diff options
author | aiju <aiju@phicode.de> | 2011-07-18 11:01:22 +0200 |
---|---|---|
committer | aiju <aiju@phicode.de> | 2011-07-18 11:01:22 +0200 |
commit | 8c4c1f39f4e369d7c590c9d119f1150a2215e56d (patch) | |
tree | cd430740860183fc01de1bc1ddb216ceff1f7173 /sys/doc/sam | |
parent | 11bf57fb2ceb999e314cfbe27a4e123bf846d2c8 (diff) |
added /sys/doc
Diffstat (limited to 'sys/doc/sam')
-rw-r--r-- | sys/doc/sam/fig1.bm | bin | 0 -> 42200 bytes | |||
-rw-r--r-- | sys/doc/sam/fig1.gif | bin | 0 -> 13382 bytes | |||
-rw-r--r-- | sys/doc/sam/fig1.png | bin | 0 -> 18498 bytes | |||
-rw-r--r-- | sys/doc/sam/fig1.ps | 1740 | ||||
-rw-r--r-- | sys/doc/sam/fig2.bm | bin | 0 -> 6362 bytes | |||
-rw-r--r-- | sys/doc/sam/fig2.gif | bin | 0 -> 4253 bytes | |||
-rw-r--r-- | sys/doc/sam/fig2.png | bin | 0 -> 3536 bytes | |||
-rw-r--r-- | sys/doc/sam/fig2.ps | 294 | ||||
-rw-r--r-- | sys/doc/sam/fig3.bm | bin | 0 -> 16176 bytes | |||
-rw-r--r-- | sys/doc/sam/fig3.gif | bin | 0 -> 5042 bytes | |||
-rw-r--r-- | sys/doc/sam/fig3.png | bin | 0 -> 5271 bytes | |||
-rw-r--r-- | sys/doc/sam/fig3.ps | 622 | ||||
-rw-r--r-- | sys/doc/sam/fig4.bm | bin | 0 -> 1620 bytes | |||
-rw-r--r-- | sys/doc/sam/fig4.gif | bin | 0 -> 2640 bytes | |||
-rw-r--r-- | sys/doc/sam/fig4.png | bin | 0 -> 1137 bytes | |||
-rw-r--r-- | sys/doc/sam/fig4.ps | 130 | ||||
-rw-r--r-- | sys/doc/sam/fig5.pic | 27 | ||||
-rw-r--r-- | sys/doc/sam/fig6.pic | 38 | ||||
-rw-r--r-- | sys/doc/sam/fig7.pic | 12 | ||||
-rw-r--r-- | sys/doc/sam/mkfile | 19 | ||||
-rw-r--r-- | sys/doc/sam/refs | 166 | ||||
-rw-r--r-- | sys/doc/sam/sam.html | 3705 | ||||
-rw-r--r-- | sys/doc/sam/sam.ms | 3241 | ||||
-rw-r--r-- | sys/doc/sam/sam.pdf | bin | 0 -> 156123 bytes | |||
-rw-r--r-- | sys/doc/sam/sam.ps | 23496 | ||||
-rw-r--r-- | sys/doc/sam/sam.tut | 1784 | ||||
-rw-r--r-- | sys/doc/sam/sam.tut.out | 4863 | ||||
-rw-r--r-- | sys/doc/sam/sam0.png | bin | 0 -> 38692 bytes | |||
-rw-r--r-- | sys/doc/sam/sam1.png | bin | 0 -> 19764 bytes | |||
-rw-r--r-- | sys/doc/sam/sam2.png | bin | 0 -> 4722 bytes | |||
-rw-r--r-- | sys/doc/sam/sam3.png | bin | 0 -> 4805 bytes | |||
-rw-r--r-- | sys/doc/sam/sam4.png | bin | 0 -> 1236 bytes |
32 files changed, 40137 insertions, 0 deletions
diff --git a/sys/doc/sam/fig1.bm b/sys/doc/sam/fig1.bm Binary files differnew file mode 100644 index 000000000..7f5e63a7c --- /dev/null +++ b/sys/doc/sam/fig1.bm diff --git a/sys/doc/sam/fig1.gif b/sys/doc/sam/fig1.gif Binary files differnew file mode 100644 index 000000000..b540c6694 --- /dev/null +++ b/sys/doc/sam/fig1.gif diff --git a/sys/doc/sam/fig1.png b/sys/doc/sam/fig1.png Binary files differnew file mode 100644 index 000000000..fe1a83e21 --- /dev/null +++ b/sys/doc/sam/fig1.png diff --git a/sys/doc/sam/fig1.ps b/sys/doc/sam/fig1.ps new file mode 100644 index 000000000..6c18c63a7 --- /dev/null +++ b/sys/doc/sam/fig1.ps @@ -0,0 +1,1740 @@ +%!PS-Adobe-2.0 +%%Version: 3.3.2 +%%DocumentFonts: (atend) +%%Pages: (atend) +%%EndComments +%%EndProlog +%%BeginSetup +mark +%%Patch from lp +%%EndPatch from lp + +/picstr 98 string def +23 241 translate +564.48 309.60 scale + +784 430 1 [784 0 0 -430 0 430] +{currentfile picstr readhexstring pop} image + +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0001 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0001 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0001 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0001 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0001 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0001 +02001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffe7fffffffe227ff0feffffffffffffff3ff87ff11ffcffffffff +fffffffe7fe7ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffde01ffffe7fffffffe227fe7f9f833900fffffef3ff3e0711ffcffdffff1 +e0fffffe7fe7ffe7f3e0ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfcfffffe7fffffffe233fe7f3f3b39e7fffffcf9ff3e7311ffcff9fffe9 +ce7fffffffe7ffc7e3ce7fffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfcfe3ffe4f879cfff773f80f3e7f3de7f0e73019fc0673bbffc8e03ffe9 +ce7ff3907f07ffa7d3ce7fffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfcfe3ffe27339cfff779fe7e7e7f25e7e6673cfcff3e73bbffc479fffd9 +ce7ff3de7e67ff67b3fe7fffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfcfe3ffe7279cdfff779fe7e7e7f25e7ce737cfcff3e73bbffce79fffd9 +ce7ff25e7ce7ffe7f3fe7fffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfcfffffe7279c3fffffcfe7e7e7f25e7ce70fcfe7f3e67ffffce79fffb9 +ce7ff25e7ce7ffe7f3fcffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fcfffffe7279f7fffffcfe7e7e7f93e7c07dfcfe7f3e0fffffce79fff80 +ce7ff25e7ce7ffe7f3f9ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fcfffffe7279e1fffffe7e7e7e7f93e7cff87cff3f3e7fffffce79fff80 +ce7ff93e7ce7ffe7f3f3ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fcfe3ffe7279d9fffffe7e7e7e7f93e7cff67cff3f3e7fffffce79ffff9 +ce7ff93e7ce7ffe7f3e7ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fcfe3ffe67339cffffff3e7e7f3b93e7e6673cff9f3e7fffffce79ffff9 +ce7ff93e7e47ffe7f3c07fffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fcfe3ffe0f879cffffff381f3f8393e7f0e73e1f9c0e7fffffce7c3ffe0 +e0fff9300f27ff81c0c07fffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889ffffffffffffffffffff9fff3fffffffffffffffcffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221ffffffffffffffffffff9fff9fffffffffffffffcffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889ffffffffffffffffffffffffeffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffe7fffffffe227ff0feffffffffffffff3ff87ff11ffcffffffff +fffffffe7fe7fffffffffffcfffcffffffffffffffffffefffffffffffffffff +fffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221e07ffffe7fffffffe227fe7f9f833903fffffff3ff3e0711ffcffdffff1 +e0fffffe7fe7ff83c1fffffcff7cfffffffffffffeffff9c03ffffffffffff3e +0fffff00ffffffffff3fffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889e73ffffe7fffffffe233fe7f3f3b3939fffffff9ff3e7311ffcff9fffe9 +ce7fffffffe7ff399cfffffffe7cfffffffffffffcffff3f9ffffffffffffe3c +e7ffffe7ffffffffff9fffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221e73e3ffe4f879cfff773f80f3e7f3d39e0f07279fc0673bbffc8e03ffe9 +ce7ff3907f07ff399cffe720f80c8fffff9cfff0701fff3f9fffe1ffe73cfd3c +ffffffe7fff87ff9cf9fffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889e73e3ffe27339cfff779fe7e7e7f2539ce67313cff3e73bbffc479fffd9 +ce7ff3de7e67ff399cffe7bcfe7c47ffff9effe73cfffe7f9fffccffe73cfb3c +ffffffe7fff33ff9cfcfffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221e77e3ffe7279cdfff779fe7e7e7f253bfe67f39cff3e73bbffce79fffd9 +ce7ff25e7ce7ff399cffe4bcfe7ce7ffff92ffff3cfffe7f9fff9cfff37cff3c +ffffffe7ffe73ff9efcfffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889e0fffffe7279c3fffffcfe7e7e7f2507fe63f39e7f3e67ffffce79fffb9 +ce7ff25e7ce7ff819cffe4bcfe7ce7ffff92ffff3cfffe7f9fff9cfff0e01f3c +0fffffe7ffe73ffccfcfffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221e67ffffe7279f7fffffcfe7e7e7f9333e070739e7f3e0fffffce79fff80 +ce7ff25e7ce7fff99cffe4bcfe7ce7ffff92fff03cfffe7f9fff80fffde01f3c +e7ffffe7ffe03ffcdfcfffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889e67ffffe7279e1fffffe7e7e7e7f9333ce7e339f3f3e7fffffce79fff80 +ce7ff93e7ce7fff99cfff27cfe7ce7ffffc9ffe73cfffe7f9fff9ffff87cff3c +e7ffffe7ffe7fffcdfcfffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221e73e3ffe7279d9fffffe7e7e7e7f9339ce7f339f3f3e7fffffce79ffff9 +ce7ff93e7ce7fff99cfff27cfe7ce7ffc7c9ffe73cfffe7f9fc79ff1f67cff3c +e78fffe7f1e7fc7e3fcfffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889e73e3ffe67339cffffff3e7e7f3b9339cc67333f9f3e7fffffce79ffff9 +ce7ff93e7e47ff399cfff27cfe7ce7ffc7c9ffe63cfffe7f9fc7ccf1e73cff3c +e78fffe7f1f33c7e3fcfffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221e71e3ffe0f879cffffff381f3f839338e270707f9c0e7fffffce7c3ffe0 +e0fff9300f27ff83c1fff2601f0ce7ffc7c9fff13e1fff3f9fc7e1f1e73ffc0e +0f8fffe7f1f87c7f3f9fffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889ffffffffffffffffffff9fff3ffffffffffff3ffcffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff3fffffffffffffffff +ffcfffffffffffff7f9fffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221ffffffffffffffffffff9fff9ffffffffffff3ffcffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff9fffffffffffffffff +ffcffffffffffffe7f3fffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889ffffffffffffffffffffffffeffffffffffff3fffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffefffffffffffffffff +ff9ffffffffffffc7effffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889e0fe7ffffffff0fffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fcfe7fffffffe7fffffffff807fffffffbfffff03ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fcffffffffffe7ffffffffff3ffffffff3fffff39ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fcf07c8f87ff80c670e5bfff3fffc3ffc070fff39ffe73fffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fcfe7c4733ffe7e066601fff3fff99fff3e67ff39ffe7bfffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fcfe7ce673ffe7e64f249fff3fff39fff3cf3ff3bffe4bfffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fcfe7ce673ffe7e7cf249fff3fff39fff3cf3ff07ffe4bfffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fcfe7ce603ffe7e7cf249fff3fff01fff3cf3ff33ffe4bfffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fcfe7ce67fffe7e7cf249fff3fff3ffff3cf3ff33fff27fffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fcfe7ce67fffe7e7cf249fff3f8f3ffff3cf3ff39f1f27fffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fcfe7ce733ffe7e7e6649fff3f8f99fff3e67ff39f1f27fffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221e0100ce787ff81c1f0e49fff3f8fc3fff870fff38f1f27fffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff80000000800000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221c00000000001fffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff3f80000001800000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889c00000000001fff87ffffffffffffffffffffcfffcfffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff0f80078c67f00000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221c00000000001fff3fffffffffc0ffffffffffcfffcffdfffc1f8fffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff1f800ccc61800000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889c00000000001fff3fffffffffce7fffffffffffffcff9fff9cf4fffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff3f8018cc61800000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221c7c73398f0c7ffc0633872dffce7ffe1ffe320fe0c8e03ff9cf4fffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7d80180c61800000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889cc63f1f998c3fff3f033300ffce7ffccfff03cfccc479ffffcecfffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffff980180c61800000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221c063319b0cdbfff3f327924ffcefff9cfff33cf9cce79ffffcecfffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffef080180c61800000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889c06301830cdbfff3f3e7924ffc1fff9cfff3fcf9cce79ffff9dcfffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffce080180c61800000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221c7e301830cdbfff3f3e7924ffccfff80fff3fcf9cce79ffff3c07ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fff8c0000ccee1800000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889cc6301830c6dfff3f3e7924ffccfff9ffff3fcf9cce79fffe7c07ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fff08000078760f00000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221cc6301830c6dfff3f3e7924ffce7c79ffff3fcf9cce79fffcffcfffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe00000000000000000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889cce30181986dfff3f3f3324ffce7c7ccfff3fcfc8ce79fff80fcfffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffc10000000000000000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221c767c3e0f06dffc0e0f8724ffce3c7e1ffe0e01e4ce7c3ff80f07ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff837ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889c00000000001ffffffffffffffffffffffffffffcffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffc77ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221c00000000001fffffffffffffffffffffffffff9cffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffef7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889c00000000001fffffffffffffffffffffffffffc1ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fffffffff7ffffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffffffffe7ffffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889f3ffffffffcffffff9fffffc47ffffffcffffffffc47ffffe7ffe7fffff +fffffffffffffffffcfffffe1ff83fffffffffffffffffffffffffffffffffff +ffff7fc9f078380f0ffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221f3ffffffffcffffff9fffffc47dfffffcfffffff7c47ffffe7fbe7fffff +ffffffff7ffffffffcfffffcffff3ffffff7ffffffffffffffffffffffffffff +ffff7fc4e7339e7e67feffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889f3fffffffffffffffffffffc479fffffcffffffe7c47fffffff3e7fffff +fffffffe7ffffffffcfffffcffff3fffffe7ffffffffffffffffffffffffffff +ffff7fce7f33fe7ce7feffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221f27c3ce7fe0f91ce41f83ffeee0387ffc8f0f8380eefff3907c0647ffff +ce7ff8380fff8723e0fff0f01fff3f078380fff07198ce1e73ffffffffffffff +ffff7fce7f31fe7ce7feffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889f1399ce7ffcf88ce79f39ffeef9f33ffc466739e7eefff3de7f3e23ffff +cf7ff39e7fff3311ccffe67cffff3e7339e7ffe7381c0cce7bffffffffffffff +ffff7fce70383e7c07feffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221f393ce6fffcf9ccf79f3fffeef9e79ffce4f33fe7eefff25e7f3e73ffff +c97fff9e7ffe73399cffcf3cffff3ff33fe7ffff399cc9e64bffffffffffffff +ffff7fce673f1e7cfffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889f393ce1fffcf9ce679f1ffffff9e79ffce4f31fe7fffff25e7f3e73ffff +c97fff9e7ffe73399cffcf3cffff3ff31fe7ffff39fcf9e64bffffffffffffff +ffff7fce673f9e7cfffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221f393cfbfffcf9ce6f9f83fffff9e79ffce4f383e7fffff25e7f3e73ffff +c97ff81e7ffe03399cffcf3cffff3f0383e7fff039fcf9e64bffffffffffffff +ffff7fcce6339e7e67feffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889f393cf0fffcf9ce6f9ff1fffff9e79ffce4f3f1e7fffff93e7f3e73ffff +e4fff39e7ffe7f399cffcf3cffff3e73f1e7ffe739fcf9e727ffffffffffffff +ffff7fc1f1383f0f0ffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221f393cecfffcf9cf1f9ff9fffff9e79ffce4f3f9e7fffff93e7f3e73ffe3 +e4fff39e7ffe7f399cffcf3cffff3e73f9e7ffe739fcf9e727ffffffffffffff +ffff7fcffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889f3399ce7ffcf9cf1f9f39fffff9f33ffce66739e7fffff93e7f3e73ffe3 +e4fff31e7fff3339c8ffe67cffff3e6339e7ffe639fcfccf27ffffffffffffff +ffff7fcffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221f07c3ce7fe019cf1c0383fffffc387ffce70f83f0fffff9300f8673ffe3 +e4fff89f0fff8739e4fff0f03ff8071383f0fff130783e1f27ffffffffffffff +ffff7fcffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fffffffffff87feffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fffffffffff3ffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fffffffffff3ffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fe0e47838cc07feffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fce62339c0f3ffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fcfe73f9ccf3ffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fc7e73f9cff3ffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fe0e7381cff3ffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffc67339cff3ffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffe67339cff3ffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fce67331cff3ffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007fe0e738983c0ffe00000000000000000000000000000000000000000000 +0001 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007ffffffffffffffe00000000000000000000000000000000000000000000 +0001 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007ffffffffffffffe00000000000000000000000000000000000000000000 +0001 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007ffffffffffffffe00000000000000000000000000000000000000000000 +0001 +0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffc1fffffcffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fff9fffffcffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ffffffffffe1e7ffffffffff3ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fff9fffffcffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffffcfe7fff03fffff3ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fff9f87c3ce7ffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ffffffffffcffffff03ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fff9f3399cefffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffff0107f077fff9383f87fffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fff9e793ccdfffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ffffffffffcfe7e677fff89f3f33fffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fff9e793ccbfffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffffcfe7ce71fff9cf3e73fffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fff9e793cc3fffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fff80fffffcfe7ce7c7ff9cf3e7ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fff9e793cc9fffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fff80fffffcfe7ce7f3ff9cf3e7ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fff9e793cccfffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ffffffffffcfe7ce7f3ff9cf3e7ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fff9f3399ce7ffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffff1fffcfe7ce7f3c79cf3e7ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffc0387c3ce7ffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ffffff1fffcfe7e4673c799f3f33fffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffff1fff0300f2707c78380787fffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffe7ffff9fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffffffffce7ffff9fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ffffffffffffffe0fffff9fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffefffffffefffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ff9ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffcfffffffe7ffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ff9ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ff9cb7399cf3ffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ff3ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ff3c03399cf9ffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ff3c1c6633879cfffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fe7c9339cdfcffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fe79ce0703339efffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fc7c9339c3fc7feffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fe7fce67327992fffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fe7c9339f7fcffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fcffce7f3e7992fffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ff3c9339e1f9ffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fcfc0e7f3e7992fffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ff9c9339d9f3ffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f9f9ce7f3e79c9fffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffcc93119ce7ffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f9f9ce7f3e79c9fffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffec93899cefffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f3f98e7f3f33c9fffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f3fc4c1e0f87c9fffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fe7fffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fe7fffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fcffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fcf07198ce1e73effffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7f9e7381c0cce7beffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7f9ff399cc9e64beffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7f3ff39fcf9e64beffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7f3f039fcf9e64beffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7e7e739fcf9e727effffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7e7e739fcf9e727effffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7cfe639fcfccf27effffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7cff130783e1f27effffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff79fffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff79fffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0001 +00000000000000000000000000000000000000000000077fef81fffff3ffffff +fceec00c0303e633f060300060060fc77ffe7feffff8f07fffff3ff3fff3f9f0 +7fffff3fdf3fffffffffffffffdfff80e07ff01c1f8ffffffffffffffe000000 +0001 +0ffffffffffffffffffffffffffffffffffffffffffff77fef9ffffff3ffffff +fcee600c060626330000300030060c677ffe7fcffff4e73ffffffff3ffe3f1e7 +3fffffff9f3fffffffffffffff9fff80e07ff019cf4ffffffffffffffeffffff +ffe1 +0ffffffffffffffffffffffffffffffffffffffffffff77fef9ff1fff27c3ce7 +fc44603f860c061303e0301e301fcc622ffe4701fff4e73ff9c83f83ffd3e9e7 +3ff9c83e0323ffffe4739ffe0e03fffeefffffd9cf4ffffffffffffffeffffff +ffe1 +0e001ffffffffffffffffffffffffffffffffffffffff77fef9ff1fff1399ce7 +fc44300c0c0c06d30060303318060c622ffe23cfffece73ff9ef3f33ffb3d9ff +3ff9ef3f9f11ffffe233dffce79ffffcefffff99cecffffffffffffffeffffff +ffe1 +0e889ffffffffffffffffffffffffffffcffffe7fffff77fef9ff1fff393ce6f +fc44300c0c0c06d30060306318060c622ffe73cfffece73ff92f3e73fff3f9ff +3ff92f3f9f39ffffe7325fffe79ffff9e3ffff39cecffffffffffffffeffffff +ffe1 +0e221fffffffffffffffbffffffffffffcffffe7fffff77fef83fffff393ce1f +fc00180c0c0c06d3e06030630c060cc00ffe73cfffdce73ff92f3e73fff3f9fe +7ff92f3f9f39ffffe7325fffe79ffff3f8fffe79cdcffffffffffffffeffffff +ffe1 +0e889fffffffffffffff3fffffffffffffffffe7fffff77fef9ffffff393cfbf +fc00180c0c0c03630060307f0c060f800ffe73cfffc0673ff92f3e73fff3f9fc +fff92f3f9f39ffffe7325ffe079fffe7fe7ffcf9cc07fffffffffffffeffffff +ffe1 +0e221f19e1f0673c3c1c0707ffc1ffe720f91f070f39f77fef9ffffff393cf0f +fc000c0c0c0c03630060306006060c000ffe73cfffc0673ffc9f3e73fff3f9f9 +fffc9f3f9f39ffffe7393ffce79fffe7fe7ffcf9cc07fffffffffffffeffffff +ffe1 +0e889f81cce6673999cf3e73ff9cffe7bcf88e66673df77fef9ff1fff393cecf +fc000c0c0c0c03630060306006060c000ffe73cffffce73ffc9f3e73fff3f9f3 +fffc9f3f9f39fff1e7393ffce79fffcffe78f9f9cfcffffffffffffffeffffff +ffe1 +0e221f999cce673399ff3e7ffffcffe4bcf9cce4f325f77fef9ff1fff3399ce7 +fc00060c0c0623630060303303060c000ffe73cffffce73ffc9f3f23fff3f9e0 +3ffc9f3f9f39fff1e7393ffcc79fffcfce78f9f9cfcffffffffffffffeffffff +ffe1 +0e889f9f9cce673398ff3e3ffffcffe4bcf9cce4f325f77fef9ff1fff07c3ce7 +fc00063f0603e36303fdfe1e031f8c000ffe73e1fff0707ffc980793ffc0e060 +3ffc9807c339fff1e7393ffe27c3ffcfe0f8f9fc1f07fffffffffffffeffffff +ffe1 +0e221f9f80ce67301c1f3f07ffc0ffe4bcf9cce4f325f77fefffffffffffffff +fc0003000600000000000000018000000fffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffcfffffffffffffffffffffeffffff +ffe1 +0e889f9f9fce6733ff8f3fe3ff9cfff27cf9cce4f393f77fefffffffffffffff +fc0003000300000000000000018000000fffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffcfffffffffffffffffffffeffffff +ffe1 +0e221f9f9fce6733ffcf3ff3ff9cfff27cf9cce4f393f77fefffffffffffffff +fc0000000080000000000000000000000fffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffff9fffffffffffffffffffffeffffff +ffe1 +0e889f9fcce4623999cf3e73ff98fff27cf9ce466793f77fefffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221f07e1f2713c3c1f8707ffc4fff26019cf270f93f77fefffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889ffffffe7ffffffffffffffffffffffffffffffff77fefffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221ffffffe7ffffffffffffffffffffffffffffffff77fefffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889ffffffe7ffffffffffffffffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221ffffffffffffffffffffffffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889ffffffffffffffffffffffffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221fffe0ce7ffffffffffffffffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889fffcece7ffffffffffffffffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221fff9fcf7ff23e1ce7fffffffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889fff9fc97ff11cccf7fffffffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221fff9fc97ff399cc97fffffffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889fff9fc97ff399cc97fffffffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221fff9fe4fff3980c97fffffffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889fff9fe4fff399fe4ffffffffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221fc79fe4fff399fe4fffc7fffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889fc7cee4fff39cce4fffc7fffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221fc7e0e4fff39e1e4fffc7fffffffffffffffffff7222f07f3ffffffff87 +fffffffffffffffffffffffffffff3ffff87c3ffffffffffff0f87ffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889fffffffffffffffffffe7fffffffffffffffffff7088fe7f3ffffffff3f +ffffffffe0f83fffffffefffffe733ffff3f9fffffffe07ffe7f3fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221fffffffffffffffffffe7fffffffffffffffffff7222fe7ffffffffff3f +ffffffffe6739fffffffcfffffe733ffff3f9fffffffe73ffe7f3fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889fffffffffffffffffffcffffffffffffffffffff7088fe783e47c3ffc06 +33872dffe7339ffc8fff01c3ffe23279cc0603c38cffe733980c078719ffe0ff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221ffffffffffffffffffffffffffffffffffffffff7222fe7f3e2399fff3f +033300ffe73f9ffc47ffcf99ffe23139cf3f9f99c0ffe7339e7f3f3381ffce7f +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889ffffffffffffffffffffffffffffffffffffffff7088fe7f3e7339fff3f +327924ffe73f9ffce7ffcf3cffe93399cf3f9f39ccffe7739e7f3e7399ffcfff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221fffe0ce7ffffffffffffffffffffffffffffffff7222fe7f3e7339fff3f +3e7924ffe73f3ffce7ffcf3cffe93399cf3f9f39cfffe0f39e7f3e739fffc7ff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889fffcece7ffffffffffffffffffffffffffffffff7088fe7f3e7301fff3f +3e7924ffe73e7ffce7ffcf3cffe93399cf3f9f01cfffe7739e7f3e039fffe0ff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221fff9fcf7ff01e1c670f39fffffffffffffffffff7222fe7f3e733ffff3f +3e7924ffe73cfffce7ffcf3cffe93399cf3f9f3fcfffe7339e7f3e7f9ffffc7f +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889fff9fc97fff9cce066739fffffffffffffffffff7088fe7f3e733ffff3f +3e7924ffe739fe3ce7ffcf3cffef3399cf3f9f3fcff1e7339e7f3e7f9fe3fe7f +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221fff9fc97fff39ce64f39bfffffffffffffffffff7222fe7f3e7399fff3f +3f3324ffe6701e3ce7ffcf99ffef33388f3f9f99cff1e7311e7f3f339fe3ce7f +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889fff9fc97ffe79ce7cf387fffffffffffffffffff7088f0080673c3ffc0e +0f8724ffe0f01e3ce7ffe1c3ffef307c4c0e07c383f1e078981c0f8707e3e0ff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221fff9fe4fffcf80e7cf3effffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889fff9fe4fff9f9fe7cf3c3fffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221fc79fe4fff3f9fe7cf3b3fffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889fc7cee4fff3fcce7e6739fffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221fc7e0e4fff01e1c1f0f39fffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889ffffffffffffffffffffffffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221ffffffffffffffffffffffffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889ffffffffffffffffffffffffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221ffffffffffffffffffffffffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889ffffffffffffffffffffffffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221ffffffffffffffffffffffffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889ffffffffffffffffffffffffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221f878cfffffffffffffffffffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889f33c0fffffffffffffffffffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221e79ccfffffffffffffffffffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889e79cffffffffffffffffffffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221e79cffffffffffffffffffffffffffffffffffff7000fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889e79cffffffffffffffffffffffffffffffffffff7ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221e79cffffffffffffffffffffffffffffffffffff7ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889f33cffffffffffffffffffffffffffffffffffff0000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000ffffff +ffe1 +0e221f8783ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffffffffffe7fffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffe0ce7ffffffffe7fffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffcece7ffffffffe7fffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fff9fcf7ff19e1e0e478393f0ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fff9fc97ff81ccce6233989e67fffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfff9fc97ff999ccfe73f99cce7fffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfff9fc97ff9f9cc7e73f99cce7fffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fff9fe4fff9f80e0e73819cc07fffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fff9fe4fff9f9ffc673399ccfffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fc79fe4fff9f9ffe673399ccffffc7fffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fc7cee4fff9fccce6733199e67ffc7fffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fc7e0e4fff07e1e0e738983f0fffc7fffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffff9ffffffe7fffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffff9ffffffe7fffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffff9ffffffcffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fcffffffff3fffffffffffffffff3ffffffffffffffffffffffffffffff +fffffe1fffffffffffcfffffffffffffff07fffffffffffffffffffffffffffc +fffffffffff9fff9ffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fcff7fffff3fffffffffffffffdf3ffffffffffffffffffffffffffffff +fffffcfffffffffff7cfffffffffffffffe7fffffffffffffffff7fffffffffc +fffffffffff9fef9ffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffe7fffff3fffffffffffffff9f3ffffffffffffffffffffffffffffff +fffffcffffffffffe7cfffffffffffffffe7ffffffffffffffffe7fffffffffc +fffffffffffffcf9ffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221e0f80fff8723c1c8f83c3c1ffe0323e1ffcb7879ce0f87ffe1ce63383c3 +c67ff018ce1cb7ff80c8f87ff9ce0e7383e7fff07198ce1e73ff80e1fff83ffc +9f0f39ffce41f0191fffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fcfe7fff33119cc4733999cfff9f11ccffc03339cce733ffccce7033999 +e07ffcfc0ccc03ffe7c4733ff9cce67339e7ffe7381c0cce7bffe7ccfff39ffc +4e6739ffcf79fcf88fffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fcfe7ffe7339fcce673399ffff9f399cffc92799ccfe73ff9cce7333f3c +e67ffcfcc9e493ffe7ce673ff9ccfe73f9e7ffff399cc9e64bffe79e7fff9ffc +e4f39bffc979fcf9cfffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fcfe7ffe7f39fcce673398ffff9f399cffc92799cc7e73ff9fce73f1f3c +e7fffcfcf9e493ffe7ce673ff9cc7e73f9e7ffff39fcf9e64bffe79e7fff9ffc +e4f387ffc979fcf9cfffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fcfe7ffe7f39c0ce67301c1fff9f3980ffc92799ce0e03ff9fce73f833c +e7fffcfcf9e493ffe7ce603ff9ce0e7381e7fff039fcf9e64bffe79e7ff81ffc +e4f3efffc979fcf9cfffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fcfe7ffe7f399cce6733ff8fff9f399fffc92799cfc67fff9fce73ff13c +e7fffcfcf9e493ffe7ce67fff9cfc67339e7ffe739fcf9e727ffe79e7ff39ffc +e4f3c3ffe4f9fcf9cfffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fcfe7ffe7f399cce6733ffcfff9f399fffc92799cfe67fff9fce73ff93c +e7fffcfcf9e493ffe7ce67fff9cfe67339e7ffe739fcf9e727ffe79e7ff39ffc +e4f3b3ffe4f9fcf9cfffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fcfe7fff333998ce723999cfff9f39ccffc933388ce733ffccc473f3999 +e7fffcfcfccc93ffe7ce733ff88ce62331e7ffe639fcfccf27ffe7ccfff31ffc +ce6739ffe4f9fcf9cfffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221e01f0fff8739c4ce793c3c1fffc339e1ffc9387c4e0f87ffe1e260f83c3 +c1fff0383e1c93fff0ce787ffc4e0f138900fff130783e1f27fff0e1fff89ffc +1f0f39ffe4c03e19cfffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffffffffffff3ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ffffffffffffffffe73ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffff07ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffffff0783fffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ffffffffffffe7f3fffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffffffe7f3fffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f83ffe0cb783e7f3fff838cc670f39fffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f39ffce40339e7f3fff39c0e06673dfffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ff9ffcfc93f9e7f3ffff9cce64f325fffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ff9ffc7c93f9e7f3ffff9cfe7cf325fffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f81ffe0c9381e7f3fff81cfe7cf325fffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f39fffc49339e7f3fff39cfe7cf393fffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f39fffe49339e7f3fff39cfe7cf393e3fffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f31ffce49331e7f3fff31cfe7e6793e3fffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f89ffe0c938900807ff8983c1f0f93e3fffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00000 +000000000000001fffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffff3fe7fffffffffffffffffffffff3fffffffffffffffffffff +fffffff9ffffffffffffff3fffffffffcffffe79ffffffffffffffffffc00003 +006000000000001ffffffffffffffffff07fffff3fffffffffffffffffffffff +ffe1 +0e221f03fffffdf3fe7ffffffff7fffdffffffffdf3fffffffffffffffffffff +fffffff9ffffffffffffff3fff7fffffcffffe79ffffffbfffffffffffc00003 +006010000000001ffffffffff7fffffffe7fffff3fffffffffffffffffffffff +ffe1 +0e889fcffffff9f3ffffffffffe7fff9ffffffff9f3fffffffffffffffffffff +fffffff9ffffffffffffff3ffe7ffffffffffe7fffffff3fffffffffffc00003 +000030000000001fffffffffe7fffffffe7fffff3fffffffffffffffffffffff +ffe1 +0e221fcf91ffe032307e0fff8380e0e03c3ffffe0323e1ffcb7879ce0f87ff2d +e0e73ff93f0fff39c1f0f83ff80e1ffe0f91f041fc3c1c0787ffc1c8ffc7c733 +63e0fe731f1ccc7ffc6787c380e0e47c1e7f0fff279cffffffffffffffffffff +ffe1 +0e889fcf88fff9f11e7ce7ff39e7ce79f99fffff9f11ccffc03339cce733ff00 +ce673ff89e67ff399ce6733ffe7ccfffcf88e679f999cf3f33ff9cc47fcc63f3 +b060303f318fcc7ffe073399e7ce62399e7e67ff139cffffffffffffffffffff +ffe1 +0e221fcf9cfff9f39e7cffff3fe7fe79f39fffff9f399cffc92799ccfe73ff24 +fe67bff9cce7ff399fce673ffe79e7ffcf9cce79f39fcf3e73fffcce7fc06333 +18603033018ccc3ffe667339e7fe67339e7ce7ff399effffffffffffffffffff +ffe1 +0e889fcf9cfff9f39e7c7fff1fe7fe79f39fffff9f399cffc92799cc7e73ff24 +fe733ff9cce7ff398fce673ffe79e7ffcf9cce79f3ffcf3e73fffcce7fc06303 +18603030018c067ffe7e733fe7fe67339e7ce7ff39ccffffffffffffffffffff +ffe1 +0e221fcf9cfff9f39e7e0fff83e7e079f01fffff9f3980ffc92799ce0e03ff24 +e0737ff9cc07ff39c1c0673ffe79e7ffcf9cce79f3fc0f3e03ffc0ce7fc7e303 +186030301f8c065ffe7e033fe7e067339e7c07ff39cdffffffffffffffffffff +ffe1 +0e889fcf9cfff9f39e7fc7fff1e7ce79f3ffffff9f399fffc92799cfc67fff24 +ce737ff9ccffff39f8cfe73ffe79e7ffcf9cce79f3f9cf3e7fff9cce7fcc6303 +18603030318c065ffe7e7f3fe7ce67339e7cffff39cdffffffffffffffffffff +ffe1 +0e221fcf9cfff9f39e7fe7fff9e7ce79f3fe3fff9f399fffc92799cfe67fff24 +ce78fff9ccffff39fccfe73ffe79e7ffcf9cce79f3f9cf3e7fff9cce7fcc6303 +18603030318c039ffe7e7f3fe7ce67339e7cffff39e3ffffffffffffffffffff +ffe1 +0e889fcf9cfff9f39e7ce7ff39e7cc79f99e3fff9f39ccffc933388ce733ff24 +cc78fff99e67ff119ce6723ffe7ccfffcf9ce479f9998f3f33ff98ce7fcce303 +30603030338c039ffe7f3399e7cc67391e7e67ff33e3ffffffffffffffffffff +ffe1 +0e221f039cfffc33900e0fff83f0e27c3c3e3fffc339e1ffc9387c4e0f87ff24 +e27cfff83f0fff89c1f0f93fff0e1ffe019cf2403c3c4f8787ffc4ce7fc767c3 +e3fc1e7c1d9f019ffc1f87c3f0e2673c900f0fff07f3ffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffff3fffffffffffffffffffffffffff +fffdffffffffffffffffffffffffffffffffffffffffffffffffffffffc00000 +000000000000011fffffffffffffffff9ffffffffff7ffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffff3fffffffffffffffffffffffffff +fff9ffffffffffffffffffffffffffffffffffffffffffffffffffffffc00000 +000000000000031ffffffffffffffff39fffffffffe7ffffffffffffffffffff +ffe1 +0e889ffffffffffffffffffffffffffffffe7fffffffffffffffffffffffffff +fff1ffffffffffffffffffffffffffffffffffffffffffffffffffffffc00000 +000000000000071ffffffffffffffff83fffffffffc7ffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffffffe7fffffff9fffffffffffffffffffffffffffffffffffff +fffffffffffffffffffe7ffffff83ffffffff3ffffffff3ffffffffffffff9ff +fffffffffffffffe7fffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ffffffffffffe7fffffff9ffffdfeffffffff83fffffdffffffffffffff +fffffffffffffffffffe7fffffff3ffffffff3ffffffff3fdffffffbfffef9ff +fffffffffffffffe7fbfffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffff9ffff9fcffffffff39fffff9ffffffffffffff +fffffffffffffffffffe7fffffff3fffffffffffffffffff9ffffff3fffcf9ff +ffffffffffffffffff3fffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f278cf0f078307c8f83ff93ce60301c3c8fff39ffe0e03ffc3c8f87ffe1 +e1e3323e1c67ff8391f07ff19e1f3f8783c183e47c1ff83e03ffc1c07ff0191f +0fff8793c9f0f8307c0787ffe1e1e3323e1c67ffffffffffffffffffffffffff +ffe1 +0e889f13c0e667339e7c4733ff89ce79fcf99c47fff9ffce79fff99c4733ffcc +ccf0311cce07ff3988e67ff81ccf3f33399cf3e2399fff3f9fff9cf3fffcf88e +67ff3389c4e6739e7f3f33ffccccf0311cce07ffffffffffffffffffffffffff +ffe1 +0e221f39ccce67f3fe7ce673ff9cce79fcf3cce7fff9fffe79fff3cce673ff9c +9e733399ce67fff99cce7ff999cf3e73f99ff3e7339fff3f9ffffcf3fffcf9cc +e7fe799cce4f33fe7f3e73ff9c9e733399ce67ffffffffffffffffffffffffff +ffe1 +0e889f39cfce63f1fe7ce673ff9cce79fcf3cce7ffc7fffe79fff3cce673ff9f +9e73f399ce7ffff99cce7ff9f9cf3e73f98ff3e7339fff3f9ffffcf3fffcf9cc +e7fe799cce4f31fe7f3e73ff9f9e73f399ce7fffffffffffffffffffffffffff +ffe1 +0e221f39cfc070783e7ce673ff9cce79fcf3cce7fff9ffe079fff3cce603ff9f +9e73f3980e7fff819cce7ff9f80f3e0381c1f3e7339fff3f9fffc0f3fffcf9cc +07fe799cce4f383e7f3e03ff9f9e73f3980e7fffffffffffffffffffffffffff +ffe1 +0e889f39cfcffe3f1e7ce673ff9cce79fcf3cce7fff9ffce79fff3cce67fff9f +9e73f399fe7fff399cce7ff9f9ff3e7f39f8f3e7339fff3f9fff9cf3fffcf9cc +fffe799cce4f3f1e7f3e7fff9f9e73f399fe7fffffffffffffffffffffffffff +ffe1 +0e221f39cfcfff3f9e7ce673ff9cce79fcf3cce7fff9ffce79fff3cce67fff9f +9e73f399fe7fff399cce7ff9f9ff3e7f39fcf3e7339fff3f9fff9cf3fffcf9cc +fffe799cce4f3f9e7f3e7fff9f9e73f399fe7f8fffffffffffffffffffffffff +ffe1 +0e889f33cfe667339e7ce723ff99c479fcf99ce7ff39ffcc79fff99ce733ffcc +ccf3f39cce7fff319ce47ff9fccf3f33319cf3e7391fff3f9fff98f3fffcf9ce +67ff3399cce6739e7f3f33ffccccf3f39cce7f8fffffffffffffffffffffffff +ffe1 +0e221f0783f0f078300ce793ff83e27c3e1c3ce7ff83ffe27c3ffc3ce787ffe1 +e1e0f39e1c1fff899cf27ff07e18078789c180673c9ff807c3ffc4f87ffe19cf +0fff8783c1f0f8300f8787ffe1e1e0f39e1c1f8fffffffffffffffffffffffff +ffe1 +0e889f3ffffffffffffffff3ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffff9fffffffffffffffffffff +ffffff9fcfffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f3ffffffffffffffe73ffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffff39fffffffffffffffffffff +ffffff9fcfffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f3fffffffffffffff07ffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffff83fffffffffffffffffffff +ffffff9fcfffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffffffffffffffffffff9fffffffc1fffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f39fffffffffffffffffffffff9ffffffbf9fffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f39ffffffffffffffffffffffffffffff3f9fffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f11c3c6787ffe1e1e4739e1c8c1fc391c079f39ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f1199e0733ffcccce2339ccc479f9988f3f9f39ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f493ce6673ff9c9e6733d9cce79f399cf3f9f3dffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f493ce7e73ff9f9e673999cce79f399cf3f9f99ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f493ce7e03ff9f9e6739b80ce79f019cf3f9f9bffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f493ce7e7fff9f9e6739b9fce79f3f9cf3f9f9bffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f793ce7e7fff9f9e673c79fce79f3f9cf3f9fc7e3ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f7999e7f33ffcccce73c7ccce79f999cf3f9fc7e3ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f79c3c1f87ffe1e1e73c7e1ce403c39cf8403e7e3ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffeff3ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffcff3ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffff8fe7ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f3fffffffffffffffffffffffffffffff3fffff07fffff3fffffffe0fe7 +ffe7ffffcfffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f3ffffbfdffffffff07ffffffffffffff3fffffe7fffff3ffffffffcfe7 +ffe7ffffcfffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f3ffff3f9fffffffe73ffffffffffffffffffffe7fffff3ffffffffcfff +ffe7ffffcfffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f279cc06038791ffe73ff2de0e73ffc183cb727e7ce7ff27e1fff87cf07 +f0e73c3e0fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f139cf3f9f3388ffff3ff00ce673ff9cf3c0313e7ce7ff13ccfff33cfe7 +e667799ccfffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f399cf3f9e799cffff3ff24fe67bff9ff3c9339e7cf7ff399cffe73cfe7 +ce66f399cfffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f399cf3f9e799cfff8fff24fe733ff8ff3c9339e7e67ff399cffe7fcfe7 +cfe5f399cfffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f399cf3f9e799cffff3ff24e0737ffc1f3c9339e7e6fff3980ffe7fcfe7 +cfe1f019cfffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f399cf3f9e799cffff3ff24ce737fff8f3c9339e7e6fff399fffe7fcfe7 +cfe4f3f9cfffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f399cf3f9e799cffff3ff24ce78ffffcf3c9339e7f1fff399fffe7fcfe7 +cfe673f9cf1fffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f3388f3f9f339cffe73ff24cc78fff9cf3c9333e7f1fff33ccfff33cfe7 +e667399c8f1fffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f07c4f87c3879cfff07ff24e27cfffc1804930700f9fff07e1fff860100 +f0e73c3e4f1fffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffffffffffffffffffffdffffffffff3ffffbffffffffffffffff +ffffffffff9fffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ffffffffffffffffffffffffff9ffffffffff3ffff3ffffffffffffffff +ffffffffff9fffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffffffffffffffffffff1ffffffffff3fffe3ffffffffffffffff +ffffffffff3fffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fff9fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fff9fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fff9fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f3991f0e33c39cc9f0f23ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f3d88e6703999cc4e6711ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f259cce733399cce4f339ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f259cce73f399cce4f339ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f259cc073f019cce4f339ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f939ccff3f3f9cce4f339ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f939ccff3f3f9cce4f339ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f939ce673f9988cce6739ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f939cf0e0fc3c4c1f0f39ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffffffffcffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ffffffffffffffcffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffffffffcffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0001 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0001 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0001 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0001 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff +showpage +%%BoundingBox: 23 241 587.48 550.60 diff --git a/sys/doc/sam/fig2.bm b/sys/doc/sam/fig2.bm Binary files differnew file mode 100644 index 000000000..5bbcc22d0 --- /dev/null +++ b/sys/doc/sam/fig2.bm diff --git a/sys/doc/sam/fig2.gif b/sys/doc/sam/fig2.gif Binary files differnew file mode 100644 index 000000000..88410195e --- /dev/null +++ b/sys/doc/sam/fig2.gif diff --git a/sys/doc/sam/fig2.png b/sys/doc/sam/fig2.png Binary files differnew file mode 100644 index 000000000..326131a5b --- /dev/null +++ b/sys/doc/sam/fig2.png diff --git a/sys/doc/sam/fig2.ps b/sys/doc/sam/fig2.ps new file mode 100644 index 000000000..00d3a7a9d --- /dev/null +++ b/sys/doc/sam/fig2.ps @@ -0,0 +1,294 @@ +%!PS-Adobe-2.0 +%%Version: 3.3.2 +%%DocumentFonts: (atend) +%%Pages: (atend) +%%EndComments +%%EndProlog +%%BeginSetup +mark +%%Patch from lp +%%EndPatch from lp + +/picstr 23 string def +239 297 translate +132.48 197.28 scale + +184 274 1 [184 0 0 -274 0 274] +{currentfile picstr readhexstring pop} image + +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffc00000000000000000000000000000000000000fffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffe47c39cfffffffffffffefffff +ffc0000fffffffffffffe23999efffffffffffffefffff +ffc0000fffffffffffffe733992fffffffffffffefffff +ffc0000fffffffffffffe733992fffffffffffffefffff +ffc0000fffffffffffffe730192fffffffffffffefffff +ffc0000fffffffffffffe733fc9fffffffffffffefffff +ffc0000fffffffffffffe733fc9fffffffffffffefffff +ffc0000fffffffffffffe7399c9fffffffffffffefffff +ffc0000fffffffffffffe73c3c9fffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffc078719c3ce7ffffffffffefffff +ffc0000ffffffffffffe7338199ce7ffffffffffefffff +ffc0000ffffffffffffce73993ce6fffffffffffefffff +ffc0000ffffffffffff9e739f3ce1fffffffffffefffff +ffc0000ffffffffffff3e039f3cfbfffffffffffefffff +ffc0000fffffffffffe7e7f9f3cf0fffffffffffefffff +ffc0000fffffffffffcfe7f9f3cecfffffffffffefffff +ffc0000fffffffffffcff339f99ce7ffffffffffefffff +ffc0000fffffffffffc078707c3ce7ffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000ffffffffffffffff3ffffffffffffffffefffff +ffc0000ffffffffffffffff3ffffffffffffffffefffff +ffc0000ffffffffffffffff3ffffffffffffffffefffff +ffc0000fffffffff8cf0f0723c1c9f87ffffffffefffff +ffc0000fffffffffc0e6673119cc4f33ffffffffefffff +ffc0000fffffffffccce67f39fcce673ffffffffefffff +ffc0000fffffffffcfce63f39fcce673ffffffffefffff +ffc0000fffffffffcfc070739c0ce603ffffffffefffff +ffc0000fffffffffcfcffe3399cce67fffffffffefffff +ffc0000fffffffffcfcfff3399cce67fffffffffefffff +ffc0000fffffffffcfe66733998ccf33ffffffffefffff +ffc0000fffffffff83f0f0739c4c1f87ffffffffefffff +ffc0000ffffffffffffffffffffcffffffffffffefffff +ffc0000ffffffffffffffffffffcffffffffffffefffff +ffc0000ffffffffffffffffffffcffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffc1ffffffffffffffffffefffff +ffc0000ffffffffffffff9ffffffffffffffffffefffff +ffc0000ffffffffffffff9ffffffffffffffffffefffff +ffc0000ffffffffffff0f9f87c1f0fffffffffffefffff +ffc0000fffffffffffe679f339ce67ffffffffffefffff +ffc0000fffffffffffce79e799fce7ffffffffffefffff +ffc0000fffffffffffcff9e798fce7ffffffffffefffff +ffc0000fffffffffffcff9e79c1c07ffffffffffefffff +ffc0000fffffffffffcff9e79f8cffffffffffffefffff +ffc0000fffffffffffcff9e79fccffffffffffffefffff +ffc0000fffffffffffe679f339ce67ffffffffffefffff +ffc0000ffffffffffff0c0387c1f0fffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc00008000000000000000000000000000000000fffff +ffc00008000000000000000000000000000000000fffff +ffc00008000000000000000300000000000000000fffff +ffc00008000000000000000300800000000000000fffff +ffc00008000000000000000001800000000000000fffff +ffc000080000000000319cdf07f0f000000000000fffff +ffc000080000000000308fc301819800000000000fffff +ffc000080000000000368cc30183180000ff80000fffff +ffc000080000000000368c030183180000fe00000fffff +ffc000080000000000368c030183f80000f800000fffff +ffc0000800000000001b0c030183000000fc00000fffff +ffc0000800000000001b0c030183000000fe00000fffff +ffc0000800000000001b0c030181980000df00000fffff +ffc0000800000000001b1f1fe0f0f00000cf80000fffff +ffc000080000000000000000000000000087c0000fffff +ffc000080000000000000000000000000083e0000fffff +ffc0000ffffffffffffffffffffffffffffe0fffefffff +ffc0000fffffffffffffffffffffffffffff07ffefffff +ffc0000fffffffffffffffffffffffffffff83ffefffff +ffc0000fffffffffffffffffffffffffffffc1ffefffff +ffc0000fffffffffffffffffffffffffffffe0ffefffff +ffc0000ffffffffffffff07832dffffffffff1ffefffff +ffc0000fffffffffeef76733900f77bbfffffbffefffff +ffc0000fffffffffc6e367ff924e371bffffffffefffff +ffc0000fffffffff80c063ff924c0603ffffffffefffff +ffc0000fffffffffb1d8f078124d8ec7ffffffffefffff +ffc0000fffffffffbbddfe33924ddeefffffffffefffff +ffc0000fffffffffffffff33924fffffffffffffefffff +ffc0000fffffffffffffe733124fffffffffffffefffff +ffc0000ffffffffffffff078924fffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000ffffffffffffff3f9ffffffffffffffffefffff +ffc0000ffffffffffffff3f9ffffffffffffffffefffff +ffc0000ffffffffffffff3f9ffffffffffffffffefffff +ffc0000ffff9fffffe0f83c18cf0f0783fff0fffefffff +ffc0000ffff9fffffce73399c0e667339ffe67ffefffff +ffc0000ffff9ffffffe67339ccce67f3fffce7ffefffff +ffc0000fffc03fffffe67339cfce63f1fffcffffefffff +ffc0000fffc03ffffe067339cfc070783ffcffffefffff +ffc0000ffff9fffffce67339cfcffe3f1ffcffffefffff +ffc0000ffff9fc7ffce67339cfcfff3f9e3cffffefffff +ffc0000ffff9fc7ffcc72391cfe667339e3e67ffefffff +ffc0000ffffffc7ffe2793c983f0f0783e3f0fffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000ffffffffffffc1e0fffffffffffffffffefffff +ffc0000fffffffffffff9fcfffffffffffffffffefffff +ffc0000fffffffffffff9fcfffffffffffffffffefffff +ffc0000ffffffffffe0f9fcfc3f0fffc3fffffffefffff +ffc0000ffffffffffce79fcf99e67ff99fffffffefffff +ffc0000fffffffffffe79fcf3cce7ff39fffffffefffff +ffc0000fffe03fffffe79fcf3ccffff3ffffffffefffff +ffc0000fffe03ffffe079fcf3ccffff3ffffffffefffff +ffc0000ffffffffffce79fcf3ccffff3ffffffffefffff +ffc0000ffffffffffce79fcf3ccff8f3ffffffffefffff +ffdffffffffffffffcc79fcf99e678f99fffffffefffff +ffdffffffffffffffe240201c3f0f8fc3fffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdffffffffffffffcffffe1f0ffffffffffffffefffff +ffdffffffffffffffcffffcfe7ffffffffffffffefffff +ffdffffffffffffffcffffcfe7ffffffffffffffefffff +ffdffffffffdfffffc9e730180f0e33ffe1fffffefffff +ffdffffffff57ffffc4e73cfe7e6703ffccfffffefffff +ffdffffffff8fffffce673cfe7ce733ff9cfffffefffff +ffdfffffffe23ffffce673cfe7ce73fff9ffffffefffff +ffdffffffff8fffffce673cfe7c073fff9ffffffefffff +ffdffffffff57ffffce673cfe7cff3fff9ffffffefffff +ffdffffffffdfffffce673cfe7cff3fc79ffffffefffff +ffdffffffffffffffcce23cfe7e673fc7ccfffffefffff +ffdffffffffffffffc1f130381f0e0fc7e1fffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdffffffffffffffffffff9ffffffffffffffffefffff +ffdffffffffffffffffffff9ffffffffffffffffefffff +ffdffffffffffffffffffff9ffffffffffffffffefffff +ffdfffffffffffffff0cb7c1fff0ffffffffffffefffff +ffdffffffffffffffe640399ffe67fffffffffffefffff +ffdffffffffffffffce49339ffce7fffffffffffefffff +ffdfffffffe03ffffcfc9339ffcfffffffffffffefffff +ffdfffffffe03ffffcfc9339ffcfffffffffffffefffff +ffdffffffffffffffcfc9339ffcfffffffffffffefffff +ffdffffffffffffffcfc9339e3cfffffffffffffefffff +ffdffffffffffffffe649391e3e67fffffffffffefffff +ffdfffffffffffffff0c93c9e3f0ffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdffffff1ffffffffe79fffffffffffffffffffefffff +ffdffffff1ffffffffe79fffffffffffffffffffefffff +ffdffffff1ffffffffe7ffffffffffffffffffffefffff +ffdffffff9f9ffffff041f83e1fff87fffffffffefffff +ffdffffff9f9fffffe679f39ccfff33fffffffffefffff +ffdffffff3f9fffffce79f3f9cffe73fffffffffefffff +ffdfffffffc03ffffce79f1f9fffe7ffffffffffefffff +ffdfffffffc03ffffce79f839fffe7ffffffffffefffff +ffdffffffff9fffffce79ff19fffe7ffffffffffefffff +ffdffffffff9fffffce79ff99ff1e7ffffffffffefffff +ffdffffffff9fffffe479f39ccf1f33fffffffffefffff +ffdfffffffffffffff240383e1f1f87fffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffff0e3319c3c67ffc3fffffffefffff +ffdffffffffffffffe67038199e07ff99fffffffefffff +ffdffffffffffffffce733993ce67ff39fffffffefffff +ffdfffffffe03ffffce73f9f3ce7fff3ffffffffefffff +ffdfffffffe03ffffc073f9f3ce7fff3ffffffffefffff +ffdffffffffffffffcff3f9f3ce7fff3ffffffffefffff +ffdffffffffffffffcff3f9f3ce7f8f3ffffffffefffff +ffdffffffffffffffe673f9f99e7f8f99fffffffefffff +ffdfffffffffffffff0e0f07c3c1f8fc3fffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdffffffffffffffffffffffffffffff9ffffffefffff +ffdffffffffffffffffffffffffffffff9ffffffefffff +ffdffffffffffffffffffffffffffffff9ffffffefffff +ffdfffffffffffffff0e3319c3c6707ff91fffffefffff +ffdffffffffffffffe67038199e0673ff88fffffefffff +ffdffffffffffffffce733993ce667fff9cfffffefffff +ffdfffffffe03ffffce73f9f3ce7e3fff9cfffffefffff +ffdfffffffe03ffffc073f9f3ce7f07ff9cfffffefffff +ffdffffffffffffffcff3f9f3ce7fe3ff9cfffffefffff +ffdffffffffffffffcff3f9f3ce7ff3c79cfffffefffff +ffdffffffffffffffe673f9f99e7e73c79cfffffefffff +ffdfffffffffffffff0e0f07c3c1f07c79cfffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffff879e0fffffffffffffffffefffff +ffdfffffffffffffff3f9fcfffffffffffffffffefffff +ffdfffffffffffffff3fffcfffffffffffffffffefffff +ffdffffffffffffffc041fcfe1fff87fffffffffefffff +ffdfffffffffffffff3f9fcfccfff33fffffffffefffff +ffdfffffffffffffff3f9fcf9cffe73fffffffffefffff +ffdfffffffe03fffff3f9fcf9cffe7ffffffffffefffff +ffdfffffffe03fffff3f9fcf80ffe7ffffffffffefffff +ffdfffffffffffffff3f9fcf9fffe7ffffffffffefffff +ffdfffffffffffffff3f9fcf9ff1e7ffffffffffefffff +ffdfffffffffffffff3f9fcfccf1f33fffffffffefffff +ffdffffffffffffffc0c0201e1f1f87fffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffff0783ffffffffffffefffff +ffdfffffffffffffffffffffe7f3ffffffffffffefffff +ffdfffffffffffffffffffffe7f3ffffffffffffefffff +ffdfffffffffffffff078783e7f3f0fc3fff0fffefffff +ffdffffffffffffffe673339e7f3e6799ffe67ffefffff +ffdffffffffffffffce673f9e7f3cf339ffce7ffefffff +ffdfffffffe03ffffce67ff9e7f3cf33fffcffffefffff +ffdfffffffe03ffffce67f81e7f3cf33fffcffffefffff +ffdffffffffffffffce67f39e7f3cf33fffcffffefffff +ffdffffffffffffffce67f39e7f3cf33fe3cffffefffff +ffdffffffffffffffe473331e7f3e6799e3e67ffefffff +ffdfffffffffffffff278789008070fc3e3f0fffefffff +ffdfffffffffffffffe7ffffffffffffffffffffefffff +ffdffffffffffffffce7ffffffffffffffffffffefffff +ffdffffffffffffffe0fffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffff3fffffffffffffffffffffefffff +ffdfffffffffffffff3fffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdffffffffffffff83f0fffe1ffffffffffffffefffff +ffdfffffffffffffff3e67ffccffffffffffffffefffff +ffdfffffffffffffff3cf3ff9cffffffffffffffefffff +ffdfffffffe03fffff3cf3ff9fffffffffffffffefffff +ffdfffffffe03fffff3cf3ff9fffffffffffffffefffff +ffdfffffffffffffff3cf3ff9fffffffffffffffefffff +ffdfffffffffffffff3cf3c79fffffffffffffffefffff +ffdfffffffffffffff3e67c7ccffffffffffffffefffff +ffdffffffffffffff8070fc7e1ffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffc00000000000000000000000000000000000000fffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +showpage +%%BoundingBox: 239 297 371.48 494.28 diff --git a/sys/doc/sam/fig3.bm b/sys/doc/sam/fig3.bm Binary files differnew file mode 100644 index 000000000..25548370d --- /dev/null +++ b/sys/doc/sam/fig3.bm diff --git a/sys/doc/sam/fig3.gif b/sys/doc/sam/fig3.gif Binary files differnew file mode 100644 index 000000000..b6c8be2fc --- /dev/null +++ b/sys/doc/sam/fig3.gif diff --git a/sys/doc/sam/fig3.png b/sys/doc/sam/fig3.png Binary files differnew file mode 100644 index 000000000..be2c986ed --- /dev/null +++ b/sys/doc/sam/fig3.png diff --git a/sys/doc/sam/fig3.ps b/sys/doc/sam/fig3.ps new file mode 100644 index 000000000..a2a64c0b4 --- /dev/null +++ b/sys/doc/sam/fig3.ps @@ -0,0 +1,622 @@ +%!PS +/picstr 79 string def +80 322 translate +451.44 146.88 scale + +627 204 1 [627 0 0 -204 0 204] +{currentfile picstr readhexstring pop} image + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +fe00000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe00000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe00000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff3fffffff3cffffffffffffffffffffdfe7f3bff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff3fffefff3cffffffff07ffffffffff3fe7f3cff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff3fffe7ff3fffffffff33fffffffffe7fe7f3e7f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff27fff3f820fc1f0fff39c3c9f8723e7f0783e7e +3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff13fff9f33cf9ce66033999c4f3311cfe6733f3e +3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff39fffce73cf9fce603393cce67339cfce673f3e +3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff3980fc673cf8fcffff393cce67339cfce673f3f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2ffdfffffffffffffffffff3980fce73cfc1cffff393cce60339cfce673f3f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2ffdfffffffffffffffffff39fff9e73cff8cfe03393cce67f39cfce673f3f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2ffdfffffffffffffffffff39fff3e73cffccfe03393cce67f39cfce673f3e +3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2ffdfffffffffffffffffff33ffe7f23cf9ce67ff3399ccf3339cfe4723f3e +3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2ffdfffffffffffffffffff07ffeff9201c1f0fff07c3c1f8739e7f2793e7e +3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2ffdfffffffffffffffffffffffffffffffffffffffffcffffffe7fffffe7f +3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2ffdfffffffffffffffffffffffffffffffffffffffffcfffffff3fffffcff +3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2ffdfffffffffffffffffffffffffffffffffffffffffcfffffffdfffffbfe +7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2ffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2ffdffffffffffffffffffffffffff9fffe7ffff7ff9ffffffffffffe7fffd +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffffff7fff9fffe7fbfcf0f9ffff7fffffffe7fffe +7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffffffe7ffffffffff3f9e679ffff3fffffffe7ffff +3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff8380c641f2307c079e6793fff9fc3c1f0e47c3f +3f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff39e7e079f11e7f3f3e6f89fffcf999ce662399f +9f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff3fe7e679f39e7f3f3f1f9cfffe739fcce67339f +9f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff1fe7e7f9f39e7f3f3f499cc07e33ffccfe7339f +9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff83e7e7f9f39e7f3f3e4b9cc07e73fc0cfe7301f +9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889ffffffffffffffffffff1e7e7f9f39e7f3f3e679cfffcf3f9ccfe733ff +9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffff9e7e7f9f39e7f3f3e679cfff9f3f9ccfe733ff +9f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff39e7e7f9f39e7f3f3e2399fff3f9998e667399f +9f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff83f0c1c033900f879f1183fff7fc3c4f0e73c3f +3f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffffffffffffffffffff9ffffffffffffffffffffff +3f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffffffffffffffffffffcfffffffffffffffffffffe +7f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889ffffffffffffffffffffffffffffffffffff7ffffffffffffffffffffd +ff3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889ffffffffffffffffffffffffffffffffffe7ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffffffffbfffffffffe7ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889ffffffffffffffffffffffff3fffffffffe7ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff19e1c06731991ffe4fc7fffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff81ccf3e738188ffe27c7fffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff999cf3e73999cffe73c7fffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff9f9cf3e739f9cffe73fffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff9f80f3e739f9cffe73fffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff9f9ff3e739f9cffe73fffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff9f9ff3e739f9cffe73c7fffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff9fccf3e239f9cffe67c7fffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff07e1f8713079cffe0fc7fffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffffffffffffffffffffffe7fffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffffffffffffffffffffffe7fffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffffffffffffffffffffffcffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fc7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fe3fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffff83ffffffffee7fbffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221f03fff3ffffffff9e7fcffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889f39fff3ffffffff3e7fe7fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221f39e1f3f0f83e1f3e4fe7fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889f39ccf3e6739cce7e27f3fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221f3b9cf3cf33f9ce7e73f3fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889f079ff3cf31f9ce7e73f3fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221f3b9ff3cf38380e7e73f3fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889f399ff3cf3f19fe7e73f3fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221f399ff3cf3f99fe7e73f3fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889f39ccf3e6739cce7e67f3fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221f03e18070f83e1f3e0fe7fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffff3fffe7fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffff9fffcffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffefffbffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889ffffffffffffffffffffffffff9fffffffffffffffffc3e1fffffffff9 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffffffffff9ffff7fffffff81fff9fcffffffffff9 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889ffffffffffffffffffffffffffffffe7fffffff9cfff9fcffffffffff9 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff19e1f041f8380f0e33ff9cce60301e1c67ffef9 +3f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff81cce679f39e7e6703ff9cce79fcfcce07ffab8 +9f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff999cce79f3fe7ce733ff9dce79fcf9ce67ffc79 +cf1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff9f9cce79f1fe7ce73fff83ce79fcf9ce7fff119 +cfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff9f80ce79f83e7c073fff9dce79fcf80e7fffc79 +cfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff9f9fce79ff1e7cff3fff9cce79fcf9fe7fffab9 +cfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff9f9fce79ff9e7cff3fff9cce79fcf9fe7fffef9 +cf1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff9fcce479f39e7e673fff9cc479fcfcce7fffff9 +9f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff07e1f240383f0f0e0fff81e260703e1c1fffff8 +3f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889ffffffffffffffffffffffffe7ffffffffffffffffffffffffffffffff +ff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffffffffce7ffffffffffffffffffffffffffffffff +ff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffffffffe0fffffffffffffffffffffffffffffffff +ff3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fe3fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fe3fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffc000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889ffffffffffffffffffc00007c000000001180000001860000010000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221ffffffffffffffffffcf8000c00000000618000200186000000c000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889ffffffffffffffffffccc000c00000000c180003001800000006000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221ffffffffffffffffffcc61e0c0f07c1e0c1b000180fbe07c1e06070000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889ffffffffffffffffffcc6330c198c633181d8000c19860c63303070000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221ffffffffffffffffffcc6630c30cc0631818c000631860c06303070000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889ffffffffffffffffffcc6600c30ce0631818cfe0731860e06003000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221ffffffffffffffffffcc6600c30c7c7f1818cfe06318607c6003000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889ffffffffffffffffffcc6600c30c0e601818c000c318600e6003000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221ffffffffffffffffffcc6600c30c06601818c001831860066003070000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889ffffffffffffffffffccc330c198c6331819800301b860c63303070000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221ffffffffffffffffffcf81e7f8f07c1e0c1f000200dbfc7c1e06070000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889ffffffffffffffffffc00000000000000c000000000000000006030000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221ffffffffffffffffffc00000000000000600000000000000000c030000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889ffffffffffffffffffc000000000000001000000000000000010060000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221c000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889c000000000000000000000000001f00000000040030000000000000c00 +0100000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221c000000000000000000000800000300000000187830000400000000c00 +00c0000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889c00000000000000000000180000030000000030cc30000600000000c00 +0060000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221c0000000000000000007c7f39878303c1f07830cc36000301e1f078dc1 +e060700000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889c000000000000000000c6181f8cc3066318cc60c83b0001833318ccee3 +3030700000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221c000000000000000000c0181998c30c33018c6070318000c630198cc66 +3030700000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889c000000000000000000e0181818030c33818c605b319fc0e6001980c66 +3030000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221c0000000000000000007c181818030c31f1fc60da319fc0c601f980c67 +f030000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889c0000000000000000000e181818030c30398060cc31800186031980c66 +0030000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221c00000000000000000006181818030c30198060cc31800306031980c66 +0030700000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889c000000000000000000c618180cc3066318cc60ee330006033338ccc63 +3030700000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221c0000000000000000007c0f3e079fe3c1f07830773e000401e1d878c61 +e060700000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889c000000000000000000000000000000000000300000000000000000000 +0060300000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221c000000000000000000000000000000000000180000000000000000000 +00c0300000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889c000000000000000000000000000000000000040000000000000000000 +0100600000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221c00000000000000000000000000000000000000000000000000000001f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889c0000000000000000001e0000000040200000c0000000000203008001f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221c000000000000000000300000000180c00000c0000000000183006001f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889c000000000000000000300000000301800000c00000000000c3003001f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221c000000000000000000fe730f078301831878dc3e39800100c3603039f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889c000000000000000000303f198cc6030318ccee631f80054063b01839f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221c00000000000000000030333198c60303198cc6031980038063181839f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889c00000000000000000030303198c603031980c60318000ee063181801f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221c00000000000000000030303f9fc603031980c63f1800038063181801f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889c000000000000000000303030180603031980c6631800054063181801f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221c000000000000000000303030180603031980c6631800010063181839f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889c0000000000000000003030198cc60303b8ccc6671800000063301839f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221c000000000000000000fc7c0f07830181d878c63b3e000000c3e03039f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889c000000000000000000000000000301800000000000000000c0003019f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221c000000000000000000000000000180c0000000000000000180006019f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889c00000000000000000000000000004020000000000000000200008031f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fc7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fe3fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe00000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe00000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe00000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +showpage +%%BoundingBox: 80 322 531.44 468.88 diff --git a/sys/doc/sam/fig4.bm b/sys/doc/sam/fig4.bm Binary files differnew file mode 100644 index 000000000..6e456a9e3 --- /dev/null +++ b/sys/doc/sam/fig4.bm diff --git a/sys/doc/sam/fig4.gif b/sys/doc/sam/fig4.gif Binary files differnew file mode 100644 index 000000000..00625cc44 --- /dev/null +++ b/sys/doc/sam/fig4.gif diff --git a/sys/doc/sam/fig4.png b/sys/doc/sam/fig4.png Binary files differnew file mode 100644 index 000000000..9bfd950e4 --- /dev/null +++ b/sys/doc/sam/fig4.png diff --git a/sys/doc/sam/fig4.ps b/sys/doc/sam/fig4.ps new file mode 100644 index 000000000..6d1ddccfa --- /dev/null +++ b/sys/doc/sam/fig4.ps @@ -0,0 +1,130 @@ +%!PS +/picstr 13 string def +268 352 translate + 74.16 86.40 scale + +103 120 1 [103 0 0 -120 0 120] +{currentfile picstr readhexstring pop} image + +ffffffffffffffffffffffffff +ffffffffffffffffffffffffff +ffffffffffffffffffffffffff +ffffffffffffffffffffffffff +ffffffffffffffffffffffffff +f800000000000000000001ffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffdfffffffdffff +fbfffffffffff9fffffffdffff +fbffffffe1ce603ffffffdffff +fbffffffccce79fffffffdffff +fbffffff9cce79fffffffdffff +fbffffff9fce79fffffffdffff +fbffffff9fce79fffffffdffff +fbffffff9fce79fffffffdffff +fbffffff9fce79fffffffdffff +fbffffffccc479fffffffdffff +fbffffffe1e27c3ffffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffdfffffffdffff +fbfffffffffff9fffffffdffff +fbffff27c1e0e03c3ffffdffff +fbffff139cce79f99ffffdffff +fbffff39fccff9f39ffffdffff +fbffff39fcc7f9f39ffffdffff +fbffff39c0e0f9f01ffffdffff +fbffff399cfc79f3fffffdffff +fbffff399cfe79f3fffffdffff +fbffff3398ce79f99ffffdffff +fbffff07c4e0fc3c3ffffdffff +fbffff3ffffffffffffffdffff +fbffff3ffffffffffffffdffff +fbffff3ffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffe1ffffdffff +fbfffffffffffffcfffffdffff +fbfffffffffffffcfffffdffff +fbffff8391e0e3301ffffdffff +fbffff3988ce703cfffffdffff +fbffff3f9cfe733cfffffdffff +fbffff1f9cfe73fcfffffdffff +fbffff839ce073fcfffffdffff +fbfffff19cce73fcfffffdffff +fbfffff99cce73fcfffffdffff +fbffff399ccc73fcfffffdffff +fbffff839ce260f03ffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffff07fffff3ffffffdffff +fbfffffe7fffff3ffffffdffff +fbfffffe7fffff3ffffffdffff +fbfffffe7e1f0f39fffffdffff +fbfffffe7cce673bfffffdffff +fbfffffe79e4f337fffffdffff +fbfffffe79e4f32ffffffdffff +fbfffffe79e4f30ffffffdffff +fbfffffe79e4f327fffffdffff +fbfffffe79e4f333fffffdffff +fbfffffe7cce6739fffffdffff +fbfffff00e1f0f39fffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffffbfffffffbfffffdffff +fbfffff3fffffff9fffffdffff +fbffffe72dce673cfffffdffff +fbffffcf00ce673e7ffffdffff +fbffff9f24ce737f3ffffdffff +fbffff1f24ce70ff1ffffdffff +fbffff9f24ce7dff3ffffdffff +fbffffcf24ce787e7ffffdffff +fbffffe724ce767cfffffdffff +fbfffff324c46739fffffdffff +fbfffffb24e2673bfffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +f800000000000000000001ffff +f800000000000000000001ffff +f800c04000030000200001ffff +f800c18000030000180001ffff +f8018300000180000c0001ffff +f801830000c180dc0c0c01ffff +f803060000c0c0ee060c01ffff +f803060000c0c0c6060c01ffff +f806060007f860c6067f81ffff +f806060007f860c6067f81ffff +f80c060000c030c6060c01ffff +f80c0601c0c030c6060c01ffff +f8180601c0c018c6060c01ffff +f8180301c00018c60c001e0fff +f830030000000c000c001e3fff +f830018000000c0018001effff +f80000400000000020001e7fff +ffffffffffffffffffffe03fff +ffffffffffffffffffffe41fff +ffffffffffffffffffffe60fff +ffffffffffffffffffffef07ff +ffffffffffffffffffffef83ff +ffffffffffffffffffffffc1ff +ffffffffffffffffffffffe0ff +fffffffffffffffffffffff07f +fffffffffffffffffffffff83f +fffffffffffffffffffffffc1f +fffffffffffffffffffffffe3f +ffffffffffffffffffffffff7f +ffffffffffffffffffffffffff +ffffffffffffffffffffffffff +ffffffffffffffffffffffffff +ffffffffffffffffffffffffff +ffffffffffffffffffffffffff +showpage +%%BoundingBox: 268 352 342.16 438.40 diff --git a/sys/doc/sam/fig5.pic b/sys/doc/sam/fig5.pic new file mode 100644 index 000000000..67ecd8abc --- /dev/null +++ b/sys/doc/sam/fig5.pic @@ -0,0 +1,27 @@ +.PS +scale=100 +define m0 | +[ +$2: box "\f(CWBuffer\fP" $1 ht 40 wid 88 with .nw at 0,40 +box "\f(CWString\fP" "(cache)" ht 40 wid 72 with .nw at 104,40 +line left 16 from last box.w +] | + +define m1 | +[ +box "\f(CWDisc\fP" ht 40 wid 88 with .sw at 0,56 +box "temp. file" ht 40 wid 88 with .sw at 0,0 +line up 16 from last box.n +] | + +D1: m1 with .nw at 184,576 +D2: m1 with .nw at 0,576 +Mtranscript: m0("(transcript)", Buffer) with .nw at 0,640 +Mcontents: m0("(contents)", Contents) with .nw at 184,640 +F: box "\f(CWFile\fP" ht 40 wid 112 with .nw at 75,704 + +line from D2.n to Mtranscript.Buffer.s +line from D1.n to Mcontents.Contents.s +line up 12 from Mtranscript.Buffer.n then right 50 then up 12 +line up 12 from Mcontents.Contents.n then left 60 then up 12 +.PE diff --git a/sys/doc/sam/fig6.pic b/sys/doc/sam/fig6.pic new file mode 100644 index 000000000..52ac9a045 --- /dev/null +++ b/sys/doc/sam/fig6.pic @@ -0,0 +1,38 @@ +.PS +scale=100 + +T: box "\f(CWText\fP" ht 40 wid 112 +R: box "\f(CWRasp\fP" ht 40 wid 90 with .w at (T.e.x+16, T.e.y) + +line from T.e to R.w +arrow from R.e right 24 +box invis "to host" with .w at end of last arrow + +line from T.s down 16 then left 30 then down 30 then right 16 + +FL: box "\f(CWFlayer\fP" ht 40 wid 75 with .w at end of last line +F1: box ht 40 wid 75 with .w at FL.e +F2: box ht 40 wid 75 with .w at F1.e +F3: box "\&\f(CW...\fP" ht 40 wid 75 with .w at F2.e + +FX: box invis "\f(CW...\fP" ht 40 wid 75 with .n at (F1.s.x, F1.s.y-24) + +FR: box "\f(CWFrame\fP" ht 40 wid 75 with .n at (FL.s.x, FL.s.y-24) + +line from FL.s to FR.n +line from F1.s down 24 +line from F2.s down 24 +line from F3.s down 24 + +BM: box "\f(CWBitmap\fP" "(cache)" ht 40 wid 68 with .e at (FR.w.x-28, FR.w.y) + +line from BM.e to FR.w + +line from FR.s down 16 then left 50 then down 30 then right 16 + +B1: box "\f(CWBox\fP" ht 40 wid 45 with .w at end of last line +B2: box ht 40 wid 45 with .w at B1.e +B3: box ht 40 wid 45 with .w at B2.e +B4: box "\f(CW...\fP" ht 40 wid 45 with .w at B3.e + +.PE diff --git a/sys/doc/sam/fig7.pic b/sys/doc/sam/fig7.pic new file mode 100644 index 000000000..840eac782 --- /dev/null +++ b/sys/doc/sam/fig7.pic @@ -0,0 +1,12 @@ +.PS +scale=100 + +tw=15 + +T1: box ht tw wid 80 +T2: box "\f(CW\s8for(i=0; i<NL; i++){\s0\fP" ht tw wid 166 with .w at T1.e +T3: box ht tw wid 60 with .w at T2.e +T4: box "\f(CW\s8/* for each element */\s0\fP" ht tw wid 186 with .w at T3.e +T5: box ht tw wid 50 + +.PE diff --git a/sys/doc/sam/mkfile b/sys/doc/sam/mkfile new file mode 100644 index 000000000..26de1d431 --- /dev/null +++ b/sys/doc/sam/mkfile @@ -0,0 +1,19 @@ +</sys/doc/fonts + +default:V: sam.ps sam.tut.out + +sam.ps:D: sam.ms fig1.ps fig2.ps fig3.ps fig4.ps fig5.pic fig6.pic fig7.pic refs + {echo $FONTS; cat sam.ms refs} | pic | tbl | troff -ms -mpictures | lp -dstdout >sam.ps + ../cleanps sam.ps + +sam.trout:D: sam.ms fig1.ps fig2.ps fig3.ps fig4.ps fig5.pic fig6.pic fig7.pic refs + {echo $FONTS; cat sam.ms refs} | pic | tbl | troff -ms -mpictures >sam.trout + +sam.html:D: sam.ms fig1.ps fig2.ps fig3.ps fig4.ps fig5.pic fig6.pic fig7.pic refs + pic sam.ms refs | tbl | htmlroff -ms -mhtml >sam.html + +sam.tut.out:D: sam.tut + troff -ms sam.tut > sam.tut.out + +clean:V: + rm -f sam.ps diff --git a/sys/doc/sam/refs b/sys/doc/sam/refs new file mode 100644 index 000000000..d50b062db --- /dev/null +++ b/sys/doc/sam/refs @@ -0,0 +1,166 @@ +.SH +REFERENCES +.PP +.nr PI \w'20. 'u +.IP \01. +R. Pike, +`The Blit: a multiplexed graphics terminal,' +.I +AT&T Bell Labs. Tech. J., +.R +.B 63 , +(8), +1607-1631 (1984). +.IP \02. +L. Johnson, +.I MacWrite, +Apple Computer Inc., Cupertino, Calif. 1983. +.IP \03. +B. Lampson, +`Bravo Manual,' +in +.I +Alto User's Handbook, +.R +pp. 31-62, +Xerox Palo Alto Research Center, +Palo Alto, Calif. +1979. +.IP \04. +W. Teitelman, +`A tour through Cedar,' +.I +IEEE Software, +.R +.B 1 +(2), 44-73 (1984). +.IP \05. +J. Gutknecht, +`Concepts of the text editor Lara,' +.I +Comm. ACM, +.R +.B 28 , +(9), +942-960 (1985). +.IP \06. +Bell Telephone Laboratories, +.I +UNIX Programmer's Manual, +.R +Holt, Rinehart and Winston, New York 1983. +.IP \07. +B. W. Kernighan and R. Pike, +.I +The Unix Programming Environment, +.R +Prentice-Hall, Englewood Cliffs, New Jersey 1984. +.IP \08. +.I +Unix Time-Sharing System Programmer's Manual, Research Version, Ninth Edition, +Volume 1, +.R +AT&T Bell Laboratories, Murray Hill, New Jersey 1986. +.IP \09. +.I +Unix Time-Sharing System Programmer's Manual, 4.1 Berkeley Software Distribution, +Volumes 1 and 2C, +.R +University of California, Berkeley, Calif. 1981. +.IP 10. +R. Pike, +`Structural Regular Expressions,' +.I +Proc. EUUG Spring Conf., Helsinki 1987, +.R +Eur. Unix User's Group, Buntingford, Herts, UK 1987. +.IP 11. +A. Goldberg, +.I +Smalltalk-80 \(en The Interactive Programming Environment, +.R +Addison-Wesley, Reading, Mass. 1984. +.IP 12. +K. Thompson, +`Regular expression search algorithm,' +.I +Comm. ACM, +.R +.B 11 , +(6), +419-422 (1968). +.IP 13. +A. V. Aho, J. E. Hopcroft and J. D. Ullman, +.I +The Design and Analysis of Computer Algorithms, +.R +Addison-Wesley, Reading, Mass. 1974. +.IP 14. +B. W. Kernighan and D. M. Ritchie, +.I +The C Programming Language, +.R +Prentice-Hall, Englewood Cliffs, New Jersey 1978. +.IP 15. +W. M. Waite, +`The cost of lexical analysis,' +.I +Softw. Pract. Exp., +.R +.B 16 , +(5), +473-488 (1986). +.IP 16. +C. W. Fraser, +`A generalized text editor,' +.I +Comm. ACM, +.R +.B 23 , +(3), +154-158 (1980). +.IP 17. +R. Pike, +`Graphics in overlapping bitmap layers,' +.I +ACM Trans. on Graph., +.R +.B 2 , +(2) +135-160 (1983). +.IP 18. +L. J. Guibas and J. Stolfi, +`A language for bitmap manipulation,' +.I +ACM Trans. on Graph., +.R +.B 1 , +(3), +191-214 (1982). +.IP 19. +R. Pike, B. Locanthi and J. Reiser, +`Hardware/software trade-offs for bitmap graphics on the Blit,' +.I +Softw. Pract. Exp., +.R +.B 15 , +(2), +131-151 (1985). +.IP 20. +T. A. Cargill, +`The feel of Pi,' +.I +Winter USENIX Conference Proceedings, +Denver 1986, +.R +62-71, +USENIX Assoc., El Cerrito, CA. +.IP 21. +G. J. Holzmann, +`Tracing protocols,' +.I +AT&T Tech. J., +.R +.B 64 , +(10), +2413-2434 (1985). diff --git a/sys/doc/sam/sam.html b/sys/doc/sam/sam.html new file mode 100644 index 000000000..e7bda43b6 --- /dev/null +++ b/sys/doc/sam/sam.html @@ -0,0 +1,3705 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" +"http://www.w3.org/TR/html4/loose.dtd"> +<html> +<head> +<meta http-equiv=Content-Type content="text/html; charset=utf8"> +<title>The Text Editor sam</title> +</meta> +</head> +<body> +<p style="margin-top: 0; margin-bottom: 0.50in"></p> +<p style="margin-top: 0; margin-bottom: 0.21in"></p> + +<p style="line-height: 1.4em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: center;"> +<span style="font-size: 12pt"><b>The Text Editor </b></span><span style="font-size: 12pt"><tt>sam</tt></span><span style="font-size: 12pt"><b></b></span></p> +<p style="margin-top: 0; margin-bottom: 0.21in"></p> + +<p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="line-height: 1.4em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: center;"> +<span style="font-size: 10pt"><i>Rob Pike</i></span></p> +<p style="line-height: 1.4em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: center;"> +<span style="font-size: 10pt"><i>rob@plan9.bell-labs.com</i></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="margin-top: 0; margin-bottom: 0.33in"></p> +<p style="line-height: 1.4em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: center;"> +<span style="font-size: 10pt"><i>ABSTRACT</i></span></p> +<p style="margin-top: 0; margin-bottom: 0.19in"></p> +<p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.50in; text-indent: 0.50in; margin-right: 1.50in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"></span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt"> +is an interactive multi-file text editor intended for +bitmap displays. +A textual command language +supplements the mouse-driven, cut-and-paste interface +to make complex or +repetitive editing tasks easy to specify. +The language is characterized by the composition of regular expressions +to describe the structure of the text being modified. +The treatment of files as a database, with changes logged +as atomic transactions, guides the implementation and +makes a general ‘undo’ mechanism straightforward. +</span><span style="font-size: 10pt"></span><span style="font-size: 10pt"></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.50in; text-indent: 0.35in; margin-right: 1.50in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"></span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt"> +is implemented as two processes connected by a low-bandwidth stream, +one process handling the display and the other the editing +algorithms. Therefore it can run with the display process +in a bitmap terminal and the editor on a local host, +with both processes on a bitmap-equipped host, or with +the display process in the terminal and the editor in a +remote host. +By suppressing the display process, +it can even run without a bitmap terminal. +</span><span style="font-size: 10pt"></span><span style="font-size: 10pt"></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.50in; text-indent: 0.35in; margin-right: 1.50in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">This paper is reprinted from Software—Practice and Experience, +Vol 17, number 11, pp. 813-845, November 1987. +The paper has not been updated for the Plan 9 manuals. Although +</span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt"> +has not changed much since the paper was written, the system around it certainly has. +Nonetheless, the description here still stands as the best introduction to the editor. +</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="margin-top: 0; margin-bottom: 0.50in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"><b>Introduction +</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"></span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt"> +is an interactive text editor that combines cut-and-paste interactive editing with +an unusual command language based on the composition of regular expressions. +It is written as two programs: one, the ‘host part,’ runs on a UNIX system +and implements the command language and provides file access; the other, the +‘terminal part,’ runs asynchronously +on a machine with a mouse and bitmap display +and supports the display and interactive editing. +The host part may be even run in isolation on an ordinary terminal +to edit text using the command +language, much like a traditional line editor, +without assistance from a mouse or display. +Most often, +the terminal part runs on a Blit<sup></sup></span><sup><span style="font-size: 6pt">1</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> terminal +(actually on a Teletype DMD 5620, the production version of the Blit), whose +host connection is an ordinary 9600 bps RS232 link; +on the SUN computer the host and display processes run on a single machine, +connected by a pipe. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"></span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt"> +edits uninterpreted +ASCII text. +It has no facilities for multiple fonts, graphics or tables, +unlike MacWrite,<sup></sup></span><sup><span style="font-size: 6pt">2</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> Bravo,<sup></sup></span><sup><span style="font-size: 6pt">3</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> Tioga<sup></sup></span><sup><span style="font-size: 6pt">4</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> +or Lara.<sup></sup></span><sup><span style="font-size: 6pt">5</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> +Also unlike them, it has a rich command language. +(Throughout this paper, the phrase +</span><span style="font-size: 10pt"><i>command language +</i></span><span style="font-size: 10pt">refers to +textual commands; commands activated from the mouse form the +</span><span style="font-size: 10pt"><i>mouse</i></span><span style="font-size: 10pt"> +</span><span style="font-size: 10pt"><i>language.</i></span><span style="font-size: 10pt">) +</span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt"> +developed as an editor for use by programmers, and tries to join +the styles of the UNIX text editor +</span><span style="font-size: 10pt"><tt>ed</tt></span><span style="font-size: 10pt"><sup></sup></span><sup><span style="font-size: 6pt">6,7</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> +with that of interactive cut-and-paste editors by +providing a comfortable mouse-driven interface +to a program with a solid command language driven by regular expressions. +The command language developed more than the mouse language, and +acquired a notation for describing the structure of files +more richly than as a sequence of lines, +using a dataflow-like syntax for specifying changes. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The interactive style was influenced by +</span><span style="font-size: 10pt"><tt>jim</tt></span><span style="font-size: 10pt">,<sup></sup></span><sup><span style="font-size: 6pt">1</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> +an early cut-and-paste editor for the Blit, and by +</span><span style="font-size: 10pt"><tt>mux</tt></span><span style="font-size: 10pt">,<sup></sup></span><sup><span style="font-size: 6pt">8</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> +the Blit window system. +</span><span style="font-size: 10pt"><tt>Mux</tt></span><span style="font-size: 10pt"> +merges the original Blit window system, +</span><span style="font-size: 10pt"><tt>mpx</tt></span><span style="font-size: 10pt">,<sup></sup></span><sup><span style="font-size: 6pt">1</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> +with cut-and-paste editing, forming something like a +multiplexed version of +</span><span style="font-size: 10pt"><tt>jim</tt></span><span style="font-size: 10pt"> +that edits the output of (and input to) command sessions rather than files. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The first part of this paper describes the command language, then the mouse +language, and explains how they interact. +That is followed by a description of the implementation, +first of the host part, then of the terminal part. +A principle that influenced the design of +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +is that it should have no explicit limits, such as upper limits on +file size or line length. +A secondary consideration is that it be efficient. +To honor these two goals together requires a method for efficiently +manipulating +huge strings (files) without breaking them into lines, +perhaps while making thousands of changes +under control of the command language. +</span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt">’s +method is to +treat the file as a transaction database, implementing changes as atomic +updates. These updates may be unwound easily to ‘undo’ changes. +Efficiency is achieved through a collection of caches that minimizes +disc traffic and data motion, both within the two parts of the program +and between them. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The terminal part of +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +is fairly straightforward. +More interesting is how the two halves of the editor stay +synchronized when either half may initiate a change. +This is achieved through a data structure that organizes the +communications and is maintained in parallel by both halves. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The last part of the paper chronicles the writing of +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +and discusses the lessons that were learned through its development and use. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The paper is long, but is composed largely of two papers of reasonable length: +a description of the user interface of +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +and a discussion of its implementation. +They are combined because the implementation is strongly influenced by +the user interface, and vice versa. +</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"><b>The Interface +</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"></span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt"> +is a text editor for multiple files. +File names may be provided when it is invoked: +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>sam file1 file2 ...</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">and there are commands +to add new files and discard unneeded ones. +Files are not read until necessary +to complete some command. +Editing operations apply to an internal copy +made when the file is read; the UNIX file associated with the copy +is changed only by an explicit command. +To simplify the discussion, the internal copy is here called a +</span><span style="font-size: 10pt"><i>file</i></span><span style="font-size: 10pt">, +while the disc-resident original is called a +</span><span style="font-size: 10pt"><i>disc file. +</i></span><span style="font-size: 10pt"></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"></span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt"> +is usually connected to a bitmap display that presents a cut-and-paste +editor driven by the mouse. +In this mode, the command language is still available: +text typed in a special window, called the +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +</span><span style="font-size: 10pt"><i>window,</i></span><span style="font-size: 10pt"> +is interpreted +as commands to be executed in the current file. +Cut-and-paste editing may be used in any window — even in the +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +window to construct commands. +The other mode of operation, invoked by starting +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +with the option +</span><span style="font-size: 10pt"><tt>-d</tt></span><span style="font-size: 10pt"> +(for ‘no download’), +does not use the mouse or bitmap display, but still permits +editing using the textual command language, even on an ordinary terminal, +interactively or from a script. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The following sections describe first the command language (under +</span><span style="font-size: 10pt"><tt>sam\fP-d +and in the +</tt></span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"><tt> +window), and then the mouse interface. +These two languages are nearly independent, but connect through the +</tt></span><span style="font-size: 10pt"><i>current</i></span><span style="font-size: 10pt"><tt> +</tt></span><span style="font-size: 10pt"><i>text,</i></span><span style="font-size: 10pt"><tt> +described below. +</tt></span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"><b>The Command Language +</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">A file consists of its contents, which are an array of characters +(that is, a string); the +</span><span style="font-size: 10pt"><i>name</i></span><span style="font-size: 10pt"> +of the associated disc file; the +</span><span style="font-size: 10pt"><i>modified bit +</i></span><span style="font-size: 10pt">that states whether the contents match those of +the disc file; +and a substring of the contents, called the +</span><span style="font-size: 10pt"><i>current text +</i></span><span style="font-size: 10pt">or +</span><span style="font-size: 10pt"><i>dot</i></span><span style="font-size: 10pt"> +(see Figures 1 and 2). +If the current text is a null string, dot falls between characters. +The +</span><span style="font-size: 10pt"><i>value</i></span><span style="font-size: 10pt"> +of dot is the location of the current text; the +</span><span style="font-size: 10pt"><i>contents</i></span><span style="font-size: 10pt"> +of dot are the characters it contains. +</span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt"> +imparts to the text no two-dimensional interpretation such as columns +or fields; text is always one-dimensional. +Even the idea of a ‘line’ of text as understood by most UNIX programs +— a sequence of characters terminated by a newline character — +is only weakly supported. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The +</span><span style="font-size: 10pt"><i>current file +</i></span><span style="font-size: 10pt">is the file to which editing commands refer. +The current text is therefore dot in the current file. +If a command doesn’t explicitly name a particular file or piece of text, +the command is assumed to apply to the current text. +For the moment, ignore the presence of multiple files and consider +editing a single file. +</span><span style="font-size: 10pt"></span></p><center><img src="fig1.gif" /></center> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 8pt"><i>Figure 1. A typical +</i></span><span style="font-size: 8pt"><tt>sam</tt></span><span style="font-size: 8pt"><i> +screen, with the editing menu presented. +The +</i></span><span style="font-size: 8pt"><tt>sam</tt></span><span style="font-size: 8pt"><i> +(command language) window is in the middle, with file windows above and below. +(The user interface makes it easy to create these abutting windows.) +The partially obscured window is a third file window. +The uppermost window is that to which typing and mouse operations apply, +as indicated by its heavy border. +Each window has its current text highlighted in reverse video. +The +</i></span><span style="font-size: 8pt"><tt>sam</tt></span><span style="font-size: 8pt"><i> +window’s current text is the null string on the last visible line, +indicated by a vertical bar. +See also Figure 2. +</i></span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="margin-top: 0; margin-bottom: 0.02in"></p> + +<p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Commands have one-letter names. +Except for non-editing commands such as writing +the file to disc, most commands make some change +to the text in dot and leave dot set to the text resulting from the change. +For example, the delete command, +</span><span style="font-size: 10pt"><tt>d</tt></span><span style="font-size: 10pt">, +deletes the text in dot, replacing it by the null string and setting dot +to the result. +The change command, +</span><span style="font-size: 10pt"><tt>c</tt></span><span style="font-size: 10pt">, +replaces dot by text delimited by an arbitrary punctuation character, +conventionally +a slash. Thus, +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>c/Peter/</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">replaces the text in dot by the string +</span><span style="font-size: 10pt"><tt>Peter</tt></span><span style="font-size: 10pt">. +Similarly, +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>a/Peter/</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">(append) adds the string after dot, and +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>i/Peter/</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">(insert) inserts before dot. +All three leave dot set to the new text, +</span><span style="font-size: 10pt"><tt>Peter</tt></span><span style="font-size: 10pt">. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Newlines are part of the syntax of commands: +the newline character lexically terminates a command. +Within the inserted text, however, newlines are never implicit. +But since it is often convenient to insert multiple lines of text, +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +has a special +syntax for that case: +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>a</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>some lines of text</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>to be inserted in the file,</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>terminated by a period</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>on a line by itself</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>.</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">In the one-line syntax, a newline character may be specified by a C-like +escape, so +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>c/\n/</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">replaces dot by a single newline character. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"></span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt"> +also has a substitute command, +</span><span style="font-size: 10pt"><tt>s</tt></span><span style="font-size: 10pt">: +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>s/</tt></span><span style="font-size: 9pt"><i>expression</i></span><span style="font-size: 9pt"><tt>/</tt></span><span style="font-size: 9pt"><i>replacement</i></span><span style="font-size: 9pt"><tt>/</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">substitutes the replacement text for the first match, in dot, +of the regular expression. +Thus, if dot is the string +</span><span style="font-size: 10pt"><tt>Peter</tt></span><span style="font-size: 10pt">, +the command +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>s/t/st/</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">changes it to +</span><span style="font-size: 10pt"><tt>Pester</tt></span><span style="font-size: 10pt">. +In general, +</span><span style="font-size: 10pt"><tt>s</tt></span><span style="font-size: 10pt"> +is unnecessary, but it was inherited from +</span><span style="font-size: 10pt"><tt>ed</tt></span><span style="font-size: 10pt"> +and it has some convenient variations. +For instance, the replacement text may include the matched text, +specified by +</span><span style="font-size: 10pt"><tt>&</tt></span><span style="font-size: 10pt">: +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>s/Peter/Oh, &, &, &, &!/</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">There are also three commands that apply programs +to text: +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>< </tt></span><span style="font-size: 9pt"><i>UNIX program</i></span><span style="font-size: 9pt"><tt></tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">replaces dot by the output of the UNIX program. +Similarly, the +</span><span style="font-size: 10pt"><tt>></tt></span><span style="font-size: 10pt"> +command +runs the program with dot as its standard input, and +</span><span style="font-size: 10pt"><tt>|</tt></span><span style="font-size: 10pt"> +does both. For example, +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>| sort</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">replaces dot by the result of applying the standard sorting utility to it. +Again, newlines have no special significance for these +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +commands. +The text acted upon and resulting from these commands is not necessarily +bounded by newlines, although for connection with UNIX programs, +newlines may be necessary to obey conventions. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">One more command: +</span><span style="font-size: 10pt"><tt>p</tt></span><span style="font-size: 10pt"> +prints the contents of dot. +Table I summarizes +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">’s +commands. +</span><span style="font-size: 10pt"></span></p><center><img src="sam0.png"></center> +</center> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="margin-top: 0; margin-bottom: 0.02in"></p> + +<p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The value of dot may be changed by +specifying an +</span><span style="font-size: 10pt"><i>address</i></span><span style="font-size: 10pt"> +for the command. +The simplest address is a line number: +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>3</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">refers to the third line of the file, so +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>3d</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">deletes the third line of the file, and implicitly renumbers +the lines so the old line 4 is now numbered 3. +(This is one of the few places where +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +deals with lines directly.) +Line +</span><span style="font-size: 10pt"><tt>0</tt></span><span style="font-size: 10pt"> +is the null string at the beginning of the file. +If a command consists of only an address, a +</span><span style="font-size: 10pt"><tt>p</tt></span><span style="font-size: 10pt"> +command is assumed, so typing an unadorned +</span><span style="font-size: 10pt"><tt>3</tt></span><span style="font-size: 10pt"> +prints line 3 on the terminal. +There are a couple of other basic addresses: +a period addresses dot itself; and +a dollar sign +(</span><span style="font-size: 10pt"><tt>$</tt></span><span style="font-size: 10pt">) +addresses the null string at the end of the file. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">An address is always a single substring of the file. +Thus, the address +</span><span style="font-size: 10pt"><tt>3</tt></span><span style="font-size: 10pt"> +addresses the characters +after the second newline of +the file through the third newline of the file. +A +</span><span style="font-size: 10pt"><i>compound address +</i></span><span style="font-size: 10pt">is constructed by the comma operator +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><i>address1</i></span><span style="font-size: 9pt"><tt>,</tt></span><span style="font-size: 9pt"><i>address2</i></span><span style="font-size: 9pt"><tt></tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">and addresses the substring of the file from the beginning of +</span><span style="font-size: 10pt"><i>address1</i></span><span style="font-size: 10pt"> +to the end of +</span><span style="font-size: 10pt"><i>address2</i></span><span style="font-size: 10pt">. +For example, the command +</span><span style="font-size: 10pt"><tt>3,5p</tt></span><span style="font-size: 10pt"> +prints the third through fifth lines of the file and +</span><span style="font-size: 10pt"><tt>.,$d</tt></span><span style="font-size: 10pt"> +deletes the text from the beginning of dot to the end of the file. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">These addresses are all absolute positions in the file, but +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +also has relative addresses, indicated by +</span><span style="font-size: 10pt"><tt>+</tt></span><span style="font-size: 10pt"> +or +</span><span style="font-size: 10pt"><tt>-</tt></span><span style="font-size: 10pt">. +For example, +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>$-3</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">is the third line before the end of the file and +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>.+1</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">is the line after dot. +If no address appears to the left of the +</span><span style="font-size: 10pt"><tt>+</tt></span><span style="font-size: 10pt"> +or +</span><span style="font-size: 10pt"><tt>-</tt></span><span style="font-size: 10pt">, +dot is assumed; +if nothing appears to the right, +</span><span style="font-size: 10pt"><tt>1</tt></span><span style="font-size: 10pt"> +is assumed. +Therefore, +</span><span style="font-size: 10pt"><tt>.+1</tt></span><span style="font-size: 10pt"> +may be abbreviated to just a plus sign. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The +</span><span style="font-size: 10pt"><tt>+</tt></span><span style="font-size: 10pt"> +operator acts relative to the end of its first argument, while the +</span><span style="font-size: 10pt"><tt>-</tt></span><span style="font-size: 10pt"> +operator acts relative to the beginning. Thus +</span><span style="font-size: 10pt"><tt>.+1</tt></span><span style="font-size: 10pt"> +addresses the first line after dot, +</span><span style="font-size: 10pt"><tt>.-</tt></span><span style="font-size: 10pt"> +addresses the first line before dot, and +</span><span style="font-size: 10pt"><tt>+-</tt></span><span style="font-size: 10pt"> +refers to the line containing the end of dot. (Dot may span multiple lines, and +</span><span style="font-size: 10pt"><tt>+</tt></span><span style="font-size: 10pt"> +selects the line after the end of dot, then +</span><span style="font-size: 10pt"><tt>-</tt></span><span style="font-size: 10pt"> +backs up one line.) +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The final type of address is a regular expression, which addresses the +text matched by the expression. The expression is enclosed in slashes, as in +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>/</tt></span><span style="font-size: 9pt"><i>expression</i></span><span style="font-size: 9pt"><tt>/</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The expressions are the same as those in the UNIX program +</span><span style="font-size: 10pt"><tt>egrep</tt></span><span style="font-size: 10pt">,<sup></sup></span><sup><span style="font-size: 6pt">6,7</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> +and include closures, alternations, and so on. +They find the +</span><span style="font-size: 10pt"><i>leftmost longest +</i></span><span style="font-size: 10pt">string that matches the expression, that is, +the first match after the point where the search is started, +and if more than one match begins at the same spot, the longest such match. +(I assume familiarity with the syntax for regular expressions in UNIX programs.<sup></sup></span><sup><span style="font-size: 6pt">9</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt">) +For example, +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>/x/</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">matches the next +</span><span style="font-size: 10pt"><tt>x</tt></span><span style="font-size: 10pt"> +character in the file, +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>/xx*/</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">matches the next run of one or more +</span><span style="font-size: 10pt"><tt>x</tt></span><span style="font-size: 10pt">’s, +and +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>/x|Peter/</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">matches the next +</span><span style="font-size: 10pt"><tt>x</tt></span><span style="font-size: 10pt"> +or +</span><span style="font-size: 10pt"><tt>Peter</tt></span><span style="font-size: 10pt">. +For compatibility with other UNIX programs, the ‘any character’ operator, +a period, +does not match a newline, so +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>/.*/</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">matches the text from dot to the end of the line, but excludes the newline +and so will not match across +the line boundary. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Regular expressions are always relative addresses. +The direction is forwards by default, +so +</span><span style="font-size: 10pt"><tt>/Peter/</tt></span><span style="font-size: 10pt"> +is really an abbreviation for +</span><span style="font-size: 10pt"><tt>+/Peter/</tt></span><span style="font-size: 10pt">. +The search can be reversed with a minus sign, so +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt></tt></span><span style="font-size: 9pt"><tt>-/Peter/</tt></span><span style="font-size: 9pt"><tt></tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">finds the first +</span><span style="font-size: 10pt"><tt>Peter</tt></span><span style="font-size: 10pt"> +before dot. +Regular expressions may be used with other address forms, so +</span><span style="font-size: 10pt"><tt>0+/Peter/</tt></span><span style="font-size: 10pt"> +finds the first +</span><span style="font-size: 10pt"><tt>Peter</tt></span><span style="font-size: 10pt"> +in the file and +</span><span style="font-size: 10pt"><tt>$-/Peter/</tt></span><span style="font-size: 10pt"> +finds the last. +Table II summarizes +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">’s +addresses. +</span><span style="font-size: 10pt"></span></p><center><img src="sam1.png"></center> +</center> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="margin-top: 0; margin-bottom: 0.02in"></p> + +<p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The language discussed so far will not seem novel +to people who use UNIX text editors +such as +</span><span style="font-size: 10pt"><tt>ed</tt></span><span style="font-size: 10pt"> +or +</span><span style="font-size: 10pt"><tt>vi</tt></span><span style="font-size: 10pt">.<sup></sup></span><sup><span style="font-size: 6pt">9</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> +Moreover, the kinds of editing operations these commands allow, with the exception +of regular expressions and line numbers, +are clearly more conveniently handled by a mouse-based interface. +Indeed, +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">’s +mouse language (discussed at length below) is the means by which +simple changes are usually made. +For large or repetitive changes, however, a textual language +outperforms a manual interface. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Imagine that, instead of deleting just one occurrence of the string +</span><span style="font-size: 10pt"><tt>Peter</tt></span><span style="font-size: 10pt">, +we wanted to eliminate every +</span><span style="font-size: 10pt"><tt>Peter</tt></span><span style="font-size: 10pt">. +What’s needed is an iterator that runs a command for each occurrence of some +text. +</span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt">’s +iterator is called +</span><span style="font-size: 10pt"><tt>x</tt></span><span style="font-size: 10pt">, +for extract: +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>x/</tt></span><span style="font-size: 9pt"><i>expression</i></span><span style="font-size: 9pt"><tt>/ </tt></span><span style="font-size: 9pt"><i>command</i></span><span style="font-size: 9pt"><tt></tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">finds all matches in dot of the specified expression, and for each +such match, sets dot to the text matched and runs the command. +So to delete all the +</span><span style="font-size: 10pt"><tt>Peters:</tt></span><span style="font-size: 10pt"> +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>0,$ x/Peter/ d</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">(Blanks in these examples are to improve readability; +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +neither requires nor interprets them.) +This searches the entire file +(</span><span style="font-size: 10pt"><tt>0,$</tt></span><span style="font-size: 10pt">) +for occurrences of the string +</span><span style="font-size: 10pt"><tt>Peter</tt></span><span style="font-size: 10pt">, +and runs the +</span><span style="font-size: 10pt"><tt>d</tt></span><span style="font-size: 10pt"> +command with dot set to each such occurrence. +(By contrast, the comparable +</span><span style="font-size: 10pt"><tt>ed</tt></span><span style="font-size: 10pt"> +command would delete all +</span><span style="font-size: 10pt"><i>lines</i></span><span style="font-size: 10pt"> +containing +</span><span style="font-size: 10pt"><tt>Peter</tt></span><span style="font-size: 10pt">; +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +deletes only the +</span><span style="font-size: 10pt"><tt>Peters</tt></span><span style="font-size: 10pt">.) +The address +</span><span style="font-size: 10pt"><tt>0,$</tt></span><span style="font-size: 10pt"> +is commonly used, and may be abbreviated to just a comma. +As another example, +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>, x/Peter/ p</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">prints a list of +</span><span style="font-size: 10pt"><tt>Peters,</tt></span><span style="font-size: 10pt"> +one for each appearance in the file, with no intervening text (not even newlines +to separate the instances). +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Of course, the text extracted by +</span><span style="font-size: 10pt"><tt>x</tt></span><span style="font-size: 10pt"> +may be selected by a regular expression, +which complicates deciding what set of matches is chosen — +matches may overlap. This is resolved by generating the matches +starting from the beginning of dot using the leftmost-longest rule, +and searching for each match starting from the end of the previous one. +Regular expressions may also match null strings, but a null match +adjacent to a non-null match is never selected; at least one character +must intervene. +For example, +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>, c/AAA/</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>x/B*/ c/-/</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>, p</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">produces as output +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>-A-A-A-</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">because the pattern +</span><span style="font-size: 10pt"><tt>B*</tt></span><span style="font-size: 10pt"> +matches the null strings separating the +</span><span style="font-size: 10pt"><tt>A</tt></span><span style="font-size: 10pt">’s. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The +</span><span style="font-size: 10pt"><tt>x</tt></span><span style="font-size: 10pt"> +command has a complement, +</span><span style="font-size: 10pt"><tt>y</tt></span><span style="font-size: 10pt">, +with similar syntax, that executes the command with dot set to the text +</span><span style="font-size: 10pt"><i>between</i></span><span style="font-size: 10pt"> +the matches of the expression. +For example, +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>, c/AAA/</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>y/A/ c/-/</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>, p</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">produces the same result as the example above. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The +</span><span style="font-size: 10pt"><tt>x</tt></span><span style="font-size: 10pt"> +and +</span><span style="font-size: 10pt"><tt>y</tt></span><span style="font-size: 10pt"> +commands are looping constructs, and +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +has a pair of conditional commands to go with them. +They have similar syntax: +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>g/</tt></span><span style="font-size: 9pt"><i>expression</i></span><span style="font-size: 9pt"><tt>/ </tt></span><span style="font-size: 9pt"><i>command</i></span><span style="font-size: 9pt"><tt></tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">(guard) +runs the command exactly once if dot contains a match of the expression. +This is different from +</span><span style="font-size: 10pt"><tt>x</tt></span><span style="font-size: 10pt">, +which runs the command for +</span><span style="font-size: 10pt"><i>each</i></span><span style="font-size: 10pt"> +match: +</span><span style="font-size: 10pt"><tt>x</tt></span><span style="font-size: 10pt"> +loops; +</span><span style="font-size: 10pt"><tt>g</tt></span><span style="font-size: 10pt"> +merely tests, without changing the value of dot. +Thus, +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>, x/Peter/ d</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">deletes all occurrences of +</span><span style="font-size: 10pt"><tt>Peter</tt></span><span style="font-size: 10pt">, +but +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>, g/Peter/ d</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">deletes the whole file (reduces it to a null string) if +</span><span style="font-size: 10pt"><tt>Peter</tt></span><span style="font-size: 10pt"> +occurs anywhere in the text. +The complementary conditional is +</span><span style="font-size: 10pt"><tt>v</tt></span><span style="font-size: 10pt">, +which runs the command if there is +</span><span style="font-size: 10pt"><i>no</i></span><span style="font-size: 10pt"> +match of the expression. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">These control-structure-like commands may be composed to construct more +involved operations. For example, to print those lines of text that +contain the string +</span><span style="font-size: 10pt"><tt>Peter</tt></span><span style="font-size: 10pt">: +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>, x/.*\n/ g/Peter/ p</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The +</span><span style="font-size: 10pt"><tt>x</tt></span><span style="font-size: 10pt"> +breaks the file into lines, the +</span><span style="font-size: 10pt"><tt>g</tt></span><span style="font-size: 10pt"> +selects those lines containing +</span><span style="font-size: 10pt"><tt>Peter</tt></span><span style="font-size: 10pt">, +and the +</span><span style="font-size: 10pt"><tt>p</tt></span><span style="font-size: 10pt"> +prints them. +This command gives an address for the +</span><span style="font-size: 10pt"><tt>x</tt></span><span style="font-size: 10pt"> +command (the whole file), but because +</span><span style="font-size: 10pt"><tt>g</tt></span><span style="font-size: 10pt"> +does not have an explicit address, it applies to the value of +dot produced by the +</span><span style="font-size: 10pt"><tt>x</tt></span><span style="font-size: 10pt"> +command, that is, to each line. +All commands in +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +except for the command to write a file to disc use dot for the +default address. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Composition may be continued indefinitely. +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>, x/.*\n/ g/Peter/ v/SaltPeter/ p</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">prints those lines containing +</span><span style="font-size: 10pt"><tt>Peter</tt></span><span style="font-size: 10pt"> +but +</span><span style="font-size: 10pt"><i>not</i></span><span style="font-size: 10pt"> +those containing +</span><span style="font-size: 10pt"><tt>SaltPeter</tt></span><span style="font-size: 10pt">. +</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"><b>Structural Regular Expressions +</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Unlike other UNIX text editors, +including the non-interactive ones such as +</span><span style="font-size: 10pt"><tt>sed</tt></span><span style="font-size: 10pt"> +and +</span><span style="font-size: 10pt"><tt>awk</tt></span><span style="font-size: 10pt">,<sup></sup></span><sup><span style="font-size: 6pt">7</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +is good for manipulating files with multi-line ‘records.’ +An example is an on-line phone book composed of records, +separated by blank lines, of the form +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>Herbert Tic</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>44 Turnip Ave., Endive, NJ</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>201-5555642</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.15in"></p> + +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>Norbert Twinge</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>16 Potato St., Cabbagetown, NJ</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>201-5553145</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.15in"></p> + +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>...</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The format may be encoded as a regular expression: +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>(.+\n)+</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">that is, a sequence of one or more non-blank lines. +The command to print Mr. Tic’s entire record is then +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>, x/(.+\n)+/ g/^Herbert Tic$/ p</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">and that to extract just the phone number is +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>, x/(.+\n)+/ g/^Herbert Tic$/ x/^[0-9]*-[0-9]*\n/ p</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The latter command breaks the file into records, +chooses Mr. Tic’s record, +extracts the phone number from the record, +and finally prints the number. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">A more involved problem is that of +renaming a particular variable, say +</span><span style="font-size: 10pt"><tt>n</tt></span><span style="font-size: 10pt">, +to +</span><span style="font-size: 10pt"><tt>num</tt></span><span style="font-size: 10pt"> +in a C program. +The obvious first attempt, +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>, x/n/ c/num/</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">is badly flawed: it changes not only the variable +</span><span style="font-size: 10pt"><tt>n</tt></span><span style="font-size: 10pt"> +but any letter +</span><span style="font-size: 10pt"><tt>n</tt></span><span style="font-size: 10pt"> +that appears. +We need to extract all the variables, and select those that match +</span><span style="font-size: 10pt"><tt>n</tt></span><span style="font-size: 10pt"> +and only +</span><span style="font-size: 10pt"><tt>n</tt></span><span style="font-size: 10pt">: +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>, x/[A-Za-z_][A-Za-z_0-9]*/ g/n/ v/../ c/num/</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The pattern +</span><span style="font-size: 10pt"><tt>[A-Za-z_][A-Za-z_0-9]*</tt></span><span style="font-size: 10pt"> +matches C identifiers. +Next +</span><span style="font-size: 10pt"><tt>g/n/</tt></span><span style="font-size: 10pt"> +selects those containing an +</span><span style="font-size: 10pt"><tt>n</tt></span><span style="font-size: 10pt">. +Then +</span><span style="font-size: 10pt"><tt>v/../</tt></span><span style="font-size: 10pt"> +rejects those containing two (or more) characters, and finally +</span><span style="font-size: 10pt"><tt>c/num/</tt></span><span style="font-size: 10pt"> +changes the remainder (identifiers +</span><span style="font-size: 10pt"><tt>n</tt></span><span style="font-size: 10pt">) +to +</span><span style="font-size: 10pt"><tt>num</tt></span><span style="font-size: 10pt">. +This version clearly works much better, but there may still be problems. +For example, in C character and string constants, the sequence +</span><span style="font-size: 10pt"><tt>\n</tt></span><span style="font-size: 10pt"> +is interpreted as a newline character, and we don’t want to change it to +</span><span style="font-size: 10pt"><tt>\num.</tt></span><span style="font-size: 10pt"> +This problem can be forestalled with a +</span><span style="font-size: 10pt"><tt>y</tt></span><span style="font-size: 10pt"> +command: +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>, y/\\n/ x/[A-Za-z_][A-Za-z_0-9]*/ g/n/ v/../ c/num/</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">(the second +</span><span style="font-size: 10pt"><tt>\</tt></span><span style="font-size: 10pt"> +is necessary because of lexical conventions in regular expressions), +or we could even reject character constants and strings outright: +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>,y/’[^’]*’/ y/"[^"]*"/ x/[A-Za-z_][A-Za-z_0-9]*/ g/n/ v/../ c/num/</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The +</span><span style="font-size: 10pt"><tt>y</tt></span><span style="font-size: 10pt"> +commands in this version exclude from consideration all character constants +and strings. +The only remaining problem is to deal with the possible occurrence of +</span><span style="font-size: 10pt"><tt>\’</tt></span><span style="font-size: 10pt"> +or +</span><span style="font-size: 10pt"><tt>\"</tt></span><span style="font-size: 10pt"> +within these sequences, but it’s easy to see how to resolve this difficulty. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The point of these composed commands is successive refinement. +A simple version of the command is tried, and if it’s not good enough, +it can be honed by adding a clause or two. +(Mistakes can be undone; see below. +Also, the mouse language makes it unnecessary to retype the command each time.) +The resulting chains of commands are somewhat reminiscent of +shell pipelines.<sup></sup></span><sup><span style="font-size: 6pt">7</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> +Unlike pipelines, though, which pass along modified +</span><span style="font-size: 10pt"><i>data</i></span><span style="font-size: 10pt">, +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +commands pass a +</span><span style="font-size: 10pt"><i>view</i></span><span style="font-size: 10pt"> +of the data. +The text at each step of the command is the same, but which pieces +are selected is refined step by step until the correct piece is +available to the final step of the command line, which ultimately makes the change. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">In other UNIX programs, regular expressions are used only for selection, +as in the +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +</span><span style="font-size: 10pt"><tt>g</tt></span><span style="font-size: 10pt"> +command, never for extraction as in the +</span><span style="font-size: 10pt"><tt>x</tt></span><span style="font-size: 10pt"> +or +</span><span style="font-size: 10pt"><tt>y</tt></span><span style="font-size: 10pt"> +command. +For example, patterns in +</span><span style="font-size: 10pt"><tt>awk</tt></span><span style="font-size: 10pt"><sup></sup></span><sup><span style="font-size: 6pt">7</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> +are used to select lines to be operated on, but cannot be used +to describe the format of the input text, or to handle newline-free text. +The use of regular expressions to describe the structure of a piece +of text rather than its contents, as in the +</span><span style="font-size: 10pt"><tt>x</tt></span><span style="font-size: 10pt"> +command, +has been given a name: +</span><span style="font-size: 10pt"><i>structural regular expressions. +</i></span><span style="font-size: 10pt">When they are composed, as in the above example, +they are pleasantly expressive. +Their use is discussed at greater length elsewhere.<sup></sup></span><sup><span style="font-size: 6pt">10</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"><b>Multiple files +</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"></span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt"> +has a few other commands, mostly relating to input and output. +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>e discfilename</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">replaces the contents and name of the current file with those of the named +disc file; +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>w discfilename</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">writes the contents to the named disc file; and +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>r discfilename</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">replaces dot with the contents of the named disc file. +All these commands use the current file’s name if none is specified. +Finally, +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>f discfilename</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">changes the name associated with the file and displays the result: +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>’-. discfilename</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">This output is called the file’s +</span><span style="font-size: 10pt"><i>menu line, +</i></span><span style="font-size: 10pt">because it is the contents of the file’s line in the button 3 menu (described +in the +next section). +The first three characters are a concise notation for the state of the file. +The apostrophe signifies that the file is modified. +The minus sign indicates the number of windows +open on the file (see the next section): +</span><span style="font-size: 10pt"><tt>-</tt></span><span style="font-size: 10pt"> +means none, +</span><span style="font-size: 10pt"><tt>+</tt></span><span style="font-size: 10pt"> +means one, and +</span><span style="font-size: 10pt"><tt>*</tt></span><span style="font-size: 10pt"> +means more than one. +Finally, the period indicates that this is the current file. +These characters are useful for controlling the +</span><span style="font-size: 10pt"><tt>X</tt></span><span style="font-size: 10pt"> +command, described shortly. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"></span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt"> +may be started with a set of disc files (such as all the source for +a program) by invoking it with a list of file names as arguments, and +more may be added or deleted on demand. +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>B discfile1 discfile2 ...</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">adds the named files to +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">’s +list, and +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>D discfile1 discfile2 ...</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">removes them from +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">’s +memory (without effect on associated disc files). +Both these commands have a syntax for using the shell<sup></sup></span><sup><span style="font-size: 6pt">7</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> +(the UNIX command interpreter) to generate the lists: +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>B <echo *.c</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">will add all C source files, and +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>B <grep -l variable *.c</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">will add all C source files referencing a particular variable +(the UNIX command +</span><span style="font-size: 10pt"><tt>grep\fP-l +lists all files in its arguments that contain matches of +the specified regular expression). +Finally, +</tt></span><span style="font-size: 10pt"><tt>D</tt></span><span style="font-size: 10pt"><tt> +without arguments deletes the current file. +</tt></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">There are two ways to change which file is current: +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>b filename</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">makes the named file current. +The +</span><span style="font-size: 10pt"><tt>B</tt></span><span style="font-size: 10pt"> +command +does the same, but also adds any new files to +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">’s +list. +(In practice, of course, the current file +is usually chosen by mouse actions, not by textual commands.) +The other way is to use a form of address that refers to files: +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>"</tt></span><span style="font-size: 9pt"><i>expression</i></span><span style="font-size: 9pt"><tt>" </tt></span><span style="font-size: 9pt"><i>address</i></span><span style="font-size: 9pt"><tt></tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">refers to the address evaluated in the file whose menu line +matches the expression (there must be exactly one match). +For example, +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>"peter.c" 3</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">refers to the third line of the file whose name matches +</span><span style="font-size: 10pt"><tt>peter.c</tt></span><span style="font-size: 10pt">. +This is most useful in the move +(</span><span style="font-size: 10pt"><tt>m</tt></span><span style="font-size: 10pt">) +and copy +(</span><span style="font-size: 10pt"><tt>t</tt></span><span style="font-size: 10pt">) +commands: +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>0,$ t "peter.c" 0</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">makes a copy of the current file at the beginning of +</span><span style="font-size: 10pt"><tt>peter.c</tt></span><span style="font-size: 10pt">. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The +</span><span style="font-size: 10pt"><tt>X</tt></span><span style="font-size: 10pt"> +command +is a looping construct, like +</span><span style="font-size: 10pt"><tt>x</tt></span><span style="font-size: 10pt">, +that refers to files instead of strings: +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>X/</tt></span><span style="font-size: 9pt"><i>expression</i></span><span style="font-size: 9pt"><tt>/ </tt></span><span style="font-size: 9pt"><i>command</i></span><span style="font-size: 9pt"><tt></tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">runs the command in all +files whose menu lines match the expression. The best example is +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>X/’/ w</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">which writes to disc all modified files. +</span><span style="font-size: 10pt"><tt>Y</tt></span><span style="font-size: 10pt"> +is the complement of +</span><span style="font-size: 10pt"><tt>X</tt></span><span style="font-size: 10pt">: +it runs the command on all files whose menu lines don’t match the expression: +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>Y/\.c/ D</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">deletes all files that don’t have +</span><span style="font-size: 10pt"><tt>.c</tt></span><span style="font-size: 10pt"> +in their names, that is, it keeps all C source files and deletes the rest. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Braces allow commands to be grouped, so +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>{</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>    </tt></span><span style="font-size: 9pt"><i>command1</i></span><span style="font-size: 9pt"><tt></tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>    </tt></span><span style="font-size: 9pt"><i>command2</i></span><span style="font-size: 9pt"><tt></tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>}</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">is syntactically a single command that runs two commands. +Thus, +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>X/\.c/ ,g/variable/ {</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>    f</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>    , x/.*\n/ g/variable/ p</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>}</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">finds all occurrences of +</span><span style="font-size: 10pt"><tt>variable</tt></span><span style="font-size: 10pt"> +in C source files, and prints +out the file names and lines of each match. +The precise semantics of compound operations is discussed in the implementation +sections below. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Finally, +the undo command, +</span><span style="font-size: 10pt"><tt>u</tt></span><span style="font-size: 10pt">, +undoes the last command, +no matter how many files were affected. +Multiple undo operations move further back in time, so +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>u</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>u</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">(which may be abbreviated +</span><span style="font-size: 10pt"><tt>u2</tt></span><span style="font-size: 10pt">) +undoes the last two commands. An undo may not be undone, however, nor +may any command that adds or deletes files. +Everything else is undoable, though, including for example +</span><span style="font-size: 10pt"><tt>e</tt></span><span style="font-size: 10pt"> +commands: +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>e filename</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>u</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">restores the state of the file completely, including its name, dot, +and modified bit. Because of the undo, potentially dangerous commands +are not guarded by confirmations. Only +</span><span style="font-size: 10pt"><tt>D</tt></span><span style="font-size: 10pt">, +which destroys the information necessary to restore itself, is protected. +It will not delete a modified file, but a second +</span><span style="font-size: 10pt"><tt>D</tt></span><span style="font-size: 10pt"> +of the same file will succeed regardless. +The +</span><span style="font-size: 10pt"><tt>q</tt></span><span style="font-size: 10pt"> +command, which exits +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">, +is similarly guarded. +</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"><b>Mouse Interface +</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"></span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt"> +is most commonly run +connected to a bitmap display and mouse for interactive editing. +The only difference in the command language +between regular, mouse-driven +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +and +</span><span style="font-size: 10pt"><tt>sam\fP-d +is that if an address +is provided without a command, +</tt></span><span style="font-size: 10pt"><tt>sam\fP-d +will print the text referenced by the address, but +regular +</tt></span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"><tt> +will highlight it on the screen — in fact, +dot is always highlighted (see Figure 2). +</tt></span><span style="font-size: 10pt"></span></p><center><img src="fig3.gif" /></center> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 8pt"><i>Figure 2. A +</i></span><span style="font-size: 8pt"><tt>sam</tt></span><span style="font-size: 8pt"><i> +window. The scroll bar down the left +represents the file, with the bubble showing the fraction +visible in the window. +The scroll bar may be manipulated by the mouse for convenient browsing. +The current text, +which is highlighted, need not fit on a line. Here it consists of one partial +line, one complete line, and final partial line. +</i></span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="margin-top: 0; margin-bottom: 0.02in"></p> + +<p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Each file may have zero or more windows open on the display. +At any time, only one window in all of +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +is the +</span><span style="font-size: 10pt"><i>current window, +</i></span><span style="font-size: 10pt">that is, the window to which typing and mouse actions refer; +this may be the +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +window (that in which commands may be typed) +or one of the file windows. +When a file has multiple windows, the image of the file in each window +is always kept up to date. +The current file is the last file affected by a command, +so if the +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +window is current, +the current window is not a window on the current file. +However, each window on a file has its own value of dot, +and when switching between windows on a single file, +the file’s value of dot is changed to that of the window. +Thus, flipping between windows behaves in the obvious, convenient way. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The mouse on the Blit has three buttons, numbered left to right. +Button 3 has a list of commands to manipulate windows, +followed by a list of ‘menu lines’ exactly as printed by the +</span><span style="font-size: 10pt"><tt>f</tt></span><span style="font-size: 10pt"> +command, one per file (not one per window). +These menu lines are sorted by file name. +If the list is long, the Blit menu software will make it more manageable +by generating a scrolling menu instead of an unwieldy long list. +Using the menu to select a file from the list makes that file the current +file, and the most recently current window in that file the current window. +But if that file is already current, selecting it in the menu cycles through +the windows on the file; this simple trick avoids a special menu to +choose windows on a file. +If there is no window open on the file, +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +changes the mouse cursor to prompt the user to create one. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The commands on the button 3 menu are straightforward (see Figure 3), and +are like the commands to manipulate windows in +</span><span style="font-size: 10pt"><tt>mux</tt></span><span style="font-size: 10pt">,<sup></sup></span><sup><span style="font-size: 6pt">8</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> +the Blit’s window system. +</span><span style="font-size: 10pt"><tt>New</tt></span><span style="font-size: 10pt"> +makes a new file, and gives it one empty window, whose size is determined +by a rectangle swept by the mouse. +</span><span style="font-size: 10pt"><tt>Zerox</tt></span><span style="font-size: 10pt"> +prompts for a window to be selected, and +makes a clone of that window; this is how multiple windows are created on one file. +</span><span style="font-size: 10pt"><tt>Reshape</tt></span><span style="font-size: 10pt"> +changes the size of the indicated window, and +</span><span style="font-size: 10pt"><tt>close</tt></span><span style="font-size: 10pt"> +deletes it. If that is the last window open on the file, +</span><span style="font-size: 10pt"><tt>close</tt></span><span style="font-size: 10pt"> +first does a +</span><span style="font-size: 10pt"><tt>D</tt></span><span style="font-size: 10pt"> +command on the file. +</span><span style="font-size: 10pt"><tt>Write</tt></span><span style="font-size: 10pt"> +is identical to a +</span><span style="font-size: 10pt"><tt>w</tt></span><span style="font-size: 10pt"> +command on the file; it is in the menu purely for convenience. +Finally, +</span><span style="font-size: 10pt"><tt>~~sam~~</tt></span><span style="font-size: 10pt"> +is a menu item that appears between the commands and the file names. +Selecting it makes the +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +window the current window, +causing subsequent typing to be interpreted as commands. +</span><span style="font-size: 10pt"></span></p><center><img src="fig2.gif" /></center> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 8pt"><i>Figure 3. The menu on button 3. +The black rectangle on the left is a scroll bar; the menu is limited to +the length shown to prevent its becoming unwieldy. +Above the +</i></span><span style="font-size: 8pt"><tt>~~sam~~</tt></span><span style="font-size: 8pt"><i> +line is a list of commands; +beneath it is a list of files, presented exactly as with the +</i></span><span style="font-size: 8pt"><tt>f</tt></span><span style="font-size: 8pt"><i> +command. +</i></span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="margin-top: 0; margin-bottom: 0.02in"></p> + +<p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">When +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +requests that a window be swept, in response to +</span><span style="font-size: 10pt"><tt>new</tt></span><span style="font-size: 10pt">, +</span><span style="font-size: 10pt"><tt>zerox</tt></span><span style="font-size: 10pt"> +or +</span><span style="font-size: 10pt"><tt>reshape</tt></span><span style="font-size: 10pt">, +it changes the mouse cursor from the usual arrow to a box with +a small arrow. +In this state, the mouse may be used to indicate an arbitrary rectangle by +pressing button 3 at one corner and releasing it at the opposite corner. +More conveniently, +button 3 may simply be clicked, +whereupon +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +creates the maximal rectangle that contains the cursor +and abuts the +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +window. +By placing the +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +window in the middle of the screen, the user can define two regions (one above, +one below) in which stacked fully-overlapping +windows can be created with minimal fuss (see Figure 1). +This simple user interface trick makes window creation noticeably easier. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The cut-and-paste editor is essentially the same as that in Smalltalk-80.<sup></sup></span><sup><span style="font-size: 6pt">11</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> +The text in dot is always highlighted on the screen. +When a character is typed it replaces dot, and sets dot to the null +string after the character. Thus, ordinary typing inserts text. +Button 1 is used for selection: +pressing the button, moving the mouse, and lifting the button +selects (sets dot to) the text between the points where the +button was pressed and released. +Pressing and releasing at the same point selects a null string; this +is called clicking. Clicking twice quickly, or +</span><span style="font-size: 10pt"><i>double clicking, +</i></span><span style="font-size: 10pt">selects larger objects; +for example, double clicking in a word selects the word, +double clicking just inside an opening bracket selects the text +contained in the brackets (handling nested brackets correctly), +and similarly for +parentheses, quotes, and so on. +The double-clicking rules reflect a bias toward +programmers. +If +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +were intended more for word processing, double-clicks would probably +select linguistic structures such as sentences. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">If button 1 is pressed outside the current window, it makes the indicated +window current. +This is the easiest way to switch between windows and files. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Pressing button 2 brings up a menu of editing functions (see Figure 4). +These mostly apply to the selected text: +</span><span style="font-size: 10pt"><tt>cut</tt></span><span style="font-size: 10pt"> +deletes the selected text, and remembers it in a hidden buffer called the +</span><span style="font-size: 10pt"><i>snarf buffer, +</i></span><span style="font-size: 10pt"></span><span style="font-size: 10pt"><tt>paste</tt></span><span style="font-size: 10pt"> +replaces the selected text by the contents of the snarf buffer, +</span><span style="font-size: 10pt"><tt>snarf</tt></span><span style="font-size: 10pt"> +just copies the selected text to the snarf buffer, +</span><span style="font-size: 10pt"><tt>look</tt></span><span style="font-size: 10pt"> +searches forward for the next literal occurrence of the selected text, and +</span><span style="font-size: 10pt"><tt><mux></tt></span><span style="font-size: 10pt"> +exchanges snarf buffers with the window system in which +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +is running. +Finally, the last regular expression used appears as a menu entry +to search +forward for the next occurrence of a match for the expression. +</span><span style="font-size: 10pt"></span></p><center><img src="fig4.gif" /></center> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 8pt"><i>Figure 4. The menu on button 2. +The bottom entry tracks the most recently used regular expression, which may +be literal text. +</i></span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="margin-top: 0; margin-bottom: 0.02in"></p> + +<p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The relationship between the command language and the mouse language is +entirely due to the equality of dot and the selected text chosen +with button 1 on the mouse. +For example, to make a set of changes in a C subroutine, dot can be +set by double clicking on the left brace that begins the subroutine, +which sets dot for the command language. +An address-free command then typed in the +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +window will apply only to the text between the opening and closing +braces of the function. +The idea is to select what you want, and then say what you want +to do with it, whether invoked by a menu selection or by a typed command. +And of course, the value of dot is highlighted on +the display after the command completes. +This relationship between mouse interface and command language +is clumsy to explain, but comfortable, even natural, in practice. +</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"><b>The Implementation +</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The next few sections describe how +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +is put together, first the host part, +then the inter-component communication, +then the terminal part. +After explaining how the command language is implemented, +the discussion follows (roughly) the path of a character +from the temporary file on disc to the screen. +The presentation centers on the data structures, +because that is how the program was designed and because +the algorithms are easy to provide, given the right data +structures. +</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"><b>Parsing and execution +</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The command language is interpreted by parsing each command with a +table-driven recursive +descent parser, and when a complete command is assembled, invoking a top-down +executor. +Most editors instead employ a simple character-at-a-time +lexical scanner. +Use of a parser makes it +easy and unambiguous to detect when a command is complete, +which has two advantages. +First, escape conventions such as backslashes to quote +multiple-line commands are unnecessary; if the command isn’t finished, +the parser keeps reading. For example, a multiple-line append driven by an +</span><span style="font-size: 10pt"><tt>x</tt></span><span style="font-size: 10pt"> +command is straightforward: +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>x/.*\n/ g/Peter/ a</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>one line about Peter</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>another line about Peter</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>.</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Other UNIX editors would require a backslash after all but the last line. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The other advantage is specific to the two-process structure of +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">. +The host process must decide when a command is completed so the +command interpreter can be called. This problem is easily resolved +by having the lexical analyzer read the single stream of events from the +terminal, directly executing all typing and mouse commands, +but passing to the parser characters typed to the +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +command window. +This scheme is slightly complicated by the availability of cut-and-paste +editing in the +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +window, but that difficulty is resolved by applying the rules +used in +</span><span style="font-size: 10pt"><tt>mux</tt></span><span style="font-size: 10pt">: +when a newline is typed to the +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +window, all text between the newline and the previously typed newline +is made available to the parser. +This permits arbitrary editing to be done to a command before +typing newline and thereby requesting execution. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The parser is driven by a table because the syntax of addresses +and commands is regular enough +to be encoded compactly. There are few special cases, such as the +replacement text in a substitution, so the syntax of almost all commands +can be encoded with a few flags. +These include whether the command allows an address (for example, +</span><span style="font-size: 10pt"><tt>e</tt></span><span style="font-size: 10pt"> +does not), whether it takes a regular expression (as in +</span><span style="font-size: 10pt"><tt>x</tt></span><span style="font-size: 10pt"> +and +</span><span style="font-size: 10pt"><tt>s</tt></span><span style="font-size: 10pt">), +whether it takes replacement text (as in +</span><span style="font-size: 10pt"><tt>c</tt></span><span style="font-size: 10pt"> +or +</span><span style="font-size: 10pt"><tt>i</tt></span><span style="font-size: 10pt">), +which may be multi-line, and so on. +The internal syntax of regular expressions is handled by a separate +parser; a regular expression is a leaf of the command parse tree. +Regular expressions are discussed fully in the next section. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The parser table also has information about defaults, so the interpreter +is always called with a complete tree. For example, the parser fills in +the implicit +</span><span style="font-size: 10pt"><tt>0</tt></span><span style="font-size: 10pt"> +and +</span><span style="font-size: 10pt"><tt>$</tt></span><span style="font-size: 10pt"> +in the abbreviated address +</span><span style="font-size: 10pt"><tt>,</tt></span><span style="font-size: 10pt"> +(comma), +inserts a +</span><span style="font-size: 10pt"><tt>+</tt></span><span style="font-size: 10pt"> +to the left of an unadorned regular expression in an address, +and provides the usual default address +</span><span style="font-size: 10pt"><tt>.</tt></span><span style="font-size: 10pt"> +(dot) for commands that expect an address but are not given one. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Once a complete command is parsed, the evaluation is easy. +The address is evaluated left-to-right starting from the value of dot, +with a mostly ordinary expression evaluator. +Addresses, like many of the data structures in +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">, +are held in a C structure and passed around by value: +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>typedef long Posn;    /* Position in a file */</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>typedef struct Range{</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>        Posn    p1, p2;</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>}Range;</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>typedef struct Address{</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>        Range   r;</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>        File    *f;</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>}Address;</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">An address is encoded as a substring (character positions +</span><span style="font-size: 10pt"><tt>p1</tt></span><span style="font-size: 10pt"> +to +</span><span style="font-size: 10pt"><tt>p2</tt></span><span style="font-size: 10pt">) +in a file +</span><span style="font-size: 10pt"><tt>f</tt></span><span style="font-size: 10pt">. +(The data type +</span><span style="font-size: 10pt"><tt>File</tt></span><span style="font-size: 10pt"> +is described in detail below.) +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The address interpreter is an +</span><span style="font-size: 10pt"><tt>Address</tt></span><span style="font-size: 10pt">-valued +function that traverses the parse tree describing an address (the +parse tree for the address has type +</span><span style="font-size: 10pt"><tt>Addrtree</tt></span><span style="font-size: 10pt">): +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>Address</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>address(ap, a, sign)</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>    Addrtree *ap;</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>    Address a;</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>    int sign;</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>{</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>    Address a2;</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>    do</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>        switch(ap->type){</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>        case ’.’:</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>            a=a.f->dot;</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>            break;</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>        case ’$’:</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>            a.r.p1=a.r.p2=a.f->nbytes;</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>            break;</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>        case ’"’:   </tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>            a=matchfile(a, ap->aregexp)->dot; </tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>            break;</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>        case ’,’:</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>            a2=address(ap->right, a, 0);</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>            a=address(ap->left, a, 0);</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>            if(a.f!=a2.f || a2.r.p2<a.r.p1)</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>                error(Eorder);</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>            a.r.p2=a2.r.p2;</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>            return a;</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>        /* and so on */</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>        }</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>    while((ap=ap->right)!=0);</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>    return a;</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>}</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Throughout, errors are handled by a non-local +</span><span style="font-size: 10pt"><tt>goto</tt></span><span style="font-size: 10pt"> +(a +</span><span style="font-size: 10pt"><tt>setjmp/longjmp</tt></span><span style="font-size: 10pt"> +in C terminology) +hidden in a routine called +</span><span style="font-size: 10pt"><tt>error</tt></span><span style="font-size: 10pt"> +that immediately aborts the execution, retracts any +partially made changes (see the section below on ‘undoing’), and +returns to the top level of the parser. +The argument to +</span><span style="font-size: 10pt"><tt>error</tt></span><span style="font-size: 10pt"> +is an enumeration type that +is translated to a terse but possibly helpful +message such as ‘?addresses out of order.’ +Very common messages are kept short; for example the message for +a failed regular expression search is ‘?search.’ +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Character addresses such as +</span><span style="font-size: 10pt"><tt>#3</tt></span><span style="font-size: 10pt"> +are trivial to implement, as the +</span><span style="font-size: 10pt"><tt>File</tt></span><span style="font-size: 10pt"> +data structure is accessible by character number. +However, +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +keeps no information about the position of newlines — it is too +expensive to track dynamically — so line addresses are computed by reading +the file, counting newlines. Except in very large files, this has proven +acceptable: file access is fast enough to make the technique practical, +and lines are not central to the structure of the command language. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The command interpreter, called +</span><span style="font-size: 10pt"><tt>cmdexec</tt></span><span style="font-size: 10pt">, +is also straightforward. The parse table includes a +function to call to interpret a particular command. That function +receives as arguments +the calculated address +for the command +and the command tree (of type +</span><span style="font-size: 10pt"><tt>Cmdtree</tt></span><span style="font-size: 10pt">), +which may contain information such as the subtree for compound commands. +Here, for example, is the function for the +</span><span style="font-size: 10pt"><tt>g</tt></span><span style="font-size: 10pt"> +and +</span><span style="font-size: 10pt"><tt>v</tt></span><span style="font-size: 10pt"> +commands: +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>int</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>g_cmd(a, cp)</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>    Address a;</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>    Cmdtree *cp;</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>{</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>    compile(cp->regexp);</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>    if(execute(a.f, a.r.p1, a.r.p2)!=(cp->cmdchar==’v’)){</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>        a.f->dot=a;</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>        return cmdexec(a, cp->subcmd);</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>    }</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>    return TRUE;    /* cause execution to continue */</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>}</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">(</span><span style="font-size: 10pt"><tt>Compile</tt></span><span style="font-size: 10pt"> +and +</span><span style="font-size: 10pt"><tt>execute</tt></span><span style="font-size: 10pt"> +are part of the regular expression code, described in the next section.) +Because the parser and the +</span><span style="font-size: 10pt"><tt>File</tt></span><span style="font-size: 10pt"> +data structure do most of the work, most commands +are similarly brief. +</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"><b>Regular expressions +</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The regular expression code in +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +is an interpreted, rather than compiled on-the-fly, implementation of Thompson’s +non-deterministic finite automaton algorithm.<sup></sup></span><sup><span style="font-size: 6pt">12</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> +The syntax and semantics of the expressions are as in the UNIX program +</span><span style="font-size: 10pt"><tt>egrep</tt></span><span style="font-size: 10pt">, +including alternation, closures, character classes, and so on. +The only changes in the notation are two additions: +</span><span style="font-size: 10pt"><tt>\n</tt></span><span style="font-size: 10pt"> +is translated to, and matches, a newline character, and +</span><span style="font-size: 10pt"><tt>@</tt></span><span style="font-size: 10pt"> +matches any character. In +</span><span style="font-size: 10pt"><tt>egrep</tt></span><span style="font-size: 10pt">, +the character +</span><span style="font-size: 10pt"><tt>.</tt></span><span style="font-size: 10pt"> +matches any character except newline, and in +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +the same rule seemed safest, to prevent idioms like +</span><span style="font-size: 10pt"><tt>.*</tt></span><span style="font-size: 10pt"> +from spanning newlines. +</span><span style="font-size: 10pt"><tt>Egrep</tt></span><span style="font-size: 10pt"> +expressions are arguably too complicated for an interactive editor — +certainly it would make sense if all the special characters were two-character +sequences, so that most of the punctuation characters wouldn’t have +peculiar meanings — but for an interesting command language, full +regular expressions are necessary, and +</span><span style="font-size: 10pt"><tt>egrep</tt></span><span style="font-size: 10pt"> +defines the full regular expression syntax for UNIX programs. +Also, it seemed superfluous to define a new syntax, since various UNIX programs +(</span><span style="font-size: 10pt"><tt>ed</tt></span><span style="font-size: 10pt">, +</span><span style="font-size: 10pt"><tt>egrep</tt></span><span style="font-size: 10pt"> +and +</span><span style="font-size: 10pt"><tt>vi</tt></span><span style="font-size: 10pt">) +define too many already. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The expressions are compiled by a routine, +</span><span style="font-size: 10pt"><tt>compile</tt></span><span style="font-size: 10pt">, +that generates the description of the non-deterministic finite state machine. +A second routine, +</span><span style="font-size: 10pt"><tt>execute</tt></span><span style="font-size: 10pt">, +interprets the machine to generate the leftmost-longest match of the +expression in a substring of the file. +The algorithm is described elsewhere.<sup></sup></span><sup><span style="font-size: 6pt">12,13</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> +</span><span style="font-size: 10pt"><tt>Execute</tt></span><span style="font-size: 10pt"> +reports +whether a match was found, and sets a global variable, +of type +</span><span style="font-size: 10pt"><tt>Range</tt></span><span style="font-size: 10pt">, +to the substring matched. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">A trick is required to evaluate the expression in reverse, such as when +searching backwards for an expression. +For example, +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>-/P.*r/</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">looks backwards through the file for a match of the expression. +The expression, however, is defined for a forward search. +The solution is to construct a machine identical to the machine +for a forward search except for a reversal of all the concatenation +operators (the other operators are symmetric under direction reversal), +to exchange the meaning of the operators +</span><span style="font-size: 10pt"><tt>^</tt></span><span style="font-size: 10pt"> +and +</span><span style="font-size: 10pt"><tt>$</tt></span><span style="font-size: 10pt">, +and then to read the file backwards, looking for the +usual earliest longest match. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"></span><span style="font-size: 10pt"><tt>Execute</tt></span><span style="font-size: 10pt"> +generates only one match each time it is called. +To interpret looping constructs such as the +</span><span style="font-size: 10pt"><tt>x</tt></span><span style="font-size: 10pt"> +command, +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +must therefore synchronize between +calls of +</span><span style="font-size: 10pt"><tt>execute</tt></span><span style="font-size: 10pt"> +to avoid +problems with null matches. +For example, even given the leftmost-longest rule, +the expression +</span><span style="font-size: 10pt"><tt>a*</tt></span><span style="font-size: 10pt"> +matches three times in the string +</span><span style="font-size: 10pt"><tt>ab</tt></span><span style="font-size: 10pt"> +(the character +</span><span style="font-size: 10pt"><tt>a</tt></span><span style="font-size: 10pt">, +the null string between the +</span><span style="font-size: 10pt"><tt>a</tt></span><span style="font-size: 10pt"> +and +</span><span style="font-size: 10pt"><tt>b</tt></span><span style="font-size: 10pt">, +and the final null string). +After returning a match for the +</span><span style="font-size: 10pt"><tt>a</tt></span><span style="font-size: 10pt">, +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +must not match the null string before the +</span><span style="font-size: 10pt"><tt>b</tt></span><span style="font-size: 10pt">. +The algorithm starts +</span><span style="font-size: 10pt"><tt>execute</tt></span><span style="font-size: 10pt"> +at the end of its previous match, and +if the match it returns +is null and abuts the previous match, rejects the match and advances +the initial position one character. +</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"><b>Memory allocation +</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The C language has no memory allocation primitives, although a standard +library routine, +</span><span style="font-size: 10pt"><tt>malloc</tt></span><span style="font-size: 10pt">, +provides adequate service for simple programs. +For specific uses, however, +it can be better to write a custom allocator. +The allocator (or rather, pair of allocators) described here +work in both the terminal and host parts of +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">. +They are designed for efficient manipulation of strings, +which are allocated and freed frequently and vary in length from essentially +zero to 32 Kbytes (very large strings are written to disc). +More important, strings may be large and change size often, +so to minimize memory usage it is helpful to reclaim and to coalesce the +unused portions of strings when they are truncated. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Objects to be allocated in +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +are of two flavors: +the first is C +</span><span style="font-size: 10pt"><tt>structs</tt></span><span style="font-size: 10pt">, +which are small and often addressed by pointer variables; +the second is variable-sized arrays of characters +or integers whose +base pointer is always used to access them. +The memory allocator in +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +is therefore in two parts: +first, a traditional first-fit allocator that provides fixed storage for +</span><span style="font-size: 10pt"><tt>structs</tt></span><span style="font-size: 10pt">; +and second, a garbage-compacting allocator that reduces storage +overhead for variable-sized objects, at the cost of some bookkeeping. +The two types of objects are allocated from adjoining arenas, with +the garbage-compacting allocator controlling the arena with higher addresses. +Separating into two arenas simplifies compaction and prevents fragmentation due +to immovable objects. +The access rules for garbage-compactable objects +(discussed in the next paragraph) allow them to be relocated, so when +the first-fit arena needs space, it moves the garbage-compacted arena +to higher addresses to make room. Storage is therefore created only +at successively higher addresses, either when more garbage-compacted +space is needed or when the first-fit arena pushes up the other arena. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Objects that may be compacted declare to the +allocator a cell that is guaranteed to be the sole repository of the +address of the object whenever a compaction can occur. +The compactor can then update the address when the object is moved. +For example, the implementation of type +</span><span style="font-size: 10pt"><tt>List</tt></span><span style="font-size: 10pt"> +(really a variable-length array) +is: +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>typedef struct List{</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>        int     nused;</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>        long    *ptr;</tt></span></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>}List;</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The +</span><span style="font-size: 10pt"><tt>ptr</tt></span><span style="font-size: 10pt"> +cell must always be used directly, and never copied. When a +</span><span style="font-size: 10pt"><tt>List</tt></span><span style="font-size: 10pt"> +is to be created the +</span><span style="font-size: 10pt"><tt>List</tt></span><span style="font-size: 10pt"> +structure is allocated in the ordinary first-fit arena +and its +</span><span style="font-size: 10pt"><tt>ptr</tt></span><span style="font-size: 10pt"> +is allocated in the garbage-compacted arena. +A similar data type for strings, called +</span><span style="font-size: 10pt"><tt>String</tt></span><span style="font-size: 10pt">, +stores variable-length character arrays of up to 32767 elements. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">A related matter of programming style: +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +frequently passes structures by value, which +simplifies the code. +Traditionally, C programs have +passed structures by reference, but implicit allocation on +the stack is easier to use. +Structure passing is a relatively new feature of C +(it is not in the +standard reference manual for C<sup></sup></span><sup><span style="font-size: 6pt">14</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt">), and is poorly supported in most +commercial C compilers. +It’s convenient and expressive, though, +and simplifies memory management by +avoiding the allocator altogether +and eliminating pointer aliases. +</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"><b>Data structures for manipulating files +</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Experience with +</span><span style="font-size: 10pt"><tt>jim</tt></span><span style="font-size: 10pt"> +showed that the requirements +of the file data structure were few, but strict. +First, files need to be read and written quickly; +adding a fresh file must be painless. +Second, the implementation must place no arbitrary upper limit on +the number or sizes of files. (It should be practical to edit many files, +and files up to megabytes in length should be handled gracefully.) +This implies that files be stored on disc, not in main memory. +(Aficionados of virtual memory may argue otherwise, but the +implementation of virtual +memory in our system is not something to depend on +for good performance.) +Third, changes to files need be made by only two primitives: +deletion and insertion. +These are inverses of each other, +which simplifies the implementation of the undo operation. +Finally, +it must be easy and efficient to access the file, either +forwards or backwards, a byte at a time. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The +</span><span style="font-size: 10pt"><tt>File</tt></span><span style="font-size: 10pt"> +data type is constructed from three simpler data structures that hold arrays +of characters. +Each of these types has an insertion and deletion operator, and the +insertion and deletion operators of the +</span><span style="font-size: 10pt"><tt>File</tt></span><span style="font-size: 10pt"> +type itself are constructed from them. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The simplest type is the +</span><span style="font-size: 10pt"><tt>String</tt></span><span style="font-size: 10pt">, +which is used to hold strings in main memory. +The code that manages +</span><span style="font-size: 10pt"><tt>Strings</tt></span><span style="font-size: 10pt"> +guarantees that they will never be longer +than some moderate size, and in practice they are rarely larger than 8 Kbytes. +</span><span style="font-size: 10pt"><tt>Strings</tt></span><span style="font-size: 10pt"> +have two purposes: they hold short strings like file names with little overhead, +and because they are deliberately small, they are efficient to modify. +They are therefore used as the data structure for in-memory caches. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The disc copy of the file is managed by a data structure called a +</span><span style="font-size: 10pt"><tt>Disc</tt></span><span style="font-size: 10pt">, +which corresponds to a temporary file. A +</span><span style="font-size: 10pt"><tt>Disc</tt></span><span style="font-size: 10pt"> +has no storage in main memory other than bookkeeping information; +the actual data being held is all on the disc. +To reduce the number of open files needed, +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +opens a dozen temporary UNIX files and multiplexes the +</span><span style="font-size: 10pt"><tt>Discs</tt></span><span style="font-size: 10pt"> +upon them. +This permits many files to +be edited; the entire +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +source (48 files) may be edited comfortably with a single +instance of +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">. +Allocating one temporary file per +</span><span style="font-size: 10pt"><tt>Disc</tt></span><span style="font-size: 10pt"> +would strain the operating system’s limit on the number of open files. +Also, spreading the traffic among temporary files keeps the files shorter, +and shorter files are more efficiently implemented by the UNIX +I/O subsystem. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">A +</span><span style="font-size: 10pt"><tt>Disc</tt></span><span style="font-size: 10pt"> +is an array of fixed-length blocks, each of which contains +between 1 and 4096 characters of active data. +(The block size of our UNIX file system is 4096 bytes.) +The block addresses within the temporary file and the length of each +block are stored in a +</span><span style="font-size: 10pt"><tt>List</tt></span><span style="font-size: 10pt">. +When changes are made the live part of blocks may change size. +Blocks are created and coalesced when necessary to try to keep the sizes +between 2048 and 4096 bytes. +An actively changing part of the +</span><span style="font-size: 10pt"><tt>Disc</tt></span><span style="font-size: 10pt"> +therefore typically has about a kilobyte of slop that can be +inserted or deleted +without changing more than one block or affecting the block order. +When an insertion would overflow a block, the block is split, a new one +is allocated to receive the overflow, and the memory-resident list of blocks +is rearranged to reflect the insertion of the new block. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Obviously, going to the disc for every modification to the file is +prohibitively expensive. +The data type +</span><span style="font-size: 10pt"><tt>Buffer</tt></span><span style="font-size: 10pt"> +consists of a +</span><span style="font-size: 10pt"><tt>Disc</tt></span><span style="font-size: 10pt"> +to hold the data and a +</span><span style="font-size: 10pt"><tt>String</tt></span><span style="font-size: 10pt"> +that acts as a cache. +This is the first of a series of caches throughout the data structures in +</span><span style="font-size: 10pt"><tt>sam.</tt></span><span style="font-size: 10pt"> +The caches not only improve performance, they provide a way to organize +the flow of data, particularly in the communication between the host +and terminal. +This idea is developed below, in the section on communications. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">To reduce disc traffic, changes to a +</span><span style="font-size: 10pt"><tt>Buffer</tt></span><span style="font-size: 10pt"> +are mediated by a variable-length string, in memory, that acts as a cache. +When an insertion or deletion is made to a +</span><span style="font-size: 10pt"><tt>Buffer</tt></span><span style="font-size: 10pt">, +if the change can be accommodated by the cache, it is done there. +If the cache becomes bigger than a block because of an insertion, +some of it is written to the +</span><span style="font-size: 10pt"><tt>Disc</tt></span><span style="font-size: 10pt"> +and deleted from the cache. +If the change does not intersect the cache, the cache is flushed. +The cache is only loaded at the new position if the change is smaller than a block; +otherwise, it is sent directly to the +</span><span style="font-size: 10pt"><tt>Disc</tt></span><span style="font-size: 10pt">. +This is because +large changes are typically sequential, +whereupon the next change is unlikely to overlap the current one. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">A +</span><span style="font-size: 10pt"><tt>File</tt></span><span style="font-size: 10pt"> +comprises a +</span><span style="font-size: 10pt"><tt>String</tt></span><span style="font-size: 10pt"> +to hold the file name and some ancillary data such as dot and the modified bit. +The most important components, though, are a pair of +</span><span style="font-size: 10pt"><tt>Buffers</tt></span><span style="font-size: 10pt">, +one called the transcript and the other the contents. +Their use is described in the next section. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The overall structure is shown in Figure 5. +Although it may seem that the data is touched many times on its +way from the +</span><span style="font-size: 10pt"><tt>Disc</tt></span><span style="font-size: 10pt">, +it is read (by one UNIX system call) directly into the cache of the +associated +</span><span style="font-size: 10pt"><tt>Buffer</tt></span><span style="font-size: 10pt">; +no extra copy is done. +Similarly, when flushing the cache, the text is written +directly from the cache to disc. +Most operations act directly on the text in the cache. +A principle applied throughout +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +is that the fewer times the data is copied, the faster the program will run +(see also the paper by Waite<sup></sup></span><sup><span style="font-size: 6pt">15</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt">). +</span><span style="font-size: 10pt"></span></p><center><img src="sam2.png"></center> +</center> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 8pt"><i>Figure 5. File data structures. +The temporary files are stored in the standard repository for such files +on the host system. +</i></span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="margin-top: 0; margin-bottom: 0.02in"></p> + +<p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The contents of a +</span><span style="font-size: 10pt"><tt>File</tt></span><span style="font-size: 10pt"> +are accessed by a routine that +copies to a buffer a substring of a file starting at a specified offset. +To read a byte at a time, a +per-</span><span style="font-size: 10pt"><tt>File</tt></span><span style="font-size: 10pt"> +array is loaded starting from a specified initial position, +and bytes may then be read from the array. +The implementation is done by a macro similar to the C standard I/O +</span><span style="font-size: 10pt"><tt>getc</tt></span><span style="font-size: 10pt"> +macro.<sup></sup></span><sup><span style="font-size: 6pt">14</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> +Because the reading may be done at any address, a minor change to the +macro allows the file to be read backwards. +This array is read-only; there is no +</span><span style="font-size: 10pt"><tt>putc</tt></span><span style="font-size: 10pt">. +</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"><b>Doing and undoing +</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"></span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt"> +has an unusual method for managing changes to files. +The command language makes it easy to specify multiple variable-length changes +to a file millions of bytes long, and such changes +must be made efficiently if the editor is to be practical. +The usual techniques for inserting and deleting strings +are inadequate under these conditions. +The +</span><span style="font-size: 10pt"><tt>Buffer</tt></span><span style="font-size: 10pt"> +and +</span><span style="font-size: 10pt"><tt>Disc</tt></span><span style="font-size: 10pt"> +data structures are designed for efficient random access to long strings, +but care must be taken to avoid super-linear behavior when making +many changes simultaneously. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"></span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt"> +uses a two-pass algorithm for making changes, and treats each file as a database +against which transactions are registered. +Changes are not made directly to the contents. +Instead, when a command is started, a ‘mark’ containing +a sequence number is placed in the transcript +</span><span style="font-size: 10pt"><tt>Buffer</tt></span><span style="font-size: 10pt">, +and each change made to the file, either an insertion or deletion +or a change to the file name, +is appended to the end of the transcript. +When the command is complete, the transcript is rewound to the +mark and applied to the contents. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">One reason for separating evaluation from +application in this way is to simplify tracking the addresses of changes +made in the middle of a long sequence. +The two-pass algorithm also allows all changes to apply to the +</span><span style="font-size: 10pt"><i>original</i></span><span style="font-size: 10pt"> +data: no change can affect another change made in the same command. +This is particularly important when evaluating an +</span><span style="font-size: 10pt"><tt>x</tt></span><span style="font-size: 10pt"> +command because it prevents regular expression matches +from stumbling over changes made earlier in the execution. +Also, the two-pass +algorithm is cleaner than the way other UNIX editors allow changes to +affect each other; +for example, +</span><span style="font-size: 10pt"><tt>ed</tt></span><span style="font-size: 10pt">’s +idioms to do things like delete every other line +depend critically on the implementation. +Instead, +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">’s +simple model, in which all changes in a command occur effectively +simultaneously, is easy to explain and to understand. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The records in the transcript are of the form ‘‘delete substring from +locations +123 to 456’’ and ‘‘insert 11 characters ‘hello there’ at location 789.’’ +(It is an error if the changes are not at monotonically greater +positions through the file.) +While the update is occurring, these numbers must be +offset by earlier changes, but that is straightforward and +local to the update routine; +moreover, all the numbers have been computed +before the first is examined. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Treating the file as a transaction system has another advantage: +undo is trivial. +All it takes is to invert the transcript after it has been +implemented, converting insertions +into deletions and vice versa, and saving them in a holding +</span><span style="font-size: 10pt"><tt>Buffer</tt></span><span style="font-size: 10pt">. +The ‘do’ transcript can then be deleted from +the transcript +</span><span style="font-size: 10pt"><tt>Buffer</tt></span><span style="font-size: 10pt"> +and replaced by the ‘undo’ transcript. +If an undo is requested, the transcript is rewound and the undo transcript +executed. +Because the transcript +</span><span style="font-size: 10pt"><tt>Buffer</tt></span><span style="font-size: 10pt"> +is not truncated after each command, it accumulates +successive changes. +A sequence of undo commands +can therefore back up the file arbitrarily, +which is more helpful than the more commonly implemented self-inverse form of undo. +(</span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt"> +provides no way to undo an undo, but if it were desired, +it would be easy to provide by re-interpreting the ‘do’ transcript.) +Each mark in the transcript contains a sequence number and the offset into +the transcript of the previous mark, to aid in unwinding the transcript. +Marks also contain the value of dot and the modified bit so these can be +restored easily. +Undoing multiple files is easy; it merely demands undoing all files whose +latest change has the same sequence number as the current file. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Another benefit of having a transcript is that errors encountered in the middle +of a complicated command need not leave the files in an intermediate state. +By rewinding the transcript to the mark beginning the command, +the partial command can be trivially undone. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">When the update algorithm was first implemented, it was unacceptably slow, +so a cache was added to coalesce nearby changes, +replacing multiple small changes by a single larger one. +This reduced the number +of insertions into the transaction +</span><span style="font-size: 10pt"><tt>Buffer</tt></span><span style="font-size: 10pt">, +and made a dramatic improvement in performance, +but made it impossible +to handle changes in non-monotonic order in the file; the caching method +only works if changes don’t overlap. +Before the cache was added, the transaction could in principle be sorted +if the changes were out of order, although +this was never done. +The current status is therefore acceptable performance with a minor +restriction on global changes, which is sometimes, but rarely, an annoyance. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The update algorithm obviously paws the data more than simpler +algorithms, but it is not prohibitively expensive; +the caches help. +(The principle of avoiding copying the data is still honored here, +although not as piously: +the data is moved from contents’ cache to +the transcript’s all at once and through only one internal buffer.) +Performance figures confirm the efficiency. +To read from a dead start a hundred kilobyte file on a VAX-11/750 +takes 1.4 seconds of user time, 2.5 seconds of system time, +and 5 seconds of real time. +Reading the same file in +</span><span style="font-size: 10pt"><tt>ed</tt></span><span style="font-size: 10pt"> +takes 6.0 seconds of user time, 1.7 seconds of system time, +and 8 seconds of real time. +</span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt"> +uses about half the CPU time. +A more interesting example is the one stated above: +inserting a character between every pair of characters in the file. +The +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +command is +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>,y/@/ a/x/</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">and takes 3 CPU seconds per kilobyte of input file, of which +about a third is spent in the regular expression code. +This translates to about 500 changes per second. +</span><span style="font-size: 10pt"><tt>Ed</tt></span><span style="font-size: 10pt"> +takes 1.5 seconds per kilobyte to make a similar change (ignoring newlines), +but cannot undo it. +The same example in +</span><span style="font-size: 10pt"><tt>ex</tt></span><span style="font-size: 10pt">,<sup></sup></span><sup><span style="font-size: 6pt">9</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> +a variant of +</span><span style="font-size: 10pt"><tt>ed</tt></span><span style="font-size: 10pt"> +done at the University of California at Berkeley, +which allows one level of undoing, again takes 3 seconds. +In summary, +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">’s +performance is comparable to that of other UNIX editors, although it solves +a harder problem. +</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"><b>Communications +</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The discussion so far has described the implementation of the host part of +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">; +the next few sections explain how a machine with mouse and bitmap display +can be engaged to improve interaction. +</span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt"> +is not the first editor to be written as two processes,<sup></sup></span><sup><span style="font-size: 6pt">16</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> +but its implementation +has some unusual aspects. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">There are several ways +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">’s +host and terminal parts may be connected. +The first and simplest is to forgo the terminal part and use the host +part’s command language to edit text on an ordinary terminal. +This mode is invoked by starting +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +with the +</span><span style="font-size: 10pt"><tt>-d</tt></span><span style="font-size: 10pt"> +option. +With no options, +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +runs separate host and terminal programs, +communicating with a message protocol over the physical +connection that joins them. +Typically, the connection is an RS-232 link between a Blit +(the prototypical display for +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">) +and a host running +the Ninth Edition of the UNIX operating system.<sup></sup></span><sup><span style="font-size: 6pt">8</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> +(This is the version of the system used in the Computing Sciences Research +Center at AT&T Bell Laboratories [now Lucent Technologies, Bell Labs], where I work. Its relevant +aspects are discussed in the Blit paper.<sup></sup></span><sup><span style="font-size: 6pt">1</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt">) +The implementation of +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +for the SUN computer runs both processes on the same machine and +connects them by a pipe. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The low bandwidth of an RS-232 link +necessitated the split between +the two programs. +The division is a mixed blessing: +a program in two parts is much harder to write and to debug +than a self-contained one, +but the split makes several unusual configurations possible. +The terminal may be physically separated from the host, allowing the conveniences +of a mouse and bitmap display to be taken home while leaving the files at work. +It is also possible to run the host part on a remote machine: +</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.1em; margin-left: 1.28in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 9pt"><tt>sam -r host</tt></span></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> + +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">connects to the terminal in the usual way, and then makes a call +across the network to establish the host part of +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +on the named machine. +Finally, it cross-connects the I/O to join the two parts. +This allows +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +to be run on machines that do not support bitmap displays; +for example, +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +is the editor of choice on our Cray X-MP/24. +</span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt"> +</span><span style="font-size: 10pt"><tt>-r</tt></span><span style="font-size: 10pt"> +involves +</span><span style="font-size: 10pt"><i>three</i></span><span style="font-size: 10pt"> +machines: the remote host, the terminal, and the local host. +The local host’s job is simple but vital: it passes the data +between the remote host and terminal. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The host and terminal exchange messages asynchronously +(rather than, say, as remote procedure calls) but there is no +error detection or correction +because, whatever the configuration, the connection is reliable. +Because the terminal handles mundane interaction tasks such as +popping up menus and interpreting the responses, the messages are about +data, not actions. +For example, the host knows nothing about what is displayed on the screen, +and when the user types a character, the message sent to the host says +‘‘insert a one-byte string at location 123 in file 7,’’ not ‘‘a character +was typed at the current position in the current file.’’ +In other words, the messages look very much like the transaction records +in the transcripts. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Either the host or terminal part of +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +may initiate a change to a file. +The command language operates on the host, while typing and some +mouse operations are executed directly in the terminal to optimize response. +Changes initiated by the host program must be transmitted to the terminal, +and +vice versa. +(A token is exchanged to determine which end is in control, +which means that characters typed while a time-consuming command runs +must be buffered and do not appear until the command is complete.) +To maintain consistent information, +the host and terminal track changes through a per-file +data structure that records what portions of the file +the terminal has received. +The data structure, called a +</span><span style="font-size: 10pt"><tt>Rasp</tt></span><span style="font-size: 10pt"> +(a weak pun: it’s a file with holes) +is held and updated by both the host and terminal. +A +</span><span style="font-size: 10pt"><tt>Rasp</tt></span><span style="font-size: 10pt"> +is a list of +</span><span style="font-size: 10pt"><tt>Strings</tt></span><span style="font-size: 10pt"> +holding those parts of the file known to the terminal, +separated by counts of the number of bytes in the interstices. +Of course, the host doesn’t keep a separate copy of the data (it only needs +the lengths of the various pieces), +but the structure is the same on both ends. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The +</span><span style="font-size: 10pt"><tt>Rasp</tt></span><span style="font-size: 10pt"> +in the terminal doubles as a cache. +Since the terminal keeps the text for portions of the file it has displayed, +it need not request data from the host when revisiting old parts of the file +or redrawing obscured windows, which speeds things up considerably +over low-speed links. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">It’s trivial for the terminal to maintain its +</span><span style="font-size: 10pt"><tt>Rasp</tt></span><span style="font-size: 10pt">, +because all changes made on the terminal apply to parts of the file +already loaded there. +Changes made by the host are compared against the +</span><span style="font-size: 10pt"><tt>Rasp</tt></span><span style="font-size: 10pt"> +during the update sequence after each command. +Small changes to pieces of the file loaded in the terminal +are sent in their entirety. +Larger changes, and changes that fall entirely in the holes, +are transmitted as messages without literal data: +only the lengths of the deleted and inserted strings are transmitted. +When a command is completed, the terminal examines its visible +windows to see if any holes in their +</span><span style="font-size: 10pt"><tt>Rasps</tt></span><span style="font-size: 10pt"> +intersect the visible portion of the file. +It then requests the missing data from the host, +along with up to 512 bytes of surrounding data, to minimize +the number of messages when visiting a new portion of the file. +This technique provides a kind of two-level lazy evaluation for the terminal. +The first level sends a minimum of information about +parts of the file not being edited interactively; +the second level waits until a change is displayed before +transmitting the new data. +Of course, +performance is also helped by having the terminal respond immediately to typing +and simple mouse requests. +Except for small changes to active pieces of the file, which are +transmitted to the terminal without negotiation, +the terminal is wholly responsible for deciding what is displayed; +the host uses the +</span><span style="font-size: 10pt"><tt>Rasp</tt></span><span style="font-size: 10pt"> +only to tell the terminal what might be relevant. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">When a change is initiated by the host, +the messages to the terminal describing the change +are generated by the routine that applies the transcript of the changes +to the contents of the +</span><span style="font-size: 10pt"><tt>File</tt></span><span style="font-size: 10pt">. +Since changes are undone by the same update routine, +undoing requires +no extra code in the communications; +the usual messages describing changes to the file are sufficient +to back up the screen image. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The +</span><span style="font-size: 10pt"><tt>Rasp</tt></span><span style="font-size: 10pt"> +is a particularly good example of the way caches are used in +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">. +First, it facilitates access to the active portion of the text by placing +the busy text in main memory. +In so doing, it provides efficient access +to a large data structure that does not fit in memory. +Since the form of data is to be imposed by the user, not by the program, +and because characters will frequently be scanned sequentially, +files are stored as flat objects. +Caches help keep performance good and linear when working with such +data. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Second, the +</span><span style="font-size: 10pt"><tt>Rasp</tt></span><span style="font-size: 10pt"> +and several of the other caches have some +</span><span style="font-size: 10pt"><i>read-ahead;</i></span><span style="font-size: 10pt"> +that is, the cache is loaded with more information than is needed for +the job immediately at hand. +When manipulating linear structures, the accesses are usually sequential, +and read-ahead can significantly reduce the average time to access the +next element of the object. +Sequential access is a common mode for people as well as programs; +consider scrolling through a document while looking for something. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Finally, like any good data structure, +the cache guides the algorithm, or at least the implementation. +The +</span><span style="font-size: 10pt"><tt>Rasp</tt></span><span style="font-size: 10pt"> +was actually invented to control the communications between the host and +terminal parts, but I realized very early that it was also a form of +cache. Other caches were more explicitly intended to serve a double +purpose: for example, the caches in +</span><span style="font-size: 10pt"><tt>Files</tt></span><span style="font-size: 10pt"> +that coalesce updates not only reduce traffic to the +transcript and contents +</span><span style="font-size: 10pt"><tt>Buffers</tt></span><span style="font-size: 10pt">, +they also clump screen updates so that complicated changes to the +screen are achieved in +just a few messages to the terminal. +This saved me considerable work: I did not need to write special +code to optimize the message traffic to the +terminal. +Caches pay off in surprising ways. +Also, they tend to be independent, so their performance improvements +are multiplicative. +</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"><b>Data structures in the terminal +</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The terminal’s job is to display and to maintain a consistent image of +pieces of the files being edited. +Because the text is always in memory, the data structures are +considerably simpler than those in the host part. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"></span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt"> +typically has far more windows than does +</span><span style="font-size: 10pt"><tt>mux</tt></span><span style="font-size: 10pt">, +the window system within which its Blit implementation runs. +</span><span style="font-size: 10pt"><tt>Mux</tt></span><span style="font-size: 10pt"> +has a fairly small number of asynchronously updated windows; +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +needs a large number of synchronously updated windows that are +usually static and often fully obscured. +The different tradeoffs guided +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +away from the memory-intensive implementation of windows, called +</span><span style="font-size: 10pt"><tt>Layers</tt></span><span style="font-size: 10pt">,<sup></sup></span><sup><span style="font-size: 6pt">17</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> +used in +</span><span style="font-size: 10pt"><tt>mux.</tt></span><span style="font-size: 10pt"> +Rather than depending on a complete bitmap image of the display for each window, +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +regenerates the image from its in-memory text +(stored in the +</span><span style="font-size: 10pt"><tt>Rasp</tt></span><span style="font-size: 10pt">) +when necessary, although it will use such an image if it is available. +Like +</span><span style="font-size: 10pt"><tt>Layers</tt></span><span style="font-size: 10pt">, +though, +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +uses the screen bitmap as active storage in which to update the image using +</span><span style="font-size: 10pt"><tt>bitblt</tt></span><span style="font-size: 10pt">.<sup></sup></span><sup><span style="font-size: 6pt">18,19</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> +The resulting organization, pictured in Figure 6, +has a global array of windows, called +</span><span style="font-size: 10pt"><tt>Flayers</tt></span><span style="font-size: 10pt">, +each of which holds an image of a piece of text held in a data structure +called a +</span><span style="font-size: 10pt"><tt>Frame</tt></span><span style="font-size: 10pt">, +which in turn represents +a rectangular window full of text displayed in some +</span><span style="font-size: 10pt"><tt>Bitmap</tt></span><span style="font-size: 10pt">. +Each +</span><span style="font-size: 10pt"><tt>Flayer</tt></span><span style="font-size: 10pt"> +appears in a global list that orders them all front-to-back +on the display, and simultaneously as an element of a per-file array +that holds all the open windows for that file. +The complement in the terminal of the +</span><span style="font-size: 10pt"><tt>File</tt></span><span style="font-size: 10pt"> +on the host is called a +</span><span style="font-size: 10pt"><tt>Text</tt></span><span style="font-size: 10pt">; +each connects its +</span><span style="font-size: 10pt"><tt>Flayers</tt></span><span style="font-size: 10pt"> +to the associated +</span><span style="font-size: 10pt"><tt>Rasp</tt></span><span style="font-size: 10pt">. +</span><span style="font-size: 10pt"></span></p><center><img src="sam3.png"></center> +</center> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 8pt"><i>Figure 6. Data structures in the terminal. +</i></span><span style="font-size: 8pt"><tt>Flayers</tt></span><span style="font-size: 8pt"><i> +are also linked together into a front-to-back list. +</i></span><span style="font-size: 8pt"><tt>Boxes</tt></span><span style="font-size: 8pt"><i> +are discussed in the next section. +</i></span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="margin-top: 0; margin-bottom: 0.02in"></p> + +<p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The +</span><span style="font-size: 10pt"><tt>Bitmap</tt></span><span style="font-size: 10pt"> +for a +</span><span style="font-size: 10pt"><tt>Frame</tt></span><span style="font-size: 10pt"> +contains the image of the text. +For a fully visible window, the +</span><span style="font-size: 10pt"><tt>Bitmap</tt></span><span style="font-size: 10pt"> +will be the screen (or at least the +</span><span style="font-size: 10pt"><tt>Layer</tt></span><span style="font-size: 10pt"> +in which +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +is being run), +while for partially obscured windows the +</span><span style="font-size: 10pt"><tt>Bitmap</tt></span><span style="font-size: 10pt"> +will be off-screen. +If the window is fully obscured, the +</span><span style="font-size: 10pt"><tt>Bitmap</tt></span><span style="font-size: 10pt"> +will be null. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The +</span><span style="font-size: 10pt"><tt>Bitmap</tt></span><span style="font-size: 10pt"> +is a kind of cache. +When making changes to the display, most of the original image will +look the same in the final image, and the update algorithms exploit this. +The +</span><span style="font-size: 10pt"><tt>Frame</tt></span><span style="font-size: 10pt"> +software updates the image in the +</span><span style="font-size: 10pt"><tt>Bitmap</tt></span><span style="font-size: 10pt"> +incrementally; the +</span><span style="font-size: 10pt"><tt>Bitmap</tt></span><span style="font-size: 10pt"> +is not just an image, it is a data structure.<sup></sup></span><sup><span style="font-size: 6pt">18,19</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> +The job of the software that updates the display is therefore +to use as much as possible of the existing image (converting the +text from ASCII characters to pixels is expensive) in a sort of two-dimensional +string insertion algorithm. +The details of this process are described in the next section. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The +</span><span style="font-size: 10pt"><tt>Frame</tt></span><span style="font-size: 10pt"> +software has no code to support overlapping windows; +its job is to keep a single +</span><span style="font-size: 10pt"><tt>Bitmap</tt></span><span style="font-size: 10pt"> +up to date. +It falls to the +</span><span style="font-size: 10pt"><tt>Flayer</tt></span><span style="font-size: 10pt"> +software to multiplex the various +</span><span style="font-size: 10pt"><tt>Bitmaps</tt></span><span style="font-size: 10pt"> +onto the screen. +The problem of maintaining overlapping +</span><span style="font-size: 10pt"><tt>Flayers</tt></span><span style="font-size: 10pt"> +is easier than for +</span><span style="font-size: 10pt"><tt>Layers</tt></span><span style="font-size: 10pt"><sup></sup></span><sup><span style="font-size: 6pt">17</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> +because changes are made synchronously and because the contents of the window +can be reconstructed from the data stored in the +</span><span style="font-size: 10pt"><tt>Frame</tt></span><span style="font-size: 10pt">; +the +</span><span style="font-size: 10pt"><tt>Layers</tt></span><span style="font-size: 10pt"> +software +makes no such assumptions. +In +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">, +the window being changed is almost always fully visible, because the current +window is always fully visible, by construction. +However, when multi-file changes are being made, or when +more than one window is open on a file, +it may be necessary to update partially obscured windows. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">There are three cases: the window is +fully visible, invisible (fully obscured), or partially visible. +If fully visible, the +</span><span style="font-size: 10pt"><tt>Bitmap</tt></span><span style="font-size: 10pt"> +is part of the screen, so when the +</span><span style="font-size: 10pt"><tt>Flayer</tt></span><span style="font-size: 10pt"> +update routine calls the +</span><span style="font-size: 10pt"><tt>Frame</tt></span><span style="font-size: 10pt"> +update routine, the screen will be updated directly. +If the window is invisible, +there is no associated +</span><span style="font-size: 10pt"><tt>Bitmap</tt></span><span style="font-size: 10pt">, +and all that is necessary is to update the +</span><span style="font-size: 10pt"><tt>Frame</tt></span><span style="font-size: 10pt"> +data structure, not the image. +If the window is partially visible, the +</span><span style="font-size: 10pt"><tt>Frame</tt></span><span style="font-size: 10pt"> +routine is called to update the image in the off-screen +</span><span style="font-size: 10pt"><tt>Bitmap</tt></span><span style="font-size: 10pt">, +which may require regenerating it from the text of the window. +The +</span><span style="font-size: 10pt"><tt>Flayer</tt></span><span style="font-size: 10pt"> +code then clips this +</span><span style="font-size: 10pt"><tt>Bitmap</tt></span><span style="font-size: 10pt"> +against the +</span><span style="font-size: 10pt"><tt>Bitmaps</tt></span><span style="font-size: 10pt"> +of all +</span><span style="font-size: 10pt"><tt>Frames</tt></span><span style="font-size: 10pt"> +in front of the +</span><span style="font-size: 10pt"><tt>Frame</tt></span><span style="font-size: 10pt"> +being modified, and the remainder is copied to the display. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">This is much faster than recreating the image off-screen +for every change, or clipping all the changes made to the image +during its update. +Unfortunately, these caches can also consume prohibitive amounts of +memory, so they are freed fairly liberally — after every change to the +front-to-back order of the +</span><span style="font-size: 10pt"><tt>Flayers</tt></span><span style="font-size: 10pt">. +The result is that +the off-screen +</span><span style="font-size: 10pt"><tt>Bitmaps</tt></span><span style="font-size: 10pt"> +exist only while multi-window changes are occurring, +which is the only time the performance improvement they provide is needed. +Also, the user interface causes fully-obscured windows to be the +easiest to make — +creating a canonically sized and placed window requires only a button click +— which reduces the need for caching still further. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"><b>Screen update +</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Only two low-level primitives are needed for incremental update: +</span><span style="font-size: 10pt"><tt>bitblt</tt></span><span style="font-size: 10pt">, +which copies rectangles of pixels, and +</span><span style="font-size: 10pt"><tt>string</tt></span><span style="font-size: 10pt"> +(which in turn calls +</span><span style="font-size: 10pt"><tt>bitblt</tt></span><span style="font-size: 10pt">), +which draws a null-terminated character string in a +</span><span style="font-size: 10pt"><tt>Bitmap</tt></span><span style="font-size: 10pt">. +A +</span><span style="font-size: 10pt"><tt>Frame</tt></span><span style="font-size: 10pt"> +contains a list of +</span><span style="font-size: 10pt"><tt>Boxes</tt></span><span style="font-size: 10pt">, +each of which defines a horizontal strip of text in the window +(see Figure 7). +A +</span><span style="font-size: 10pt"><tt>Box</tt></span><span style="font-size: 10pt"> +has a character string +</span><span style="font-size: 10pt"><tt>str</tt></span><span style="font-size: 10pt">, +and a +</span><span style="font-size: 10pt"><tt>Rectangle</tt></span><span style="font-size: 10pt"> +</span><span style="font-size: 10pt"><tt>rect</tt></span><span style="font-size: 10pt"> +that defines the location of the strip in the window. +(The text in +</span><span style="font-size: 10pt"><tt>str</tt></span><span style="font-size: 10pt"> +is stored in the +</span><span style="font-size: 10pt"><tt>Box</tt></span><span style="font-size: 10pt"> +separately from the +</span><span style="font-size: 10pt"><tt>Rasp</tt></span><span style="font-size: 10pt"> +associated with the window’s file, so +</span><span style="font-size: 10pt"><tt>Boxes</tt></span><span style="font-size: 10pt"> +are self-contained.) +The invariant is that +the image of the +</span><span style="font-size: 10pt"><tt>Box</tt></span><span style="font-size: 10pt"> +can be reproduced by calling +</span><span style="font-size: 10pt"><tt>string</tt></span><span style="font-size: 10pt"> +with argument +</span><span style="font-size: 10pt"><tt>str</tt></span><span style="font-size: 10pt"> +to draw the string in +</span><span style="font-size: 10pt"><tt>rect</tt></span><span style="font-size: 10pt">, +and the resulting picture fits perfectly within +</span><span style="font-size: 10pt"><tt>rect</tt></span><span style="font-size: 10pt">. +In other words, the +</span><span style="font-size: 10pt"><tt>Boxes</tt></span><span style="font-size: 10pt"> +define the tiling of the window. +The tiling may be complicated by long lines of text, which +are folded onto the next line. +Some editors use horizontal scrolling to avoid this complication, +but to be comfortable this technique requires that lines not be +</span><span style="font-size: 10pt"><i>too</i></span><span style="font-size: 10pt"> +long; +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +has no such restriction. +Also, and perhaps more importantly, UNIX programs and terminals traditionally fold +long lines to make their contents fully visible. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Two special kinds of +</span><span style="font-size: 10pt"><tt>Boxes</tt></span><span style="font-size: 10pt"> +contain a single +character: either a newline or a tab. +Newlines and tabs are white space. +A newline +</span><span style="font-size: 10pt"><tt>Box</tt></span><span style="font-size: 10pt"> +always extends to the right edge of the window, +forcing the following +</span><span style="font-size: 10pt"><tt>Box</tt></span><span style="font-size: 10pt"> +to the next line. +The width of a tab depends on where it is located: +it forces the next +</span><span style="font-size: 10pt"><tt>Box</tt></span><span style="font-size: 10pt"> +to begin at a tab location. +Tabs also +have a minimum width equivalent to a blank (blanks are +drawn by +</span><span style="font-size: 10pt"><tt>string</tt></span><span style="font-size: 10pt"> +and are not treated specially); newlines have a minimum width of zero. +</span><span style="font-size: 10pt"></span></p><center><img src="sam4.png"></center> +</center> +<p style="margin-top: 0; margin-bottom: 0.08in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 8pt"><i>Figure 7. A line of text showing its +</i></span><span style="font-size: 8pt"><tt>Boxes</tt></span><span style="font-size: 8pt"><i>. +The first two blank +</i></span><span style="font-size: 8pt"><tt>Boxes</tt></span><span style="font-size: 8pt"><i> +contain tabs; the last contains a newline. +Spaces are handled as ordinary characters. +</i></span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="margin-top: 0; margin-bottom: 0.02in"></p> + +<p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The update algorithms always use the +</span><span style="font-size: 10pt"><tt>Bitmap</tt></span><span style="font-size: 10pt"> +image of the text (either the display or cache +</span><span style="font-size: 10pt"><tt>Bitmap</tt></span><span style="font-size: 10pt">); +they never examine the characters within a +</span><span style="font-size: 10pt"><tt>Box</tt></span><span style="font-size: 10pt"> +except when the +</span><span style="font-size: 10pt"><tt>Box</tt></span><span style="font-size: 10pt"> +needs to be split in two. +Before a change, the window consists of a tiling of +</span><span style="font-size: 10pt"><tt>Boxes</tt></span><span style="font-size: 10pt">; +after the change the window is tiled differently. +The update algorithms rearrange the tiles in place, without +backup storage. +The algorithms are not strictly optimal — for example, they can +clear a pixel that is later going to be written upon — +but they never move a tile that doesn’t need to be moved, +and they move each tile at most once. +</span><span style="font-size: 10pt"><tt>Frinsert</tt></span><span style="font-size: 10pt"> +on a Blit can absorb over a thousand characters a second if the strings +being inserted are a few tens of characters long. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Consider +</span><span style="font-size: 10pt"><tt>frdelete</tt></span><span style="font-size: 10pt">. +Its job is to delete a substring from a +</span><span style="font-size: 10pt"><tt>Frame</tt></span><span style="font-size: 10pt"> +and restore the image of the +</span><span style="font-size: 10pt"><tt>Frame</tt></span><span style="font-size: 10pt">. +The image of a substring has a peculiar shape (see Figure 2) comprising +possibly a partial line, +zero or more full lines, +and possibly a final partial line. +For reference, call this the +</span><span style="font-size: 10pt"><i>Z-shape. +</i></span><span style="font-size: 10pt"></span><span style="font-size: 10pt"><tt>Frdelete</tt></span><span style="font-size: 10pt"> +begins by splitting, if necessary, the +</span><span style="font-size: 10pt"><tt>Boxes</tt></span><span style="font-size: 10pt"> +containing the ends of +the substring so the substring begins and ends on +</span><span style="font-size: 10pt"><tt>Box</tt></span><span style="font-size: 10pt"> +boundaries. +Because the substring is being deleted, its image is not needed, +so the Z-shape is then cleared. +Then, tiles (that is, the images of +</span><span style="font-size: 10pt"><tt>Boxes</tt></span><span style="font-size: 10pt">) +are copied, using +</span><span style="font-size: 10pt"><tt>bitblt</tt></span><span style="font-size: 10pt">, +from immediately after the Z-shape to +the beginning of the Z-shape, +resulting in a new Z-shape. +(</span><span style="font-size: 10pt"><tt>Boxes</tt></span><span style="font-size: 10pt"> +whose contents would span two lines in the new position must first be split.) +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Copying the remainder of the +</span><span style="font-size: 10pt"><tt>Frame</tt></span><span style="font-size: 10pt"> +tile by tile +this way will clearly accomplish the deletion but eventually, +typically when the copying algorithm encounters a tab or newline, +the old and new +</span><span style="font-size: 10pt"><tt>x</tt></span><span style="font-size: 10pt"> +coordinates of the tile +to be copied are the same. +This correspondence implies +that the Z-shape has its beginning and ending edges aligned +vertically, and a sequence of at most two +</span><span style="font-size: 10pt"><tt>bitblts</tt></span><span style="font-size: 10pt"> +can be used to copy the remaining tiles. +The last step is to clear out the resulting empty space at the bottom +of the window; +the number of lines to be cleared is the number of complete lines in the +Z-shape closed by the final +</span><span style="font-size: 10pt"><tt>bitblts.</tt></span><span style="font-size: 10pt"> +The final step is to merge horizontally adjacent +</span><span style="font-size: 10pt"><tt>Boxes</tt></span><span style="font-size: 10pt"> +of plain text. +The complete source to +</span><span style="font-size: 10pt"><tt>frdelete</tt></span><span style="font-size: 10pt"> +is less than 100 lines of C. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"></span><span style="font-size: 10pt"><tt>frinsert</tt></span><span style="font-size: 10pt"> +is more complicated because it must do four passes: +one to construct the +</span><span style="font-size: 10pt"><tt>Box</tt></span><span style="font-size: 10pt"> +list for the inserted string, +one to reconnoitre, +one to copy (in opposite order to +</span><span style="font-size: 10pt"><tt>frdelete</tt></span><span style="font-size: 10pt">) +the +</span><span style="font-size: 10pt"><tt>Boxes</tt></span><span style="font-size: 10pt"> +to make the hole for the new text, +and finally one to copy the new text into place. +Overall, though, +</span><span style="font-size: 10pt"><tt>frinsert</tt></span><span style="font-size: 10pt"> +has a similar flavor to +</span><span style="font-size: 10pt"><tt>frdelete</tt></span><span style="font-size: 10pt">, +and needn’t be described further. +</span><span style="font-size: 10pt"><tt>Frinsert</tt></span><span style="font-size: 10pt"> +and its subsidiary routines comprise 211 lines of C. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The terminal source code is 3024 lines of C, +and the host source is 5797 lines. +</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"><b>Discussion +</b></span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"><b>History +</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">The immediate ancestor of +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +was the original text editor for the Blit, called +</span><span style="font-size: 10pt"><tt>jim</tt></span><span style="font-size: 10pt">. +</span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt"> +inherited +</span><span style="font-size: 10pt"><tt>jim</tt></span><span style="font-size: 10pt">’s +two-process structure and mouse language almost unchanged, but +</span><span style="font-size: 10pt"><tt>jim</tt></span><span style="font-size: 10pt"> +suffered from several drawbacks that were addressed in the design of +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">. +The most important of these was the lack of a command language. +Although +</span><span style="font-size: 10pt"><tt>jim</tt></span><span style="font-size: 10pt"> +was easy to use for simple editing, it provided no direct help with +large or repetitive editing tasks. Instead, it provided a command to pass +selected text through a shell pipeline, +but this was no more satisfactory than could be expected of a stopgap measure. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"></span><span style="font-size: 10pt"><tt>Jim</tt></span><span style="font-size: 10pt"> +was written primarily as a vehicle for experimenting with a mouse-based +interface to text, and the experiment was successful. +</span><span style="font-size: 10pt"><tt>Jim</tt></span><span style="font-size: 10pt"> +had some spin-offs: +</span><span style="font-size: 10pt"><tt>mux</tt></span><span style="font-size: 10pt">, +the second window system for the Blit, is essentially a multiplexed +version of the terminal part of +</span><span style="font-size: 10pt"><tt>jim</tt></span><span style="font-size: 10pt">; +and the debugger +</span><span style="font-size: 10pt"><tt>pi</tt></span><span style="font-size: 10pt">’s +user interface<sup></sup></span><sup><span style="font-size: 6pt">20</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> was closely modeled on +</span><span style="font-size: 10pt"><tt>jim</tt></span><span style="font-size: 10pt">’s. +But after a couple of years, +</span><span style="font-size: 10pt"><tt>jim</tt></span><span style="font-size: 10pt"> +had become difficult to maintain and limiting to use, +and its replacement was overdue. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">I began the design of +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +by asking +</span><span style="font-size: 10pt"><tt>jim</tt></span><span style="font-size: 10pt"> +customers what they wanted. +This was probably a mistake; the answers were essentially a list of features +to be found in other editors, which did not provide any of the +guiding principles I was seeking. +For instance, one common request was for a ‘‘global substitute,’’ +but no one suggested how to provide it within a cut-and-paste editor. +I was looking for a scheme that would +support such specialized features comfortably in the context of some +general command language. +Ideas were not forthcoming, though, particularly given my insistence +on removing all limits on file sizes, line lengths and so on. +Even worse, I recognized that, since the mouse could easily +indicate a region of the screen that was not an integral number of lines, +the command language would best forget about newlines altogether, +and that meant the command language had to treat the file as a single +string, not an array of lines. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Eventually, I decided that thinking was not getting me very far and it was +time to try building. +I knew that the terminal part could be built easily — +that part of +</span><span style="font-size: 10pt"><tt>jim</tt></span><span style="font-size: 10pt"> +behaved acceptably well — and that most of the hard work was going +to be in the host part: the file interface, command interpreter and so on. +Moreover, I had some ideas about how the architecture of +</span><span style="font-size: 10pt"><tt>jim</tt></span><span style="font-size: 10pt"> +could be improved without destroying its basic structure, which I liked +in principle but which hadn’t worked out as well as I had hoped. +So I began by designing the file data structure, +starting with the way +</span><span style="font-size: 10pt"><tt>jim</tt></span><span style="font-size: 10pt"> +worked — comparable to a single structure merging +</span><span style="font-size: 10pt"><tt>Disc</tt></span><span style="font-size: 10pt"> +and +</span><span style="font-size: 10pt"><tt>Buffer</tt></span><span style="font-size: 10pt">, +which I split to make the cache more general +— and thinking about how global substitute could be implemented. +The answer was clearly that it had to be done in two passes, +and the transcript-oriented implementation fell out naturally. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"></span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt"> +was written bottom-up, +starting from the data structures and algorithms for manipulating text, +through the command language and up to the code for maintaining +the display. +In retrospect, it turned out well, but this implementation method is +not recommended in general. +There were several times when I had a large body of interesting code +assembled and no clue how to proceed with it. +The command language, in particular, took almost a year to figure out, +but can be implemented (given what was there at the beginning of that year) +in a day or two. Similarly, inventing the +</span><span style="font-size: 10pt"><tt>Rasp</tt></span><span style="font-size: 10pt"> +data structure delayed the +connection of the host and terminal pieces by another few months. +</span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt"> +took about two years to write, although only about four months were +spent actually working on it. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Part of the design process was unusual: +the subset of the protocol that maintains the +</span><span style="font-size: 10pt"><tt>Rasp</tt></span><span style="font-size: 10pt"> +was simulated, debugged +and verified by an automatic protocol analyzer,<sup></sup></span><sup><span style="font-size: 6pt">21</span><span style="font-size: 10pt"></span></sup><span style="font-size: 10pt"> and was bug-free +from the start. +The rest of the protocol, concerned mostly +with keeping menus up to date, +was unfortunately too unwieldy for such analysis, +and was debugged by more traditional methods, primarily +by logging in a file all messages in and out of the host. +</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"><b>Reflections +</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"></span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt"> +is essentially the only interactive editor used by the sixty or so members of +the computing science research center in which I work. +The same could not be said of +</span><span style="font-size: 10pt"><tt>jim</tt></span><span style="font-size: 10pt">; +the lack of a command language kept some people from adopting it. +The union of a user interface as comfortable as +</span><span style="font-size: 10pt"><tt>jim</tt></span><span style="font-size: 10pt">’s +with a command language as powerful as +</span><span style="font-size: 10pt"><tt>ed</tt></span><span style="font-size: 10pt">’s† +</span></p><p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.50in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">is essential to +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">’s +success. +When +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +was first made available to the +</span><span style="font-size: 10pt"><tt>jim</tt></span><span style="font-size: 10pt"> +community, +almost everyone switched to it within two or three days. +In the months that followed, even people who had never adopted +</span><span style="font-size: 10pt"><tt>jim</tt></span><span style="font-size: 10pt"> +started using +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +exclusively. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">To be honest, +</span><span style="font-size: 10pt"><tt>ed</tt></span><span style="font-size: 10pt"> +still gets occasional use, but usually when +something quick needs to be done and the overhead of +downloading the terminal part of +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +isn’t worth the trouble. +Also, as a ‘line’ editor, +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +</span><span style="font-size: 10pt"><tt>-d</tt></span><span style="font-size: 10pt"> +is a bit odd; +when using a good old ASCII terminal, it’s comforting to have +a true line editor. +But it is fair to say that +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">’s +command language has displaced +</span><span style="font-size: 10pt"><tt>ed</tt></span><span style="font-size: 10pt">’s +for most of the complicated editing that has kept line editors +(that is, command-driven editors) with us. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"></span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt">’s +command language is even fancier than +</span><span style="font-size: 10pt"><tt>ed</tt></span><span style="font-size: 10pt">’s, +and most +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +customers don’t come near to using all its capabilities. +Does it need to be so sophisticated? +I think the answer is yes, for two reasons. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">First, the +</span><span style="font-size: 10pt"><i>model</i></span><span style="font-size: 10pt"> +for +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">’s +command language is really relatively simple, and certainly simpler than that of +</span><span style="font-size: 10pt"><tt>ed</tt></span><span style="font-size: 10pt">. +For instance, there is only one kind of textual loop in +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +— the +</span><span style="font-size: 10pt"><tt>x</tt></span><span style="font-size: 10pt"> +command — +while +</span><span style="font-size: 10pt"><tt>ed</tt></span><span style="font-size: 10pt"> +has three (the +</span><span style="font-size: 10pt"><tt>g</tt></span><span style="font-size: 10pt"> +command, the global flag on substitutions, and the implicit loop over +lines in multi-line substitutions). +Also, +</span><span style="font-size: 10pt"><tt>ed</tt></span><span style="font-size: 10pt">’s +substitute command is necessary to make changes within lines, but in +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +the +</span><span style="font-size: 10pt"><tt>s</tt></span><span style="font-size: 10pt"> +command is more of a familiar convenience than a necessity; +</span><span style="font-size: 10pt"><tt>c</tt></span><span style="font-size: 10pt"> +and +</span><span style="font-size: 10pt"><tt>t</tt></span><span style="font-size: 10pt"> +can do all the work. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Second, +given a community that expects an editor to be about as powerful as +</span><span style="font-size: 10pt"><tt>ed</tt></span><span style="font-size: 10pt">, +it’s hard to see how +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +could really be much simpler and still satisfy that expectation. +People want to do ‘‘global substitutes,’’ and most are content +to have the recipe for that and a few other fancy changes. +The sophistication of the command language is really just a veneer +over a design that makes it possible to do global substitutes +in a screen editor. +Some people will always want something more, however, and it’s gratifying to +be able to provide it. +The real power of +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">’s +command language comes from composability of the operators, which is by +nature orthogonal to the underlying model. +In other words, +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +is not itself complex, but it makes complex things possible. +If you don’t want to do anything complex, you can ignore the +complexity altogether, and many people do so. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Sometimes I am asked the opposite question: why didn’t I just make +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +a real programmable editor, with macros and variables and so on? +The main reason is a matter of taste: I like the editor +to be the same every time I use it. +There is one technical reason, though: +programmability in editors is largely a workaround for insufficient +interactivity. +Programmable editors are used to make particular, usually short-term, +things easy to do, such as by providing shorthands for common actions. +If things are generally easy to do in the first place, +shorthands are not as helpful. +</span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt"> +makes common editing operations very easy, and the solutions to +complex editing problems seem commensurate with the problems themselves. +Also, the ability to edit the +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +window makes it easy to repeat commands — it only takes a mouse button click +to execute a command again. +</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"><b>Pros and cons +</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"></span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt"> +has several other good points, +and its share of problems. +Among the good things is the idea of +structural regular expressions, +whose usefulness has only begun to be explored. +They were arrived at serendipitously when I attempted to distill the essence of +</span><span style="font-size: 10pt"><tt>ed</tt></span><span style="font-size: 10pt">’s +way of doing global substitution and recognized that the looping command in +</span><span style="font-size: 10pt"><tt>ed</tt></span><span style="font-size: 10pt"> +was implicitly imposing a structure (an array of lines) on the file. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Another of +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">’s +good things is its undo capability. +I had never before used an editor with a true undo, +but I would never go back now. +Undo +</span><span style="font-size: 10pt"><i>must</i></span><span style="font-size: 10pt"> +be done well, but if it is, it can be relied on. +For example, +it’s safe to experiment if you’re not sure how to write some intricate command, +because if you make a mistake, it can be fixed simply and reliably. +I learned two things about undo from writing +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">: +first, it’s easy to provide if you design it in from the beginning, and +second, it’s necessary, particularly if the system has some subtle +properties that may be unfamiliar or error-prone for users. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"></span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt">’s +lack of internal limits and sizes is a virtue. +Because it avoids all fixed-size tables and data structures, +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +is able to make global changes to files that some of our other +tools cannot even read. +Moreover, the design keeps the performance linear when doing such +operations, although I must admit +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +does get slow when editing a huge file. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Now, the problems. +Externally, the most obvious is that it is poorly integrated into the +surrounding window system. +By design, the user interface in +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +feels almost identical to that of +</span><span style="font-size: 10pt"><tt>mux</tt></span><span style="font-size: 10pt">, +but a thick wall separates text in +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +from the programs running in +</span><span style="font-size: 10pt"><tt>mux</tt></span><span style="font-size: 10pt">. +For instance, the ‘snarf buffer’ in +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +must be maintained separately from that in +</span><span style="font-size: 10pt"><tt>mux</tt></span><span style="font-size: 10pt">. +This is regrettable, but probably necessary given the unusual configuration +of the system, with a programmable terminal on the far end of an RS-232 link. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"></span><span style="font-size: 10pt"><tt>Sam</tt></span><span style="font-size: 10pt"> +is reliable; otherwise, people wouldn’t use it. +But it was written over such a long time, and has so many new (to me) +ideas in it, that I would like to see it done over again to clean +up the code and remove many of the lingering problems in the implementation. +The worst part is in the interconnection of the host and terminal parts, +which might even be able to go away in a redesign for a more +conventional window system. +The program must be split in two to use the terminal effectively, +but the low bandwidth of the connection forces the separation to +occur in an inconvenient part of the design if performance is to be acceptable. +A simple remote procedure call +protocol driven by the host, emitting only graphics +commands, would be easy to write but wouldn’t have nearly the +necessary responsiveness. On the other hand, if the terminal were in control +and requested much simpler file services from the host, regular expression +searches would require that the terminal read the entire file over its RS-232 +link, which would be unreasonably slow. +A compromise in which either end can take control is necessary. +In retrospect, the communications protocol should have been +designed and verified formally, although I do not know of any tool +that can adequately relate the protocol to +its implementation. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Not all of +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">’s +users are comfortable with its command language, and few are adept. +Some (venerable) people use a sort of +‘‘</span><span style="font-size: 10pt"><tt>ed</tt></span><span style="font-size: 10pt"> +subset’’ of +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">’s +command language, +and even ask why +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">’s +command language is not exactly +</span><span style="font-size: 10pt"><tt>ed</tt></span><span style="font-size: 10pt">’s. +(The reason, of course, is that +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">’s +model for text does not include newlines, which are central to +</span><span style="font-size: 10pt"><tt>ed</tt></span><span style="font-size: 10pt">. +Making the text an array of newlines to the command language would +be too much of a break from the seamless model provided by the mouse. +Some editors, such as +</span><span style="font-size: 10pt"><tt>vi</tt></span><span style="font-size: 10pt">, +are willing to make this break, though.) +The difficulty is that +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">’s +syntax is so close to +</span><span style="font-size: 10pt"><tt>ed</tt></span><span style="font-size: 10pt">’s +that people believe it +</span><span style="font-size: 10pt"><i>should</i></span><span style="font-size: 10pt"> +be the same. +I thought, with some justification in hindsight, +that making +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +similar to +</span><span style="font-size: 10pt"><tt>ed</tt></span><span style="font-size: 10pt"> +would make it easier to learn and to accept. +But I may have overstepped and raised the users’ +expectations too much. +It’s hard to decide which way to resolve this problem. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Finally, there is a tradeoff in +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +that was decided by the environment in which it runs: +</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt"> +is a multi-file editor, although in a different system there might instead be +multiple single-file editors. +The decision was made primarily because starting a new program in a Blit is +time-consuming. +If the choice could be made freely, however, I would +still choose the multi-file architecture, because it allows +groups of files to be handled as a unit; +the usefulness of the multi-file commands is incontrovertible. +It is delightful to have the source to an entire program +available at your fingertips. +</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"><b>Acknowledgements +</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">Tom Cargill suggested the idea behind the +</span><span style="font-size: 10pt"><tt>Rasp</tt></span><span style="font-size: 10pt"> +data structure. +Norman Wilson and Ken Thompson influenced the command language. +This paper was improved by comments from +Al Aho, +Jon Bentley, +Chris Fraser, +Gerard Holzmann, +Brian Kernighan, +Ted Kowalski, +Doug McIlroy +and +Dennis Ritchie. +</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"><b>REFERENCES +</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"> 1. R. Pike, +‘The Blit: a multiplexed graphics terminal,’ +</span><span style="font-size: 10pt"><i>AT&T Bell Labs. Tech. J., +</i></span><span style="font-size: 10pt"></span><span style="font-size: 10pt"><b>63</b></span><span style="font-size: 10pt">, +(8), +1607-1631 (1984). +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"> 2. L. Johnson, +</span><span style="font-size: 10pt"><i>MacWrite,</i></span><span style="font-size: 10pt"> +Apple Computer Inc., Cupertino, Calif. 1983. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"> 3. B. Lampson, +‘Bravo Manual,’ +in +</span><span style="font-size: 10pt"><i>Alto User’s Handbook, +</i></span><span style="font-size: 10pt">pp. 31-62, +Xerox Palo Alto Research Center, +Palo Alto, Calif. +1979. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"> 4. W. Teitelman, +‘A tour through Cedar,’ +</span><span style="font-size: 10pt"><i>IEEE Software, +</i></span><span style="font-size: 10pt"></span><span style="font-size: 10pt"><b>1</b></span><span style="font-size: 10pt"> +(2), 44-73 (1984). +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"> 5. J. Gutknecht, +‘Concepts of the text editor Lara,’ +</span><span style="font-size: 10pt"><i>Comm. ACM, +</i></span><span style="font-size: 10pt"></span><span style="font-size: 10pt"><b>28</b></span><span style="font-size: 10pt">, +(9), +942-960 (1985). +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"> 6. Bell Telephone Laboratories, +</span><span style="font-size: 10pt"><i>UNIX Programmer’s Manual, +</i></span><span style="font-size: 10pt">Holt, Rinehart and Winston, New York 1983. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"> 7. B. W. Kernighan and R. Pike, +</span><span style="font-size: 10pt"><i>The Unix Programming Environment, +</i></span><span style="font-size: 10pt">Prentice-Hall, Englewood Cliffs, New Jersey 1984. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"> 8. </span><span style="font-size: 10pt"><i>Unix Time-Sharing System Programmer’s Manual, Research Version, Ninth Edition, +Volume 1, +</i></span><span style="font-size: 10pt">AT&T Bell Laboratories, Murray Hill, New Jersey 1986. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt"> 9. </span><span style="font-size: 10pt"><i>Unix Time-Sharing System Programmer’s Manual, 4.1 Berkeley Software Distribution, +Volumes 1 and 2C, +</i></span><span style="font-size: 10pt">University of California, Berkeley, Calif. 1981. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">10. R. Pike, +‘Structural Regular Expressions,’ +</span><span style="font-size: 10pt"><i>Proc. EUUG Spring Conf., Helsinki 1987, +</i></span><span style="font-size: 10pt">Eur. Unix User’s Group, Buntingford, Herts, UK 1987. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">11. A. Goldberg, +</span><span style="font-size: 10pt"><i>Smalltalk-80 – The Interactive Programming Environment, +</i></span><span style="font-size: 10pt">Addison-Wesley, Reading, Mass. 1984. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">12. K. Thompson, +‘Regular expression search algorithm,’ +</span><span style="font-size: 10pt"><i>Comm. ACM, +</i></span><span style="font-size: 10pt"></span><span style="font-size: 10pt"><b>11</b></span><span style="font-size: 10pt">, +(6), +419-422 (1968). +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">13. A. V. Aho, J. E. Hopcroft and J. D. Ullman, +</span><span style="font-size: 10pt"><i>The Design and Analysis of Computer Algorithms, +</i></span><span style="font-size: 10pt">Addison-Wesley, Reading, Mass. 1974. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">14. B. W. Kernighan and D. M. Ritchie, +</span><span style="font-size: 10pt"><i>The C Programming Language, +</i></span><span style="font-size: 10pt">Prentice-Hall, Englewood Cliffs, New Jersey 1978. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">15. W. M. Waite, +‘The cost of lexical analysis,’ +</span><span style="font-size: 10pt"><i>Softw. Pract. Exp., +</i></span><span style="font-size: 10pt"></span><span style="font-size: 10pt"><b>16</b></span><span style="font-size: 10pt">, +(5), +473-488 (1986). +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">16. C. W. Fraser, +‘A generalized text editor,’ +</span><span style="font-size: 10pt"><i>Comm. ACM, +</i></span><span style="font-size: 10pt"></span><span style="font-size: 10pt"><b>23</b></span><span style="font-size: 10pt">, +(3), +154-158 (1980). +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">17. R. Pike, +‘Graphics in overlapping bitmap layers,’ +</span><span style="font-size: 10pt"><i>ACM Trans. on Graph., +</i></span><span style="font-size: 10pt"></span><span style="font-size: 10pt"><b>2</b></span><span style="font-size: 10pt">, +(2) +135-160 (1983). +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">18. L. J. Guibas and J. Stolfi, +‘A language for bitmap manipulation,’ +</span><span style="font-size: 10pt"><i>ACM Trans. on Graph., +</i></span><span style="font-size: 10pt"></span><span style="font-size: 10pt"><b>1</b></span><span style="font-size: 10pt">, +(3), +191-214 (1982). +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">19. R. Pike, B. Locanthi and J. Reiser, +‘Hardware/software trade-offs for bitmap graphics on the Blit,’ +</span><span style="font-size: 10pt"><i>Softw. Pract. Exp., +</i></span><span style="font-size: 10pt"></span><span style="font-size: 10pt"><b>15</b></span><span style="font-size: 10pt">, +(2), +131-151 (1985). +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">20. T. A. Cargill, +‘The feel of Pi,’ +</span><span style="font-size: 10pt"><i>Winter USENIX Conference Proceedings, +Denver 1986, +</i></span><span style="font-size: 10pt">62-71, +USENIX Assoc., El Cerrito, CA. +</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p> +<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;"> +<span style="font-size: 10pt">21. G. J. Holzmann, +‘Tracing protocols,’ +</span><span style="font-size: 10pt"><i>AT&T Tech. J., +</i></span><span style="font-size: 10pt"></span><span style="font-size: 10pt"><b>64</b></span><span style="font-size: 10pt">, +(10), +2413-2434 (1985). +</span></p><p style="margin-top: 0; margin-bottom: 0.50in"></p> +</body> +</html> + diff --git a/sys/doc/sam/sam.ms b/sys/doc/sam/sam.ms new file mode 100644 index 000000000..dfbd9c809 --- /dev/null +++ b/sys/doc/sam/sam.ms @@ -0,0 +1,3241 @@ +.HTML "The Text Editor sam +.Vx 17 11 November 87 1 32 "ROB PIKE" "THE TEXT EDITOR SAM" +.ds DY "31 May 1987 +.ds DR "Revised 1 July 1987 +.de CW \" puts first arg in CW font, same as UL; maintains font +\%\&\\$3\f(CW\\$1\fP\&\\$2 +.. +.de Cs +.br +.fi +.ft 2 +.ps -2 +.vs -2 +.. +.de Ce +.br +.nf +.ft 1 +.ps +.vs +.sp +.. +.de XP +.ie h .html - <center><img src="\\$1.gif" /></center> +.el .BP \\$1.ps \\$2 +.. +.TL +The Text Editor \&\f(CWsam\fP +.AU +Rob Pike +rob@plan9.bell-labs.com +.AB +.LP +.CW Sam +is an interactive multi-file text editor intended for +bitmap displays. +A textual command language +supplements the mouse-driven, cut-and-paste interface +to make complex or +repetitive editing tasks easy to specify. +The language is characterized by the composition of regular expressions +to describe the structure of the text being modified. +The treatment of files as a database, with changes logged +as atomic transactions, guides the implementation and +makes a general `undo' mechanism straightforward. +.PP +.CW Sam +is implemented as two processes connected by a low-bandwidth stream, +one process handling the display and the other the editing +algorithms. Therefore it can run with the display process +in a bitmap terminal and the editor on a local host, +with both processes on a bitmap-equipped host, or with +the display process in the terminal and the editor in a +remote host. +By suppressing the display process, +it can even run without a bitmap terminal. +.PP +This paper is reprinted from Software\(emPractice and Experience, +Vol 17, number 11, pp. 813-845, November 1987. +The paper has not been updated for the Plan 9 manuals. Although +.CW Sam +has not changed much since the paper was written, the system around it certainly has. +Nonetheless, the description here still stands as the best introduction to the editor. +.AE +.SH +Introduction +.LP +.CW Sam +is an interactive text editor that combines cut-and-paste interactive editing with +an unusual command language based on the composition of regular expressions. +It is written as two programs: one, the `host part,' runs on a UNIX system +and implements the command language and provides file access; the other, the +`terminal part,' runs asynchronously +on a machine with a mouse and bitmap display +and supports the display and interactive editing. +The host part may be even run in isolation on an ordinary terminal +to edit text using the command +language, much like a traditional line editor, +without assistance from a mouse or display. +Most often, +the terminal part runs on a Blit\u\s-4\&1\s+4\d terminal +(actually on a Teletype DMD 5620, the production version of the Blit), whose +host connection is an ordinary 9600 bps RS232 link; +on the SUN computer the host and display processes run on a single machine, +connected by a pipe. +.PP +.CW Sam +edits uninterpreted +ASCII text. +It has no facilities for multiple fonts, graphics or tables, +unlike MacWrite,\u\s-4\&2\s+4\d Bravo,\u\s-4\&3\s+4\d Tioga\u\s-4\&4\s+4\d +or Lara.\u\s-4\&5\s+4\d +Also unlike them, it has a rich command language. +(Throughout this paper, the phrase +.I +command language +.R +refers to +textual commands; commands activated from the mouse form the +.I mouse +.I language. ) +.CW Sam +developed as an editor for use by programmers, and tries to join +the styles of the UNIX text editor +.CW ed \u\s-4\&6,7\s+4\d +with that of interactive cut-and-paste editors by +providing a comfortable mouse-driven interface +to a program with a solid command language driven by regular expressions. +The command language developed more than the mouse language, and +acquired a notation for describing the structure of files +more richly than as a sequence of lines, +using a dataflow-like syntax for specifying changes. +.PP +The interactive style was influenced by +.CW jim ,\u\s-4\&1\s+4\d +an early cut-and-paste editor for the Blit, and by +.CW mux ,\u\s-4\&8\s+4\d +the Blit window system. +.CW Mux +merges the original Blit window system, +.CW mpx ,\u\s-4\&1\s+4\d +with cut-and-paste editing, forming something like a +multiplexed version of +.CW jim +that edits the output of (and input to) command sessions rather than files. +.PP +The first part of this paper describes the command language, then the mouse +language, and explains how they interact. +That is followed by a description of the implementation, +first of the host part, then of the terminal part. +A principle that influenced the design of +.CW sam +is that it should have no explicit limits, such as upper limits on +file size or line length. +A secondary consideration is that it be efficient. +To honor these two goals together requires a method for efficiently +manipulating +huge strings (files) without breaking them into lines, +perhaps while making thousands of changes +under control of the command language. +.CW Sam 's +method is to +treat the file as a transaction database, implementing changes as atomic +updates. These updates may be unwound easily to `undo' changes. +Efficiency is achieved through a collection of caches that minimizes +disc traffic and data motion, both within the two parts of the program +and between them. +.PP +The terminal part of +.CW sam +is fairly straightforward. +More interesting is how the two halves of the editor stay +synchronized when either half may initiate a change. +This is achieved through a data structure that organizes the +communications and is maintained in parallel by both halves. +.PP +The last part of the paper chronicles the writing of +.CW sam +and discusses the lessons that were learned through its development and use. +.PP +The paper is long, but is composed largely of two papers of reasonable length: +a description of the user interface of +.CW sam +and a discussion of its implementation. +They are combined because the implementation is strongly influenced by +the user interface, and vice versa. +.SH +The Interface +.LP +.CW Sam +is a text editor for multiple files. +File names may be provided when it is invoked: +.P1 +sam file1 file2 ... +.P2 +and there are commands +to add new files and discard unneeded ones. +Files are not read until necessary +to complete some command. +Editing operations apply to an internal copy +made when the file is read; the UNIX file associated with the copy +is changed only by an explicit command. +To simplify the discussion, the internal copy is here called a +.I file , +while the disc-resident original is called a +.I +disc file. +.R +.PP +.CW Sam +is usually connected to a bitmap display that presents a cut-and-paste +editor driven by the mouse. +In this mode, the command language is still available: +text typed in a special window, called the +.CW sam +.I window, +is interpreted +as commands to be executed in the current file. +Cut-and-paste editing may be used in any window \(em even in the +.CW sam +window to construct commands. +The other mode of operation, invoked by starting +.CW sam +with the option +.CW -d +(for `no download'), +does not use the mouse or bitmap display, but still permits +editing using the textual command language, even on an ordinary terminal, +interactively or from a script. +.PP +The following sections describe first the command language (under +.CW sam\ -d +and in the +.CW sam +window), and then the mouse interface. +These two languages are nearly independent, but connect through the +.I current +.I text, +described below. +.SH 2 +The Command Language +.LP +A file consists of its contents, which are an array of characters +(that is, a string); the +.I name +of the associated disc file; the +.I +modified bit +.R +that states whether the contents match those of +the disc file; +and a substring of the contents, called the +.I +current text +.R +or +.I dot +(see Figures 1 and 2). +If the current text is a null string, dot falls between characters. +The +.I value +of dot is the location of the current text; the +.I contents +of dot are the characters it contains. +.CW Sam +imparts to the text no two-dimensional interpretation such as columns +or fields; text is always one-dimensional. +Even the idea of a `line' of text as understood by most UNIX programs +\(em a sequence of characters terminated by a newline character \(em +is only weakly supported. +.PP +The +.I +current file +.R +is the file to which editing commands refer. +The current text is therefore dot in the current file. +If a command doesn't explicitly name a particular file or piece of text, +the command is assumed to apply to the current text. +For the moment, ignore the presence of multiple files and consider +editing a single file. +.KF L +.XP fig1 3.5i +.Cs +Figure 1. A typical +.CW sam +screen, with the editing menu presented. +The +.CW sam +(command language) window is in the middle, with file windows above and below. +(The user interface makes it easy to create these abutting windows.) +The partially obscured window is a third file window. +The uppermost window is that to which typing and mouse operations apply, +as indicated by its heavy border. +Each window has its current text highlighted in reverse video. +The +.CW sam +window's current text is the null string on the last visible line, +indicated by a vertical bar. +See also Figure 2. +.Ce +.KE +.PP +Commands have one-letter names. +Except for non-editing commands such as writing +the file to disc, most commands make some change +to the text in dot and leave dot set to the text resulting from the change. +For example, the delete command, +.CW d , +deletes the text in dot, replacing it by the null string and setting dot +to the result. +The change command, +.CW c , +replaces dot by text delimited by an arbitrary punctuation character, +conventionally +a slash. Thus, +.P1 +c/Peter/ +.P2 +replaces the text in dot by the string +.CW Peter . +Similarly, +.P1 +a/Peter/ +.P2 +(append) adds the string after dot, and +.P1 +i/Peter/ +.P2 +(insert) inserts before dot. +All three leave dot set to the new text, +.CW Peter . +.PP +Newlines are part of the syntax of commands: +the newline character lexically terminates a command. +Within the inserted text, however, newlines are never implicit. +But since it is often convenient to insert multiple lines of text, +.CW sam +has a special +syntax for that case: +.P1 +a +some lines of text +to be inserted in the file, +terminated by a period +on a line by itself +\&. +.P2 +In the one-line syntax, a newline character may be specified by a C-like +escape, so +.P1 +c/\en/ +.P2 +replaces dot by a single newline character. +.PP +.CW Sam +also has a substitute command, +.CW s : +.P1 +s/\f2expression\fP/\f2replacement\fP/ +.P2 +substitutes the replacement text for the first match, in dot, +of the regular expression. +Thus, if dot is the string +.CW Peter , +the command +.P1 +s/t/st/ +.P2 +changes it to +.CW Pester . +In general, +.CW s +is unnecessary, but it was inherited from +.CW ed +and it has some convenient variations. +For instance, the replacement text may include the matched text, +specified by +.CW & : +.P1 +s/Peter/Oh, &, &, &, &!/ +.P2 +.PP +There are also three commands that apply programs +to text: +.P1 +< \f2UNIX program\fP +.P2 +replaces dot by the output of the UNIX program. +Similarly, the +.CW > +command +runs the program with dot as its standard input, and +.CW | +does both. For example, +.P1 +| sort +.P2 +replaces dot by the result of applying the standard sorting utility to it. +Again, newlines have no special significance for these +.CW sam +commands. +The text acted upon and resulting from these commands is not necessarily +bounded by newlines, although for connection with UNIX programs, +newlines may be necessary to obey conventions. +.PP +One more command: +.CW p +prints the contents of dot. +Table I summarizes +.CW sam 's +commands. +.KF +.TS +center; +c s +lfCW l. +Table I. \f(CWSam\fP commands +.sp .4 +.ft CW +_ +.ft +.sp .4 +\f1Text commands\fP +.sp .4 +_ +.sp .4 +a/\f2text\fP/ Append text after dot +c/\f2text\fP/ Change text in dot +i/\f2text\fP/ Insert text before dot +d Delete text in dot +s/\f2regexp\fP/\f2text\fP/ Substitute text for match of regular expression in dot +m \f2address\fP Move text in dot after address +t \f2address\fP Copy text in dot after address +.sp .4 +_ +.sp .4 +\f1Display commands\fP +.sp .4 +_ +.sp .2 +p Print contents of dot +\&= Print value (line numbers and character numbers) of dot +.sp .4 +_ +.sp .4 +\f1File commands\fP +.sp .4 +_ +.sp .2 +b \f2file-list\fP Set current file to first file in list that \f(CWsam\fP has in menu +B \f2file-list\fP Same as \f(CWb\fP, but load new files +n Print menu lines of all files +D \f2file-list\fP Delete named files from \f(CWsam\fP +.sp .4 +_ +.sp .4 +\f1I/O commands\fP +.sp .4 +_ +.sp .2 +e \f2filename\fP Replace file with named disc file +r \f2filename\fP Replace dot by contents of named disc file +w \f2filename\fP Write file to named disc file +f \f2filename\fP Set file name and print new menu line +< \f2UNIX-command\fP Replace dot by standard output of command +> \f2UNIX-command\fP Send dot to standard input of command +| \f2UNIX-command\fP Replace dot by result of command applied to dot +! \f2UNIX-command\fP Run the command +.sp .4 +_ +.sp .4 +\f1Loops and conditionals\fP +.sp .4 +_ +.sp .2 +x/\f2regexp\fP/ \f2command\fP For each match of regexp, set dot and run command +y/\f2regexp\fP/ \f2command\fP Between adjacent matches of regexp, set dot and run command +X/\f2regexp\fP/ \f2command\fP Run command in each file whose menu line matches regexp +Y/\f2regexp\fP/ \f2command\fP Run command in each file whose menu line does not match +g/\f2regexp\fP/ \f2command\fP If dot contains a match of regexp, run command +v/\f2regexp\fP/ \f2command\fP If dot does not contain a match of regexp, run command +.sp .4 +_ +.sp .4 +\f1Miscellany\fP +.sp .4 +_ +.sp .2 +k Set address mark to value of dot +q Quit +u \f2n\fP Undo last \f2n\fP (default 1) changes +{ } Braces group commands +.sp .3 +.ft CW +_ +.ft +.TE +.sp +.KE +.PP +The value of dot may be changed by +specifying an +.I address +for the command. +The simplest address is a line number: +.P1 +3 +.P2 +refers to the third line of the file, so +.P1 +3d +.P2 +deletes the third line of the file, and implicitly renumbers +the lines so the old line 4 is now numbered 3. +(This is one of the few places where +.CW sam +deals with lines directly.) +Line +.CW 0 +is the null string at the beginning of the file. +If a command consists of only an address, a +.CW p +command is assumed, so typing an unadorned +.CW 3 +prints line 3 on the terminal. +There are a couple of other basic addresses: +a period addresses dot itself; and +a dollar sign +.CW $ ) ( +addresses the null string at the end of the file. +.PP +An address is always a single substring of the file. +Thus, the address +.CW 3 +addresses the characters +after the second newline of +the file through the third newline of the file. +A +.I +compound address +.R +is constructed by the comma operator +.P1 +\f2address1\fP,\f2address2\fP +.P2 +and addresses the substring of the file from the beginning of +.I address1 +to the end of +.I address2 . +For example, the command +.CW 3,5p +prints the third through fifth lines of the file and +.CW .,$d +deletes the text from the beginning of dot to the end of the file. +.PP +These addresses are all absolute positions in the file, but +.CW sam +also has relative addresses, indicated by +.CW + +or +.CW - . +For example, +.P1 +$-3 +.P2 +is the third line before the end of the file and +.P1 +\&.+1 +.P2 +is the line after dot. +If no address appears to the left of the +.CW + +or +.CW - , +dot is assumed; +if nothing appears to the right, +.CW 1 +is assumed. +Therefore, +.CW .+1 +may be abbreviated to just a plus sign. +.PP +The +.CW + +operator acts relative to the end of its first argument, while the +.CW - +operator acts relative to the beginning. Thus +.CW .+1 +addresses the first line after dot, +.CW .- +addresses the first line before dot, and +.CW +- +refers to the line containing the end of dot. (Dot may span multiple lines, and +.CW + +selects the line after the end of dot, then +.CW - +backs up one line.) +.PP +The final type of address is a regular expression, which addresses the +text matched by the expression. The expression is enclosed in slashes, as in +.P1 +/\f2expression\fP/ +.P2 +The expressions are the same as those in the UNIX program +.CW egrep ,\u\s-4\&6,7\s+4\d +and include closures, alternations, and so on. +They find the +.I +leftmost longest +.R +string that matches the expression, that is, +the first match after the point where the search is started, +and if more than one match begins at the same spot, the longest such match. +(I assume familiarity with the syntax for regular expressions in UNIX programs.\u\s-4\&9\s+4\d) +For example, +.P1 +/x/ +.P2 +matches the next +.CW x +character in the file, +.P1 +/xx*/ +.P2 +matches the next run of one or more +.CW x 's, +and +.P1 +/x|Peter/ +.P2 +matches the next +.CW x +or +.CW Peter . +For compatibility with other UNIX programs, the `any character' operator, +a period, +does not match a newline, so +.P1 +/.*/ +.P2 +matches the text from dot to the end of the line, but excludes the newline +and so will not match across +the line boundary. +.PP +Regular expressions are always relative addresses. +The direction is forwards by default, +so +.CW /Peter/ +is really an abbreviation for +.CW +/Peter/ . +The search can be reversed with a minus sign, so +.P1 +.CW -/Peter/ +.P2 +finds the first +.CW Peter +before dot. +Regular expressions may be used with other address forms, so +.CW 0+/Peter/ +finds the first +.CW Peter +in the file and +.CW $-/Peter/ +finds the last. +Table II summarizes +.CW sam 's +addresses. +.KF +.TS +center; +c s +lfCW l. +Table II. \f(CWSam\fP addresses +.sp .4 +.ft CW +_ +.ft +.sp .4 +\f1Simple addresses\fP +.sp .4 +_ +.sp .2 +#\f2n\fP The empty string after character \f2n\fP +\f2n\fP Line \f2n\fP. +/\f2regexp\fP/ The first following match of the regular expression +-/\f2regexp\fP/ The first previous match of the regular expression +$ The null string at the end of the file +\&. Dot +\&' The address mark, set by \f(CWk\fP command +"\f2regexp\fP" Dot in the file whose menu line matches regexp +.sp .4 +_ +.sp .4 +\f1Compound addresses\fP +.sp .4 +_ +.sp .2 +\f2a1\fP+\f2a2\fP The address \f2a2\fP evaluated starting at right of \f2a1\fP +\f2a1\fP-\f2a2\fP \f2a2\fP evaluated in the reverse direction starting at left of \f2a1\fP +\f2a1\fP,\f2a2\fP From the left of \f2a1\fP to the right of \f2a2\fP (default \f(CW0,$\fP) +\f2a1\fP;\f2a2\fP Like \f(CW,\fP but sets dot after evaluating \f2a1\fP +.sp .4 +_ +.sp .4 +.T& +c s. +T{ +The operators +.CW + +and +.CW - +are high precedence, while +.CW , +and +.CW ; +are low precedence. +In both +.CW + +and +.CW - +forms, +.I a2 +defaults to 1 and +.I a1 +defaults to dot. +If both +.I a1 +and +.I a2 +are present, +.CW + +may be elided. +T} +.sp .5 +.ft CW +_ +.ft +.TE +.sp +.KE +.PP +The language discussed so far will not seem novel +to people who use UNIX text editors +such as +.CW ed +or +.CW vi .\u\s-4\&9\s+4\d +Moreover, the kinds of editing operations these commands allow, with the exception +of regular expressions and line numbers, +are clearly more conveniently handled by a mouse-based interface. +Indeed, +.CW sam 's +mouse language (discussed at length below) is the means by which +simple changes are usually made. +For large or repetitive changes, however, a textual language +outperforms a manual interface. +.PP +Imagine that, instead of deleting just one occurrence of the string +.CW Peter , +we wanted to eliminate every +.CW Peter . +What's needed is an iterator that runs a command for each occurrence of some +text. +.CW Sam 's +iterator is called +.CW x , +for extract: +.P1 +x/\f2expression\fP/ \f2command\fP +.P2 +finds all matches in dot of the specified expression, and for each +such match, sets dot to the text matched and runs the command. +So to delete all the +.CW Peters: +.P1 +0,$ x/Peter/ d +.P2 +(Blanks in these examples are to improve readability; +.CW sam +neither requires nor interprets them.) +This searches the entire file +.CW 0,$ ) ( +for occurrences of the string +.CW Peter , +and runs the +.CW d +command with dot set to each such occurrence. +(By contrast, the comparable +.CW ed +command would delete all +.I lines +containing +.CW Peter ; +.CW sam +deletes only the +.CW Peters .) +The address +.CW 0,$ +is commonly used, and may be abbreviated to just a comma. +As another example, +.P1 +, x/Peter/ p +.P2 +prints a list of +.CW Peters, +one for each appearance in the file, with no intervening text (not even newlines +to separate the instances). +.PP +Of course, the text extracted by +.CW x +may be selected by a regular expression, +which complicates deciding what set of matches is chosen \(em +matches may overlap. This is resolved by generating the matches +starting from the beginning of dot using the leftmost-longest rule, +and searching for each match starting from the end of the previous one. +Regular expressions may also match null strings, but a null match +adjacent to a non-null match is never selected; at least one character +must intervene. +For example, +.P1 +, c/AAA/ +x/B*/ c/-/ +, p +.P2 +produces as output +.P1 +-A-A-A- +.P2 +because the pattern +.CW B* +matches the null strings separating the +.CW A 's. +.PP +The +.CW x +command has a complement, +.CW y , +with similar syntax, that executes the command with dot set to the text +.I between +the matches of the expression. +For example, +.P1 +, c/AAA/ +y/A/ c/-/ +, p +.P2 +produces the same result as the example above. +.PP +The +.CW x +and +.CW y +commands are looping constructs, and +.CW sam +has a pair of conditional commands to go with them. +They have similar syntax: +.P1 +g/\f2expression\fP/ \f2command\fP +.P2 +(guard) +runs the command exactly once if dot contains a match of the expression. +This is different from +.CW x , +which runs the command for +.I each +match: +.CW x +loops; +.CW g +merely tests, without changing the value of dot. +Thus, +.P1 +, x/Peter/ d +.P2 +deletes all occurrences of +.CW Peter , +but +.P1 +, g/Peter/ d +.P2 +deletes the whole file (reduces it to a null string) if +.CW Peter +occurs anywhere in the text. +The complementary conditional is +.CW v , +which runs the command if there is +.I no +match of the expression. +.PP +These control-structure-like commands may be composed to construct more +involved operations. For example, to print those lines of text that +contain the string +.CW Peter : +.P1 +, x/.*\en/ g/Peter/ p +.P2 +The +.CW x +breaks the file into lines, the +.CW g +selects those lines containing +.CW Peter , +and the +.CW p +prints them. +This command gives an address for the +.CW x +command (the whole file), but because +.CW g +does not have an explicit address, it applies to the value of +dot produced by the +.CW x +command, that is, to each line. +All commands in +.CW sam +except for the command to write a file to disc use dot for the +default address. +.PP +Composition may be continued indefinitely. +.P1 +, x/.*\en/ g/Peter/ v/SaltPeter/ p +.P2 +prints those lines containing +.CW Peter +but +.I not +those containing +.CW SaltPeter . +.SH 2 +Structural Regular Expressions +.LP +Unlike other UNIX text editors, +including the non-interactive ones such as +.CW sed +and +.CW awk ,\u\s-4\&7\s+4\d +.CW sam +is good for manipulating files with multi-line `records.' +An example is an on-line phone book composed of records, +separated by blank lines, of the form +.P1 +Herbert Tic +44 Turnip Ave., Endive, NJ +201-5555642 + +Norbert Twinge +16 Potato St., Cabbagetown, NJ +201-5553145 + +\&... +.P2 +The format may be encoded as a regular expression: +.P1 +(.+\en)+ +.P2 +that is, a sequence of one or more non-blank lines. +The command to print Mr. Tic's entire record is then +.P1 +, x/(.+\en)+/ g/^Herbert Tic$/ p +.P2 +and that to extract just the phone number is +.P1 +, x/(.+\en)+/ g/^Herbert Tic$/ x/^[0-9]*-[0-9]*\en/ p +.P2 +The latter command breaks the file into records, +chooses Mr. Tic's record, +extracts the phone number from the record, +and finally prints the number. +.PP +A more involved problem is that of +renaming a particular variable, say +.CW n , +to +.CW num +in a C program. +The obvious first attempt, +.P1 +, x/n/ c/num/ +.P2 +is badly flawed: it changes not only the variable +.CW n +but any letter +.CW n +that appears. +We need to extract all the variables, and select those that match +.CW n +and only +.CW n : +.P1 +, x/[A-Za-z_][A-Za-z_0-9]*/ g/n/ v/../ c/num/ +.P2 +The pattern +.CW [A-Za-z_][A-Za-z_0-9]* +matches C identifiers. +Next +.CW g/n/ +selects those containing an +.CW n . +Then +.CW v/../ +rejects those containing two (or more) characters, and finally +.CW c/num/ +changes the remainder (identifiers +.CW n ) +to +.CW num . +This version clearly works much better, but there may still be problems. +For example, in C character and string constants, the sequence +.CW \en +is interpreted as a newline character, and we don't want to change it to +.CW \enum. +This problem can be forestalled with a +.CW y +command: +.P1 +, y/\e\en/ x/[A-Za-z_][A-Za-z_0-9]*/ g/n/ v/../ c/num/ +.P2 +(the second +.CW \e +is necessary because of lexical conventions in regular expressions), +or we could even reject character constants and strings outright: +.P1 0 +,y/'[^']*'/ y/"[^"]*"/ x/[A-Za-z_][A-Za-z_0-9]*/ g/n/ v/../ c/num/ +.P2 +The +.CW y +commands in this version exclude from consideration all character constants +and strings. +The only remaining problem is to deal with the possible occurrence of +.CW \e' +or +.CW \e" +within these sequences, but it's easy to see how to resolve this difficulty. +.PP +The point of these composed commands is successive refinement. +A simple version of the command is tried, and if it's not good enough, +it can be honed by adding a clause or two. +(Mistakes can be undone; see below. +Also, the mouse language makes it unnecessary to retype the command each time.) +The resulting chains of commands are somewhat reminiscent of +shell pipelines.\u\s-4\&7\s+4\d +Unlike pipelines, though, which pass along modified +.I data , +.CW sam +commands pass a +.I view +of the data. +The text at each step of the command is the same, but which pieces +are selected is refined step by step until the correct piece is +available to the final step of the command line, which ultimately makes the change. +.PP +In other UNIX programs, regular expressions are used only for selection, +as in the +.CW sam +.CW g +command, never for extraction as in the +.CW x +or +.CW y +command. +For example, patterns in +.CW awk \u\s-4\&7\s+4\d +are used to select lines to be operated on, but cannot be used +to describe the format of the input text, or to handle newline-free text. +The use of regular expressions to describe the structure of a piece +of text rather than its contents, as in the +.CW x +command, +has been given a name: +.I +structural regular expressions. +.R +When they are composed, as in the above example, +they are pleasantly expressive. +Their use is discussed at greater length elsewhere.\u\s-4\&10\s+4\d +.PP +.SH 2 +Multiple files +.LP +.CW Sam +has a few other commands, mostly relating to input and output. +.P1 +e discfilename +.P2 +replaces the contents and name of the current file with those of the named +disc file; +.P1 +w discfilename +.P2 +writes the contents to the named disc file; and +.P1 +r discfilename +.P2 +replaces dot with the contents of the named disc file. +All these commands use the current file's name if none is specified. +Finally, +.P1 +f discfilename +.P2 +changes the name associated with the file and displays the result: +.P1 +\&'-. discfilename +.P2 +This output is called the file's +.I +menu line, +.R +because it is the contents of the file's line in the button 3 menu (described +in the +next section). +The first three characters are a concise notation for the state of the file. +The apostrophe signifies that the file is modified. +The minus sign indicates the number of windows +open on the file (see the next section): +.CW - +means none, +.CW + +means one, and +.CW * +means more than one. +Finally, the period indicates that this is the current file. +These characters are useful for controlling the +.CW X +command, described shortly. +.PP +.CW Sam +may be started with a set of disc files (such as all the source for +a program) by invoking it with a list of file names as arguments, and +more may be added or deleted on demand. +.P1 +B discfile1 discfile2 ... +.P2 +adds the named files to +.CW sam 's +list, and +.P1 +D discfile1 discfile2 ... +.P2 +removes them from +.CW sam 's +memory (without effect on associated disc files). +Both these commands have a syntax for using the shell\u\s-4\&7\s+4\d +(the UNIX command interpreter) to generate the lists: +.P1 +B <echo *.c +.P2 +will add all C source files, and +.P1 +B <grep -l variable *.c +.P2 +will add all C source files referencing a particular variable +(the UNIX command +.CW grep\ -l +lists all files in its arguments that contain matches of +the specified regular expression). +Finally, +.CW D +without arguments deletes the current file. +.PP +There are two ways to change which file is current: +.P1 +b filename +.P2 +makes the named file current. +The +.CW B +command +does the same, but also adds any new files to +.CW sam 's +list. +(In practice, of course, the current file +is usually chosen by mouse actions, not by textual commands.) +The other way is to use a form of address that refers to files: +.P1 +"\f2expression\fP" \f2address\fP +.P2 +refers to the address evaluated in the file whose menu line +matches the expression (there must be exactly one match). +For example, +.P1 +"peter.c" 3 +.P2 +refers to the third line of the file whose name matches +.CW peter.c . +This is most useful in the move +.CW m ) ( +and copy +.CW t ) ( +commands: +.P1 +0,$ t "peter.c" 0 +.P2 +makes a copy of the current file at the beginning of +.CW peter.c . +.PP +The +.CW X +command +is a looping construct, like +.CW x , +that refers to files instead of strings: +.P1 +X/\f2expression\fP/ \f2command\fP +.P2 +runs the command in all +files whose menu lines match the expression. The best example is +.P1 +X/'/ w +.P2 +which writes to disc all modified files. +.CW Y +is the complement of +.CW X : +it runs the command on all files whose menu lines don't match the expression: +.P1 +Y/\e.c/ D +.P2 +deletes all files that don't have +.CW \&.c +in their names, that is, it keeps all C source files and deletes the rest. +.PP +Braces allow commands to be grouped, so +.P1 +{ + \f2command1\fP + \f2command2\fP +} +.P2 +is syntactically a single command that runs two commands. +Thus, +.P1 +X/\e.c/ ,g/variable/ { + f + , x/.*\en/ g/variable/ p +} +.P2 +finds all occurrences of +.CW variable +in C source files, and prints +out the file names and lines of each match. +The precise semantics of compound operations is discussed in the implementation +sections below. +.PP +Finally, +the undo command, +.CW u , +undoes the last command, +no matter how many files were affected. +Multiple undo operations move further back in time, so +.P1 +u +u +.P2 +(which may be abbreviated +.CW u2 ) +undoes the last two commands. An undo may not be undone, however, nor +may any command that adds or deletes files. +Everything else is undoable, though, including for example +.CW e +commands: +.P1 +e filename +u +.P2 +restores the state of the file completely, including its name, dot, +and modified bit. Because of the undo, potentially dangerous commands +are not guarded by confirmations. Only +.CW D , +which destroys the information necessary to restore itself, is protected. +It will not delete a modified file, but a second +.CW D +of the same file will succeed regardless. +The +.CW q +command, which exits +.CW sam , +is similarly guarded. +.SH 2 +Mouse Interface +.LP +.CW Sam +is most commonly run +connected to a bitmap display and mouse for interactive editing. +The only difference in the command language +between regular, mouse-driven +.CW sam +and +.CW sam\ -d +is that if an address +is provided without a command, +.CW sam\ -d +will print the text referenced by the address, but +regular +.CW sam +will highlight it on the screen \(em in fact, +dot is always highlighted (see Figure 2). +.WS 1 +.KF +.XP fig3 2.04i +.Cs +Figure 2. A +.CW sam +window. The scroll bar down the left +represents the file, with the bubble showing the fraction +visible in the window. +The scroll bar may be manipulated by the mouse for convenient browsing. +The current text, +which is highlighted, need not fit on a line. Here it consists of one partial +line, one complete line, and final partial line. +.Ce +.KE +.PP +Each file may have zero or more windows open on the display. +At any time, only one window in all of +.CW sam +is the +.I +current window, +.R +that is, the window to which typing and mouse actions refer; +this may be the +.CW sam +window (that in which commands may be typed) +or one of the file windows. +When a file has multiple windows, the image of the file in each window +is always kept up to date. +The current file is the last file affected by a command, +so if the +.CW sam +window is current, +the current window is not a window on the current file. +However, each window on a file has its own value of dot, +and when switching between windows on a single file, +the file's value of dot is changed to that of the window. +Thus, flipping between windows behaves in the obvious, convenient way. +.PP +The mouse on the Blit has three buttons, numbered left to right. +Button 3 has a list of commands to manipulate windows, +followed by a list of `menu lines' exactly as printed by the +.CW f +command, one per file (not one per window). +These menu lines are sorted by file name. +If the list is long, the Blit menu software will make it more manageable +by generating a scrolling menu instead of an unwieldy long list. +Using the menu to select a file from the list makes that file the current +file, and the most recently current window in that file the current window. +But if that file is already current, selecting it in the menu cycles through +the windows on the file; this simple trick avoids a special menu to +choose windows on a file. +If there is no window open on the file, +.CW sam +changes the mouse cursor to prompt the user to create one. +.PP +The commands on the button 3 menu are straightforward (see Figure 3), and +are like the commands to manipulate windows in +.CW mux ,\u\s-4\&8\s+4\d +the Blit's window system. +.CW New +makes a new file, and gives it one empty window, whose size is determined +by a rectangle swept by the mouse. +.CW Zerox +prompts for a window to be selected, and +makes a clone of that window; this is how multiple windows are created on one file. +.CW Reshape +changes the size of the indicated window, and +.CW close +deletes it. If that is the last window open on the file, +.CW close +first does a +.CW D +command on the file. +.CW Write +is identical to a +.CW w +command on the file; it is in the menu purely for convenience. +Finally, +.CW ~~sam~~ +is a menu item that appears between the commands and the file names. +Selecting it makes the +.CW sam +window the current window, +causing subsequent typing to be interpreted as commands. +.KF +.XP fig2 2.74i +.Cs +Figure 3. The menu on button 3. +The black rectangle on the left is a scroll bar; the menu is limited to +the length shown to prevent its becoming unwieldy. +Above the +.CW ~~sam~~ +line is a list of commands; +beneath it is a list of files, presented exactly as with the +.CW f +command. +.Ce +.KE +.PP +When +.CW sam +requests that a window be swept, in response to +.CW new , +.CW zerox +or +.CW reshape , +it changes the mouse cursor from the usual arrow to a box with +a small arrow. +In this state, the mouse may be used to indicate an arbitrary rectangle by +pressing button 3 at one corner and releasing it at the opposite corner. +More conveniently, +button 3 may simply be clicked, +whereupon +.CW sam +creates the maximal rectangle that contains the cursor +and abuts the +.CW sam +window. +By placing the +.CW sam +window in the middle of the screen, the user can define two regions (one above, +one below) in which stacked fully-overlapping +windows can be created with minimal fuss (see Figure 1). +This simple user interface trick makes window creation noticeably easier. +.PP +The cut-and-paste editor is essentially the same as that in Smalltalk-80.\u\s-4\&11\s+4\d +The text in dot is always highlighted on the screen. +When a character is typed it replaces dot, and sets dot to the null +string after the character. Thus, ordinary typing inserts text. +Button 1 is used for selection: +pressing the button, moving the mouse, and lifting the button +selects (sets dot to) the text between the points where the +button was pressed and released. +Pressing and releasing at the same point selects a null string; this +is called clicking. Clicking twice quickly, or +.I +double clicking, +.R +selects larger objects; +for example, double clicking in a word selects the word, +double clicking just inside an opening bracket selects the text +contained in the brackets (handling nested brackets correctly), +and similarly for +parentheses, quotes, and so on. +The double-clicking rules reflect a bias toward +programmers. +If +.CW sam +were intended more for word processing, double-clicks would probably +select linguistic structures such as sentences. +.PP +If button 1 is pressed outside the current window, it makes the indicated +window current. +This is the easiest way to switch between windows and files. +.PP +Pressing button 2 brings up a menu of editing functions (see Figure 4). +These mostly apply to the selected text: +.CW cut +deletes the selected text, and remembers it in a hidden buffer called the +.I +snarf buffer, +.R +.CW paste +replaces the selected text by the contents of the snarf buffer, +.CW snarf +just copies the selected text to the snarf buffer, +.CW look +searches forward for the next literal occurrence of the selected text, and +.CW <mux> +exchanges snarf buffers with the window system in which +.CW sam +is running. +Finally, the last regular expression used appears as a menu entry +to search +forward for the next occurrence of a match for the expression. +.WS 1 +.KF +.XP fig4 1.20i +.Cs +Figure 4. The menu on button 2. +The bottom entry tracks the most recently used regular expression, which may +be literal text. +.Ce +.KE +.PP +The relationship between the command language and the mouse language is +entirely due to the equality of dot and the selected text chosen +with button 1 on the mouse. +For example, to make a set of changes in a C subroutine, dot can be +set by double clicking on the left brace that begins the subroutine, +which sets dot for the command language. +An address-free command then typed in the +.CW sam +window will apply only to the text between the opening and closing +braces of the function. +The idea is to select what you want, and then say what you want +to do with it, whether invoked by a menu selection or by a typed command. +And of course, the value of dot is highlighted on +the display after the command completes. +This relationship between mouse interface and command language +is clumsy to explain, but comfortable, even natural, in practice. +.SH +The Implementation +.LP +The next few sections describe how +.CW sam +is put together, first the host part, +then the inter-component communication, +then the terminal part. +After explaining how the command language is implemented, +the discussion follows (roughly) the path of a character +from the temporary file on disc to the screen. +The presentation centers on the data structures, +because that is how the program was designed and because +the algorithms are easy to provide, given the right data +structures. +.SH 2 +Parsing and execution +.LP +The command language is interpreted by parsing each command with a +table-driven recursive +descent parser, and when a complete command is assembled, invoking a top-down +executor. +Most editors instead employ a simple character-at-a-time +lexical scanner. +Use of a parser makes it +easy and unambiguous to detect when a command is complete, +which has two advantages. +First, escape conventions such as backslashes to quote +multiple-line commands are unnecessary; if the command isn't finished, +the parser keeps reading. For example, a multiple-line append driven by an +.CW x +command is straightforward: +.P1 +x/.*\en/ g/Peter/ a +one line about Peter +another line about Peter +\&. +.P2 +Other UNIX editors would require a backslash after all but the last line. +.PP +The other advantage is specific to the two-process structure of +.CW sam . +The host process must decide when a command is completed so the +command interpreter can be called. This problem is easily resolved +by having the lexical analyzer read the single stream of events from the +terminal, directly executing all typing and mouse commands, +but passing to the parser characters typed to the +.CW sam +command window. +This scheme is slightly complicated by the availability of cut-and-paste +editing in the +.CW sam +window, but that difficulty is resolved by applying the rules +used in +.CW mux : +when a newline is typed to the +.CW sam +window, all text between the newline and the previously typed newline +is made available to the parser. +This permits arbitrary editing to be done to a command before +typing newline and thereby requesting execution. +.PP +The parser is driven by a table because the syntax of addresses +and commands is regular enough +to be encoded compactly. There are few special cases, such as the +replacement text in a substitution, so the syntax of almost all commands +can be encoded with a few flags. +These include whether the command allows an address (for example, +.CW e +does not), whether it takes a regular expression (as in +.CW x +and +.CW s ), +whether it takes replacement text (as in +.CW c +or +.CW i ), +which may be multi-line, and so on. +The internal syntax of regular expressions is handled by a separate +parser; a regular expression is a leaf of the command parse tree. +Regular expressions are discussed fully in the next section. +.PP +The parser table also has information about defaults, so the interpreter +is always called with a complete tree. For example, the parser fills in +the implicit +.CW 0 +and +.CW $ +in the abbreviated address +.CW , +(comma), +inserts a +.CW + +to the left of an unadorned regular expression in an address, +and provides the usual default address +.CW . +(dot) for commands that expect an address but are not given one. +.PP +Once a complete command is parsed, the evaluation is easy. +The address is evaluated left-to-right starting from the value of dot, +with a mostly ordinary expression evaluator. +Addresses, like many of the data structures in +.CW sam , +are held in a C structure and passed around by value: +.P1 +typedef long Posn; /* Position in a file */ +typedef struct Range{ + Posn p1, p2; +}Range; +typedef struct Address{ + Range r; + File *f; +}Address; +.P2 +An address is encoded as a substring (character positions +.CW p1 +to +.CW p2 ) +in a file +.CW f . +(The data type +.CW File +is described in detail below.) +.PP +The address interpreter is an +.CW Address -valued +function that traverses the parse tree describing an address (the +parse tree for the address has type +.CW Addrtree ): +.P1 +Address +address(ap, a, sign) + Addrtree *ap; + Address a; + int sign; +{ + Address a2; + do + switch(ap->type){ + case '.': + a=a.f->dot; + break; + case '$': + a.r.p1=a.r.p2=a.f->nbytes; + break; + case '"': + a=matchfile(a, ap->aregexp)->dot; + break; + case ',': + a2=address(ap->right, a, 0); + a=address(ap->left, a, 0); + if(a.f!=a2.f || a2.r.p2<a.r.p1) + error(Eorder); + a.r.p2=a2.r.p2; + return a; + /* and so on */ + } + while((ap=ap->right)!=0); + return a; +} +.P2 +.PP +Throughout, errors are handled by a non-local +.CW goto +(a +.CW setjmp/longjmp +in C terminology) +hidden in a routine called +.CW error +that immediately aborts the execution, retracts any +partially made changes (see the section below on `undoing'), and +returns to the top level of the parser. +The argument to +.CW error +is an enumeration type that +is translated to a terse but possibly helpful +message such as `?addresses out of order.' +Very common messages are kept short; for example the message for +a failed regular expression search is `?search.' +.PP +Character addresses such as +.CW #3 +are trivial to implement, as the +.CW File +data structure is accessible by character number. +However, +.CW sam +keeps no information about the position of newlines \(em it is too +expensive to track dynamically \(em so line addresses are computed by reading +the file, counting newlines. Except in very large files, this has proven +acceptable: file access is fast enough to make the technique practical, +and lines are not central to the structure of the command language. +.PP +The command interpreter, called +.CW cmdexec , +is also straightforward. The parse table includes a +function to call to interpret a particular command. That function +receives as arguments +the calculated address +for the command +and the command tree (of type +.CW Cmdtree ), +which may contain information such as the subtree for compound commands. +Here, for example, is the function for the +.CW g +and +.CW v +commands: +.P1 +int +g_cmd(a, cp) + Address a; + Cmdtree *cp; +{ + compile(cp->regexp); + if(execute(a.f, a.r.p1, a.r.p2)!=(cp->cmdchar=='v')){ + a.f->dot=a; + return cmdexec(a, cp->subcmd); + } + return TRUE; /* cause execution to continue */ +} +.P2 +.CW Compile "" ( +and +.CW execute +are part of the regular expression code, described in the next section.) +Because the parser and the +.CW File +data structure do most of the work, most commands +are similarly brief. +.SH 2 +Regular expressions +.LP +The regular expression code in +.CW sam +is an interpreted, rather than compiled on-the-fly, implementation of Thompson's +non-deterministic finite automaton algorithm.\u\s-4\&12\s+4\d +The syntax and semantics of the expressions are as in the UNIX program +.CW egrep , +including alternation, closures, character classes, and so on. +The only changes in the notation are two additions: +.CW \en +is translated to, and matches, a newline character, and +.CW @ +matches any character. In +.CW egrep , +the character +.CW \&. +matches any character except newline, and in +.CW sam +the same rule seemed safest, to prevent idioms like +.CW \&.* +from spanning newlines. +.CW Egrep +expressions are arguably too complicated for an interactive editor \(em +certainly it would make sense if all the special characters were two-character +sequences, so that most of the punctuation characters wouldn't have +peculiar meanings \(em but for an interesting command language, full +regular expressions are necessary, and +.CW egrep +defines the full regular expression syntax for UNIX programs. +Also, it seemed superfluous to define a new syntax, since various UNIX programs +.CW ed , ( +.CW egrep +and +.CW vi ) +define too many already. +.PP +The expressions are compiled by a routine, +.CW compile , +that generates the description of the non-deterministic finite state machine. +A second routine, +.CW execute , +interprets the machine to generate the leftmost-longest match of the +expression in a substring of the file. +The algorithm is described elsewhere.\u\s-4\&12,13\s+4\d +.CW Execute +reports +whether a match was found, and sets a global variable, +of type +.CW Range , +to the substring matched. +.PP +A trick is required to evaluate the expression in reverse, such as when +searching backwards for an expression. +For example, +.P1 +-/P.*r/ +.P2 +looks backwards through the file for a match of the expression. +The expression, however, is defined for a forward search. +The solution is to construct a machine identical to the machine +for a forward search except for a reversal of all the concatenation +operators (the other operators are symmetric under direction reversal), +to exchange the meaning of the operators +.CW ^ +and +.CW $ , +and then to read the file backwards, looking for the +usual earliest longest match. +.PP +.CW Execute +generates only one match each time it is called. +To interpret looping constructs such as the +.CW x +command, +.CW sam +must therefore synchronize between +calls of +.CW execute +to avoid +problems with null matches. +For example, even given the leftmost-longest rule, +the expression +.CW a* +matches three times in the string +.CW ab +(the character +.CW a , +the null string between the +.CW a +and +.CW b , +and the final null string). +After returning a match for the +.CW a , +.CW sam +must not match the null string before the +.CW b . +The algorithm starts +.CW execute +at the end of its previous match, and +if the match it returns +is null and abuts the previous match, rejects the match and advances +the initial position one character. +.SH 2 +Memory allocation +.LP +The C language has no memory allocation primitives, although a standard +library routine, +.CW malloc , +provides adequate service for simple programs. +For specific uses, however, +it can be better to write a custom allocator. +The allocator (or rather, pair of allocators) described here +work in both the terminal and host parts of +.CW sam . +They are designed for efficient manipulation of strings, +which are allocated and freed frequently and vary in length from essentially +zero to 32 Kbytes (very large strings are written to disc). +More important, strings may be large and change size often, +so to minimize memory usage it is helpful to reclaim and to coalesce the +unused portions of strings when they are truncated. +.PP +Objects to be allocated in +.CW sam +are of two flavors: +the first is C +.CW structs , +which are small and often addressed by pointer variables; +the second is variable-sized arrays of characters +or integers whose +base pointer is always used to access them. +The memory allocator in +.CW sam +is therefore in two parts: +first, a traditional first-fit allocator that provides fixed storage for +.CW structs ; +and second, a garbage-compacting allocator that reduces storage +overhead for variable-sized objects, at the cost of some bookkeeping. +The two types of objects are allocated from adjoining arenas, with +the garbage-compacting allocator controlling the arena with higher addresses. +Separating into two arenas simplifies compaction and prevents fragmentation due +to immovable objects. +The access rules for garbage-compactable objects +(discussed in the next paragraph) allow them to be relocated, so when +the first-fit arena needs space, it moves the garbage-compacted arena +to higher addresses to make room. Storage is therefore created only +at successively higher addresses, either when more garbage-compacted +space is needed or when the first-fit arena pushes up the other arena. +.PP +Objects that may be compacted declare to the +allocator a cell that is guaranteed to be the sole repository of the +address of the object whenever a compaction can occur. +The compactor can then update the address when the object is moved. +For example, the implementation of type +.CW List +(really a variable-length array) +is: +.P1 +typedef struct List{ + int nused; + long *ptr; +}List; +.P2 +The +.CW ptr +cell must always be used directly, and never copied. When a +.CW List +is to be created the +.CW List +structure is allocated in the ordinary first-fit arena +and its +.CW ptr +is allocated in the garbage-compacted arena. +A similar data type for strings, called +.CW String , +stores variable-length character arrays of up to 32767 elements. +.PP +A related matter of programming style: +.CW sam +frequently passes structures by value, which +simplifies the code. +Traditionally, C programs have +passed structures by reference, but implicit allocation on +the stack is easier to use. +Structure passing is a relatively new feature of C +(it is not in the +standard reference manual for C\u\s-4\&14\s+4\d), and is poorly supported in most +commercial C compilers. +It's convenient and expressive, though, +and simplifies memory management by +avoiding the allocator altogether +and eliminating pointer aliases. +.SH 2 +Data structures for manipulating files +.LP +Experience with +.CW jim +showed that the requirements +of the file data structure were few, but strict. +First, files need to be read and written quickly; +adding a fresh file must be painless. +Second, the implementation must place no arbitrary upper limit on +the number or sizes of files. (It should be practical to edit many files, +and files up to megabytes in length should be handled gracefully.) +This implies that files be stored on disc, not in main memory. +(Aficionados of virtual memory may argue otherwise, but the +implementation of virtual +memory in our system is not something to depend on +for good performance.) +Third, changes to files need be made by only two primitives: +deletion and insertion. +These are inverses of each other, +which simplifies the implementation of the undo operation. +Finally, +it must be easy and efficient to access the file, either +forwards or backwards, a byte at a time. +.PP +The +.CW File +data type is constructed from three simpler data structures that hold arrays +of characters. +Each of these types has an insertion and deletion operator, and the +insertion and deletion operators of the +.CW File +type itself are constructed from them. +.PP +The simplest type is the +.CW String , +which is used to hold strings in main memory. +The code that manages +.CW Strings +guarantees that they will never be longer +than some moderate size, and in practice they are rarely larger than 8 Kbytes. +.CW Strings +have two purposes: they hold short strings like file names with little overhead, +and because they are deliberately small, they are efficient to modify. +They are therefore used as the data structure for in-memory caches. +.PP +The disc copy of the file is managed by a data structure called a +.CW Disc , +which corresponds to a temporary file. A +.CW Disc +has no storage in main memory other than bookkeeping information; +the actual data being held is all on the disc. +To reduce the number of open files needed, +.CW sam +opens a dozen temporary UNIX files and multiplexes the +.CW Discs +upon them. +This permits many files to +be edited; the entire +.CW sam +source (48 files) may be edited comfortably with a single +instance of +.CW sam . +Allocating one temporary file per +.CW Disc +would strain the operating system's limit on the number of open files. +Also, spreading the traffic among temporary files keeps the files shorter, +and shorter files are more efficiently implemented by the UNIX +I/O subsystem. +.PP +A +.CW Disc +is an array of fixed-length blocks, each of which contains +between 1 and 4096 characters of active data. +(The block size of our UNIX file system is 4096 bytes.) +The block addresses within the temporary file and the length of each +block are stored in a +.CW List . +When changes are made the live part of blocks may change size. +Blocks are created and coalesced when necessary to try to keep the sizes +between 2048 and 4096 bytes. +An actively changing part of the +.CW Disc +therefore typically has about a kilobyte of slop that can be +inserted or deleted +without changing more than one block or affecting the block order. +When an insertion would overflow a block, the block is split, a new one +is allocated to receive the overflow, and the memory-resident list of blocks +is rearranged to reflect the insertion of the new block. +.PP +Obviously, going to the disc for every modification to the file is +prohibitively expensive. +The data type +.CW Buffer +consists of a +.CW Disc +to hold the data and a +.CW String +that acts as a cache. +This is the first of a series of caches throughout the data structures in +.CW sam. +The caches not only improve performance, they provide a way to organize +the flow of data, particularly in the communication between the host +and terminal. +This idea is developed below, in the section on communications. +.PP +To reduce disc traffic, changes to a +.CW Buffer +are mediated by a variable-length string, in memory, that acts as a cache. +When an insertion or deletion is made to a +.CW Buffer , +if the change can be accommodated by the cache, it is done there. +If the cache becomes bigger than a block because of an insertion, +some of it is written to the +.CW Disc +and deleted from the cache. +If the change does not intersect the cache, the cache is flushed. +The cache is only loaded at the new position if the change is smaller than a block; +otherwise, it is sent directly to the +.CW Disc . +This is because +large changes are typically sequential, +whereupon the next change is unlikely to overlap the current one. +.PP +A +.CW File +comprises a +.CW String +to hold the file name and some ancillary data such as dot and the modified bit. +The most important components, though, are a pair of +.CW Buffers , +one called the transcript and the other the contents. +Their use is described in the next section. +.PP +The overall structure is shown in Figure 5. +Although it may seem that the data is touched many times on its +way from the +.CW Disc , +it is read (by one UNIX system call) directly into the cache of the +associated +.CW Buffer ; +no extra copy is done. +Similarly, when flushing the cache, the text is written +directly from the cache to disc. +Most operations act directly on the text in the cache. +A principle applied throughout +.CW sam +is that the fewer times the data is copied, the faster the program will run +(see also the paper by Waite\u\s-4\&15\s+4\d). +.KF +.PS +copy "fig5.pic" +.PE +.Cs +Figure 5. File data structures. +The temporary files are stored in the standard repository for such files +on the host system. +.Ce +.KE +.PP +The contents of a +.CW File +are accessed by a routine that +copies to a buffer a substring of a file starting at a specified offset. +To read a byte at a time, a +.CW File "" per- +array is loaded starting from a specified initial position, +and bytes may then be read from the array. +The implementation is done by a macro similar to the C standard I/O +.CW getc +macro.\u\s-4\&14\s+4\d +Because the reading may be done at any address, a minor change to the +macro allows the file to be read backwards. +This array is read-only; there is no +.CW putc . +.SH 2 +Doing and undoing +.LP +.CW Sam +has an unusual method for managing changes to files. +The command language makes it easy to specify multiple variable-length changes +to a file millions of bytes long, and such changes +must be made efficiently if the editor is to be practical. +The usual techniques for inserting and deleting strings +are inadequate under these conditions. +The +.CW Buffer +and +.CW Disc +data structures are designed for efficient random access to long strings, +but care must be taken to avoid super-linear behavior when making +many changes simultaneously. +.PP +.CW Sam +uses a two-pass algorithm for making changes, and treats each file as a database +against which transactions are registered. +Changes are not made directly to the contents. +Instead, when a command is started, a `mark' containing +a sequence number is placed in the transcript +.CW Buffer , +and each change made to the file, either an insertion or deletion +or a change to the file name, +is appended to the end of the transcript. +When the command is complete, the transcript is rewound to the +mark and applied to the contents. +.PP +One reason for separating evaluation from +application in this way is to simplify tracking the addresses of changes +made in the middle of a long sequence. +The two-pass algorithm also allows all changes to apply to the +.I original +data: no change can affect another change made in the same command. +This is particularly important when evaluating an +.CW x +command because it prevents regular expression matches +from stumbling over changes made earlier in the execution. +Also, the two-pass +algorithm is cleaner than the way other UNIX editors allow changes to +affect each other; +for example, +.CW ed 's +idioms to do things like delete every other line +depend critically on the implementation. +Instead, +.CW sam 's +simple model, in which all changes in a command occur effectively +simultaneously, is easy to explain and to understand. +.PP +The records in the transcript are of the form ``delete substring from +locations +123 to 456'' and ``insert 11 characters `hello there' at location 789.'' +(It is an error if the changes are not at monotonically greater +positions through the file.) +While the update is occurring, these numbers must be +offset by earlier changes, but that is straightforward and +local to the update routine; +moreover, all the numbers have been computed +before the first is examined. +.PP +Treating the file as a transaction system has another advantage: +undo is trivial. +All it takes is to invert the transcript after it has been +implemented, converting insertions +into deletions and vice versa, and saving them in a holding +.CW Buffer . +The `do' transcript can then be deleted from +the transcript +.CW Buffer +and replaced by the `undo' transcript. +If an undo is requested, the transcript is rewound and the undo transcript +executed. +Because the transcript +.CW Buffer +is not truncated after each command, it accumulates +successive changes. +A sequence of undo commands +can therefore back up the file arbitrarily, +which is more helpful than the more commonly implemented self-inverse form of undo. +.CW Sam "" ( +provides no way to undo an undo, but if it were desired, +it would be easy to provide by re-interpreting the `do' transcript.) +Each mark in the transcript contains a sequence number and the offset into +the transcript of the previous mark, to aid in unwinding the transcript. +Marks also contain the value of dot and the modified bit so these can be +restored easily. +Undoing multiple files is easy; it merely demands undoing all files whose +latest change has the same sequence number as the current file. +.PP +Another benefit of having a transcript is that errors encountered in the middle +of a complicated command need not leave the files in an intermediate state. +By rewinding the transcript to the mark beginning the command, +the partial command can be trivially undone. +.PP +When the update algorithm was first implemented, it was unacceptably slow, +so a cache was added to coalesce nearby changes, +replacing multiple small changes by a single larger one. +This reduced the number +of insertions into the transaction +.CW Buffer , +and made a dramatic improvement in performance, +but made it impossible +to handle changes in non-monotonic order in the file; the caching method +only works if changes don't overlap. +Before the cache was added, the transaction could in principle be sorted +if the changes were out of order, although +this was never done. +The current status is therefore acceptable performance with a minor +restriction on global changes, which is sometimes, but rarely, an annoyance. +.PP +The update algorithm obviously paws the data more than simpler +algorithms, but it is not prohibitively expensive; +the caches help. +(The principle of avoiding copying the data is still honored here, +although not as piously: +the data is moved from contents' cache to +the transcript's all at once and through only one internal buffer.) +Performance figures confirm the efficiency. +To read from a dead start a hundred kilobyte file on a VAX-11/750 +takes 1.4 seconds of user time, 2.5 seconds of system time, +and 5 seconds of real time. +Reading the same file in +.CW ed +takes 6.0 seconds of user time, 1.7 seconds of system time, +and 8 seconds of real time. +.CW Sam +uses about half the CPU time. +A more interesting example is the one stated above: +inserting a character between every pair of characters in the file. +The +.CW sam +command is +.P1 +,y/@/ a/x/ +.P2 +and takes 3 CPU seconds per kilobyte of input file, of which +about a third is spent in the regular expression code. +This translates to about 500 changes per second. +.CW Ed +takes 1.5 seconds per kilobyte to make a similar change (ignoring newlines), +but cannot undo it. +The same example in +.CW ex ,\u\s-4\&9\s+4\d +a variant of +.CW ed +done at the University of California at Berkeley, +which allows one level of undoing, again takes 3 seconds. +In summary, +.CW sam 's +performance is comparable to that of other UNIX editors, although it solves +a harder problem. +.SH 2 +Communications +.LP +The discussion so far has described the implementation of the host part of +.CW sam ; +the next few sections explain how a machine with mouse and bitmap display +can be engaged to improve interaction. +.CW Sam +is not the first editor to be written as two processes,\u\s-4\&16\s+4\d +but its implementation +has some unusual aspects. +.PP +There are several ways +.CW sam 's +host and terminal parts may be connected. +The first and simplest is to forgo the terminal part and use the host +part's command language to edit text on an ordinary terminal. +This mode is invoked by starting +.CW sam +with the +.CW -d +option. +With no options, +.CW sam +runs separate host and terminal programs, +communicating with a message protocol over the physical +connection that joins them. +Typically, the connection is an RS-232 link between a Blit +(the prototypical display for +.CW sam ) +and a host running +the Ninth Edition of the UNIX operating system.\u\s-4\&8\s+4\d +(This is the version of the system used in the Computing Sciences Research +Center at AT&T Bell Laboratories [now Lucent Technologies, Bell Labs], where I work. Its relevant +aspects are discussed in the Blit paper.\u\s-4\&1\s+4\d) +The implementation of +.CW sam +for the SUN computer runs both processes on the same machine and +connects them by a pipe. +.PP +The low bandwidth of an RS-232 link +necessitated the split between +the two programs. +The division is a mixed blessing: +a program in two parts is much harder to write and to debug +than a self-contained one, +but the split makes several unusual configurations possible. +The terminal may be physically separated from the host, allowing the conveniences +of a mouse and bitmap display to be taken home while leaving the files at work. +It is also possible to run the host part on a remote machine: +.P1 +sam -r host +.P2 +connects to the terminal in the usual way, and then makes a call +across the network to establish the host part of +.CW sam +on the named machine. +Finally, it cross-connects the I/O to join the two parts. +This allows +.CW sam +to be run on machines that do not support bitmap displays; +for example, +.CW sam +is the editor of choice on our Cray X-MP/24. +.CW Sam +.CW -r +involves +.I three +machines: the remote host, the terminal, and the local host. +The local host's job is simple but vital: it passes the data +between the remote host and terminal. +.PP +The host and terminal exchange messages asynchronously +(rather than, say, as remote procedure calls) but there is no +error detection or correction +because, whatever the configuration, the connection is reliable. +Because the terminal handles mundane interaction tasks such as +popping up menus and interpreting the responses, the messages are about +data, not actions. +For example, the host knows nothing about what is displayed on the screen, +and when the user types a character, the message sent to the host says +``insert a one-byte string at location 123 in file 7,'' not ``a character +was typed at the current position in the current file.'' +In other words, the messages look very much like the transaction records +in the transcripts. +.PP +Either the host or terminal part of +.CW sam +may initiate a change to a file. +The command language operates on the host, while typing and some +mouse operations are executed directly in the terminal to optimize response. +Changes initiated by the host program must be transmitted to the terminal, +and +vice versa. +(A token is exchanged to determine which end is in control, +which means that characters typed while a time-consuming command runs +must be buffered and do not appear until the command is complete.) +To maintain consistent information, +the host and terminal track changes through a per-file +data structure that records what portions of the file +the terminal has received. +The data structure, called a +.CW Rasp +(a weak pun: it's a file with holes) +is held and updated by both the host and terminal. +A +.CW Rasp +is a list of +.CW Strings +holding those parts of the file known to the terminal, +separated by counts of the number of bytes in the interstices. +Of course, the host doesn't keep a separate copy of the data (it only needs +the lengths of the various pieces), +but the structure is the same on both ends. +.PP +The +.CW Rasp +in the terminal doubles as a cache. +Since the terminal keeps the text for portions of the file it has displayed, +it need not request data from the host when revisiting old parts of the file +or redrawing obscured windows, which speeds things up considerably +over low-speed links. +.PP +It's trivial for the terminal to maintain its +.CW Rasp , +because all changes made on the terminal apply to parts of the file +already loaded there. +Changes made by the host are compared against the +.CW Rasp +during the update sequence after each command. +Small changes to pieces of the file loaded in the terminal +are sent in their entirety. +Larger changes, and changes that fall entirely in the holes, +are transmitted as messages without literal data: +only the lengths of the deleted and inserted strings are transmitted. +When a command is completed, the terminal examines its visible +windows to see if any holes in their +.CW Rasps +intersect the visible portion of the file. +It then requests the missing data from the host, +along with up to 512 bytes of surrounding data, to minimize +the number of messages when visiting a new portion of the file. +This technique provides a kind of two-level lazy evaluation for the terminal. +The first level sends a minimum of information about +parts of the file not being edited interactively; +the second level waits until a change is displayed before +transmitting the new data. +Of course, +performance is also helped by having the terminal respond immediately to typing +and simple mouse requests. +Except for small changes to active pieces of the file, which are +transmitted to the terminal without negotiation, +the terminal is wholly responsible for deciding what is displayed; +the host uses the +.CW Rasp +only to tell the terminal what might be relevant. +.PP +When a change is initiated by the host, +the messages to the terminal describing the change +are generated by the routine that applies the transcript of the changes +to the contents of the +.CW File . +Since changes are undone by the same update routine, +undoing requires +no extra code in the communications; +the usual messages describing changes to the file are sufficient +to back up the screen image. +.PP +The +.CW Rasp +is a particularly good example of the way caches are used in +.CW sam . +First, it facilitates access to the active portion of the text by placing +the busy text in main memory. +In so doing, it provides efficient access +to a large data structure that does not fit in memory. +Since the form of data is to be imposed by the user, not by the program, +and because characters will frequently be scanned sequentially, +files are stored as flat objects. +Caches help keep performance good and linear when working with such +data. +.PP +Second, the +.CW Rasp +and several of the other caches have some +.I read-ahead; +that is, the cache is loaded with more information than is needed for +the job immediately at hand. +When manipulating linear structures, the accesses are usually sequential, +and read-ahead can significantly reduce the average time to access the +next element of the object. +Sequential access is a common mode for people as well as programs; +consider scrolling through a document while looking for something. +.PP +Finally, like any good data structure, +the cache guides the algorithm, or at least the implementation. +The +.CW Rasp +was actually invented to control the communications between the host and +terminal parts, but I realized very early that it was also a form of +cache. Other caches were more explicitly intended to serve a double +purpose: for example, the caches in +.CW Files +that coalesce updates not only reduce traffic to the +transcript and contents +.CW Buffers , +they also clump screen updates so that complicated changes to the +screen are achieved in +just a few messages to the terminal. +This saved me considerable work: I did not need to write special +code to optimize the message traffic to the +terminal. +Caches pay off in surprising ways. +Also, they tend to be independent, so their performance improvements +are multiplicative. +.SH 2 +Data structures in the terminal +.LP +The terminal's job is to display and to maintain a consistent image of +pieces of the files being edited. +Because the text is always in memory, the data structures are +considerably simpler than those in the host part. +.PP +.CW Sam +typically has far more windows than does +.CW mux , +the window system within which its Blit implementation runs. +.CW Mux +has a fairly small number of asynchronously updated windows; +.CW sam +needs a large number of synchronously updated windows that are +usually static and often fully obscured. +The different tradeoffs guided +.CW sam +away from the memory-intensive implementation of windows, called +.CW Layers ,\u\s-4\&17\s+4\d +used in +.CW mux. +Rather than depending on a complete bitmap image of the display for each window, +.CW sam +regenerates the image from its in-memory text +(stored in the +.CW Rasp ) +when necessary, although it will use such an image if it is available. +Like +.CW Layers , +though, +.CW sam +uses the screen bitmap as active storage in which to update the image using +.CW bitblt .\u\s-4\&18,19\s+4\d +The resulting organization, pictured in Figure 6, +has a global array of windows, called +.CW Flayers , +each of which holds an image of a piece of text held in a data structure +called a +.CW Frame , +which in turn represents +a rectangular window full of text displayed in some +.CW Bitmap . +Each +.CW Flayer +appears in a global list that orders them all front-to-back +on the display, and simultaneously as an element of a per-file array +that holds all the open windows for that file. +The complement in the terminal of the +.CW File +on the host is called a +.CW Text ; +each connects its +.CW Flayers +to the associated +.CW Rasp . +.KF +.PS +copy "fig6.pic" +.PE +.Cs +Figure 6. Data structures in the terminal. +.CW Flayers +are also linked together into a front-to-back list. +.CW Boxes +are discussed in the next section. +.Ce +.KE +.PP +The +.CW Bitmap +for a +.CW Frame +contains the image of the text. +For a fully visible window, the +.CW Bitmap +will be the screen (or at least the +.CW Layer +in which +.CW sam +is being run), +while for partially obscured windows the +.CW Bitmap +will be off-screen. +If the window is fully obscured, the +.CW Bitmap +will be null. +.PP +The +.CW Bitmap +is a kind of cache. +When making changes to the display, most of the original image will +look the same in the final image, and the update algorithms exploit this. +The +.CW Frame +software updates the image in the +.CW Bitmap +incrementally; the +.CW Bitmap +is not just an image, it is a data structure.\u\s-4\&18,19\s+4\d +The job of the software that updates the display is therefore +to use as much as possible of the existing image (converting the +text from ASCII characters to pixels is expensive) in a sort of two-dimensional +string insertion algorithm. +The details of this process are described in the next section. +.PP +The +.CW Frame +software has no code to support overlapping windows; +its job is to keep a single +.CW Bitmap +up to date. +It falls to the +.CW Flayer +software to multiplex the various +.CW Bitmaps +onto the screen. +The problem of maintaining overlapping +.CW Flayers +is easier than for +.CW Layers \u\s-4\&17\s+4\d +because changes are made synchronously and because the contents of the window +can be reconstructed from the data stored in the +.CW Frame ; +the +.CW Layers +software +makes no such assumptions. +In +.CW sam , +the window being changed is almost always fully visible, because the current +window is always fully visible, by construction. +However, when multi-file changes are being made, or when +more than one window is open on a file, +it may be necessary to update partially obscured windows. +.PP +There are three cases: the window is +fully visible, invisible (fully obscured), or partially visible. +If fully visible, the +.CW Bitmap +is part of the screen, so when the +.CW Flayer +update routine calls the +.CW Frame +update routine, the screen will be updated directly. +If the window is invisible, +there is no associated +.CW Bitmap , +and all that is necessary is to update the +.CW Frame +data structure, not the image. +If the window is partially visible, the +.CW Frame +routine is called to update the image in the off-screen +.CW Bitmap , +which may require regenerating it from the text of the window. +The +.CW Flayer +code then clips this +.CW Bitmap +against the +.CW Bitmaps +of all +.CW Frames +in front of the +.CW Frame +being modified, and the remainder is copied to the display. +.PP +This is much faster than recreating the image off-screen +for every change, or clipping all the changes made to the image +during its update. +Unfortunately, these caches can also consume prohibitive amounts of +memory, so they are freed fairly liberally \(em after every change to the +front-to-back order of the +.CW Flayers . +The result is that +the off-screen +.CW Bitmaps +exist only while multi-window changes are occurring, +which is the only time the performance improvement they provide is needed. +Also, the user interface causes fully-obscured windows to be the +easiest to make \(em +creating a canonically sized and placed window requires only a button click +\(em which reduces the need for caching still further. +.PP +.SH 2 +Screen update +.LP +Only two low-level primitives are needed for incremental update: +.CW bitblt , +which copies rectangles of pixels, and +.CW string +(which in turn calls +.CW bitblt ), +which draws a null-terminated character string in a +.CW Bitmap . +A +.CW Frame +contains a list of +.CW Boxes , +each of which defines a horizontal strip of text in the window +(see Figure 7). +A +.CW Box +has a character string +.CW str , +and a +.CW Rectangle +.CW rect +that defines the location of the strip in the window. +(The text in +.CW str +is stored in the +.CW Box +separately from the +.CW Rasp +associated with the window's file, so +.CW Boxes +are self-contained.) +The invariant is that +the image of the +.CW Box +can be reproduced by calling +.CW string +with argument +.CW str +to draw the string in +.CW rect , +and the resulting picture fits perfectly within +.CW rect . +In other words, the +.CW Boxes +define the tiling of the window. +The tiling may be complicated by long lines of text, which +are folded onto the next line. +Some editors use horizontal scrolling to avoid this complication, +but to be comfortable this technique requires that lines not be +.I too +long; +.CW sam +has no such restriction. +Also, and perhaps more importantly, UNIX programs and terminals traditionally fold +long lines to make their contents fully visible. +.PP +Two special kinds of +.CW Boxes +contain a single +character: either a newline or a tab. +Newlines and tabs are white space. +A newline +.CW Box +always extends to the right edge of the window, +forcing the following +.CW Box +to the next line. +The width of a tab depends on where it is located: +it forces the next +.CW Box +to begin at a tab location. +Tabs also +have a minimum width equivalent to a blank (blanks are +drawn by +.CW string +and are not treated specially); newlines have a minimum width of zero. +.KF +.PS +copy "fig7.pic" +.PE +.sp .5 +.Cs +Figure 7. A line of text showing its +.CW Boxes . +The first two blank +.CW Boxes +contain tabs; the last contains a newline. +Spaces are handled as ordinary characters. +.Ce +.KE +.PP +The update algorithms always use the +.CW Bitmap +image of the text (either the display or cache +.CW Bitmap ); +they never examine the characters within a +.CW Box +except when the +.CW Box +needs to be split in two. +Before a change, the window consists of a tiling of +.CW Boxes ; +after the change the window is tiled differently. +The update algorithms rearrange the tiles in place, without +backup storage. +The algorithms are not strictly optimal \(em for example, they can +clear a pixel that is later going to be written upon \(em +but they never move a tile that doesn't need to be moved, +and they move each tile at most once. +.CW Frinsert +on a Blit can absorb over a thousand characters a second if the strings +being inserted are a few tens of characters long. +.PP +Consider +.CW frdelete . +Its job is to delete a substring from a +.CW Frame +and restore the image of the +.CW Frame . +The image of a substring has a peculiar shape (see Figure 2) comprising +possibly a partial line, +zero or more full lines, +and possibly a final partial line. +For reference, call this the +.I +Z-shape. +.R +.CW Frdelete +begins by splitting, if necessary, the +.CW Boxes +containing the ends of +the substring so the substring begins and ends on +.CW Box +boundaries. +Because the substring is being deleted, its image is not needed, +so the Z-shape is then cleared. +Then, tiles (that is, the images of +.CW Boxes ) +are copied, using +.CW bitblt , +from immediately after the Z-shape to +the beginning of the Z-shape, +resulting in a new Z-shape. +.CW Boxes "" ( +whose contents would span two lines in the new position must first be split.) +.PP +Copying the remainder of the +.CW Frame +tile by tile +this way will clearly accomplish the deletion but eventually, +typically when the copying algorithm encounters a tab or newline, +the old and new +.CW x +coordinates of the tile +to be copied are the same. +This correspondence implies +that the Z-shape has its beginning and ending edges aligned +vertically, and a sequence of at most two +.CW bitblts +can be used to copy the remaining tiles. +The last step is to clear out the resulting empty space at the bottom +of the window; +the number of lines to be cleared is the number of complete lines in the +Z-shape closed by the final +.CW bitblts. +The final step is to merge horizontally adjacent +.CW Boxes +of plain text. +The complete source to +.CW frdelete +is less than 100 lines of C. +.PP +.CW frinsert +is more complicated because it must do four passes: +one to construct the +.CW Box +list for the inserted string, +one to reconnoitre, +one to copy (in opposite order to +.CW frdelete ) +the +.CW Boxes +to make the hole for the new text, +and finally one to copy the new text into place. +Overall, though, +.CW frinsert +has a similar flavor to +.CW frdelete , +and needn't be described further. +.CW Frinsert +and its subsidiary routines comprise 211 lines of C. +.PP +The terminal source code is 3024 lines of C, +and the host source is 5797 lines. +.SH +Discussion +.SH 2 +History +.LP +The immediate ancestor of +.CW sam +was the original text editor for the Blit, called +.CW jim . +.CW Sam +inherited +.CW jim 's +two-process structure and mouse language almost unchanged, but +.CW jim +suffered from several drawbacks that were addressed in the design of +.CW sam . +The most important of these was the lack of a command language. +Although +.CW jim +was easy to use for simple editing, it provided no direct help with +large or repetitive editing tasks. Instead, it provided a command to pass +selected text through a shell pipeline, +but this was no more satisfactory than could be expected of a stopgap measure. +.PP +.CW Jim +was written primarily as a vehicle for experimenting with a mouse-based +interface to text, and the experiment was successful. +.CW Jim +had some spin-offs: +.CW mux , +the second window system for the Blit, is essentially a multiplexed +version of the terminal part of +.CW jim ; +and the debugger +.CW pi 's +user interface\u\s-4\&20\s+4\d was closely modeled on +.CW jim 's. +But after a couple of years, +.CW jim +had become difficult to maintain and limiting to use, +and its replacement was overdue. +.PP +I began the design of +.CW sam +by asking +.CW jim +customers what they wanted. +This was probably a mistake; the answers were essentially a list of features +to be found in other editors, which did not provide any of the +guiding principles I was seeking. +For instance, one common request was for a ``global substitute,'' +but no one suggested how to provide it within a cut-and-paste editor. +I was looking for a scheme that would +support such specialized features comfortably in the context of some +general command language. +Ideas were not forthcoming, though, particularly given my insistence +on removing all limits on file sizes, line lengths and so on. +Even worse, I recognized that, since the mouse could easily +indicate a region of the screen that was not an integral number of lines, +the command language would best forget about newlines altogether, +and that meant the command language had to treat the file as a single +string, not an array of lines. +.PP +Eventually, I decided that thinking was not getting me very far and it was +time to try building. +I knew that the terminal part could be built easily \(em +that part of +.CW jim +behaved acceptably well \(em and that most of the hard work was going +to be in the host part: the file interface, command interpreter and so on. +Moreover, I had some ideas about how the architecture of +.CW jim +could be improved without destroying its basic structure, which I liked +in principle but which hadn't worked out as well as I had hoped. +So I began by designing the file data structure, +starting with the way +.CW jim +worked \(em comparable to a single structure merging +.CW Disc +and +.CW Buffer , +which I split to make the cache more general +\(em and thinking about how global substitute could be implemented. +The answer was clearly that it had to be done in two passes, +and the transcript-oriented implementation fell out naturally. +.PP +.CW Sam +was written bottom-up, +starting from the data structures and algorithms for manipulating text, +through the command language and up to the code for maintaining +the display. +In retrospect, it turned out well, but this implementation method is +not recommended in general. +There were several times when I had a large body of interesting code +assembled and no clue how to proceed with it. +The command language, in particular, took almost a year to figure out, +but can be implemented (given what was there at the beginning of that year) +in a day or two. Similarly, inventing the +.CW Rasp +data structure delayed the +connection of the host and terminal pieces by another few months. +.CW Sam +took about two years to write, although only about four months were +spent actually working on it. +.PP +Part of the design process was unusual: +the subset of the protocol that maintains the +.CW Rasp +was simulated, debugged +and verified by an automatic protocol analyzer,\u\s-4\&21\s+4\d and was bug-free +from the start. +The rest of the protocol, concerned mostly +with keeping menus up to date, +was unfortunately too unwieldy for such analysis, +and was debugged by more traditional methods, primarily +by logging in a file all messages in and out of the host. +.SH 2 +Reflections +.LP +.CW Sam +is essentially the only interactive editor used by the sixty or so members of +the computing science research center in which I work. +The same could not be said of +.CW jim ; +the lack of a command language kept some people from adopting it. +The union of a user interface as comfortable as +.CW jim 's +with a command language as powerful as +.CW ed 's†+.FS +.vs 9 +†The people who criticize +.CW ed +as an interactive program often forget that it and its close relative +.CW sed \u\s-4\&7\s+4\d +still thrive as programmable editors. The strength of these programs is +independent of their convenience for interactive editing. +.br +.vs +.FE +is essential to +.CW sam 's +success. +When +.CW sam +was first made available to the +.CW jim +community, +almost everyone switched to it within two or three days. +In the months that followed, even people who had never adopted +.CW jim +started using +.CW sam +exclusively. +.PP +To be honest, +.CW ed +still gets occasional use, but usually when +something quick needs to be done and the overhead of +downloading the terminal part of +.CW sam +isn't worth the trouble. +Also, as a `line' editor, +.CW sam +.CW -d +is a bit odd; +when using a good old ASCII terminal, it's comforting to have +a true line editor. +But it is fair to say that +.CW sam 's +command language has displaced +.CW ed 's +for most of the complicated editing that has kept line editors +(that is, command-driven editors) with us. +.PP +.CW Sam 's +command language is even fancier than +.CW ed 's, +and most +.CW sam +customers don't come near to using all its capabilities. +Does it need to be so sophisticated? +I think the answer is yes, for two reasons. +.PP +First, the +.I model +for +.CW sam 's +command language is really relatively simple, and certainly simpler than that of +.CW ed . +For instance, there is only one kind of textual loop in +.CW sam +\(em the +.CW x +command \(em +while +.CW ed +has three (the +.CW g +command, the global flag on substitutions, and the implicit loop over +lines in multi-line substitutions). +Also, +.CW ed 's +substitute command is necessary to make changes within lines, but in +.CW sam +the +.CW s +command is more of a familiar convenience than a necessity; +.CW c +and +.CW t +can do all the work. +.PP +Second, +given a community that expects an editor to be about as powerful as +.CW ed , +it's hard to see how +.CW sam +could really be much simpler and still satisfy that expectation. +People want to do ``global substitutes,'' and most are content +to have the recipe for that and a few other fancy changes. +The sophistication of the command language is really just a veneer +over a design that makes it possible to do global substitutes +in a screen editor. +Some people will always want something more, however, and it's gratifying to +be able to provide it. +The real power of +.CW sam 's +command language comes from composability of the operators, which is by +nature orthogonal to the underlying model. +In other words, +.CW sam +is not itself complex, but it makes complex things possible. +If you don't want to do anything complex, you can ignore the +complexity altogether, and many people do so. +.PP +Sometimes I am asked the opposite question: why didn't I just make +.CW sam +a real programmable editor, with macros and variables and so on? +The main reason is a matter of taste: I like the editor +to be the same every time I use it. +There is one technical reason, though: +programmability in editors is largely a workaround for insufficient +interactivity. +Programmable editors are used to make particular, usually short-term, +things easy to do, such as by providing shorthands for common actions. +If things are generally easy to do in the first place, +shorthands are not as helpful. +.CW Sam +makes common editing operations very easy, and the solutions to +complex editing problems seem commensurate with the problems themselves. +Also, the ability to edit the +.CW sam +window makes it easy to repeat commands \(em it only takes a mouse button click +to execute a command again. +.SH 2 +Pros and cons +.LP +.CW Sam +has several other good points, +and its share of problems. +Among the good things is the idea of +structural regular expressions, +whose usefulness has only begun to be explored. +They were arrived at serendipitously when I attempted to distill the essence of +.CW ed 's +way of doing global substitution and recognized that the looping command in +.CW ed +was implicitly imposing a structure (an array of lines) on the file. +.PP +Another of +.CW sam 's +good things is its undo capability. +I had never before used an editor with a true undo, +but I would never go back now. +Undo +.I must +be done well, but if it is, it can be relied on. +For example, +it's safe to experiment if you're not sure how to write some intricate command, +because if you make a mistake, it can be fixed simply and reliably. +I learned two things about undo from writing +.CW sam : +first, it's easy to provide if you design it in from the beginning, and +second, it's necessary, particularly if the system has some subtle +properties that may be unfamiliar or error-prone for users. +.PP +.CW Sam 's +lack of internal limits and sizes is a virtue. +Because it avoids all fixed-size tables and data structures, +.CW sam +is able to make global changes to files that some of our other +tools cannot even read. +Moreover, the design keeps the performance linear when doing such +operations, although I must admit +.CW sam +does get slow when editing a huge file. +.PP +Now, the problems. +Externally, the most obvious is that it is poorly integrated into the +surrounding window system. +By design, the user interface in +.CW sam +feels almost identical to that of +.CW mux , +but a thick wall separates text in +.CW sam +from the programs running in +.CW mux . +For instance, the `snarf buffer' in +.CW sam +must be maintained separately from that in +.CW mux . +This is regrettable, but probably necessary given the unusual configuration +of the system, with a programmable terminal on the far end of an RS-232 link. +.PP +.CW Sam +is reliable; otherwise, people wouldn't use it. +But it was written over such a long time, and has so many new (to me) +ideas in it, that I would like to see it done over again to clean +up the code and remove many of the lingering problems in the implementation. +The worst part is in the interconnection of the host and terminal parts, +which might even be able to go away in a redesign for a more +conventional window system. +The program must be split in two to use the terminal effectively, +but the low bandwidth of the connection forces the separation to +occur in an inconvenient part of the design if performance is to be acceptable. +A simple remote procedure call +protocol driven by the host, emitting only graphics +commands, would be easy to write but wouldn't have nearly the +necessary responsiveness. On the other hand, if the terminal were in control +and requested much simpler file services from the host, regular expression +searches would require that the terminal read the entire file over its RS-232 +link, which would be unreasonably slow. +A compromise in which either end can take control is necessary. +In retrospect, the communications protocol should have been +designed and verified formally, although I do not know of any tool +that can adequately relate the protocol to +its implementation. +.PP +Not all of +.CW sam 's +users are comfortable with its command language, and few are adept. +Some (venerable) people use a sort of +.CW ed \& `` +subset'' of +.CW sam 's +command language, +and even ask why +.CW sam 's +command language is not exactly +.CW ed 's. +(The reason, of course, is that +.CW sam 's +model for text does not include newlines, which are central to +.CW ed . +Making the text an array of newlines to the command language would +be too much of a break from the seamless model provided by the mouse. +Some editors, such as +.CW vi , +are willing to make this break, though.) +The difficulty is that +.CW sam 's +syntax is so close to +.CW ed 's +that people believe it +.I should +be the same. +I thought, with some justification in hindsight, +that making +.CW sam +similar to +.CW ed +would make it easier to learn and to accept. +But I may have overstepped and raised the users' +expectations too much. +It's hard to decide which way to resolve this problem. +.PP +Finally, there is a tradeoff in +.CW sam +that was decided by the environment in which it runs: +.CW sam +is a multi-file editor, although in a different system there might instead be +multiple single-file editors. +The decision was made primarily because starting a new program in a Blit is +time-consuming. +If the choice could be made freely, however, I would +still choose the multi-file architecture, because it allows +groups of files to be handled as a unit; +the usefulness of the multi-file commands is incontrovertible. +It is delightful to have the source to an entire program +available at your fingertips. +.SH +Acknowledgements +.LP +Tom Cargill suggested the idea behind the +.CW Rasp +data structure. +Norman Wilson and Ken Thompson influenced the command language. +This paper was improved by comments from +Al Aho, +Jon Bentley, +Chris Fraser, +Gerard Holzmann, +Brian Kernighan, +Ted Kowalski, +Doug McIlroy +and +Dennis Ritchie. diff --git a/sys/doc/sam/sam.pdf b/sys/doc/sam/sam.pdf Binary files differnew file mode 100644 index 000000000..39244c74c --- /dev/null +++ b/sys/doc/sam/sam.pdf diff --git a/sys/doc/sam/sam.ps b/sys/doc/sam/sam.ps new file mode 100644 index 000000000..4da88b437 --- /dev/null +++ b/sys/doc/sam/sam.ps @@ -0,0 +1,23496 @@ +%!PS-Adobe-2.0 +%%BeginResource: font lsunr00 +%!PS-AdobeFont-1.1: LucidaSansUnicode00 0.9 +%%CreationDate: 1994 Jun 04 09:53:35 +% Lucida is a registered trademark of Bigelow & Holmes Inc. +% NOTE: This is a partial font in Adobe Type 1 format. +% The complete font in fully hinted ATM compatible form is available from Y&Y +% (508) 371-3286 USA, email: tech-help@YandY.com, http://www.YandY.com +11 dict begin +/FontInfo 9 dict dup begin +/version (0.9) readonly def +/Notice ((C) 1991, 1993 Bigelow & Holmes Inc. Pat. Des. 289,420. All rights reserved.) readonly def +/Notice ((C) 1994 Y&Y Inc. All rights reserved.) readonly def +/FullName (Lucida Sans Unicode 00) readonly def +/FamilyName (LucidaSansUnicode) readonly def +/Weight (Normal) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /LucidaSansUnicode00 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 100 /0064 put +dup 101 /0065 put +dup 102 /0066 put +dup 103 /0067 put +dup 104 /0068 put +dup 105 /0069 put +dup 106 /006a put +dup 107 /006b put +dup 108 /006c put +dup 109 /006d put +dup 110 /006e put +dup 111 /006f put +dup 112 /0070 put +dup 113 /0071 put +dup 114 /0072 put +dup 115 /0073 put +dup 116 /0074 put +dup 117 /0075 put +dup 118 /0076 put +dup 119 /0077 put +dup 120 /0078 put +dup 121 /0079 put +dup 122 /007a put +dup 123 /007b put +dup 124 /007c put +dup 125 /007d put +dup 126 /007e put +dup 163 /00a3 put +dup 167 /00a7 put +dup 169 /00a9 put +dup 173 /00ad put +dup 174 /00ae put +dup 176 /00b0 put +dup 177 /00b1 put +dup 180 /00b4 put +dup 181 /00b5 put +dup 182 /00b6 put +dup 185 /00b9 put +dup 186 /00ba put +dup 188 /00bc put +dup 189 /00bd put +dup 191 /00bf put +dup 198 /00c6 put +dup 215 /00d7 put +dup 223 /00df put +dup 231 /00e7 put +dup 233 /00e9 put +dup 237 /00ed put +dup 239 /00ef put +dup 241 /00f1 put +dup 247 /00f7 put +dup 252 /00fc put +dup 32 /0020 put +dup 33 /0021 put +dup 34 /0022 put +dup 35 /0023 put +dup 36 /0024 put +dup 37 /0025 put +dup 38 /0026 put +dup 40 /0028 put +dup 41 /0029 put +dup 42 /002a put +dup 43 /002b put +dup 44 /002c put +dup 45 /002d put +dup 46 /002e put +dup 47 /002f put +dup 48 /0030 put +dup 49 /0031 put +dup 50 /0032 put +dup 51 /0033 put +dup 52 /0034 put +dup 53 /0035 put +dup 54 /0036 put +dup 55 /0037 put +dup 56 /0038 put +dup 57 /0039 put +dup 58 /003a put +dup 59 /003b put +dup 60 /003c put +dup 61 /003d put +dup 62 /003e put +dup 63 /003f put +dup 65 /0041 put +dup 66 /0042 put +dup 67 /0043 put +dup 68 /0044 put +dup 69 /0045 put +dup 70 /0046 put +dup 71 /0047 put +dup 72 /0048 put +dup 73 /0049 put +dup 74 /004a put +dup 75 /004b put +dup 76 /004c put +dup 77 /004d put +dup 78 /004e put +dup 79 /004f put +dup 80 /0050 put +dup 81 /0051 put +dup 82 /0052 put +dup 83 /0053 put +dup 84 /0054 put +dup 85 /0055 put +dup 86 /0056 put +dup 87 /0057 put +dup 88 /0058 put +dup 89 /0059 put +dup 90 /005a put +dup 91 /005b put +dup 92 /005c put +dup 93 /005d put +dup 95 /005f put +dup 96 /0060 put +dup 97 /0061 put +dup 98 /0062 put +dup 99 /0063 put +readonly def +/FontBBox{-90 -211 977 1005}readonly def +%/UniqueID 5054500 def +currentdict end +currentfile eexec +AF9D569DD6A39B9A08931526FD86DA1F3D52F6A6E9A3C2A341616BA8AD4A6BBA6A84F4F691C60D +64B463C6D1B3A432634AAC416FAE1067039D940A82A692DB189D5719DA649D309E36853E1F767A +0DF1C424DA3E9D8E6B45B659E31B0A03BB7747FB2945268D0805A130347C7455FA73121BA001A8 +5BFFF1847B8FBAE1B61BA76AB61D750F7BCDB1EE8E4B4E95657E783B2230A68A5A62E9E39EA352 +7B3E832C6BF769697C2B18F29596B8A56AC9532224A452AE7A77A33DC5D437BAD5B4C1B9DD7680 +FE4456B59A798F584F7913B3A790F3E5F9559505B80A36CDE0A4D46A595E942D798E6F6311B3E3 +613059010E0C594BA804C9FA8EED254427D021628C6A59FA5C10314D3143AA329B9E1E767CADFB +B864C70BE2EB0FA96FBDCC2EB1B44783431EE1CDCADC68DF65C29B4AB7C198BAA625A3736F6240 +46E72FAE8F379B391393A007E9F796065FC622322C782111E2EE7B73FC09C5852F35A75CA296FB +ADBC77E83C2378DAE017DC93437EDA4E1473D256C7AA433FAFF90BFF104C39847FB6076D559B8A +4D05AC2A35837CF7949567F37638F1FF869CA022F28979DC7AA611BCACFFE95AA23CBFB86C9719 +BBD5738FB6D86326F1B0A84EFA79C80BDC618F42DFAB8B232211332E1D793A6C4CA71DE2D7DBE1 +5806FB210EA36FCE5FA253B9C507225A5581765AA21DB9E1739AA6063F3F7F11D72E65C3F9A83E +71C8DFC9B9E13C0CCA25836D4233D10595ED053201C745C989878BC0457410C29FED3273550E0E +C93F30B6E5994D0DE950C82E70299AB82D97B0EC11EE5CFD3A5311B0B9623C7CF73BCCE4D33436 +655812E9BC69045B581B2BACE84DEBD480A8652676ABDB2976168954DCD745B42F92F25CC2A4B0 +58AF8D1F0BFFC280B7FECF0593655FEDBE41135D72874467035351F424E92C9E4F628501066322 +AE5896C2CC8C5AD9EE9C4E2076DF548DEF8A6ADAAEC8F05CBBB8882BE5DEBB3976FDD20539F0ED +C5F331CADFFF8B1E1ACC3E0DE2DE0628766105E7EE97E55E66E2585DD7412749CCA828C3CB355F +716E5F447857D298C1383EDD389C2C09F3094A09F90652D5913EEBBFB16547FF31DBB8C0F43480 +6C96524DB4F2D96F6A32856DC62FB350D208B4462521EA9578695E7F8A31FDAFC065535AB32B28 +4F808767213AD4B89C02E59E3F2BD114BC411E4A9B58F97102E7ACB9310EE2AD2EAEE87E1702E4 +3E00854C35156E731478402285AB23B0049A74381C2355F35511C7D966B2EE653CD8A3D7D6505E +80A4BD2C96B451354DD9323C30C9894A60CE614D0B091D3A03A5EDA4BB127F255FF706AD6E6827 +9123CEF7396D89B5E5A968B4A4C0F4B0C227D1EE676801922A3CE24F2602569AF11ED43F17E2F4 +6669AEBD1F6B9E53C76043E1CD9DACDBB3B6B87F949372C03E9A5C80FABBF2E7767880B7064D05 +AE2D717B6A189D0C9F8DBC981EBEFD9A031C7592EFA0C08FD8BCD2FA1210881D95D6ECD9E72096 +5ACE2A9462EB9C3504315CFE8C6B5362B833CE52BC726DCB3450CEB73E42E667B9D86D0F985A35 +CAFF807F4DFAF156AFDCB999DBA61476BF4CCE49C6D8A8B7D2A3FC07EE8346E30F68FEF7774273 +6E55BA23311F85C7FAD9D9AA1EB17E14C45033BEE8D3093AEE9E706133FA94413F30F723568255 +498A071D76C10D12536425A7185DB60BDECAF6BFD0BE58F418D0E62FDA7B846BDD490EA7CEAD05 +E1BB9A4DF66E13758858B80F6C7216D8D606E92BC93576A1FB3604D9FBD78656FDF64328AD9466 +3CFABAB19A0636518FF61E62591661FBFD264B90156E24941177A42A0E5315F6168A93B96E27DF +2E7451F382C2C83241AC2B5F52A2C9453D3E207EBBEB3881FF237E9135E1D9191E1FBE5E606C60 +43726A6783CD4414D26F8F95B260FAE60262DE148545079C80C962D5D7BDE2A77A814CDD4ED901 +D28D4D5C4324DF7F7AA6B832B6F5E0E129F471A12373F0D97037FD695F921E0CAD8963372E8DC7 +F3AA5E004E1F5980BA9825774BB2DD511B6A9D5A0C7E7885E39E3B5497EF466C52B7DD4CF4AD74 +6E62FE4B1E082811AA45D6483725D0EE18C9C6BB988C036913682EAC4645EF90AD5FC24BC78778 +DDDD48EC8F1E64525AB9B1EFE0CDFABCC6A17BDACC1B3B1929FB2FA1DB85991FFE1B92B7999C99 +1BD3AC17B8A44E11DD954BEBFF002A0562EEDBC507DD0FF13ABADBC8E5676F5F951D1B32B725DE +FB33219FF4DAE8298887E415434BE4012D1A294F807CF53248AA137591B532B573F41732216B12 +685CB4B612B782E010644CB813A31AC4A25038A17FA0872E515BB2C119DEE59829927FBE20902D +18CF2F33E18DC0AC2108789FA1D1F61553184FC185A3BC3BA6985449149A08E4484F33EA950C18 +B0148B6DA2EF0E2F1BE218CBEDFD4A4E9A53235840A8E8DD1A757D8F48DE07C687E5F35EF237DB +EA582FFC92EAC5A8E4D9C1F048B037FDE46770B073B161333AD5E0DC09187DD0D9FF2CAFEFDCBD +00F3FF4642B63703F6B4CA2A479BE5145E3EA90359F4BE67F1EF0EC07F997A7A63797EAC98E3D0 +C64F1EBEC99C7C436EF655ACF76DE5201A5B3F5CF58F0116008DF241D370E616E8FF10BC551606 +F041FF641B4C8FA9274BC3FDE69602B2BD58D1428B119607AB28B30393C0BE4E33E5EE1059C9BC +1AC92B4AD1C7D1C71FB44429D8F8042F0A7ADEDE040F13D0C13F9BD92D3BE4E77E446DC8D57FCF +C704F6EB8D438EFA72F74835DC24E853B3B1178904F0484AED543B57FC8ABFFF4253AFA2C93C66 +C2144FF1777A1E3A40D1D023BCBE24557DAE5D76DAE6FC7063E11A5DD52B0060501E84AE0E66ED +7522828C15045CE72B548B59A3D7DFC3CF6779B4A6D4891B95CD4C6613C9390DD953FA58FE97D8 +A545177EC9EDB59770B4B67111A1FEA9E74A61B360D9C19100440F8A69386EC3878C732DA58580 +3A177AEFF85BFB5D112C37ADF7604BAB387F08243B2FEC24DAF9F95BB75A678DAA7AB277D933AC +0362E4DD5E6E4194DE873932EC10013B68CD0D1CF5298816E6B195372FAE49A5F9F722C30EDDBB +088E0F1F7D8A5D6386B8E3219125A8ED2A4D534761DEC9DA916FF875E13E309F2F2C925F28ED5E +B792A290F05B7732D217A1CF9577C0107889C456924AB91BFB728E4C4A0E70412DA721CA4B1A30 +189BE4414AEE3AB1943C0349ED437C91796EB8616D3CCBE148CD21B0DF7ED5720F18496100119C +2995490D7B60C994E93D874AB352A813604AA9A83D9388F758B7F479F9F6EFDBA983FA6DA07E7D +4F80E64E68634D9D811F3A0088BA46040577B89C7E147CF96C4A999CA1899799FA56F401645A97 +DFF68155332EE3F23F3865B6DE715F1AB687A696878C9821E029E3D867BDC50322A0C90081E3B4 +3BA1E889C277DEDA5ECB0CBE16F8FD562B82F22DA851CA5AC51EF3051382E9706A2F6F14CE6897 +4292ECA605ACCBAB5071ED68BB05BDDE20C04E0007A8EF46D69FA79540C53E34C29F3CB68E9329 +8472F6D89EF77A28A18B334278836F65E88255F1FD3A3D031A22BBC607E7BDEB1D00AF60D5E024 +7E971B8965728CB1CAD6B5853F4F66448031312AFF8E56B01BB8D50F3A1060A18ADB1FA8F84C69 +399BE117B98430CF63288BA1950ABE0CEC051B66A7EBCC7A3FC793589A4C52EDBD1A71ABE49916 +10496FC6C346C376D3B061B00BE7B4A659D21A2C0FFD3FBEE485EDB7BEE599E5248DC5FCD89632 +61BE192134BFF9C9709E76A567A0F7B5773870EEBE07E3630175BFD8C5520B2AAF6DD2D7C3FAEF +2E3F52318A7AD6E05847D76ED22D021BFDAAB041B16F2AE08FF86DE08FD998D61DE2D0EA477E46 +6E963EE5EB69F69E30113F0D65683C37CDA865CF92EC5FFA54DBB6798738D38DD7898BC7C26AF6 +939EFF47B1A3DEE6B5E38505EE05A0F671EF8917A434D92EBDD8F6820ED3A2F24199D47745D393 +9259A5D856E1AA9EBA0292EEFAFF75F709ADCDA0D6453C3550DB28BFA22549BD2A282E8B9F2367 +FCF20AACF9E7B725D0ED0498695F3A2DD76389BE8A99B603CFB0FEE3C5642BD02670108226BA9B +A90B90B1D660C552307E3D388661A20C5F42C3CFF5D0E0F6DA69792E8FB4C83AB821D0F7D80F23 +93BCAACBBE56E8095466F7BF8B0504B72734DEF119DC32DD63F1BCA3A66A5F6DB5BC221F4927C2 +B08601F89D71E754481CD1B3B8E5EC8E9A22F5AD8CF45039FB8912A2E4EBC638743D7614BCB41A +49D162291E70BD656EF7F54BCA72BFC633984F1B15B4145F13D08B255B77A357C15B8A5DB04C3A +95827DAD0B0A302577C12F66389E4E40040EB52AD36552A592C47614A9035E7CDC4BDA55645F8F +72F10287EB7682F17034B836B44F111B786B8A6A47023EC1C950A4B0636C28E1753781C9C0B206 +5DE58A47D2E7B1AD71D8DBD36E72DE625B5F52B9DB0F9679FC4B61005A112E9AA717504C71CC0F +F50CE8E96DFE3AF6613CD4A3B4645ECC5F495E3DFBC1EC17575457EF39A0D4709221F2F1E14FAD +ACF7FA5CCF662DD341477170FB291B706D76CE78C3CC90CD36A45BD04704DFB2B251CD9B1B69E6 +B9DB3E9739DE8B2CD9DE63E61ABCB8581AD13493468EE995EE668DBE6AF6809F9529595D67DA56 +DC7335876F36499EBB7226FDB9876A7D0D43159E77F0AE36B55033A11156C3F757FBBA38177D24 +88EFD1BD9D8F69ABDD365989CEFD521F60BC9005D8C40942B43FC6DB8088842BE8A7B567420A80 +9AC76E7BA77D5EFC8D9A2FCDD1A565EB580207A250621E27E51685A0C650323B4D2101810F6C89 +E5D312BAEDAD3097F87C6064BA138681D3192C219ADA66AD2B0C679C8B00078597B2DE46F5A040 +91F8C34813C07AC64B2F5FBF0EF52B16AA1EE9B9ADE71108DC9D47D587585A933CAA161CE586AC +E30BA582A5CE8728991B10AE2012C2291B7DCEAF72E0299FF49F5ED495773656908F04F697ADF9 +32AA61E6D90A87BB0F0311AF737E9F72C501CF1AB4DDF4392FB9F3E71F859D45F32EDF329F4856 +C12ED2DB6FA3631B3731D5FB2DB79E193BB8BE75B85722E6CD85C35C05C2998BC6B854BFF76A39 +B1A51ABD3304ED453AA413E6F6329B651FD13C0751886DE4553E0B79441FFECB81839626868715 +0DF0FBBD53F7861647CAC9C633B9FF63BCB644D124F2420A7FE6EE7EFED293C9D53983617F2500 +6CDF86C74694A20569BBC5DE7616333432C0FD525029E612858F5BF27D1FE06931A5AD37675162 +2AE14BA10E2702CB896CC5A5164A287AE3771036AB2EC7F50B20576E73C151580E0D0884277FBE +9D2FBC52DDC0EC22A07138C692108A6C637ACA40D1881027E23BECFF6C54A50DAF7A79B5CB4BDF +AE35CD587F46B14B3A89A50487F8A6E20EE48099B44F459E48D65FB393D2874E4BF7544FC325F5 +B04FDFC0ABF2D6B8B6870A617D344AE093C4412007061670E6913B5581A0EE53B3D8C2D75E9560 +101D4C217EC44BE71F866F0F40D1DC7296ED313ECBFF60CA3A05D45E51E32D9E75ED31F1905DC0 +4F4AF2A29600172249D0B8B5B42D99A546A9C45704A35711637ABD7A64BF4D417564ED0BBBC7F2 +093F6C7F87A770F6B6A655DCBC13FB4CC24FAEC848549CE2415301BF6BF234405946330E2964AF +A37702223D1466A780720F39FE966AC1023866246F7E25BE2A1E0C009708DB2724E13770A8817D +6F27A095BED4C33648173F0DD8C627F405ABD3CA636EF8A9E77CC67D20E51721CA655704BFEC27 +564A69E6193E5E3AB1814FBD3BE29D72836BF85C85F4555FDF3908E6BED58E0927BA45AD4434F8 +D15C510FA5CD1311F7DBB20CAACE0D88535C58309CC82CA5E6ABA2E0DCC4503149E52572A0F8C6 +7ECE6B8145C85E5F211F341AC1450EEF4D1102CA184DABD5CF00049F7BE76FA793893F2873A237 +FEFE245F059AC85956B5A603DB8871BCF4DF3665364525E7B539A6A4F2C59473908121FEA5DA8F +F5E4A4FBAE0C602130400E1D9D1185703F20895806C2DFE6E47408347CAEF151C730783FB6BA38 +9EDEA18F865240ED604D0B6F5850CD18FEB63AD0A3ED46A933DE64C9571C7F15393AA81577A0BA +6A227ACA16DB43307E76C10FC630E6550079E7E5609FACF8DD84376AC186DE2E1CF84847C4E2D8 +C58385EFCA099E81B6435D8DFA6775BFD76C527DA6CE32B6326944FB6970D2787190CB0572AB6C +531EA63DD1F6BD5F7732CC7BC7751DB30874EBD006978CBDE960BFBBD8C2D115C26E7CCBA2C802 +131AAABC284699B18989BE8D548F30389BB0DED8FC122A1433EA61D074415882143D865E28A9D7 +8E59E47EC5EF1E2C5151279BFF1D77ACAB907F7DE9514A71B21C129480FE708B9AEA442EB1DDC5 +59574095F57BB3750DA4521BD298A19CBABAC650FEA7D9DDD40DFA7999D0CC79DCACD517E391E9 +2EC65FE3A64CB5BDE1A203E53D73C994D53215EDA4EF8BD06658AA94EDE4DB65719A0903035679 +B7E08BFA7C40E9AFC3ECC0A243C79D920B2F87C75430F2490362FAF9FF23E3880E7ADA9F3DB155 +6E00470C2FBB131F539600D21238CACD785964F533C80A39605C9AAFA6438B11F72D9148455E9D +88A43178089337070A47297BE223B93CA175DAC0EA3CACA4A9BB07954449A1F9A8F5DC084602A6 +2DB0D098D3EB9D967CEC1B247134B47DC120C03B66FD26FE2647C48433BB994310137C95B02FD9 +54B450FF00B194F0C5A0A8623B1101B5F32589CE81BB1EE3045F4C78AD26A9C5868AFF70DF6179 +F2A72599892518A45C54689AFDD92A5E21F47CFF3AA8636F82B33D9716DE11C3297C403B5E2708 +D9AAA7DADDB484F6719DB1A07F42C0BF6532352BBB529478F0F08AA86E554A2C8ACB4D261C0358 +CDC56FB9FB160F9CE9C7DDD0CDEAACD1FC38D9066AA1B50E26079452FA515EBB70F3F5EFE3DBE9 +791161BC643D1BB3147C9A0B0563EA94F930201780DC3E97164C369C62D75F4BA3FCB116215771 +0C7B87C4A42BAD8EE7AD49877F9AB41BBE69730A4FA1F83F4DF48F40AA6E8891D61F1E2F5B5AB7 +6E85BCDB7DB8A8D7F3E1C5628A51246896D923DE53B1B297CC8E37E0C46A6B42F616CFCF17B74E +DDA896D6075C4D60166F05F30DE0CF48A3BA092A0D2A694D01457C46089B7F573CA6A7499BDE06 +098699CF1F28CF849D2716140669C98949A551A227BDDB5594F205BFB0F0379CCDC1B53472C335 +7834C37292EF98DF1A5B42F2E8EC82381AEBFF1CD435499D35A59EB295CF563A574FEB6F8CFD09 +D9C2E2138F486226EF089654BA218706E643BCA601DA71B7A2670A15B25523D7925D1E7BEC264B +9D5D47F30A9D36CEE25E5CBE2DB3D6E1566AE8067DA2718ACC991B618578F490DFB3B2F9F2E482 +3CC80AB2B8BF562A6E5212A2A2F2604C0894D1DBE14FE9D7222E7F3AFD49D5B2344BB34CCB0007 +0246A8A3A04DB4866BD9823E0C21C8C226BCBAEB92372AB547B8FCFAAF03AEDD70D2207840D6DD +0F833F8C19DB2CA2BA4F271712E2C617E84F34CC15078F9A8972E17B8CDDB1D059C53F7E34F975 +1DD035E00F744D2EE8178B33B6E684E6D55186C9F2FE95F9964FB13CB7D83968F06BA14A62BB43 +18A5830514BC532CE55995E1CD3C939ABAB0D211B1BFA806A353E325A73BF75601E817265F6B08 +A43BCD7AE47648436A1B5285823F234601924C473B761B1C057D4C174BA653D5B0E7186B99577C +2F353E7AF1CC395EAE45B1595CA37FF9328AC2EFA8560952054F76A72D7CD91AA018B85EE553AA +532C2BCBCD412F349DFF5C37A1339AAD0F4957DCD5EC6833060E93914447483B2A2D9041621980 +83838093C798878E5D558F7B51A9626F982115EEDC2039E3C583F264EAB8321AB228868F221E8F +4F9EFE1E760903FE51F98AB321D1347CFF719F4EC83B91E010961CA4F26B7BB7D4C769FD636A4A +1931EBB2668FD9FD1DADBDB6DC61AAD03C0077AAA035608BB2F6855593CDD133AC28523C100D99 +C98A26C29C0A610AA270C03375AC0B9E7F7F265612B34C4DA3EE925B6BC8A98257986AD2AB4BAB +B31D5E387984D102043BCD2F908573DF0D5BA1C1A59FBF2411A820DA0A6E69D1C19096580701B6 +D8E814BFFC91F8068DE5D1A8C601010A53393AE554E003AE1592FA5FE0609961DCEF7D944F5857 +64F66C20281424DC4BDED24291DEB386AE9C3DB43133E91401F528017AFAA530EB2736D3B6CE7B +CB1E0C5A6DD5690AEF3465BA0836D2A68D6F3C5958843F4299B8B2728116952F62815C71B483F7 +631338CE3FD626CC22C9256AC95D88B2F4659864B022A0BA75127BD9F4876E0251A2E707FA37E4 +D5D5AEAA0EEDB18F5584B9FFDC9386C46D1D19B0419EDD812FB9FD83D531248CD1F6A4DB702135 +9C13D1629EB05CEB121CDA5944020CAF186AF94EEE6EFF48023EDFE205E749942482DE061BC86F +58FB8289435ECE461AB84B09D342138561C2B4B2496022DD57C8253CE557FCEE1905C16A01F5B8 +BA4E7F7D5006D434CF962ECE76E5C269A7243C826C0B7CCB5CB36088AA99BF3F3A7377A76779B6 +9ECEA4A83BD4713D12BF424373B399EC0A99CF5D8AF7D5A86A390A80AEA33CBBB202E0A8BBB72B +1D685B2ED32EBA11840D0C9CE80F61BF2228924DC196B9C40F81D124044BE6DF12564AA1EBF652 +41AF0DAEA563735BA4E8151F3C9820273E79DD4E10E5989BD0F291DA773C3DAC91FDBBFF6EDE1A +5D5FAC03DBABB5C2E97BFEECC08B2701C72ED14C9CA5040B9FC61A08800C5137DC617398405004 +BC3FE46672BBE3342CEB1F9750CD7F4E057E098ACFA0A441C460886FD630EBF90A327DCC2E2635 +9DF000FD24E56CC30E31BBAF1391B89504712D09C867D7E68A965E57F854507D7294C9671F38FA +9B768EAAD52137CEA03A35C82BCCFAE056DFC1214ED21EC9F5DD4555C642C2FF167EEA4EA07CF6 +A97BB9042097B1AFBFB6FE69E09C2C419E6AC38372B92590ACD39A83C84EF9AA7DF861950F5354 +046E90AF64F28B6D38CE89D602CEF86B1A47DE38E31AB242864D7BAC0EE07878CC2F30A23FFE05 +B055E4EB475BE2035B6F3FE1573FFDE9A7960CE3180AD3FBDA2BA62215BD4C964DF7FA9B7D8A0F +B32A8C36B1678E7297212BA6B5B72B1B0B9ED8C5F9390984240B3C77A137D4EE6ABFD66FD2BDFD +57CD46185487419C70C2754008A24C064D506D8FEE86DC8FA6B5AED30C3662766B8E4C7A0E205B +EF87BFB1DDF81B236AD601F4C1B25DB98B211C1BD85BB8026F6EF5EB14901240787EB10779A7DF +C70E02E2066E516BE60C726BA4E0CAE1C327A762BD30800C7F584E2796AB6A0E80AC5500498962 +52B1AE178A2FD57E0A72758E794E455E1C78696634C09077DBE2233BB4FE9FD3C428506105F32A +68A9DE914C10D7D3562F0E70C12963E7FA5EAA2AC08A384995139D4EFF7AC6A1425929DA25DA7E +11E40FA431C268CC157D3A2E7420923D546B22C8CA59ACE87633D5D6FB804A1569BAE93C004668 +A1EEE0DE42DD0A78FEA435A7D9C84A95952F78E626AABCCFF3752171730177C9AC44378EA69012 +2F1364640C4F200D885A85737080FB67E7D1BE9614D4A5A2F538C137E92FFD914CF587F03084ED +745B868102E34FB9BC2380012264F1DE610B218B84448BCDAEA37C9627A6F8B94406D069BDE191 +1E23A4AF49D64233A965F0253ED2071E61FD937A1B1B501A43021C580EDF1A1E92D27ACE0605D7 +3A868177423EBB55F178963EA9A4FF3F9F11DC1F4F938E36B04DBEC953F585A9180DF530906CDD +046D5758F792BF3AEC670EFC402596BAF8F4A3052B9C586A3E17302922D66E6FFD813480D83D4F +7245224718D31E2006A72DBBB1CE84901F69F07C5EF3554CB22A979BEDDA37E0B2E635707937F4 +526896CA654964ADFE8CEAEB0DC5AC4A039B7C4C641CE8C8D9908E9BE1BD78C77E272F9811895E +4F8DCF94CBC0B826AFE5C1692937737713CA4F7A5FB901FD7DB797B0DD9C6EA4F82FEE8E843C0D +799B552E44193298AFEE0BBBE7CA2F6759C891331B5C97AD2DFB0E2CC1BF99589B7E4619A715F8 +AB5C88BDAA1032D90B4CC5A2B4CEE7470E56E86D4B58F74CBF8D519739BE55381B75B3C8FF1F39 +45D5669B0C9F068551C7CF0F5C227F4401EB8FDC9105233154943A10C479AC9826D6366B03A775 +2CA00488AA04CDAF8B1E0DF8CBACB678A26415414D1F15D0F46FDC5A379D5EFC53DB57CD66AC73 +D274626739D9260F078EAA529693B112392FC5DC3F025DCCE34858856D61A86355F8A74427B073 +3B6AC1C2A32B1D3FFD6402798AA093391253CC3D65595148994485CD6A74271FE71093552BD0E0 +6E4BD8A55685FF784C530D186B923AEFE16250F3330789BF632F9A1AE789ECD4F8DD6055C3E7E5 +40F0193CA768EE69C37B8E51C4CEC1D1A7B12ECF6F65DA9EADC0B3B77D22084CA3E48CF0BB2E48 +37DA5D58F4F2795BFF4F62C2F520AE173A098E6F1E5ADCBD2BB3A1D26363F8F645B809A8AD40B7 +EA90DE4A9A26BE11FA203A55B144161881665D6D1D74263AB371C31FC70F9D8AFD287C0B87BD65 +DE2B3DA8E13669ABF4501ACE58D9CA150F30B23388AE9BFD053976B223E9B37D226200AF4D7697 +840FFA9EBC087A72EBB45D3D1FB5EA3E3E882BEB4F9B702DCF69DA879D72BEF2377FAB6094314A +0673364D4165950458321F9190989C00595C4AB4AE76C246D26B088F29965200103D17C6104BB6 +E95802B4068C0D24F610532AAA2267D6A36183A5CDAB42140ECE4E0A8EDAFAB4BDF8EC6D706CE0 +562235124F1564DF380549FD931F3FF4616F24E9FEDFB3C757570E60D56D1F3568E575A35A9E5A +F59CA70D9D0CF142A3F50A396807EBCD83E58AF06A4EA165730CDDA6E363B2B1F0B060645782F3 +70E717D38A3BF1552AB327AE0F9A155E15925A64D0AE25D00C5FF977BF824955926D8CD2072C8E +41591597E6907300DEB999F06449CF393A8C0A04EC6A9430BDA18F680E6B9CE7A438320224C47C +FF64783FFF47F55CFD836B93163BE2C4D9E16C0D38E0249FB1AF2E6D951C89302C7163031AB84A +F4A2ABD01EF9AE342F5284390AE12EEB1FFFD93B281162F01AC4C4FE90A4E5A53D27802A647496 +94138C6D66079312FC04FCA387A5939556C12130FB04FB892EEC36C7470EEEC2739378F96B6392 +2668A33A7F868518F380DC0E91CE2C90484DA50B6954FD6AE5B7A10578932220D075042D762CEE +4AEEE034A4637CDBF7298069DD2FE8D74265ABD5E4BCEAB81425516A38442053CD3AF67E80A50A +E9213D7B4AC2C62E22A73DF69F8BD5E0C6AC8C688DA644EF6E20210919ADD9D69FDB4D5DA26B06 +10E8DB9748BA445FF931E3146E5937EBADE4C7FC61303004AC549C1900F5CF8E1AB0D63F13CD7C +5EB22E21E9FFC31AEDDCEAEB76CB869253111EF1CFB6D8162DA3E59D77F44000B96386C046861D +B1FA14BCB2C07B5B373312468AD8D73BB483429A22A27BBB62FD087A0F8FBBE23CE21F3F49EDE5 +F0A329993AD337C393F1332BD534750579A3E72D194B04EBC430594D4E181AF8FA60618E1502F9 +3172E26B55E5AAE989BBCC48374E8C6906A34BFCE114C2B2B4ACEF9BD7F8CD81A44F855F15CA88 +BE8A56AD1BF77EFAA5BC81C97B8F29F878F9091D651D5903E3F60D25EA1D97B6025FDBE181246F +05262E430FD57ADE69286353EDCB572069E25BCA99F3FE8744ED8297D933BD7B5F5687BC5DF1FB +584B8207EEDB38FC95BC6036342B012CDBDCE4F565B6D6DAE2EDA1B4F40B054DE50043D7AC9C3A +C0DD32F1AC2D38D0230231C17D2EA583F5740A47CCFD0FAB920FE1A49914C663D8CCAA9B1C0672 +055483B762DFF0493E0D46643BA4458DAF364512A3C72ED1AF38DD00FFE18592E96DF318B7C96A +2FE3543688CF50562159576FC9D051B6BFCD32A80FDD537F2A88DD9061CCBF832819F09570308A +10065010DB72AE096D02A61092961094C1E383712FBBB58FB322ABCD0CFE77B98D9C584AD5C9DF +53EDB81949D310679E2D28A2D8B347434BF71445EB9F9F1A2C61B6BC16EEC4C1522AE46C5E9984 +1206FFEBC27388D4952FE629644F6AB7733C457CF939C324DF0C4FFBC5E7BECF655B1F09670D17 +421CFE6C9A0FF4C4D7342E8CA177A602E7FB93DCD456151A8208C332541869298A0EA29A787931 +906B0EF099CA32F975496AB342130F34C92CC5A863029E030B66D3626C88F4887CF5A8A92AA750 +E5660AD03EA55D69EDF466D4AEE45067D5496FF91F26BCDA766476CFDE111F227FC7ACF6FBE1F3 +22038A92031650E9B813AF16A37B4095F039DF57791D3F8242C2C409B37D045001C74BB740E2BA +0D29CE658C65510AFB0D899C651DFC01752F9425D5B152436B04D5DF36DF03F11E141FE994BB0C +B0B7E37D5ED5981FF91DC25335A480ACDB25C48C20EE40F66F5B482A626A4D0DD2689D862F302C +E5421DED7429235723092734BC73D00F56419927120414CF8659CD1F964128BB6FC105A7E090F1 +A2093CDB77BD1C04C723E0F1C5F60BE70AAE29BF0713F86C58DE426819D22390DC1D985F2FF86C +08EF83F2E9AFB3A62EF4958945FE270950418D0B26206545CCD081E4DD18C9661BC8CBB4C2AD15 +1F71D6BDFD16F8FC0E239DA5D19E8C2DC980C367B7EA589A5278901D913600A2AE6728589CA00C +44957816D98775D86D9F11C086A95601730EC4DAB3306ACAA840599A785E4AEC4C0B45D14800C8 +0EA12E04F69836CA05D79543A7D7043DDE89BD573A8A937E27DDB89267C30731E20402901F9042 +675860C2C1EEA408F35561E73301F5DD52591A59FFC7684A1FB9228A3CCD6D321FBAFD05718411 +DCDC2ABB7A588C8FB14D916993B5FBC01409652E5818F2211C86FC21FE154B464206B642B12564 +A6F4A8F4FD5ABB6F48E959FD1BDB8C413B2D6E12EE5286A805117A97E3829DC83F431AAE03A6A9 +3C97DD6640E4EAE56AFB44C1892D3E531FBBC7C1ECEE90583A72F6CFD618CC01E0DE8733D38568 +2600AF19FA2E08FF0C29EAFBE912C289E57F0C315AE24445F1A5AB2F492FA7A38A4886FC0035A2 +7E793BEA877210F272D16771C90B5BD86267F889D3A25546DA863A100005511CED9C95A1E2AACE +E762E6501DF03F146719D3581365260811105609E56239B54D7AD1F0AAB6C7C168C7DCCF3CB30D +06080F32E815CFE2784FAAC58AEAE4F22D72CFCA289BE03F9B2DFD27FB1E2D27572A7400303398 +47AD06137695C113E8C2DFC0BAB9A3ACD2A856D9E7927FEAAE009B6F0CB84F76A488CFD5205AF1 +DC4313B6E4179B1370695509FEE3E64A9AC425A043E434ADED0E5985B293669D09968D0AA231E1 +B2F617CDE5DF2A681B2054EC1FE239E95EE1A11823F73713F9CD4AF03E13A78C2442B6AF16360B +01E8CE7DAD91717567BEAC799962F00A3509E24E4C4882124006B252F9A4C88071629A9C2B7104 +6483958A3D0FEC7F0A48FFD5E98F3C49B0FF8BFDF5824DA3605980B4D72A8902ABB0E0F52636A1 +06605CB90404E57B49596690E4B0591751D5630148B140AD0D2EA236764B131CE42AC418D3EA2E +2DFD09FF17D979E54C6194DEE059501718A14F86ADE2E231842ABAB8A6634C0C31C3C125048D6A +0E96A2BD785D51591B79E2022D49F2EC9BD874FC2FD52A7DCF644F124215C7B9D3DBE9919BF9D2 +138F0C75AC93F48C7F125973BBC8EEEE34502A62986FB8CAAA8242E499A85E43387264D3982838 +791590583BC2D74F1D1E3A4F4723457077D8E538BEB749D35F44F37B86A26C90951CD56A0E5086 +74E42A1EC33FA88A47C248B2D9783D4D788082B89368D73F2EA3131A0C78DF9CB707A0F65F3AC9 +3CC6E81866BBA0D87902E04CB3DDE252CF76344C2A2EE70C9260BA8C4DEA508D5B267A9E852C75 +79C062478C9F224D6CD544047E6643753F6B9D387EFF69E37E8EB61E6C50BF6CC93845070FAA36 +72EFFDF8F0EFC7EEE9D42594D1786BC7F3280FCADE5027ABFDB83E6E8A72C457BD6B2739D263F3 +27C5E0BD130514D98A5FC840558E85017D289816B13C0BA1FCC6ACEB5DDCA6B7F4EE30D1D7E617 +3D9B14A16F330E9D32BE3CE1B92F18D2878A2C3CCD52B2103B082454C60724EC75B08D187E01D9 +EE3286D69B9EAD4D8D35AA8BAE3639B7E36556E1BC86143C1BABD3D05B4CFBD918C4171B3CDA77 +A1C49679016AB674530416738945967896E405A3A7A451F43B14E7BB3BED0CE014188779610F21 +E869A79245AEEDF2D01CFBEA80B9295AF35A7085E4019F499820420BC15E5D3D8450AC979E4499 +A894699D154648A74C6443EA53C851E67F80721930FE61C346207F2715F3E20418A9F58E4C12CE +9ADFE14DE865DB21085783B011BF1CCB2C3335A55B61DF50486A9465BA7BA85373E10F7AC3202C +15806C98F7A8215A89DA4424D4B16A5E352AFFA05A58E5A6B0ACED834D87E7EACDEDD65CBF741C +9EBEFDB86AC1975BB61AE096239597DD08156D26E218A61C1B69C71953447BB7CA6C055F2637E0 +B2E320C1EDD20B7B4E43DEB395DA221CC17F237B81098232567F591977CBAC8678870E1A1850D5 +C019E56069F11037B2C983E61BDB9778C50BBC9FFC6CC1CACAEB4FD3B4CC131BEEDB3C486D68E0 +69303A06E1653DF35D6421F93F05DFE32BB953E0EF723CAFBED7DD829B2D469CDC9F6FC1FB6F89 +4BBD9785FB48F1A89DC2E1208192BB44E7F3DE2D632830894A57B950C7112D76AE978454E0D666 +3F97E8FC2225293977FB65D46A5A64B2BD75DD681D4B5AA39202CE5E6846B872482765F1086FE4 +6200918A34A9C0375CA555FF25C70F075530965858942F0BEBC9CCDFA2515D198479BCE058BC5A +98E014F017D5239CFA21C5801B13619642DB5DD9A2A16FAF1C7348135BC59E31450FE5824201C3 +99E397C49DFAF1E8ED16054FE187A136E5A838976A48A1AD1AFF50776E953287C5C026CF2070AB +8DF13E926E668353197C0DAAFB3BCD64D391E8DA10AA80C798A914D219D0AC05A00D4FED72885F +408293D9E9D952E47CB8CA81F3797350D50EC0B74E526825DABD3D7DBDFBAF7AF4781D11C82D54 +05AA18F1BD75F7FC6C2B135F34EB3B29599B7600912F23680F5190B6D9B06D619B26F1D086D122 +51305AABC2BF2282FAEE69718201523BC2877A640EF5FE8A68E1358BC8C0A185C304D9986A6E31 +FFFCCB726D2BA189FBCA9C699994DC51F65653BBFBE170C39203C4BCEA90E07FC0F45D0E788D45 +09948A4AEF90C62CB4D5126AA30D655A817288039460D3E8A0450B6F3860727224957DEACEBA94 +86994D34743A32EBDD7D0E20A3E318F5288B5AE38428D3071D5DA2D3D612F23617AC4CD5EE84BC +8BCF391C4AA0B721FA25AFE0705091FDC0ED96094B19CE0C8716F70EEC15579C95E4754C394895 +EBD7D83FA8B9DD8B7134E6989D3B51C47600F053EBC134795BAB7C2B7121698284E9313C442E65 +C1821476436FED31A80A8220F02B781A3D19BE6E483699F7E809B1AAA0FA13DABDE873C7DA491C +02499F9275DE49A900DC3D624FD28F4F1F88654CECDE505D7E3E449DABB1417FC03F3E0EF42F71 +0F952C7DA729B45BDAC3F766F512984FF02A178D289954D7FEEFDFD6571A8A36EC673504F0D737 +FD41CD8384B06842BC686EC6B4F3B47E4BA7532649FD57373EBA8FFAC961981C381F2B1C731709 +A9F210E7928F13185B3D0195965330D0F4DD1CD09E008DA25C067735261E4CC2C66D3FB1822E44 +7C2E3C15E815DEB88D2DE9390B179D4EDFEA55E78AB2B0CF12FEB75967D857A604075FD20ADDF2 +8BCF12C46347463A7BCFF3ED8ADF441ECB3F17F799B3ACDE848CCA5B920A2087EAED1302C2F000 +CB9396EB83598F891ACD25763F567BA9E5F3C4916C62D8DC5FB3EE188F40EABA66F51AD59F7256 +DC4977C9408808781A5B790AA26FE9E3EB1118D535A76E6445DC5EC4554A4C1A06FD082C8C1D4D +29B3CD4F77CFA9356E7F055EA5062151B272CB8A036DD5F891E4DE82FBC877D9816F4AC9EA007E +D58201808D17C5B7C0780161607EE88B6640780D23870D34892956B561B0C1910F3B1CC8261FC4 +17C49A520D7AEB3239B7DB86BC800FD1014AAAAE84DA78F2FABDA841E82F102913C89687FB94D4 +3112FFCFAD37D49D2532F9DC3506F54CEBF3D3D5AB4F32D96A801CDCEDC7D9002019EC48DFEFFD +62F7879D0C9FB2CEF3BFF219A397877377AA2B970ACAB8361CDDBC1F38C5F7D9397E2272751DA2 +CD98CC97479CEC135A2496048FD8050FFA680BAE058CA5264E738D1699826FB12A96A6D328CC03 +19F501CF5AAC51A62E6F587FB2DD98881D69FED686B64D92FFC5B1AC2C957EE5F86CC9E5BFAE3E +73E6507C5809A576A59268341EB5E3F863A69F0C805A98696A5D764E714C478B544F0095BCB352 +7D00C34A67EFE6D156EBA4AF22AD493F7EE841A8489818047663C145DC04BEE4F472544C9A2018 +2147E184BFC894362E366A757B586FCF92248DDF8B29BEE94B4444400B1764EAEF6CC8110F1371 +D34CC38A939748CBE0226C110DB1C67EC241F07953B61C683642706930266E07309655962648F2 +5E981598930F3EE4EC0F75614F777742D6CC0AEE86D7D5111D11D5077297B5358425E660A296D8 +3832D37985D710E0F9EDA67875EDA4B75457A9573E3DFFE441029ABE0494EBCDC90C789186F0B2 +97F90ACA2D3BE84610AF07E347FB7694FA4E216A2386CBD1EBE70967A82014E8503E2E97AAC71D +60DAE00B786A95B8428F7726BA74BB3752F56894D4813D0434D0026F1703DCB3631D69082B5D74 +46AF8B5660688DD97DDB83540E2A69D4F994FD94413CA5AB52325439224E0906128187180E42E9 +7324CC2AEB60E5B327CA998AFA49854A59841C5C50E4159242BEC79D2E5BDF9373CCC510B3FC38 +204BB02BF88DF702FE5F2CD11123C390C6EEA79F7F1C4A294A9137926957D70C47D7EED1047079 +ECCD09C2BDB154A95A4F5BFC6CB708409E3E1A0DDB421F3E26BDBC0126212425D68F3218DA415C +0B03792A561B6B6E02D84C83534866A8B4397D485FA947E66839BA118BE6475A8EF384E597B99A +C24B83ABC9890BDBC7946F07C43535A9C0C53C6BBEBD25E85D7DBF87394FDAE324BD1CB4288B89 +31D3BF747EB89B356B3A11F07585EFA4E4349A40B409AE651D68E611122D21D9DE3425EA845568 +43A0E9D638B1C24E55992D6EB5D7A36A8035B9AAF0D8D71FAB9A3C20BFE5FC381E6E353C8529AD +44920C2B8A1D4DCC09FA6DDAC7C540D24FB55D8EB38C883431FF49DC1DA22445A6CB438E6DED85 +699290D3EEF81BCBA53D977C0B32B2E478CEEB7126FA359D4EA3C8EF1D0F6C3AF075B2E94FCD5A +ACD0531FF179735D94672A55C1D1FFC3842BB13CCC3E4C81B706A6830A1E502E954BA2F6D57CB7 +777CAE7EBE73ED1FEFB88F4E27DE15A052185CF9DEEEE665F38703AA7AF90B0971628BDF8BB1FB +21A30C3CAF7495425150F6E53A58F11BB6CDF949066CAC1352B7460D33FDB76287A7C55C9123AE +5A2773E720509A9F3D391553BED505C28E8A68EAB0C4231BA858934FDD38C725D340F21FE656D0 +002F6571A99FCD9AF5150DA9B55D796F9F30F4D10A7E82DF3B55462BE4EEE3F22D484275D60F04 +D3B1C83AAC019C0C46B68A1A3357A65A22A36CF319F53637DA1AEC7C0AA003E75491C0CA77BB7A +DD734E0BB7AA3A30ED0E228080FF71B952DD328D938638738697F06831826400DB73D6E2B260FF +00EB6130B3868D3C204EFB65A2F00CF5BB2CE4B464E5EED55E7CE33A1702D272069C2B291212AE +0F7A0D3BB7B82DC5FF2565E40B0963FFB9ABDE6DFE0A5EE3BBA96A3CD74D4E9035849C7ED677F6 +84319FBEBA5A5B1B2B9230994B2EB643B9F395096B46A7BDE84230662B72077FC96409F1B237BE +CF8CD53F27F690B101799B9FEC896A52609FB368DDEDF466AB17CED2E756D2A9026D4D26E303A2 +CA619F746C281A9A6AEA0E08CD0D1A7AD1F9CF7C6EC91A35AFCD6A1F59815A702558305398B0A1 +4A5AD71B085B9B10325C732D229A9C98D8AB35E99B31CCC4DB44852E5BA6DCBE8F759F54B3C10C +BC761C1E576A38A788BF5CF46D68F8427E2ADB16E23A8744039F78F637BEC3D8F6D239185E9381 +82475AC85FB8112CA4806D13455EE4A903CE5C7C7D5A8BF0949D70740ED6EFD38866D4645028C0 +5F16836C9EE77E775626BD67AD61EF9F6D7B72680564715641E460E09A741F30777FF1CAFC8B43 +664F96D15E4F218B04D462C8D8AA91B55765927B41CCF8B79F89D4C95FE5A6B55E943516C8C674 +0F43D3681FF8962A0ABC7BAC47B06DA27FE8B1FBA3039595F52CA33845C1A7966308C006D6F828 +108603B42229012F5366B77C654AA8CF6980FAA68A1796A1C9DD3C8C01D144CE40C669634B2FF2 +946907DF407A2C5F577D3785623CAEA75F5D18E2B3B91D595CE8BAC2EC742ED54F17D4F912E115 +4A6866A5E3DD49EE48B407FAF34441502C6AAEE95DC123EA266C27F6924A44263AD1238FBC0C88 +22114FFD6FC5A178F22D993639DFDE16B1652881F7A015AC88722193BFDF10DC1C372916234F11 +591016A8B5C2055934EF10C079DC83BBCF396DD19C7E9E112F94A871ACCE631683A8C886E4E10F +218A7AD93B0F4F83B8418C0984EC0EFC3ACE47E7583F801D1B514FE3FCB6D4ABE5B6C3783F3026 +502212E265243963F6F57656ED205CEC6A8881F37B1FCFD2BBFC09D1608CA43EEE74229369A215 +1A916D40B2650E823BFAFFB9338BB43369CD38F0A351E320DB42BD62A6B1A53E0AF4E0BA92DA1B +D5DCE62194D041500173E02835DC3C5A43467258A4340C1B6DB48B612D54110D70FBC038E947F1 +80ECCB983D2204567BC2E256C6AE46CE9C13E6B576E2C9FA5A00840A61D078C80C1C7405A6CB66 +BC23CBAF1C5CDDE62CD32A84D587BB2B3828B088C56831E6C073AA50AB4CF27FC74547554C491C +DAC152BF20AE1E14E31A7EB4C45A11DFBA32CC6B4D47488B950A43B12AB7DF7BFF07005FB64503 +D00EBB085706EF3AA04110C671306F763273E16BC75323AEE529DF5EED8CD07BED8A635376AA88 +602674B619B086C8B46339FCC077399CDE9F054D50AB2EDC80BC73DE4332CA8F8FF3D4A2B2D461 +3BD0B29C7DF001FD3B7CBB4666DA2175252E7E55910DFE6706CF744CB7C24CCE4CFD4F35D0E0DB +FA1C336240743562FD040687693DC43397B012390833FF786416BE97C2B8E16897C3EF5765C988 +7CA6DD1A3A5B2CD07507AD852A7D694F2FB9E1B8EF8D0581EE6C80094FFD048A1623048C4D4DAC +AEC1303516A43F08736C003246885184E73D8C0312242C33F33C5FDD86B4B952F86B8008FAB05B +38C697BAD2F87115E88C90B3F70E53BF6CF95E50A39FB028681746DA3431DA246E7423E8F400E5 +659141F09EA274219F1D99EEDC203B1D8B9696F66EE89643B6412ED2C3F41CB9385C30EA9332A4 +5CB359E2739612D7FCECA55C2BFDC4230E5CF89E7021F4220C22B6913F69ACC5F65D7374214EB5 +1EB691C53D0B1F590F458A4D4A385D7826659C77EA21504A7EFB22758ECA0497D059437D70CD94 +05DE2EA6BC506686D07434C6024273B49C009169E31F4B719429CBABC11473EB70F07DC2372D11 +BB2C146DFA378825C0F2857BBE54EFFFB74FEACEAF15ED6DA597FFDE9377697C0E472B7500B9C1 +6097BC50F38651D40CE96C50C9A6236860A8BF8F469F83162324B5296C50D430BD211D8BD0E4EF +0101D6F67DA8C348861E85B35A2A4992D6A4930AD1D26C6BC5CBB999F83C727D5CE551B98C9043 +D10A648D8FCD959C9D1F83812CDA60FFA8F8C3F88FE8536CC3FABAF59C5C174580B98D38971623 +6284CB20F900D8B793D37EF566A87963445862BA4EFA880102C87F608F0CE734212B0324FB2D2A +083AFC582CA20B744DC01BE3862057D746811E95687D06388705421C1B8DB69218A2A706D3CBA7 +8A449B344AF0F64DEBB4FEEAAD2C873A42B2A934F93C0BEF487B33DB2570723194651C204F1201 +56E09CEA13151E7E49703A3124DF500E780CBC62DF36502D2E6F5C57CFD1210850A2D35AA40A55 +603D3E56591E33E7722A282D6A8E1674495E12E348954B7CD0F4A4E4DAC080824795188D8A478B +243EC611CE5901A9BBEB76EB041AD162619EDF1D3D83ED07F1152401D2D5A03E6C784D6514EB89 +6ABA990FFAE09BF057B912A27DD2092CBF5157C904DA4B566114A37A7D9AD0C0D717EFB6C4AECF +EDA8D6971897E7D0FB1E685AE00CFA46F11B4820B31EE99098EAA2505E531BD1B07F41D550FEE1 +16F49073A12E482E9194C3C5D914AA944EB0A857AE2B5647A2C9519AABEE5ED6F356852C5F14DD +0852271FDDAA5F229AA7151D9ECFBC4861D5E89AB66747272FB6B8D49ED0709EEE054CD07BB917 +606BB005B6B2FA4B114536EB0708C08B5D7CCF46EC19038D93EC063DC3DBF39B25EB301B4CAED5 +05AC18AE74A0AE4494AE38736B19FC4E6B10227CB30940BF72A4704066D1D02626EF650C112A7F +8B8EF4074748BC08CB9DF80A0393793BED309D6DF2DE1F3D8765D992044122AB317749A3F96D1C +E8CC520555B4C2352A4FC4D92947B60F13B9D5B7A5B47AEF0363A31CD9D35DC0F34A051E369400 +D2AB68DA7BE1F1A374084B5522A6BF862579AC6F9F45D1F29E7CED5041DF262CEC4D529CCDF8A8 +3A18572D65E59582F8D75236897347892D9FD0DEA75BABD0C31AF5D690394B228E835EBC6A5F05 +AF40BBC6B35F8EB3C9F76AE440CB1A2E88A4F27510F67CBFC15DC29D82BF07796F6D8F793C34B5 +D308D8764E9EED3EDF5D328FB1955CDD0719BEC23077A5080A88E9C95C705AFCF13C85DC533B77 +6A15AE7DBC452BD2A75451CD7FE36C2B24B9044DFD9784D6B55D79BD164EDBDF735E6C486C9C9F +C5A3462212B66C2E8B3C1DC01357B02DFCB8AC883E7EC27F519001E5E8397D81BE41EBA7BEB413 +5A36C4E9DDD08D27C9A5B9AEF67090AC69F122DA5DF10A086ED8EA0C0A8D8060ABC76E7878AFD4 +7444B134EDA8D78E2271374C7510658B16A9C5C4833581BB7EF970F9A6A4F09B238EFE5A8B433E +A5162C9851F74F75EEBB1A4D57B0EA29FABFAF4D2D7D8AA8BC4132BCFC9F0EC7E841288BD234E0 +6F910BCB4456C7ADE4182C459D3D366E2CF72BC6A633E830DFD85900C3696A11D2C6B79A822880 +F3560DF7B51A37FC186C48BB55F1B91DFC8622D193C48438CADD95022B3269A389C2E60C9C2800 +82C096FDDA6DA3FE1BF8369F4FBB5AF739485B83BA055AEC9DB88C23DB6C5F751966D482434721 +91E85857517308281CB32C386755A1159B1ADD7181405CA3D686ACF18566BBE1860CC3D4DD979A +D6125C6A796D9C5B9B19D03E01DC7C0502F8F7E330A87F8AB8DCA128F914DBE36434DCA8B164DE +558C9F3A7B39C07135CDBAF5C6A6AA5B21972EE56521C7C21456BF9D462BD8EC6F838A006ED0A2 +84EB344C819791B014BCE095A6558B5294506EEFE6D51C935165FA4D0344498941A5E42116BD4E +C9B9F72F4AA2FF794981FA5C9F5FDE59F62427BF17BB7F0B2AE94786CA197383A6965214895558 +6540A4DC1071767E23310C3BD9877835098912B16EC2AC50EADF2035EB7A4BA2F48F028414ECBE +0352BD409792DC1B9780A10BEF8357130C201917FF4956437DCD2E35CD0B5629AA37EF7DBD6E9D +057CBE21442DB22F3B9CE9064289CC8A3882A6934C1C7C3542739E1D56848CDD2D03701578FEA9 +AE283D393AAFB58D5A93A16B5FEF33772AA47EBCD4A33B06A2CEC3B45C553B5A63B1A33EC16FEA +A152B1D248C207924A12FD27D871175591D93E23EF5108534FC75C455311EE8E3F2AB408A2FAAD +738DAB33BF98A3396CC6D5C3816B65E58D8EDC18C72CDB15540F6D62926F496FF4107A52154233 +FD73427D3C00C4455A67705300681ACD21931C665E9462BCC800D25A31A6BE61519FA3487E6721 +6BB21B579396CEB620B65FEE8FDC9CAB02CC5D5C8CFF9A284274A26F7C5BCEEC6834176F63A1A2 +7A674025A61FDA661584C04D5C80F4DAF73A5362F67FB8064D5079406EC0D115A79F292C893EC6 +0BC24FF533153275E178AEEE1D0C2C84D28D23DF028FD364FB2F9C13141098CAFF49C322A9D8AE +D0E5F195FDB307B0D27D89EA917346AA73BCC436120E711FD36092AD7CBBFEFEA3C6F371D0D29E +AA047229A12836CC4F3E1FE539338D4FA9E15E2CA242B768FB35A7E76756DC1EF247E49FD40438 +19F917F93DA4D40156E3AB93E5580B56BEBBC1899C2E3BB68CDC5B70642788FA475E1F0C71A532 +739F4EB3C85FFDAE230FE92143B8FF8DFC928F9F72B97701C2A5844BEA5D263FF3DFB11AF92B65 +E5846A68EC81F9EF7DDEE362121AAC5DF1B0C29C6C32247ECB52A9725F65BDCCFFD0EE535C8C77 +A02E44E274988827C05FF6C78112BA5AE29DD7AF086ACDEF0372B198E0303A257386315392DEC5 +7C0BBF78A04AA1FF28F927FF6B0AC8A76A22B56CA963B779E2081CF3925391C9027AB0C5533EAE +1B22843F0AC72C2964456B56D8BEED6A3C76D6A675488C43471401ED4502351451C1CA0A46E380 +D41E370D2BC703ED34B8682FAD0E9EA71E4A5CEF5890795E2B5B09FECC763FBB40B6B2E8D07383 +CDD0B084612AD2266A4083DCC3A159426D3420B81B1041C5EE4120C925C1A952EE6DFD759908E8 +E1CC882C12DEC431C4F66EC3B5F3CCAC728208F1F841E477A276ACA2F42AB5399F762B9C70E728 +39D284531908AC8EE939BD049BBBA6BAF1C536E40DDA2412FD9A6EECAC2600C49E10092E73B91B +670AE675217BA39A808ABB34E535F5CF9A202417CA625121DFD6F4434155BA437EA16D0B6B05CC +BB3B161785B3856136A5288C4D14F406361CEB32410BBC3252ED6497690D49A3A89C40A16F66AC +8F9D80411BCE174F5D57BC07968164BCA4AFF626B6F675BE9F438B461D2A35EE1C1F559096BB04 +2E174AACC03CE5C68667F8A59D2B2B7DEA85040EDF8F3175A14BA3596064EDC67058EAE7F60BEE +1759694129264973E259053A70FDFC27E708A8A1D40B451061101C6DEA814F7C9318067E561132 +B57DCB9C67F7DAB6C5FAFB9DF7B6B53D45B8D43F66469DE6831A40A5DA32A33D5FDF9A3F266A34 +6E4A2E9D52F68599DB0138C3B08436C0DBA0A553F6133672860345B77353BF9EFA3FCC80E49D8D +F84F85F1A99F23BF470A9314DA381370BEC348A37EE4517D3372D33E528F137A787CA9956E9BBC +C8446E71CFBDC6D92B241AEA8A62B77F40A630F5E72F623C18C9B499DCF511FF19C40E53768925 +8C9C933CACD974680F6E443BBF3CF00356A498C63A56F68843FE5BEF635A4A671874A33133D525 +E632A10F62A36120E5BB9C2216FE80DDAE94CB7540669FD0BC404D361BFD34EA879E50A44D4071 +949AFC3CB4A4E4181CC30DF9DF63A6A30B38EAFDF30158A1CB45F2E433FA4DC62763B6CEB411E2 +442124F95DF503C4FBAEEBAE7681532B9E5936716F6D585F51B9871321D5B7FA5BF4704B0A536E +78D00372CADBFA191E5E3CE0AEEACE1D6586E9D11A0FE37C9824977FF1E6F95019930510137ADC +C4A4F4C4ABDF76CBD32FB977534DB8F49EF673AC29C1A559A1EEC69F0EE5A42A24D20327CFCD0A +BC278473031C3F2CBB34BA6E424D990AEC6C756293821C5D439D4C8F54319C4BEF22EE740DE2E9 +3BDF51B15FAC6E469A01C1B5C5690D16F9754A8A3094E751FCE11000F991C566C7C1B8CBE772EC +80B2A751F829A4058A28110013AF4A3DF7DD7124DFF0F728A25EF78F78EF33A97373DE68D38DCF +D1E29CBF549011A71ED451B1E7EDA255A14975FF44F1CB448B71B09E82E8DD5EF75716A6E32620 +658D229108B8209287C2CAD6346F0E8BBF1EB99BFE8952C4080AFCB21F58DCDE2E73B02428D2DF +7B29C43DC1DF324A73F480685198F8006C996958AFFF6A55B459DB50FF2A33EF43E31923518FEC +28598D092D8205300026E04907332830823CDE60D062E0BA04CE7C801775012B4835AEA56FBA80 +21097BA760632CF097A0D4B94B5BDCBC2E61EFAECC791FD7202B00E678D6B76F891B918F63D494 +72BC7C5EEF4BAA30ECC71B5DF6315A71095F9E769DD0887C4314AEA236A8EADD9DB780411C0733 +7E337744BDA802DE4906C3F98E644C638E4C86D5F2A7B2C17DACB10DEFBEDF030A580AC847C0AA +56D4D4B30B513BBDC1105978412EC2C36DA5E4F1EACDAE3426DD48898DF1DF0B0BB91C3343B487 +14EDAC8BAA025AFD729DEB9FC96432DDC0D782D226726368B516E8F266855D7D02472D605AB245 +084B55FA61A0CAD04FCFA9623DDCBE109B2AFBB69955809E2989B5453793032D1EF7D7D8BD4E10 +1456DE181A8D7DA06EFE2644F184928270400D29EA969154136D1E810386835E2A3161A3074BDA +1DDA9B028910927B84B44C52DA2E3F0CC9033A1ED31743FF1D04D281DF1D62735083E0AABED00D +C0090B1453FA60E5D16AFB16A02DC028A418F357951710B45948D06CE7BDD0BECBF3BC2B9CE44B +6E47DE415A655F6D78DFC36995DF01D28BB52F750FE557FD2A82E36C7B6D9CEE9DE4326D69E261 +74FCF2D3F78C7F68EED0374D80929FBB08419C9D2D7F55D1AF8C3639DCADA1C7DFEFB7CC17D807 +3614A1084659277FF822BA6DABC3371D600A14120DADCE7A1F29257ADEA32DE6186D1E2FB54ED4 +B9BEC1F268B90656B224757015C35355841698967587305949A7158490FCE4F1BCCC2A83DA26D0 +F1D7A9912F8462722A58F5D0A7A4DB48F527B1AC5763E6B45A41830E1ADCB09E0F336CB97CF239 +9513DFE02BA8334B6A7EC74C0F3B0BCC61382B69D062304DF98B09F1E13291C97274CA134CFF86 +CC2A823BB8A1BEA31B8A25F843B15273D0F1BEB8C18B3A2E2027334A27B5EFC4CB0068C79E5CFB +AEE391D8BE2C4CA0F8A630710AB09C18C0DFEDE175ECAF12063631E9B25C6C9FBC3D49873002DE +6262BCEE73E4716DC30D610EE5402597F514903E5EEDD8A75E5A6FA117A21144AB5B338C1D4B35 +9210169EA0726B14D99E48834DB5D15691FD9095FBE699C46C7E6EF3790F6005C05561E053800A +B8E261C17CDF355646A1BF29414D666FAA5C1EC43903DD04678CD1B5097513C0C69EDCFA5D71F1 +D3E540EDD11D4B72ECA6C590A57A41EF5CDBB09DEB1FDD6C823E10EAB9E6B9EF02F4045696D615 +AF4E01796C2856F376F42940CFE098D303C741D0257EC3CBD7FF2D33ABAFE8DCEBFAE575ADDE66 +CAE813A0451E5825AD0234D045630711BBC3853D130544E0B0E787218107450078D6F380303DA4 +DE2A39A9A689AC4337D255477A7D0ECFB746E129F779D1F45F86F7F0E141923AD062E6FFC4134B +6B15B2811DDE5902AD397044466318B4356DACB9C6DF0CA786D3D81EAB52975D5C6E34D32B28CB +608D91A4833D5D35A777AB115290A4BFC8EBD24846736B0997FF9D5DC471AC673984AC8E8BA510 +95442EF37C5791C650C3A50A2907E0447A6513359D001FBF3EEB4720167AE69D2A6E2F8D068DCA +BDCF141A61A956AF4BE6DF3EA929843344F2E38951B9EE4D38D2E51A195842E61436C77E7D953C +AB3FB8144AFDC371B0DDE968AB88493C15585570F7DE881A1724C0CB6E8A3433E6E85320ADC362 +734A1C81C1EF9CEF1B863A803F96B5F1F61A05D61B9992E99BE5A52A58 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndResource +%%BeginResource: font lsunr03 +%!PS-AdobeFont-1.1: LucidaSansUnicode03 0.9 +%%CreationDate: 1994 Jun 04 09:58:17 +% Lucida is a registered trademark of Bigelow & Holmes Inc. +% NOTE: This is a partial font in Adobe Type 1 format. +% The complete font in fully hinted ATM compatible form is available from Y&Y +% (508) 371-3286 USA, email: tech-help@YandY.com, http://www.YandY.com +11 dict begin +/FontInfo 9 dict dup begin +/version (0.9) readonly def +/Notice ((c) 1993 Bigelow & Holmes Inc. Pat. Des. 289,420. All rights reserved.) readonly def +/Notice ((c) 1994 Y&Y Inc. All rights reserved.) readonly def +/FullName (Lucida Sans Unicode 03) readonly def +/FamilyName (LucidaSansUnicode) readonly def +/Weight (Normal) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /LucidaSansUnicode03 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 148 /0394 put +dup 154 /039a put +dup 166 /03a6 put +dup 173 /03ad put +dup 177 /03b1 put +dup 178 /03b2 put +dup 180 /03b4 put +dup 181 /03b5 put +dup 183 /03b7 put +dup 186 /03ba put +dup 187 /03bb put +dup 188 /03bc put +dup 192 /03c0 put +dup 193 /03c1 put +dup 195 /03c3 put +dup 196 /03c4 put +dup 199 /03c7 put +dup 204 /03cc put +readonly def +/FontBBox{-615 -440 726 1024}readonly def +%/UniqueID 5054503 def +currentdict end +currentfile eexec +E98AC76D0B9811AF896A7D2786CFE5F8CE68EC0023DC2681A7AF04C897A42BE5FCFE91943239A1 +3AEB5296C6852464267094E08A45F9BE1C443CDAE11667C6CF7AB42711A6CCF9077E8A2D8CBC30 +9D38A0BE6B8A865AA6D108DC56579ABCEA85FD25326DB34A8A3B77A5424AE4100C2EB6804EA369 +AE0896E47334E66BEF4DCFA3CE9DCF8BA26773A39C77A33652D76918EA4BC304D746DEA74382B2 +CD2A6283142BD4605E129465DA84867CDB60E18F858C99578A3DD3BACCE03A8A6990C27D045C3F +D9C8550A2552A64F9F431169CC4AC1B9B275DD9E6D5F3DF5C70E8F657DA036CF63E714A17DA9FA +AF96888F242FF964672AB6D9CC68989DB538723337304795EE327BAB72CEBBFAB6A376093EC250 +7E6CC4E11275DB4AD7283811195AE1AF7C8235D220FAB9F10C43D291F873D989F30F3E2BD37AFF +E5D4DB432C168C065D446F0B3D58981E981E9FE5CB773EE40AB01241EA403188FEF5B1AAE43FAE +7DFBDE6A367FC7D6F418E569D7CC7B3D20FCBF2687397122164A647041D12714798560ABEB8867 +B266991761555A15A26569EB0FBD0137EAA54C1EE6010F0793B0896AE1CDCAFDA76DFFD032108D +FBE81D02FF87E094C0012FDF048557854A7951C19C117397A81FD4C8F2D32D5AD9EB1E49580125 +3BB1516DFADDB20EB7142443A1A133A5474EC8EA29103BE5554C41ECAFF76786FCD0FEE4971FCB +646F02BC421A7E4D1E5E0010A9079D17364753074ACD18630A5C6ECA43EC7C53C4B1A5DD0BEE88 +9201FC8DFD39CD0C81863BD765FE7C8CA2A69D992034D8B8B9C3486D26DA6AADB594B6EE99959A +445C809D1D3EBA95FF9429FB957EAF9B9C7E3D814B25CAC10658218FE2993828ABD4C0A7650362 +981E23E95B851A8CFA68B80D4DF911F9BF21343BD3E61DCFA86F20E96219FA1B9713677BE05602 +A6EF36F450877DABB0E42F2DC22538C31B680915A634C6D34464C3EFFCD75E60B73428ABA3832A +F9426BDC82D30589727058692220D02B5D64DA3F8F06BB80D08B77A455702FA9F2A3822698E02C +DBAB8BF4E63E39D377C60853E3B8F7B12AF04BEB45AB27036BBDCF6C58A80E3B3A61563E026C72 +4CD6E7C407B7404F301E7B1AB0EB210E41CD5148396089023AE9401C80831E627EDABFD4E30E18 +EAE2DE1884D7A3813D343CD12F9B13D935199CD744F53273DE6FCF7B0F6105BEA2176D26B9E3BE +794AB2120BF13BDA3E056EF6D06F8E219B54E3FED9A7CD767C428375E40351E73663A739B3E77D +FA3F36125473E7FA6FBF4A99A69AE1DBB03CFC5C71D2D941A15C1DA9C399EC307DA5D75C8B02FB +448BA23DB70233E83964B29CDD5101B404F505D6C8462A37DC5DA7AFF8145444ACD627E8933F24 +7EE0163AB6CF596E882A8B123A102953DB3D0394840A2977DE544DA405D8299B2AD3253C188EEA +F07D57FCA1FB375B9BBD397E1A500DB415964E518B2E2FF27A3480B58E320EE8AD0B76BAA2635F +3632B6AFC2358A3A332B773848742A11E957ABB886B3CFFA93999A478821EDA9FDD823EC8818B7 +2BC26EF0ECDD2EE498D92638D2BC8E19A283C571CA8C886A8F8E647DEC4D6424FE9CCA8308390F +78F361486C56B9C039B14F76EC5BCD8472F4E6FF566368D5FB7A55FA0E887E9CADC5044391FFA2 +21C598CC9E2CED7907F736F0EB8F12348D64EBCA0672BB8F1E651BBE785A09A34223663975B48F +90481DBA40982C8857DA5EFF13E9F5BCFADE13F02C4C5D4308CB09D6588A7BA7A2E1A4774701CD +65C7274D0E2F92AA0CA4A2FFE596733E61BD589D9B5E84835254D8F22DABCCCCE8D4760E13BC4D +6E85BCE03DFE296055EAC95B3523018DF17E8166ED03A23E1A7EEA0AF8C65F219A8F5D7C6F3253 +7160E12174798BFB8AF179C70A8E43C167E1DDF34E47F46543CCB7991B65A2FFC11F4917964CDD +C539C2E51E503998401540F23FD6A52F81F6792F2B97EABE2A74B9F58FF2C891E320DEE3ABD153 +FA43F9B456414F8207600AE3DB5283BA7A0F18FC16C58766C58EC1AD813E77BEBAF90FD8D6F55B +25615FE74761320733B58B545D584826E81F2849E1875490F15B774A3A863A20BE5A2EFEEC6F9D +337E5133329C0D4E8FB4758FF97DF0C97127FBB5F4C768439C8B9F7DF2BF3EA516C268FDA3A305 +BC2485ADB785E24A4BEE9AA3E7C82D3994C19249A3AD713FDC5B5C981A18E3D35AF4CE2A349C22 +E8923619B85E3D3E4B314A1BA051A506824368F4CAAE420FCF9CBAD8B9AB38463229750C31FD8E +B4042D8174F9C94830855B547B95210E59A601A076BEDBF121DFCF34440F65E46365871F3BDDFF +74232CA8267CE9864E4C4CF8D3A0AE94E57FBB2335AA4EF757CE11F554D8BE69EAD58004BE02A3 +B6B8CE3F5C5CD23013BD57D15D447512FF69A9CD5914A73144D71F06550E93695F0F6CDE77C1F2 +59AB5BCAE03478C9B172B792B16EBAC0F44F97C39FBA333F9BAC6123506028FA93F2ED96F88F81 +8A3EAD11809C5A5F4FBBB62C25C9C5B68B82C1C9734DF1989B00553BBCDED535F6224E2F74E18A +29CE4568C3A6B0CF980AA1F7CA1F396D2DF27D4A6C8B9E104B5CEE96CC4CB4399EB2D17269B64B +F50A3A0576EA17F41207717A2367094EC5D35DFEBA9D1E0AEEE710FA0E2297C91AD8D002E6C0A6 +FD46D5D123BA55B2595D9AE0C0C730966B1BBE3F464379167D8A7B817782DA4EAD919BE0BD1D8C +61FDA8124098009B17BD4F4A0C189ED085CED24F05A10ECB9D96F2CDED8B5D8F10A4BA62D33F94 +FF1FEBC20C9E64A7DB41218FEDFBCF94DA4F16CFAAAC9ADB9D24DC1958BA67D52F9625126D3F34 +4C7AE7634B21608049D7D30D302E95726FA7CC91B445FCFE464D6E1D79389404F0A28F8DF0D27B +AEA1C69B435B2CBC979580A2175B43F0CB739E86D778EFFB25D9C316903B82274ED9AB9E1ECBD4 +03EA7EE377A11A8EC6A8F9599879878C704B25D4A5523F759D09FE3655FEFAFD834F9AA8C75C07 +4697A890A38839FFBD754AD936EF8088D20629BCC0A9DDAFD5400D0C596391640FCF4A8F5A1155 +A383F32ADB70FD8E5AFA66484B1B6895B6F2A7859537C2088DEFF14169DAFFDF1E0ABDDC646682 +324828259958699EB1B21B7638E3CBFECDB9544F3BE2F00636906BC83568FE854E62D5BD752A38 +084421CEC5E659D7A9BDE211E643950843A0159D6834A2258933F8C001C67B073E9C9BF7D8EB68 +BF061B1966866465C8F7E1D2DC98F39F3A9A0096D62314636CED9B4E2E09225760A78B1C58A1C8 +2BF342F7940F6FC838F4618898C313CCE6311DAFBA75B344143736C7EAE29D4DBAA4B56BB3781D +D2DCC86BE5A4C4DE100BA03E4B133A239B7F6C3ACD1C4B4FC59CACE546E74591C12BF7497F908E +BBFE7160563BB47FEEB502E3B5B21EF579E375BF8B29ED72640EEBD2BB10FA2B1C30ED5EB0A089 +46EDCDDD233DBB94E95FB0012CF8BF944B683DBB52C90A08E5D53B2197FD4FBE9AEEF3245D6B9A +295445C148C20C597CB2F705512F3EBE2CA9A63E1B479A49DF54AA5F052283ED369865676C7470 +1D7F3D4745944506AB5B2FB450300BC1AE7B0F9B0A3F1BC5499A53962C4143455DB5B3C554FADB +AA6FE569A1321DC010E5484EFEC85CD8CE23C89C87D1AA2982880C56109F596DCA8258FFE48384 +1B2672711BA606DA73552081C55D0DCA31460F3C81D4A8EBC7C55A487F2C08A986403E209E52B1 +A38AB94F399D667720959DC10F9675BBBCA8BE368C3DBE8A3C82224DA3B977B0ECC13EA85F775C +1BAA1EDCD9E1C52E2169A10098B56C74E2597E5BBCDC693E27BD947033700DFFBA4D2BE22C8C0A +CB0D4CB909EBFBEFD2F66FD53157E4BD02E8D027A060BFB1452FCDF79ED71245F021D29A21D16A +8D8F2D0B53DE50B6E98715D2042E2C46B7C3D77640170993596EB481FE6A6DCFB6FF046147C68E +241E62DD123B598D408FDA25A5FF8553B44FF1620FABA4610F905C7EEB946CD6A09D5EA961FDB7 +9AD3EBF9836DEB52B4E93C4F1A1C89140272C4955908203C803C5803161AFB2C9B3510CE607F9E +2BB8AF8BD19B38D38F7942446DA9A92770333F8FDEA61394C4C1110CD91E95D3C4FAA33841D79D +F1CA42B0115ECDED6CFDD92D36A2EEC3A2904C354206B987EBA4AD69DD6B5C7A45B96106593C15 +F89796CB639575DAD7D277E09D347A4159EC19A8D881E6EE3E9093B51E9D9B1CAA1F0809EDC2EE +206F733C1B11C4292F75D0F37B25706AAE5E7900726478DAE756A7F59B4D0580D2FBC839D6F31E +086CF751F1017CD84AEFDA2D318835DFB74C02B01FB151D72C4A84D0BB976A2C35ECEC00CFB83D +EBD59C29F54F229E087C1C6E6D7F72F32685E2AF4D4353499C399F2438D18FF0E011A0532CE68F +F5B644C3D68754CA5BA2D48E0E23C80EC34F43468281AA347664D916F56E97B9F0E17A894DE514 +9800C5C7B78EDE6A882D5180EF9F51ADA5E3B511B07A89CE1680963DC3848182BDFAF361D9A893 +830547B3FCD4E412838E214A872EEA88FDE6298B15BB69FF9627EB37C27F89071F9DA74F4D6C06 +37669C6C09BB543518AF798DC1B1A10E2D53D24C3A5B1A485D6B8179DDDEDC7B82D610766BC80F +A1B2C3D3A4FEA53933A6FF83E85DBABA6F5EB94FC23EE28BA710427842803E0F375331FA1EC106 +8C396CCE31A8D68B1A7A0EC87CC082A501F711E93B9FE3DFFDD8906566B7B25A260D1C64D6746F +80A2D323058BDA6BD4122F0C04B39A4FA271E7B75A1D8FF82782540193902C88CBD99E55B33245 +069BDA735E4991447209892CA9BCF5802D44A09BE99EA64ED4EA1FA39B7AE10D8B47ECEDA33D80 +F8BB0684F289746D5D2DCCCE59D4E6F48D8F7EAA81129BC47BAD6E74F4ED9B3032156B302AD7E5 +C2F79E5A0A9DC77FB986BB46F4039152EF22331FB70C5AC047EC864F5EA5EBFDE11B5EC4081CD5 +FCDAF37B47C5CC8AEC7CBF21939F89C998AD080B530E969D39607B30B5E4474206902CDED411E1 +261FA85AA8CADAAFE9C8D0CA713066ACBCF385F4CD377194D26BBD5918096A3ED2C287A058725D +BCEF5D6D2A0EA6300BEEF77AE3C6CC068649D077A38CA6884BA08B9523E51DBE0DE61CF651B7F1 +27C93CF9A756A521276CDF6ED0FA7F4F559BEC19DD8252CB5409CD25F20D73D53375CA25DE2CAE +C1D980C6C0B99D20E3713741A86003237A291A0815FA13865649B802C08B28312C61A95910F8EE +BB51351AD5D919FB238D9BCB5C0653A14258C6899E22FF0FAE8B81804F3112C598D1C2F8860063 +C751F39CF1B7ACF3DE9E9B6F6FCFA55A59D5516C173C90B491ABBC65EB3D93B416597F22825D32 +22D9E6F5F7B993127288D3ABB7E966C9F2FA0E0A7A5B794D72FCEB0CCBE9A201041FE2338BF9BE +6241012E1E255327CCDF5FD1B0AF10626DC35C269A6E5EBCC697761374898384AF1B00BDF33A88 +E7B9628C9A44435BCA110B57227D9BC9D8BF6C2F205A62E189E683E50EFD1F09C38E62B4B12426 +2982074470A4CE35EA939B558BFD24593996AB198A669393B749AED33991D833F85DA040A04379 +57CE47FE19E30AD150D7EBF3D9FB521ECB0D3C1DD75D45C180619E0131BF9636AD108C6F7F0F73 +0937E3C8A4F788EE09F3E4A23078A79F386A7F638286AC0045F9D52E8D5AAFB1D4EE7BAE0B27EB +6FEBE7D6336241930DC406A45F261FBACAF975B7C4EA25E3751FD1806332CEA37442F99EB2BF69 +C87C649F93C5EF9DB13584690078CF7BCA17543DA5F867C550FB219C8581F3DA4DB0BE951C4932 +D3B65056CFC178183EA34389B3D28661979F1328A326783AC6CD34144EBB33CDDD58EE8A9A7DAC +E4AC91FE1532310F9B36B17F3CC79E6878488AB43045BC5B95397CE872D1429ACCCA5D99953C63 +028959839EFEC3F0A8E3052E4EB41E673F0FA73B9F82261CB6965C621ADD6DD858D7B2A8415C11 +BD9C51FF31D1F90332E076977C6461288A644D66ABD8E295AECEA2F37DAFC4F096FC0AF34938A9 +2C1E5D94A438319FEC694EE5E4ED1AE5C1FA82DDDA55C394C73CE39F18137370ADE011C4FF7213 +95A444A57EFCBA18 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndResource +%%BeginResource: font lsunr04 +%!PS-AdobeFont-1.1: LucidaSansUnicode04 0.9 +%%CreationDate: 1994 Jun 04 09:58:28 +% Lucida is a registered trademark of Bigelow & Holmes Inc. +% NOTE: This is a partial font in Adobe Type 1 format. +% The complete font in fully hinted ATM compatible form is available from Y&Y +% (508) 371-3286 USA, email: tech-help@YandY.com, http://www.YandY.com +11 dict begin +/FontInfo 9 dict dup begin +/version (0.9) readonly def +/Notice ((c) 1993 Bigelow & Holmes Inc. Pat. Des. 289,420. All rights reserved.) readonly def +/Notice ((c) 1994 Y&Y Inc. All rights reserved.) readonly def +/FullName (Lucida Sans Unicode 04) readonly def +/FamilyName (LucidaSansUnicode) readonly def +/Weight (Normal) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /LucidaSansUnicode04 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 57 /0439 put +dup 74 /044a put +dup 76 /044c put +dup 79 /044f put +dup 81 /0451 put +readonly def +/FontBBox{-90 -211 1024 940}readonly def +%/UniqueID 5054504 def +currentdict end +currentfile eexec +B947A691BCC86A8714868C4E8EAA6693E50213672FA40A24C1BFEB6B454C65D97FE3C8875CB7FF +DB41FCDA8653D373718784E1CA8C2E52026C505028CDB223EDE069E4FBEE2F9866016FCF3C439B +BB0802FAB586D7AFD17C75C2C867DC859619612A4199CCFFD6C8BFADBAAD892A6C666D828BC33F +4F4247E844052898BE31C94D164ED8D032C6F943D6ED98C08911A23F5A44886EF9C56C418B6902 +CF632ABE9998ED7354C01793652E9AFF38B16675570C3F14DD18F4E0EA8F81EBA3B5A2EA1A6A75 +2852B45D9DA70764044BA4537DB8B3E88BFED459F70BDD5F881C906573D7E01AA459D103FD3D95 +D2C0D6CFC9AA56C9706482A513FCF9B41E612B7F6A70EB084A6F9D7BA73BC196B39EAC357B521B +E3232A0CEC9DDF61F6A57661275C3E20359577BC2124313A4BD33BB79B2760F11A0CA7BF9AA8E6 +83EC1146B0B2074D70789306AFDE9BC65D8998C6C6B28D89E7CF52E057C9E40738983F55D859CD +0D719713B944F82DB6F8364CE44A194C0B4E6E987C2A392DAAC78285ED9C29C1DF8F23842C6AD7 +F2C362923E2E3C896F4759020EEE519DD5BE0603F7ADE8A7908B806799345CC450EF767993D072 +238A614D5DBE33015C181CD4377871A633824D0DEABDA62756476A2E12BAF3A891001FFB69FEFB +D921533AE16743B926BDDFF77BEE342CD2AE8AEDCBCA8F90A10779CC9BF24974B4956DA4895299 +542E68FD9F5134EB2855709D7F684998BF878869A32DB0C6BBBE28B5AF1C1007AD68807513BDC5 +583819F8A5C8FA338B6CEE5D696B0BE6AD4C132E8CD0F3A0FA8DBB22BEB7F21AC6EA9D2CE4BA7E +F4A1D55FA87B7A57DF56D478B444FA969F3CA003267F1B45E69BE9210906D363A62731EEF97540 +E5372A27983ADC774AD984B795695D3B164AC04CDF48FDD5697A3F855E53189B795887549A79DC +69AE4EE9B7DFC5732BEE8F9FDAD6008C6EC06BA5695492152EFB8C2A2BAD3D44EEC08617AE17EC +B22CEFB1122BF202A212F998882C2F653D56F2D0737FFCF84E0D52DE3CFA539954AE718331109A +30267B8CF12669EB05BA116D01F8F01472F466D26400B7CC841BBE94EFF2C95B36C695AA91FE51 +E2B1DD43A459E31E01017DB6D44ABA40FDECBA6FAAFF5D2E83219DEA8777A845F6E4F586E73B42 +FB7116974F95E2BC2FDF85FD5C561AC5582BE899C9E85FDA05D02898659522A38B4F497F16F534 +CB8E4EED100844CF77E70A0C9C6C18C99124155AF1BC7F67952DADF6FB324B9F70859BBFA5D191 +D51D024897422139DD5CB41591085BCB8A9655A43A7BDD93D78C55859F075E58B5DCAC83BB00CB +815BE032EE24398C06F8F578B49CD897740A4DA7E6DA7DD7508EDEBBE1CC0AAFBE06F570987512 +0A1B016A82C5E1C27E48B4CDD5F2884A5AC18AB5536A145A7A83EB4AAA9971865EB69EFAE5EA41 +5A9CEBF4DD21A7C173D5BC38DB8E5C2A6EE01B504A3FA492A889B67F9E27298149153FE446F040 +B7E2C781059C65967C51E23B261136557B76D675A79A006AD83F9E0A531C6EC6BAFFF9B02788A8 +35AD5EA6C7F8CC684C252AA2E7CD05C0ED81B8BCA7D4C9A0485DE412915310EF3F8303F5F4E222 +769DABE6CC59CBA5036F3B6B1881971217CBDAEB1ADDA602EECECA4EEC033A1485FC32A9F34C57 +994BE283205ECFE0B241FC56D225AC40984DEA53961B7D43BC47F7D4011AEDB3E3D824881173B0 +6107D6C34915364BA13D09B64F088504766072E48BECB0258F002BCB476AF40B5565393CEA08D8 +0B86330541D0015DCFF19A3FF11DD0DEA1E164295C22677DCCA2E69987C4DB4273ACD833F1E8A2 +90C7C7E83154E97FBDB5B28103DD17BC8187A0F82B0BEE9031F45A869161510B16EC14EEE4A90E +4B0CFF0722D40B3A54EB15AA16C4A9EB4747B76F3EB24093BCD34AB43651603328086709CAB4CA +DC987A0F15AEE2EB086532438092DA0DB860C994D5E3892618A1D6D536BD6E1267C1B79D2B038E +C3EAC72BF37A07F8338FF4ED00A2C096F2C6DB26E71F13E023D25D3F3E547AB07E837DE246E0FA +73356D30EB9E8C83D2A08745B3A238D1FB9F18CA32E2CDC93884D4B1F87854BBE7593C45B8F7AE +BC916EC39500AAC2522595A0593F2B95ACE4EFD4A016D6D6D1172AC47EA3C92AE915608F20F0BE +A10E875F9DDF6E0EFA32C3EE7965F34AB6CB670453DFE936D4D1CD77E44A1E01B81749EE49A4FC +7759CB1E0D30CC814E6AB9B51FF675A22577A3DD8025E04CCEA149E717FBCC8C424196B35D1924 +3C562D1FAE2E2DF182ADD0AA15FBABCAE89D91A363D3691CD9E2C6EC022C34C1D5A6F0EDD6189B +59561647A60F07E60202401959224E551F14C940667AE193924A0A83F4F85D071AF94C79056CAA +B4BF0453F2EFE718C7925B7D150F810156BC31CDBD19548B4365E214CC8DE2357368A8429A9D80 +6C2CF8AB10BB393455B8EC83DAD41021DD2C3C8BBD19F7F086C7D4AB0E773F9624CDFA6FE0BCA5 +1A581C845241710AE04EA754034710C1ACE81F3693F17A4144C886ACAA69D797DC781402C297AB +5D83D4CF37794E7186404A8597FA96FF43DDA263AE1E5BB13132DBC7A899B7E29136D8ADA59BE2 +F9FF6DB733B428A2D4BC94024D03210C67A9DD92FFFCF7DD20DE16564FFD28F5BBAD8FC6FFB08B +8EA5C8183331931769777C502E4DD4348DBF937560C37168C6FB31D04483E204D23C51F74BA204 +8409709D3B387CF7ADC611C68BB8DCC51ABAF46F4557D9A7D39472775F17F7D57FE5BE656B7178 +54306B9D35A6ADBEA90A4CB0B4196045B01BCC454395C6DCCD91DF342E853E390D0A060A587673 +6A7713D1BBB7EBF6BD15680DBD6996E69BE0A25DE4358BAA6FFFF20AB9FAAD1F62A773A51FBB25 +9DCD63271013026CC59090452EFD867D24C4B87B30C8B338408836B68D9F5BA5444C5AB5075D38 +1A8FE2FC68F3E307710A68163554EBE7002D15D5E5A8DD662195CFF998B7826FB58345A0C932B5 +E3505C5A7174A649668910C3493DC2BDD0635275431DDD1304699B371FE983FAB90976279ACA40 +6777877762511873E042A65E5F0D3CD63B692D22364A208B555EA28963348D2C2DE3BD025E54DF +656FC7749C9406325C809B36EF3CF9BFE641783D6B82DCFCF63482D2E82BB4DB6599D1771B6DF4 +FCFB7803B5853A371CAFF56A1A6F7060AAED31347807AC7D0114BD90CFBDF64C0A0BE6D2A18883 +CB9577A8480062E6849942CFAF4290F2BEFCD4B7A212F88B6ED02A82F4134C66609096E11258E4 +6E9EC209B58597889F3B86F66D5678CD1F0A0260BA8305EE6B038842FC4244767E615E15626773 +1006379D908D8048E94ADB70CEB5E6762763E8744D8CBE771B01BF51EAEEF378EFC38233FCE953 +1ACC4F8FEB18E3164C7C834F7A253C0EA5CDD0A541A0E8A263EC6CE7810D311D45C018CF88579A +60864FAB0D4D6E8DE5D2D77639AA944DF27C99067D4FBAA626BD61B36F4DC0CFEFC52DD1EE665E +FD87E73F791D95BF9368072D720A8E7069C9C9FA65D22B0C401115D19458883F4B37E631D6B532 +8C7E5A10B6E3F9407FB6AB8DB7D25BD0D682B197EE8C55663AA50B6B20DA99B489F8BF5F091949 +16DDF7781E5E437C208BD4C68F2DA4B4913C69DE358E9E8750F8AE45D8F0958F30FB7AC997B253 +C255CDB46054EE7CE90EE8C3B0379EDE79009F6952DD0C29A682813B283A18E11ABA75DDB8985F +F81377EF1420C3F93832DA217576D9871815CF0FAAD815FAA4B8D93862E0F7FE9424A40186E933 +81DE8FAC067BFED22ED9A8D6794FD76B97270E30ECECB34C4CCEC5C8681BDD66DE14679A85468D +2C7952A33C265FB2650B1D8DC32E867A98354E21F5E644688285315034BEA5C8981C9B36502C87 +4A3F87B5BF5BD1E3241B4056D848F46BE457752DAB938CBA20A7A8643C99E8A0719D9FF7422FC9 +1F25BDC284D1F0664C6EA1900938848BCCFEBF2BC4A0E37DE2DB48C5311F7BB5FCE22C3948F8C1 +AB83B98945A1FD7F8812CBCF8852F20D26B70D94D04E4C3B3593BE0716B016630E43C349B56F9F +C17A9D19172C4E1220F97A7B350DD592CE9E8DD5481A3A0733B95C58241B333586198F375F1F7A +FCB84E33878056472D0153459A5AAEB4F264AE38CEF24CEBA2A32970E642820E9708B137180739 +0755DB1F6E830A73DF803365B93F815A330E307828F3FFE89B1051EF80466E3F2BC7C5D703D5AB +10F0411C20E72745A13167759657C8F68457BE6C9EAEFAF4C689839179432E36200EC7C492EF2F +76AF90BBF8333DE26D91EC67F32425B3655D2AB080D6F62AE8CF99002BDA6D369529CA0110265A +E93FAA293D3E5CE6121C899FA575DAFAA8293DD6BEB7F8F5356B7076B38EF4E4DB70F004EB1FCF +F2501A24FC75A3BAACA7E6D0706FDEB788C4FDFCA642536036F90E65F6BD876DB2519DF5085C17 +E5474B454FECA74BF0F3684698585397E3E04847A1700307B25D00A2543C5F5AC662798C2BCEA5 +1A56A0D92E1D376E01898FAF604AE6C3861592CE3CCAD063C628E15C2F459A6399556F582DB160 +0C8C1C55FA94E64AE5754715B007AFE6E024AD0E96218E777E90794820DCE4FF8C0F936EDF0C55 +2808CB0DFDA4EAD0F1FB144651891982DF671D9EDF47798A24AA5F0B33E9CF63AD8AD4F3440CE3 +76B4C47499FC93F8277F3D22457B98F956C39C53D177F0CCBBB529A36055AA4EEC626A7EEED64D +646ED1FD0C3685CF4E2DE42693E7E212343B83FD75AC33DEFB9D16A1771D6D3622998E556C0AB7 +F2D811339E89330348FBA8AE94EAD8B18BAE18CA3683225EBED1A4DF9EDD2FCCC34E74822966D1 +D5F71D2346AB76CC3D0AAFFA3E3D57CEC007C9D892C5A82809976719F964186D3279D79B4B5AC1 +F0333EBB8742D25644A962D02EC011FDFD7455120BF41418D4FD6313066DBFE5A0BEEDC59ECA8F +8D1FEE9199848433A584EB5347173D726A521859A91EDA4E2D73EE7E8C51339B86305C63E35E86 +B4FF303B8B1075999B68513497249C62ECA2736FF6958EC66FB78AFA10532913ED98C1E13420FE +18C9884E3DA3ADAEBEB2AFFC5800668A2AE2752BD30945BD58C75EB522F869CD640B1BBD982833 +F92EE830EBB96507F4762E3138243417FD2C4738FFB542D1B2A29CDBCCF9F3CEDF879CEA7CAAC2 +570C352F4E4CF19D069FBE80F9AB796AF8F419EFAB203B930625C4FA2435D0760067D328A5641D +834A56E35ACDB03751B97727E4553057FBD08C1236E45C424368A7B1550A4ED7A5E6270190C60D +F2E025A2E24392AC419DD2FCC5D85696A0B2468E1995C3AFDAE38058FA85E54DCFFCF687707847 +39FC137FDF9D6BDB97E38642A6E6DBAE8B2E599069634AFA5FCB9DFD01A00F7174EBEACA58E0A3 +29B88239CD746022D2B10A8BC3CC15CE973353C01D98D8B2D5AC9253CA5ACA59AF6324B5C69A7D +A13E28170A4077709CE7B4B77B407898085D371E0F9207BB42ED043D8579D57F81156EE847D962 +FBD8412ABEEA9B941AFC7B39A51391D02695C8FA95C775F8CA84DD46B2A28D1735C2C5228FF7B9 +29AE385AA61818C2E9568A4F23F8E890583E7DDAAC4F48875429CAC2D54714D179355590FA42D8 +160CEBDCF44BC348271FBDD219EB95D1153075C82383339334D05F741D7CF5F12F85DCE3A25BAD +6D518F3B13A0DEE4DB2CDEE3D284A8DF2F7B1C9D07E8D7F9D47D6BD6088591A9E089EA2BEF5B83 +CAAB3EC766B469DF9640DFBB4C32E505EE2A01EBF2E7155729D1B9E205711A74010C6BAC48F73A +4CCDB21FD55BBA48ACF5E5126CE38ADAAD6DBF3EA6297C56EC9CCB98766DA4C76DD8542BDD1596 +BBD288C262E48A15C27690644918944E039E9012C08E62A63495BC5C6E82285885A2E830DE725F +A7C746BCD0F333AA0DACB4D044CF8DA68EB5A1DD7B657715562D0D3F3F94F0B642C06BAF360191 +193F6ED4ED5F781AA5AE2DC7E9A6B73B182092BD5ABA6AF79E638152F7747E5938ED28D9C7D894 +A5762C519DD6620CECC58B2D583D38B63584172CCE9E4D5B3737422ABB778B2B85E9F6C80D3CF5 +FCBEE03C2C66613A8C5FFD6E5C2A4377472AAB0F1B93E7564657CEF1BA61C10849686BA4176116 +FEA3C5F3F89C492C1CEAA310E9A8578B7C5439355A +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndResource +%%BeginResource: font lsunr20 +%!PS-AdobeFont-1.1: LucidaSansUnicode20 0.9 +%%CreationDate: 1994 Jun 04 10:00:12 +% Lucida is a registered trademark of Bigelow & Holmes Inc. +% NOTE: This is a partial font in Adobe Type 1 format. +% The complete font in fully hinted ATM compatible form is available from Y&Y +% (508) 371-3286 USA, email: tech-help@YandY.com, http://www.YandY.com +11 dict begin +/FontInfo 9 dict dup begin +/version (0.9) readonly def +/Notice ((c) 1993 Bigelow & Holmes Inc. Pat. Des. 289,420. All rights reserved.) readonly def +/Notice ((c) 1994 Y&Y Inc. All rights reserved.) readonly def +/FullName (Lucida Sans Unicode 20) readonly def +/FamilyName (LucidaSansUnicode) readonly def +/Weight (Normal) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /LucidaSansUnicode20 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 19 /2013 put +dup 20 /2014 put +dup 24 /2018 put +dup 25 /2019 put +dup 32 /2020 put +dup 33 /2021 put +dup 34 /2022 put +readonly def +/FontBBox{-615 -440 726 1024}readonly def +%/UniqueID 5054520 def +currentdict end +currentfile eexec +B43A59C23D31312E42BFF7A8FFD888C8118609E66724952B45D5A38971EEAF7AEAD27731404947 +E5D485EF2185B7B28FEE76585E49D85250EB800DB5DBEF09999B470F9167BB8A81B88DCF399612 +0C5E5C13C786349E7F44E018DDA185A7327A13F55575F00A7B68BA5390314FFC1BE676564A478B +1A253C30B407F07FEC8E3E3C46BC787775A409E084B26786F0856006E38AEB9E71FD27672DD999 +15E5FF51153CD2575D5A841791BBB0DAC82FC347B4323CDA6FA02627CF6F313D71FC7B56A6F4AB +9D45D4EBBA4FF9F13323865378F1240393DF17083189EA6A560B78F670F31187E21DD2282A40C4 +EC215B6E053C952A419363825F8074AA1F2791D599B236931ECA38548DF42AF21A0B93299C7A6B +CD562A5D47894A3F2BB10DE3513E0101686157DCCFE12025B2F62AB48BC56966D41430446797CB +34EAD92D70125D12FD83DD10713076729FC32F58FCE51BAAA5865AD74B16825913B821284679E5 +9C71C2DAF711C0E0D4E82BD5FCAD13D14E69C0C9E8DCE7F05D2A5B1F4B724498D405664EDC7CCB +CCDA84490522BB752CB6BB095A3AFA53A75A04E8B6446C38CE1F543231B8E7A462CC128403A30A +1553F8AD4952935A99E6781121623F4DCA70C680758A89F19FA860DDB7A02B71B4265E4EFE5CFF +F0871888F3C17034282B2250FA41A8529AD3CB49FC2F94FEDDFBED06ADB863F82168180A185578 +755D4D43CBDF4D1FA47B05871CDF84694574CB0634E35C47C9B4BF695B573F8DE08A555F0A2DF2 +2774590AA572463F9E2FB1510BBCA5E8F6ADC8217855D4F1D5C837C3CDBC31E1CB6F52CC6D0D65 +05E59AD73924E4EB1B37E9C433BF0ADAC35CE1832DACF7FE538E921DA937CE895F565305535EB8 +17575E443932C9896F7D11431F8ED21EEED56E490E157FF33BAD34EEBF76042168A86077AAF03B +A2173A795A37E0BCE53179C645E8C12C0FCBE7C33CC1AF08C58567B83B602E468A8E635F0811B7 +6F8E4318EAF2CC3C5DF01FD2A95662F00029F54AC7C8FC2B999CB46D6AE8D3FB1DC657C6E961C9 +F870BC5692211F2C244EF9CCF84C65D013425D119F60FD2131271C5FC6CBFFCAE54064DE267BBF +3E03F44C47BD24364273AE3D94C9C818825440FEA0E06CCCAB1CE6C411628FD565E8C78B039371 +F4F6618EDF8BBB15197285A8379DD1DE9B0AE8C580C44EC9A7A74DC4A4496A4868355BD28FD537 +38C81C8060FC059EBABC9B8F14F65C347E47EBB861DFED01318BF955010A0ED66DAC569E6794F4 +3425476951FA9D84A48D7F9075B0A197936EBABE6B9D3513B542E1646A0D32995AAE08FD77921C +79F575F40B8E813B330F1AA029FE6439D7505B9DC9210D43BA9CE32E3A14EF467C870B182ED37C +654DAEF47A595E363AD0BB939085DCEC7155829BBE1E1A47F1F2A4F3432E34EC91C1C85514D35E +ACE265943CD46A79D4226BAB3BF354A04F0E182B759835B9FE8F76F505057869CAE56BA3350712 +EB5103078544D804DFEA9DDAB528DD4939273645933425C0F64F7AC4E5D3B01D5D76CD95C65756 +B48FF39634475BA737AFADF17FBF3CD5AD0E88F6356CF06EED43EFEF9B5433EB1600D38D203D51 +A1099E2E20641DBAEC087D771323611E50B960C1B20EC7B1BC71697768A088D806400AB4CECC04 +67AEE799328421391BA370FF34C617F15105260632A8C0F4B22E792247E390B1F564C6FE227B85 +5A962A6E06E6F565D8D54F9887042237617FB78CCE75B0AEE938B1FF3F0362D6BC139C871D1BFF +B8AA0877F9D3F0DB55ECEE0AFE6871E01F204332718A0EFC66EF197523FCAF46898F32C1B324C6 +DFF22FD9BDB4DA9D95D5D2208CA9D67C6C13B3A3BCAE8AABF40EB224AB9CBA55204458FC526DD3 +8380F3F432EE69266C02ED0086DC8D6053AB3D3330D436B04DBAD95818B0A5025CEF13C378A9D7 +2B6C775ACB4833AD3570D1E76BD359A5A8EC9C4F0938F7240A1B663AA366A4FCF3C102DFB0FC07 +994E668F503A0E28CBD1CFC49041562DA2249B608712EFC10C9A35E0FD9B346864E6AF644F07BE +325FC4E08F81E9E8A6DE438D3ED64F05A57D3693F770C2E139ACEAB73366F56A94422EB50F6670 +9032FAB1F7ED83D150A8D26B45D8B59BF720D04C4E283A647065EC0CC0D55D9FD7C6502EE3DBE3 +E785F49966E1099CE4596EA2F1CAFD038E882F05CD9628F74A9A09A5DE677704A12CD82A95BF7F +01A5147536FFC7EEABA0D288DF1A9C9B639350A266C42500696B7E925174AE15CDD011119E8288 +7EDF23F0AC7EEA78E38104C00BACCED03A7785D88FEA2B4A3EC5DA4ED2D0357EEB43C4278CAEAB +5BE44EC6C777B67FF30140A391A66CF1B47778BC0D9BF6804E78DAEAFCF1C3F67760C94ACDC930 +94E68CC33121CAB7A1FA79E8E14276CC001A8D31333FC78721C8368034B418756A9EB23D1F7104 +43326DF928CFB2E1F9246CCF09F5D21537213B798D2B72893A8285EDCD48509C022EDB3E0943A8 +AAE2FF11AD8B6EC442F30DE19215EC6BCED82C345467DF50276F8123BC061EB2ADAFA6CDECD1C5 +5C529BD9B1ECE353EE7A58BDFFEA47EC30FF94FDEB0E465B7A45EC795797DE00F78E180B73B3A6 +F5B3F35BD80882003053F618940DB675D846095F63E90CC77B5022E963CC39915CF3B95F8F5A45 +4419ABFDAE6087C4EAB799A8A5F1CD7A234A2407A2C08DF813227CCE6DA56F6D1B081278C6E046 +96CD90F917C7AEEEA3032A1A13993079F3C41DCA1FF2B300BEE78A8D9512736DE4DF75CEBDDC58 +33F8D1555590AC92FBA63E2D59B80EE8DEC88CF78435CB4CA57D702DD144893C3279DADF5C6164 +70EA7FFF87FE66F510ADE5B32019709CE6D9BBEA02F2BA243975E7800839D904DC09C2306A292B +B812F8CC973D40810ECA109BDE38961FC2678BC1CD377E2FEEB43E2072B38621801D5ADA0A92A6 +5F37C7FA277ABBBF372D08B834C737DDFD16B51190DD3043040B9C060A1828742BCF814CA98EA3 +77DB2DAA1B027BDE291293D8CFC3DC73A75BBB4BDE3CD80FDA05E46A2CE0B003663A2003FAE55B +0535A681672F7D8FC966834DEC4DFE56D3286FF86C10630F9EB91BB731A9C2AFDDD4F1554C4728 +4D68FE4A486EEDE086A565929B97FF763B31B5CE48678860215F768CEE265E157F1A44C3092FD0 +48239B140F2F8801D05B76FC9EB969BB6EBA6D472F1C016B94012127975E20FE911529090CCCEF +4C980611502E8641568824AA0F18FC3CBC5C2C46DF4A310A1961427A7785EDC75D0DC93FD03C26 +43FFE864A91F4F285FFFB5C74803081A71AD441522F4C5DDDEB96BF5A7080BDB57A22AE8DD9310 +02D940551006B0863C4274D0090A9C2EA9516F291F4A833772CE2F0CCF7A92AE08BC02CDA5B434 +3D8E61C1F1ED39A3614BFE3BBD2BE7C9C3A64F1F7FFDAFF51D3FA0357F672316BA9810A620911C +06393D472F8BFAEF9AC09A031C3A1A33816A77A6C5EA88AF4D4303EC449982D05ACA3481807F2F +0775C87DA047792078D7FD735623D86C37274CB49235A22D01AF43791078E4AE92AADB3EF71EBB +7C96F303E70F1E3F7569471C6A0FC9B9C59E4DC141FBE2752F6717F4A7C8CB5D47EDE806D835D2 +8F48927CA3A3C38B1E5310A47943668646946991FD87BDF723BA535A587EC98F9CC86A15F3AF79 +625C5E9A1570412BD515DBC288A9DC3E4194A2031707D47E54A1FFB73099356BBF4C67A22A71BE +AB39619759800E4F9F4B558457CFD32E456D546BD2542B3F493A2FEB432FC1511587E4F5C0BCE6 +3BD4CA268846F13233A6D3E22CD92BD8E19627B71EAC34CB56125C86CB4168194ED4E45FC6B759 +5887FCEA79676EADACAC6F0A35B30B63E61C51DC92E4FD960EAA2105ADE6C4E551FB59E0381ED8 +90AD55857073689ADAAFFD1D27AF7E9BCCD8078D62E2299E35EE4255817A3E7CBF4C142AC2F10F +A5486FCB20EA7E6281F6FB7F91DF0A48B0547EE2133AC09C1E0700039CDA77281121975D84864B +FB24A6F6E05F5E801FF02B04A8FAE6F682E7C9A705B0A6CAFD3A84698528921856038137A3D111 +30602F28D61D26533FAC142D5A6F0D7C918D16BF3C1CA65109ABBED3BD897C8BFA4490545552D4 +B15F6264FFF4B02CD60970D6D8F35A18295A2AEBAC056F768F29526958DC1E717FD5D6504E303D +1C36802BFAEC578F5E3F0D1BE9FF5B65B3AF6DD63FBE07432BD1EE72BD24C27C5CCAC3B95FECA0 +AEDCB55933140D1041DE9F2AFA2ED9F3D4BE5D7D0C7F325AE26CB1FECC40CCD6A4085515A11F62 +26 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndResource +%%BeginResource: font lsunr21 +%!PS-AdobeFont-1.1: LucidaSansUnicode21 0.9 +%%CreationDate: 1994 Jun 04 10:04:24 +% Lucida is a registered trademark of Bigelow & Holmes Inc. +% NOTE: This is a partial font in Adobe Type 1 format. +% The complete font in fully hinted ATM compatible form is available from Y&Y +% (508) 371-3286 USA, email: tech-help@YandY.com, http://www.YandY.com +11 dict begin +/FontInfo 9 dict dup begin +/version (0.9) readonly def +/Notice ((c) 1993 Bigelow & Holmes Inc. Pat. Des. 289,420. All rights reserved.) readonly def +/Notice ((c) 1994 Y&Y Inc. All rights reserved.) readonly def +/FullName (Lucida Sans Unicode 21) readonly def +/FamilyName (LucidaSansUnicode) readonly def +/Weight (Normal) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /LucidaSansUnicode21 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 144 /2190 put +dup 145 /2191 put +dup 146 /2192 put +dup 147 /2193 put +dup 34 /2122 put +dup 49 /2131 put +readonly def +/FontBBox{-30 -325 1384 883}readonly def +%/UniqueID 5054521 def +currentdict end +currentfile eexec +8CECFA711B4939E41CA045BB7E8765272CCE317ABEAF2B07E70D992D651C41DC23B029563922C0 +95FE85170451329EEA8C7BF7A2726EDA9D9C6D097F0F7FB11AE93E80BF8DFEB2012E3B9F49A227 +13E573A8BAB0BD7AA774AFAA41B97C6C70A3BF84A0B468C41B70D35F1310A4BCF2B97287E2FBF9 +4A30663A4DBB485672BB54D8FEAEFDE594B3B73220D0C873C546C40B5138841E9803A47402513E +8FF4F9343A0E92A13A04C27921E3EAAB23C355AB06A42C0BC5CEF70BAF6D687B5C79B5360DD42D +B2C878AC8DF4228BB74DD81C6FEFF53A36279510E983BDCD1A8145830308160030F770C3DE994A +4DE01ACD31F1D76E3094B43F3316267B62B6D653546469CBD35DC8B1541372AACED3750E498938 +970666D8B36D41627069EF1511128034B8A364FACEF8068FB8A2F7F3209E5A769AF14C3E7F044F +6892F9009EEACF40CA1AEC6F322861CD38A8CE6A110A5C348EC2CB376E5110065918A03C02835B +E3E89B986010D70284A334D6725965CD86C1F4937315B5BFA1D7E584988077138480F1B72F2870 +2477850CB729C71006FBA750B4989EC757A808D51431556B673A084E350A74279AB2E9C638F7D5 +B6BE1D50118747D01A6F3250CB9F204E3B03CC46DEC9821867B2334D2593522BE05CD30CA6B75D +DE85222B64269B1DA310838E5962A391BC8197808B9D11B877A50D431C25870F7043983E965CF5 +0F5BA07DA4DD39F97069868D506F035C0DE343F7F5C12587B2B05CE2ADE6822C6C0739A54D5DAC +415135137E8341C4D37F7D4534BD8FCE1DEBBAA3C378C9C9CC083F3A892EB7E44144F118680E0B +2A94BE914FAED74B80747D013961C682A0C3A3F55AE7496F7A15786BB0AEA5B1079668EAED2527 +9F744F8FD112A6C33DF4E1500520910769D69C8F4D659322035993A3CD70CAA65F9DAF1485DA40 +CBD374802317B409FB464C03C8A46831DE7B04E924B9D8F5C5239CF99DFB7176B2A01C1A31AF6A +D7EE0115C6CF9EB2AEC83901795A91D4563F32399E1AEB65ADE7B8248571668410AC1D86F71918 +70B0FF9C844CB7E6352B01A2C169E37513CF7C37D131B042AE6584F1ECC680AF5AEFC74D2C3309 +12C36CBA7D88E4D44C77EBD7377674DBCD9FADA92577843CB5B1C0CCCA0A9CC3BE2A8F4CFEE1DD +ECA543A7967806B9F65C5337403864168AD5EED97FF91EA2A00BC4480D96D09080029CF4BE6975 +B34B40182DA9DE77D82BBAE0007448F08DD19A443C3EDB130AA1E36D2DE61D809BB3508EB12237 +E460F68508290E1DF4E45B652B0A2EA82DED7F3A5A05E9F6FE3CD1E8FE988B7258E81A243DA0A9 +B677C368D33AA67DCD8BED50A86331179CD2A6AF65E164A925258D5DD67704B2F3D7B3A9797DB4 +E5092122646EF94DE3FDB3548D60702ECE17FCEFAA298D9825EFB4CB96C20E5AE933A4F9E7FD4A +D8BB4FFA426366AA9EC6DD84689F24BD858212C0D745D674D513DC4C07C37D9733ECE1D7F7059B +EEEFBEA12DB1F8F21F6DB88EA763511B1CB80089383350F0EEF474F70276C7B44D075B21862115 +1C4C8CE0303FDC81D848F74CFA94CB2D2F61FB99B92DFBC6CECC15955A790C62B3DA7654CB95FC +9EB2544F05AB69475FC405C3F0F1E80EEA5F82EE0B3E47937556C7E14CFEF5A58ECD7B975E519F +CA80763297F483FE24B96F09BB0C6ACE0753EF674B62B6F7C2A301BC1F8C7D2A84CB9DBC68AFF0 +7ED80EDB570861D23430D1A30653E5580B9B9902AAD063F04A700E801964927CF9943A074D8FAE +A48CB417EF69C589EF625E46A55472A0A2B3CF9C7CAC86764E06ADFDBA7AC08812B171C4ED089F +3FD3086F97D6B96299E47EC1BC98C8320ADF7DAA7D384A128693DEC73675CD0C185BB260668E38 +9A35204FA0838F70D1AE5DC74957D9EA2E2C3088D660580C20D51B212B6CC83D9003260FA4873E +0B88A4DA8EEC5AF1DBAE1C0D1454746F9014753E3CAA9C8AF20D97E949D8685D5D9130BF1A9F79 +57569B17DBAB5AF2F08737E9A046C0BBAA1238D2A72504B9131401B96606AC9230CACF736151D7 +E1F79E7E4F42F625AB66F02FDA6C31C497B1C2A2A0C4DAA420B59D647495B306723195DBF74F72 +FEA3B0BD8C2A16E95B442FDF0B39CF601FAE4BB5AC9C85C1042A6C54C44B60B3A44D741E788165 +2126A8235FB58650ADCBB265C349F5A93543A4F765C97225C9566D7C4DCCC6779E05D9827F8C00 +D78D582BBC77E25C3A170C469A268B483BC3153D851FFED8A1911B6864655255515363D8DBFFB8 +0C02180CB399D92C242F0F450766B5D7D29F59B5D7B47633C87A1B46EB3322715BE04BDB99E126 +650DF431A9E8DF486C8C63F5F0D26DC24B9DED300D3107A814E4A01BE93CCB3694A99887C4F1A3 +46DFEE064D27CA5D5899AD2F8B3915E304C8A4121A26C1B7B8B81B9841982F6ACCD03F249A138E +0F836D0F533153FCC8B3B4CEF39802D66A0EF0CE76F8E2C03D880FC4F44C1FDEDF0C50971507C0 +7202C26CB4C0C1EBAE4AF043F2893D4B15B183B5B60DA901252BC6DE8D8DBCD54B418C088D7D07 +3084C0809EA621F31EC5DE23374C5A4AFC2AAABE30A0CD14CF07914839804BC88A7340BED9C24E +48B93770745A08B2FD64AF52D5194D57FDCFF6ADCCB3A553343FFB2F82212E5152EC91D9F19F93 +7839782E3A8FEED1128568C5D39AEF3638592F8321A7513B6C361D56EAD81E2ADC3DACE11B7B50 +73EA40B36A9E042BDFE78E30EC5059549BF9D1BD29722E6FE3E3CDF81029F81E66C887B55A6E3A +96826166A1FD6D27B7B3B5D72046373492434088F7634CB45301F885909D249C2680E5B1AF7F1A +5C1A7997730E94D8A0C643937B284C0FE0EA447965A8942E882C20833C9EEA28D063C6B5C52F06 +D9580E5387B9C87945B1990EF0537A00BDE28C42C08321C0730A04AB9A0DB8435F250E10FBD8F1 +B70FF91E4B795BB353AB3DA14F7FD8B61AD2AF4CEF5775B16BEFF8E3198558F77036CEE8F21556 +BB24BB44437966855114167168A2F45CB4CE1CC31FA04E39FE5F4F07A21D878DD4D833F2905E4A +541F26B1599463BAE2BACEDDA6A25569E27003BD478232E627892502ACAAEF3E61B56139542D1C +6D6A6B3873EEC2EF0BA2CB21AA0148F449697C43D3CE159B01827618C1E9A835186C2EEEFF0EBD +C22D9250307D280706754476A9B24E141B88294CC88634E1690C5482E5232EC7F174256999DF02 +FE1FAFA59C4369C41B8E9BA66699575035718309DC3409EF68CF0768E8A2AE0E5BBA760F3EB926 +DD09D37641808114AA91761DBDF3D2BC64A42DABD5010465BD47597A69B1F88DB579B7A47563B4 +9BA22E69D7294A81042FC2A57781D8FBB5E87E77539498BEFAFD98E3C1C761EE5E7B635AE93BCD +E9479904AB3B3BB64EDB0C80CC2B04BD9295E208340BF65D55353BF8472EBC77 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndResource +%%BeginResource: font lsunr22 +%!PS-AdobeFont-1.1: LucidaSansUnicode22 0.9 +%%CreationDate: 1994 Jun 04 10:23:13 +% Lucida is a registered trademark of Bigelow & Holmes Inc. +% NOTE: This is a partial font in Adobe Type 1 format. +% The complete font in fully hinted ATM compatible form is available from Y&Y +% (508) 371-3286 USA, email: tech-help@YandY.com, http://www.YandY.com +11 dict begin +/FontInfo 9 dict dup begin +/version (0.9) readonly def +/Notice ((c) 1993 Bigelow & Holmes Inc. Pat. Des. 289,420. All rights reserved.) readonly def +/Notice ((c) 1994 Y&Y Inc. All rights reserved.) readonly def +/FullName (Lucida Sans Unicode 22) readonly def +/FamilyName (LucidaSansUnicode) readonly def +/Weight (Normal) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /LucidaSansUnicode22 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 100 /2264 put +dup 102 /2266 put +dup 103 /2267 put +dup 130 /2282 put +dup 131 /2283 put +dup 134 /2286 put +dup 135 /2287 put +dup 41 /2229 put +dup 42 /222a put +dup 43 /222b put +dup 67 /2243 put +dup 96 /2260 put +dup 97 /2261 put +dup 23 /2217 put +dup 25 /2219 put +dup 26 /221a put +dup 29 /221d put +dup 30 /221e put +dup 2 /2202 put +dup 5 /2205 put +dup 7 /2207 put +readonly def +/FontBBox{84 -166 1060 898}readonly def +%/UniqueID 5054522 def +currentdict end +currentfile eexec +EC18885AF58F29AEFACAEEA59037C942D5A3FAB833BA43EA181148D28AB4B88B44CA4ACA1F92DC +003EAE53A624731252861B743FB223E6A26B5EA4CA4237504F6A6CCA326B9405AB85D95ADAAE82 +22B5F340DF4D35E0A2CB80190E539D9C09EC6DE84EDF6E6DC6E40089958D58B17EC7357C0EB84A +61C5A04AB034973BD320598296F9A79CA937F8946E59DDE543CC946C528E3106DEBF61B81D7A8A +69AC62FC23908A8A656B8518CB8FDAF8A2B57C3C7D4B644754586A739AFE94AAA7B685E0B09EF2 +C30BFEE0F183A420766F0BE21197DEF2C56A4BA47A2AC88C0687DCBA5494D19D543C8D7F43E8F8 +67EF76E2E818ED425C61EB7D3EB50B1174995ACA71352D8218D3734BDE02F4A95E232BD4AD9845 +09AAC48D0F388BD9ED89E3DB5276D12DB11621AD67DEB0F7CF2046A95D6147BD77893BD999663C +6BB6206F86C9E5BF1B7296EA35C677788DD9627D6385B6903C83B27CB461AB230B86435838C33F +A32A0B5DF678E7A5414A11E4BCFF1098BA6A3A6C70AEC03193BF8E08C1F703E2B0470B171CC9C9 +CFBBC16B532F551E32A6EBB545F8F16B4DFD5945ABF67BAD9AED02092F99DABD828C674A246A3B +50B6CFEC2542399D397121C09D60CD1F679CB805E385F3D63FCEC624B93BDA066709C669C50BD3 +261D4A143B81F83AC3AD4052FA424782F1C8985A783C1BDAB4303948E6BA2C6F1645D1AAEF161F +AA605149EBCE77F37B904041DCA83C92CC102FEA932313FCF28C23DA1D3F876F612EA30006CC36 +B9376696E6D3C74AC6D5E39653C03434CEB58C958FFE72BE74DCFD7921BD8D29CB9B5D9462CB1E +6CA793A7E2A7F1ABA296877AD19BAB0AA44F0916866DAAEEB3DD86474882FD901F4FE785121720 +80BB24A21D83C909FFD3ACBED7C3F97E8D434B4B3DBCC83A954037319D24198CC1B14695178CFB +18CC1F530CAEF7C5C845403B52E2A5CE0B7F158B8C4904B2EAEC08C9BA7AD693405E918356E7D5 +1E87E2857B18EABB71256596245BFB5D3F3E547AB1355106CD33AEADDCC870BEEC170FAED7884C +82DB23EB4B99C4E856B81773093BF2B625D38475AFDCFCD02468EB11B035E4950C2E909EF0AC96 +2C6C41D25D43C5653AE66D718013E922561CB88101CCA5E70905BC6D48B80C177F552BDC9BB31E +D51DED3C0D40BC161A86C06F8FADC8449AA647EA6A83D9A5AB66E8CC4B5C705375CFE9AA94C1C5 +6AC04BE22C68860DC51566D69AA649F97B43E557EE45E73B23EE06F851860CE6C29CFFFC95F561 +165AFF73E18A9DE0A1660754A311DAF53146BBB751053D424E32E8600B50303AD1A7D9E663580A +BB54114C9BF9E2850BCF12B5428A4CB8E458B16BEB43751E68BE952B34A8064CEF61452FF56537 +EF56D18A3A3A3081029B7027600A1DC1199772F97102E7FB28DBF3A941729599B0F24A565C1BCB +62FEC5ED752428920BC1C60C08ECD8EB86AEF841364B00168456006B406FE14F1D4F338B142CFC +42BA7DDCCC92233212EC5B35E205372291B4FCA126E5FE8F6D4C8A37017DE0463D7261E98813E5 +8B1FBF38993879ED183A30C569DB75D9644B0C6D237F76D760C3D77C7569FF8A1CCD752AD9FC87 +3078022F6A3B1D749DB363097597C2CEF08CF19BBBBA4DC2AEEAC4312E9851639DF6FA9E2893B4 +3366E631AC15951644702A58B7FF164C8D4137052A3CE699438B9B5FE2228DFD6B0931C6149B18 +6B9F57F9D780BAA7835331B10EC5D837B9257044B3CCF8AE4590B23796C7A712C6F188E20DFA22 +1ADDDC895EBEF28DDC6FE7C1086AB26B878DA3A1ABEF1E7EAD344CD7CBFA752F7C274E8E9C970D +744186961EE5717BD0F50B67144FD576F6B668CA608436053ECBE116CDE462509A48DA90D66105 +ADE07641CCE083FDD6F161CDD59145E8514CC0BF34FB77B657A287EFF963E63DE600FB15BA6A17 +87E63D3208F5BB859E650092902715185D69A11C6F73DE088D60DBBB98E70ED4B7C5D4CA9B2AAB +BA91E81E20CBF4716D603416B399B856C46729D4AA83330CB528859DC68CD028CAEBF9FBBCCB5D +50CCF2D3323000855669842544A61CA55FC4209AF3D6187100C47F2681D3BB823F09D3DEDDFD89 +C87B17BE0B0A0D14E75370C6D2CAB809BBE932E6718945D6933EBB8A24FD507906BC651216119E +CEC5B916BCA6459AED96417AEEEFEBC4E71D76DC5B17A37B8945A83946E64B21AF0D42282B0E25 +A3DDC555E709C80C5C8CDC5E1AD62B89A7CC1E1AEC962FEED653010E2FEF56EB5A14F810AEFE27 +16F0A27E7EDC63A7D2E1C6AD410E22E35C8C923EFC2554355092DDA8113F6D9D5B5BEF54C824A5 +1D7F5CA2CCD4321F9C3A6EC8320F9A577610C902B70B6B0EE5BD381D9A7C6B722BB55EA06DFB77 +DCFE84A0397C8FB3BA4917521A88B43F9F12F81571C39ABE049D54405B96D0BBFFFDEDD0E90C3D +D6B26D82D797C6B31B7FEC4BB0B51B2E8357C5CA8A6181536CC13498F7EF383B98281756F3D25D +6961D477191F00452FE9EBAB94EFCE0C958A415B7A8B0AEF3F072A3DAC3B6F1BC974CE0DC92A08 +00EF65EDABF91DDCE2931A6B6CDB9B46E106EEBB1017E487E4AC078243A8441422FD61BE99A8F1 +022CA7C9B86AC24E4101F46614E20749FA065C9F9EF8AB8D45DCB5632F7E5579A4EB5C44588E0E +AB91E0FA25868A585ED5364804118B2EEADD52301644AB6AF821BD6E5A78E3BD4701D7211B4929 +1EB22DA0301F61F69379F1319ECF14C6ADCF574657B6BA459E6FE012A1C6CF198250A7A9BBA055 +06215E6558DEC8CFAF5F342975B444F98782CC674EF5E03DFDF803C5645F303E229448E57E3891 +37A4703A784AE802B6D730C82E7A5981DC29B586174FB22E854CBBE4C359D27BEAAA684866AECC +6F33F9C1E0CDB2F97E32F7DE1C74CBE941D21EBB079CCAD9F45BB6C976331CCB1AE84BD12DDD0C +0245E24C556BD9DF805DDEAB76BB5B82A148CDFB8C17F97B70114107A41812EE10D16366444BFF +E6EC7BB9FE286ACF78FC1C50369FA2E0E9BB26BEBD3112F8715651DDC05482809C0348B8834AD5 +F8594197582B9FA1318E4908A108A08BF0163B419D0B20BEC4402E2B1E96F18552DD6FE45B9759 +FCB8EE6A64B9D901173B3BB5D36EA3074C8065D37A7B0E01884A59841C5C208D924D8436AE36B5 +F7EE7EBBD690EAB5AE9897B43B6F46549B6B41CFC6A5EFEB53A6E1EF8D9DF28E78D3186158D4D6 +1C10AAB0C85FB5A9CC43535D2E458090AA80AA75F39B0AD1C02E3C103269E8A40E60832AA2B160 +B78BF08BF2DB06C8D55C768055DB5F52D1F24A2599EF1F412DB23121BC8BABC1933CD43B0A5908 +77246FD36AB18D0F0452325E5F1FD495499C754D3EFD68D948DE856774E476660F91577FA68756 +CF17936C23246504495C072341C8AF8E7E4BAA8A5D7CAD373D9599F52A4D88C2F5DEB65A2B9C5B +6914C569F8CFF9164725C261EEC2AAE3C88A26BFE1B6327DF1EEF827562BBF37E8106729B5CCCF +C0F1011864574E4D0E5B3CEA70B562F03BDDA49B107521F192D36ABC6ADA755456175EC9ABBBE1 +E550C412239EC97662338E92253BBFC7D142570A6F22E212C8DECAC66B4AAAD9DF4BB681BCA16B +29B7FA623C47FF37905F923C0143AE479FADC0E27E8FA15B461509D847F02876975C6B3B33F490 +A4820F9C43D3F0115C6157211CFF4B13696BE005FD45481C9E496B078389E01815B78C9402841C +45B721355653E4B64C5F226D114DC02ACCDE11E588DF5A7889B8670F1C9F40A5DB89A7C8E901A2 +8EBFD43B24A5DB9B2F864C6A45F9DD7DA926DA86DBE5E2EC9FA04004862A5903F6A5F372303738 +B42D7FC4A35941157DB85F26C8D11099545E57B0AAA49DE793C778B8E75F45CF566B54BD1DDD7D +17E3621418F09A96A4EA2D20AE83D88E45C0B083E0CB9F3D5FB7D704581BE82E3D242B3EA6A7A9 +29B3B8AF7F5D20CD8303E7EE1CDD637E3DBDFA0B876A2E7B7106AB66779F1ECE9AB75E4C2083C7 +C97B246EF9B67937CFE4DA2FD95A5E12D019AEB10A8B1F609F2426F53CE3A6573B8A13392D762B +B2A97FF2B9ACD94ACBEA9A46D6F0F2C464145BC6AC740A19DCE03904FB928F29053493D4CA10E1 +351458BCE3B003C4BD38C891559E363DB4F6189F4925E314F77E7900DB5285C87EF4E2C55B9A12 +CBDA6762604F98B6D2209BC928DDDA85C5B5AB12876AE7D6864E8A242EB1251D6FD05F8F088A80 +FCF304F598F9FB6AD997C8A5481BF577FA4F61B2B742FAF0BC932E886A961B060E6320C3D49D62 +7C04EB0295A7DF9F8AF5F2BA6FB64AB76F685781460B35B7C510E3867DC0DC41179A1E8BC5BDB9 +5DC54721AA06B8C2119A8617674BD10F0687B07D56DFD63AAD41DF660F600DFCD91DC80645C4F1 +3FAA4A6C4B240863F6508A81EDF8B867C948EB7D3A7753A4731AF75F0C05DE4680CE216E04C8FC +49BC1CF193589EA6A33C25BC5B7155D4E34A43B49A8C37733AFDD714774E9E70FC22B40D6C9192 +D073E2E9731FA2B80ADE7D40ADC5FE1ACC52952159137FA5B30A7EA95C39A5B6CA9F6F1B3598B2 +90EC820457E11DB827E3D458C2E682BC1FB6B5E74817246B4FB47DF7DE1CDB835A849078BF71A9 +7711EB1F74791E797B3E73FCDAB725C5898D5188BAE77432AC20087EF62211EAFBA46B91B295E0 +8FD9D4C98C1331E4A1D7206A60F03EFD2E8925ACD1082FDDA8B2B6980B960C9D03BC754AB0FFF3 +EB6E92F8A6D41954CCC7A6598CCA897057141F0ADDFED6F802994D00EFC0771E4B5CC79CED9844 +E2CF890AC9F70AA4567102ABCC67C084AB818076D3134089E623CDB5CEF16E6AC89A1EC34BBC2D +ACF87E3D7EDBC5A2FE1774FE6B5BB78FC53425D364919E8F086D07ED1ECA919F003A1C5C05B914 +02086AC63F3546A34F2F99C88140F4C51096B72169B413043C366BA7BA2E5D1DE570FC1EC6CBDF +03658EE0AB3C1144FE15F8E89FF354E00261483F366BBA154DAF5E6D910F1D40F7DB4BBCF8D82F +4BEAB925EA8B0F5761B1517A2BFDD400E6B6B9605034688A7148596AA8F25B97772979B49AF56D +28B10146125B19AFC56881CA4BD579D649D104CF443E94B186FBFA0F29538D8AAC4EA3C1774A7A +64226D033869F1D821E98B9C9C1393FF35EC9A962BB8BFD3D8D062C086234D6F14D9AE028C2957 +5114905FA35B368C44BFA14DE4E73A4D6C1A119B79A6E3EBB915C9D48D3FAEC3EF31B7AE39217A +21B66FBA853E750000D395A9BE87E78CD91F390C5919766CF31E45EFE678577ADB5931CF5553AF +54F9A0E9BE0428EACD715F7D20C3D75D20810C4C0D96BB10C14B557C201B954841501341827C1A +30DA27C34A5A4CAEAFF4A3ABA566249EB82BFB367EF41635B2E27133C0BC4BF6EE280401B00B48 +87EE78B50E524A9526E442E2EB566F3ACABF1C60C65F60075C434367C67DA4AE42B1462BBB0AE3 +9C83123BEB32327FA66C18409CAEA447B8F504FBFB2CA2EB0448691CBC3C1826AD55697611E310 +BA84B3133D1240BA430B08010BBB0DD02A84FECA352324CBCC9AE188CD9213C2D513745D868C4A +6A0C995D7B455034DDC41A8ED06752805DE487375C69DD746D7F8940101EA49871A4B28AD792A5 +69E76930C32568A9ECA82892B44E111ED0806BDFFF59EDD79B5BB11F82CB7EA201524E6D6D8343 +C3EF568F33A450F8A25128218CEB810B4D4566547F2F0A0640D7F4C8623945E5755BB7B6B48272 +96AF202D9F4B17A2B4CD03D961B5728C04E275E037E49FE8A29A89972D0061055357A40DFB5019 +D0959C44E231D6AB8C6FCC8E24F5291E4B9C082AB5F7D58CCF25 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndResource +%%BeginResource: font lsunr25 +%!PS-AdobeFont-1.1: LucidaSansUnicode25 0.9 +%%CreationDate: 1994 Jun 04 10:42:59 +% Lucida is a registered trademark of Bigelow & Holmes Inc. +% NOTE: This is a partial font in Adobe Type 1 format. +% The complete font in fully hinted ATM compatible form is available from Y&Y +% (508) 371-3286 USA, email: tech-help@YandY.com, http://www.YandY.com +11 dict begin +/FontInfo 9 dict dup begin +/version (0.9) readonly def +/Notice ((c) 1993 Bigelow & Holmes Inc. Pat. Des. 289,420. All rights reserved.) readonly def +/Notice ((c) 1994 Y&Y Inc. All rights reserved.) readonly def +/FullName (Lucida Sans Unicode 25) readonly def +/FamilyName (LucidaSansUnicode) readonly def +/Weight (Normal) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /LucidaSansUnicode25 def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 161 /25a1 put +dup 202 /25ca put +dup 203 /25cb put +dup 230 /25e6 put +readonly def +/FontBBox{-26 -236 1026 815}readonly def +%/UniqueID 5054525 def +currentdict end +currentfile eexec +8A630409A330FC5FE1ED7CD3C975467DE475D113569CAA8B923FA3C5A4A5DBA1B426534896777D +FEC0CD780FDE4F4A4B37CBF69BAFE9D7B1674F09E7B60ECB1F741B6EDD9AF78B9450C77EB98488 +7838A9B1EFEC7714CB963DC0D2D7FC90DF439E7B2FD67B771E742DC7E7DB927415569E8F7DC363 +784A57FC7AC7182B65E2B2B985E0344DA414383767D69F0072B82FF65429A625F418B9554E3934 +A06F03727E3C9839A4E576E2351D0253B74FAC9084AF6E67133A5537926A8C80589A37F8ADA04B +5C2AC1126AA5CCBF23226508D011D14D13C6FFAC13BC42FFC82A696C06889B21F1453BDA33C3AC +FF81DDCE02738FAE387DF215DFF6FF74471B4EB78EA8C9F24AD655490C27E6059414A56A52A9FA +E82AC778F1210142A0F9051E5AE4B9E361B1FB91CA17F95CE918651919C7A235BECD1E676D582D +643C13D5912E896FAC77994450E36EB321BDB157BC6DB7FBD0EE4B0C1A420C2645ED9595D2D21E +F387557875DF6A9D774DAF42CA703FAA6377C62B435A83666621A7C4E578421D8C68899952954B +E992C6F613EC3AF8C2F4EC93A4AC5D7860448117BA2B6A968239B7DCC4036B4B1FBAECC17CAB89 +BAAAC5D4362C3CE32E00409A6AB9B231767C1A27514E9AAD74C32EB9F6C0DBB6F839A28BCBF862 +D183D1247828DA457DAC59A0CC0CA4153457F0DF3B5D6FCC06BCBB0B5919DA74CEB11DDF706F15 +B342B26D610DA0137ADF11F3BDDB3189C9DA0F0E870986F86C61CCE3AE60F771B65DD2E920BD6A +5094FD2A12AB3A59052BAF45248C006D431F5B04C9071F925A7F52C1271E7FD3A7F9B60FAFAD56 +8D8CEA6BE39066D98313C932A77140F1658FAD3B32F7418CA0FDF48BDF17F3AE6F095D34C707C4 +9F50C3DFC3148BEB942A63A5619B94218BA5C1F63F66ADE29E1396CCF7CF7CA97788D73D4671D7 +BB0CAE1B8E13CE410F2172B2445CFEC734F53A6EF3D3412C37908D22E3E80C817EAC0955CE2752 +E9B2327A08895A254ED18976E194E85CFF852770A56665EBAC4EAF1F6808F6288AA2776F813D6D +F089F25B21698D10A5C00522210F606F890760441B0871F31A4C0718527B68541A0314D67354BB +834F4FCD365DB2379468671DF697122B66E999BBA6B2A5A6D95E26FEB0E6AA3B4590D5B0C8F4F7 +AF1CB7FDB904F10E8817F7045238C813053CB2096EE5DAC923CC9AB2DB9FAE17B2BA08CA49DB7D +71ED0072A402793C51EE08DC09FC9C27F2E15254CCF9FEDB998F0E3B12C60BAE7CBC550A59BEF7 +CDE1159E1D6FA72E0026BE03299D851776F57069E9178CA0C53CBF939792BCA7CE52A3A90CA729 +91180F917F1E21FFDC2E306595ECD95BE6323E539FC73511C7FE237C873A60B4B4E06C49C39C1C +D1CEB9EDAB2891F30BBE64EE95C27487325C07F8F83B2C0CF8B394C3D0ADA55E4B4541A917B23C +6181480F95544F2DBCE9F22F40DC467F300234CCBFD55A919A7B4D7EF74D0C60E83F2627BD5471 +97A31EF7AB8E8C27A2EC8CC90B846212BB79CFBA9DD702DD627CFB9FABF73790BBF5AA82450017 +4E144A95706851EA88D454A80554853D7EDA089C97BD99805AD58EA333836351E1A6FFBF3F270E +E36B9A8A5C98FB53B9B77AF49F3330416708C3F8C9623899CAA72E8812C963AFB98FBDB4596F18 +32EE5FF6F6AC53B618EFDA664A090C1778C5D340CC2425184EF1AF9C6A7BC52167584CF057F737 +006496131A33D19C40B00B4A728904CCF6669F1AC17E354B71B9D6BFB322CFC1DD2E3D66C97FA5 +7886ED6A5455AB1AE8D51393C52D017C5586EB16FAD517AA4F76B7F0E3913C235A5986A767FDBD +BF04B397E7150F9CB9EE84BC53E65CEF2E4CF91C0C819D7A4860E35092E3EBF647B323331C5497 +A980FA0E95D21A0AB2D89ABF677FBBBE1811983D6BE163609EFA447878A6B9ED22479CEF8C9D19 +E8683D22DDA81461371B0D4A2F993B9ED149E14BBACAD0AED92C0B180E46DBB02F8F658A470ABB +3688C09C52006DE3A6264E0F33E92B1C6F69FE0148CB284DF2283638D396E5F8C8C7FB2A531350 +F49ED6E90498D2C30B6D48BE680B04C6CBAF4B2F92347AE886270B5753D12FE54A8CB0EA003022 +0143DA37757BCB85E0664D61384FAB84DDDA0468702C397BA2A52098181BCC26ECF597DE542CB8 +B1A0F199032BA329EF8185D97C9B536BEBDB7A9588D9EE830804F0245FF142D4BCBFA74E1D2AC6 +BFB24ADE82B947BFCF2AE083638301E0D52D0838548B9B935B52BC5F3B2FD8AEDA7AC6A0F44803 +0CB7E258BDA85320A3D6D3EACB188956D3FC231708134DE6EBE2A296EB0F07AF58E5FC366472B5 +03FA40D0156FCA4320BC906DB75250AF4C55B9DF5410EF3ED0DE8A7DAA82A8762F456BBF97BC78 +3849A1C9E1E9A7EF154084EDFB53FAB120D5F4A68AD4D83442E7F6ED51F251793E1F5D7504C874 +388E61CA7F9120C55228EBE6EE837BA371361407776E82796F5CAE390FB05E2FF92984F15170EB +89296050D3B5CA30D0ADCD59B9D666643FB69C43B2818F03F0BF529A5E68FD043DB7DEE7EA3C34 +0FDAF3598037C8C0F8657F16EAD01930DFB8A633572D6DAC96CC22EABF4361A4EA443E55102E45 +C2A7443BC2DB4883B1BFAA58343FAAA48E347109B9F5D306E450E0423320763CAC8F4B48177C85 +11F6703A383803215E520AF7CA6C449C4906FCE3695117888844DEA4A505372010A0E130FDF705 +A37E1DBC59691D785D37D40E737AC708881A603BC0D97730526138BF428D951AA75579D159E612 +F847418C23DD120FBAB2CBBFEDF9BC3B972CD59132C313D84F5CE45B0740BA7ED8086165203068 +689FE81C9CB701D205C815A8E4BF2C341D264017ED02602ACD5F6576CA7606E51B3EB22CF7AFCC +3C466B69801149AF48A8E012CC75559041B984640EC5F8043A14D70ED3AF1AF7395213E13AA79E +A3BFE238CDA1C40BCD49A006252ABC5B19EFDD78BCDB02987FAE +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndResource +%%BeginResource: font lsi +%!PS-AdobeFont-1.1: LucidaSans-Italic 1.001 +%%CreationDate: 1993 Aug 11 21:10:09 +% Lucida is a registered trademark of Bigelow & Holmes Inc. +% NOTE: This is a partial font in Adobe Type 1 format. +% The complete font in fully hinted ATM compatible form is available from Y&Y +% (508) 371-3286 USA, email: tech-help@YandY.com, http://www.YandY.com +11 dict begin +/FontInfo 9 dict dup begin +/version (1.001) readonly def +/Notice ((c) 1992 Bigelow & Holmes Inc. Pat. Des. 289,421. All rights reserved.) readonly def +/Notice ((c) 1992 by Y&Y Inc. All Rights Reserved.) readonly def +/FullName (Lucida Sans Italic) readonly def +/FamilyName (LucidaSans) readonly def +/Weight (Normal) readonly def +/ItalicAngle -11.3 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /LucidaSans-Italic def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 54 /Aditi put +dup 39 /Alessio put +dup 41 /Ali put +dup 43 /Alois put +dup 173 /Ammar put +dup 47 /Andre put +dup 49 /Andrzej put +dup 51 /Angelika put +dup 53 /Anton put +dup 55 /Ari put +dup 33 /Arne put +dup 59 /Art put +dup 61 /Ayman put +dup 63 /Barry put +dup 65 /Bent put +dup 67 /Blair put +dup 69 /Bonnie put +dup 71 /Brian put +dup 73 /Burkhard put +dup 75 /Castor put +dup 77 /Charles put +dup 79 /Chi put +dup 81 /Christian put +dup 83 /Christoph put +dup 85 /Chuck put +dup 87 /Clovis put +dup 96 /Curt put +dup 89 /Cyrus put +dup 234 /Glen put +dup 189 /Heinz put +dup 56 /Jacqueline put +dup 57 /Jagannatha put +dup 58 /Jan put +dup 60 /Jason put +dup 32 /Jeff put +dup 62 /Jerzy put +dup 34 /Jim put +dup 64 /Jiri put +dup 36 /Joe put +dup 66 /Joel put +dup 38 /Johan put +dup 68 /John put +dup 40 /Johnnie put +dup 70 /Jon put +dup 42 /Jonas put +dup 72 /Jonathan put +dup 44 /Jorgen put +dup 74 /Jose put +dup 46 /Josh put +dup 76 /Juan put +dup 48 /Justin put +dup 78 /Kamal put +dup 50 /Karl put +dup 80 /Karlheinz put +dup 52 /Kaspar put +dup 82 /Kees put +dup 84 /Keith put +dup 86 /Kenchi put +dup 88 /Kettleson put +dup 90 /Kieran put +dup 92 /Koen put +dup 98 /Lalu put +dup 100 /Leon put +dup 102 /Louis put +dup 104 /Luc put +dup 106 /Lunjin put +dup 110 /Malka put +dup 112 /Manuel put +dup 108 /Marcy put +dup 114 /Mariusz put +dup 116 /Martin put +dup 118 /Masahiro put +dup 120 /Matt put +dup 122 /Maurizio put +dup 126 /Michael put +dup 177 /Murad put +dup 91 /Robert put +dup 93 /Robin put +dup 95 /Rod put +dup 97 /Roger put +dup 99 /Ron put +dup 101 /Rudi put +dup 103 /Russell put +dup 105 /Sam put +dup 107 /Sami put +dup 109 /Sanjay put +dup 111 /Saroj put +dup 113 /Saul put +dup 115 /Saulius put +dup 117 /Scott put +dup 119 /Sean put +dup 121 /Sebastian put +dup 215 /Wilfred put +dup 45 /Will put +readonly def +/FontBBox{-250 -211 1099 967}readonly def +%/UniqueID 5029007 def +currentdict end +currentfile eexec +AE40F8585C2492B57FC8C19373E315912C0135F3613C38B98FEFD06419749A2EF936D049568E91 +2C3B4814601E6F1C68E63168C5EFE4A12F1C972A88E59D27C31A2A9C0BA365B6FE3266DE7CD0F1 +1D5F0698C11E8C1D4F1056410F924EFF7F265CD09F63373FFF21407562BFA055B1BFA359C5890A +384338F55437BCB13EF47EA2FEB34874DAE99A2A8CDF087F076588CEF4F5F52D27F99CA2FCACC3 +B00B2DAB26EBD6CCED97C1076E2E38C1C7179AF884D34E5981F3B13BFBED7B35D318515DCB2A38 +02E5402628ABCA3D4BC1F4808D32312ACCEBEC95EEAC23DBDFC3788D91B5D781933BA1E7A9E7BF +693D5DA7A9281F1C6A7C34E8D6A8145895DE4B6AFA59BC2F66198E226DC29A066BA02F4739FEF4 +FC344E81EDB55226B5E16AF7282FAE761F3D9F253D76D6442D5CC7CA3043F7B37D5A34A905ADAF +242097EEDA53782431445078C0B35090520B01B437F01D891573DF402A427CECEC5386F1603BEF +05EEB7DD5FB545BE8042FDC2656F47C7ABD12DF9DBA59693E4F9A554FE067AD8157D2BF1EFB7B9 +1C54F92B27DB8FE4AF1572A8E3131A5FC251FC8F3D5918C30B18337CF3CEB9AAC264E467F9C4E1 +3BDF64763DF9650B0F6A3FF6092F2241B1DD69076E3878B875564E5EA253BBA208DEAF32B48D82 +CA70B0D8FE5181B29362D1603FCD82116B2FCC77931D0E121CDC23CA762E8C9EF47EF6780EC5AB +D9CB39BF6BA8F4D191F9AAB5965691C4346624EF1559E151378A8EC69A126FE29F5BFEF6162653 +B55AA546E4779E7E60288C059D2DD6FAE507F6E01DB910D52D10EEA2762D59A01C2F1FA458466C +07AA5A0980968990E18D71F0AA71BBD17CEEAFF025A16913D1BA4D5974D6258BA0D1F934656B65 +19A3AD2375DA469B27BC108F919BE01C833BB6CC59AFFA34F976382579EC5253B4610F9143318C +050160C7002E29656B29874C5BC27700C912C7B00C1F62458775BEAF10C5A2858456FD04C5B6E5 +B790085D9F584195CC9BE74E7DEBDC57D5084C3CF8168D7B194D57EED9F72AFE24EB78A7CED489 +AB96EE6F2CE148C3C8CBC466AA2B35B36842CB48476D303A7717C4369F803A4FF311D53F1A0044 +B5A3B423AB2D6F361D233CED47B79D579DC4BBF97AE7E6849CE72B35CA881B4680F073C4942FB1 +04B110CD36C12B7FAFB9F8F03EF419A1A5CFAD1D28F13EF057C795F53737018583F52474008775 +5141099E0C46D3A7F65540A05DEFF5A0A1C68096CC39FA13354863897E93F98B98E2C53A693C2D +57AF95936FA23B61A55E26214D5B2337C4488BD6DC93DDA298FD77A80625C917D9D432EC1AE92F +DF42E184BCC2400C51465244F338DAD00BF384DC5910AE26F964CBB75F091609E73A3A96D8D07D +BBC4DB58148E2064C50B5EBDA56DFDA7679C10EDC505D6816B86241997582D77385E0AFD164AE4 +5333A18BC4FB8CF818CEF97158CED9628B78B6C28BE08E747739F924A7CC9C9EC72FD12FD5BCF3 +2D200E0FAF7D7C8F007C84EB868C2118F0A159DF0435C4F9E432F5F7DB3766CEB23939415E3709 +B1E5E14996C0B7123EC993739ACBCF6B28BE7628D11843B2AAD85AED50C9D82B5151EABE73505F +3A1C103B7F02C0429A32F3376C13863C347BC07472F6CB82B39EA37525A46B95F9387E654F8076 +EEFDB79193E97C16A69EF102ED96F180F44586ECB46F45611BB4FA173B4C8DE27E2C4AC2BD3E91 +8441E44FF42D13F9C119778806FFE56B8ACBDD4537C981571639C5D9D5522C822DE5F29B426B83 +74E02DE01D2A2B30281676D4593C5356214C5C6D3FC679395E0A838A447B2BC803218F97AA6C92 +EE62D3600680CC93187A2D8DC3D7616F4928CBC3E8C42BC5536D00A0F1D3FB114EEB9DA1B5FD89 +50EF78BB34E7AAAAC3AD105D960B3AA743CB487AE7D000E14C5BD14A2250AF406174ADF67A0BE6 +7D62771A8D6283F574F314FCE1FB41B80275B825066BF711A982E58E8F34657DB15E29B20B5EEF +6EE8ED0BAB63458DAAB556CFFE712851DA37303784F656309ECAAA93185643264ED4B7B6E05829 +67E94B9311A2636F0D6F18BF83E5FE28C81DADA7046E5D485B6A9754F679F2851C5C3F4071153F +C25F09DB849C09E9CC34A96E0DDE7BF692895D4B6678A1FBA8DF90522086D5C64715DE5FC26F16 +B954EDB7C3A0A72F1278341A1018286562228E2EEA26EE8EE340CB332B43CA68C65A2D57FEB45D +0BF8EC6092219E7EF9CC649834D297EAF3B5FB00F2F83399311AC5FABC8761A13575B0C4D917BA +0AA75C78AC3AB78AFC746CFD5FEB2B91073F2FD8D4C2A3A490C94BED5131622DA474A860B312AC +4675661BDF91D076228D148270253325F12147C5A7FB25FAD15732E43004A70F095EE3AD448D9E +336CF44C4D55CFC772C92E15CEEC2F56A002A6E1670ABBB074DBE0CA55BE5D1FE65F5A9FF90E1A +F4A4B5455B9F3A82502C4D860468B7E7E91A77FC043C44E19211A96D8EDDEDE29FAAF156AF6C71 +CA2D0D26A7AA68A2A0864BC236E3B410485D7CF2A51C3FD22A147E3E44E723CCE629A3E67F5321 +6BF328C2BE130CF9C05260E4E5FBE73D9C2032BEA5AEE7B0ABCFD2F6D9874B77D3B61AFDB4B300 +55A0033C9EC86962E50CEF67EDEEA31C093B3A429D9AC37D58056FB739B64FD22BEAF7955D1A12 +4E1F5F81C2FCDD89432C15ED61285B1D300C10714167D1D4DF9C7B0646BD825805B7E6F21ED4A2 +06974B556EE6306C84FCB475F4F242C440A41B67B543BFCC178DEF4E58B739ADF0E14D4D0137B4 +F48BC39918599A70DF1F0DE49F6527D25ED35B5901B2EACB584E8F29DE5CCE15AC1E31D4A14F43 +CB2BE1150D22AD419EED486AABCEAC25F01BFDFDBAE2E3E4C899B3291897A638B4420960CF7AC2 +F08236D1D7747AF87A207081CACBF00A0994C2F98EB90AA3F4211EEED6A0425C6BC0CA31DBC6C9 +DE03E02A5AA192F0187C822AE022AB776CB891E95BB90BB89C07D34A38911A34BA591D78B7DE83 +6BDC01BA45F0A66D735E317B06AF7EE6E817E98FB776EBEAEE6B8AD56FF5DE1134B7EF55D87F21 +057F1248CD06932F6DC349D2E9B1DE0B81E300625E370770C548B89FDA0AA4F8B7373426A4C8BC +200F54CF2A587DD11ECF76E2E324591FCA3817DAA9B3FE117C826F5B53F24C722F766F73903C58 +A81A2067F7A3E8544B64E26BFBAA0AF6FB10EE8D4E99C49CAB1B397E0AFFA566B007330EE54DAB +AF0C044E8FF8CBCFBD70A372C5050F02AAEE6E2A648771A199A8290BAF6ED4AD485DACFA5A4937 +CCCA8B4D03FE96D7CBC7C60E6E95B53BDA2597C66168D3564D1BC6617033688510AAE0F6DBB16E +192CBE34F5E0364233AD2A2D0043703A48EE02E2B4576645BEAF3D44622983407461F2E700F3DD +51DD10BF742D645F22700223960637361E88D79EA8EC0084F5F20D0BA3EB94A7B5EEDDE499A39C +1D621945DFB5937A31BEEDB0E2DE8395EAEEEC4A912825EE2D30E06A351862C9F02711D38F63C7 +4BAD03D267BCA956F029F2BD396A577000AAB31B00B004D7DD5F6102D7FE0BB8443AD768BD6051 +CBB0F6C74FE866A2628789EB0E2044F2EA6F0D1686BCF0BB7F245AA757A20EFD93268FC1E140DA +35E759443BFEB681CA8B10244B4E395F3E9A151A5A3D74293E5EC0A2C2D2DF37132705FED78742 +8C5E876F567D1CB77F7338F70B3FE5AD1F7D9D6AE6AEDED983B638C5B1F6284BBB8911387C2CBE +51B92657EC57F3F28F9F71BFE582DE883F2F24A3E1BE90D5DB001E7B69968AA2B8564940A2B3C8 +3EECE73D1DF1A51672429FC169488D329D8AE41E0D7E557F6678C6E36EB1877DA3B7AAB89EDDF1 +54AF743BB2FB8F4EA0AF7E8761F3EEF6794FE66A5494E74F7428EC2D47149F05B8E3CC934C46B3 +8739D1BEA64A39C4AF8CC42187FAE682546468FE3C68521D074555FE83FB96B018489EB12C7437 +9EB97E53BE86318E53494DA7F214B9EEF02B1843DEE3D3B7FD4F94986F310FAAD236BF55E7137F +8B35712AD6C103FFC59F05AC12629D2CB39940395C9683B49D80D0548A17D45A422F9BC0F02112 +DE3AB03E5CC55DF670637BE7E4F0ECEC9B324CC26C16DA89550D80C609134B14E9C5575662A309 +783794C673B64C3C62932C64D9D9F560CCBDB7BB6DDB1A0D67A6C1D09AB7BD60348F91107F65A1 +3EC3149656CDA201356CC2AEB313A97E203C8037C9D5C5A70A50DBEB91E8E4B54EF9BF8DCCC033 +23F8AAE82CB2B60737C52832DA384B02AD2A1D80EEB88AB6ACED1B44AE582B9CAB881E44AF4392 +D29F81A30B430463A0D48D26ADD6D7896EADE1C0E82DA83E28F414BB24086566EBA2BAFF475CFA +123D905A8A307E135DAAC8735B833005EE356EE627C6B3544DFED3D62F25E88429C244288ECB83 +6733096E71F85E602FB5A77E7807381D0F3805E29716B21D21AFA3BDE43C3EAE43D33082F2F14F +72CABDFA02022D3146A2AB88719998C6EF1984A5891EA63E47C995F5C484D8F3854A79AF856F57 +54E9DBBE35668176F67FB1ACB5238423D2E1396E7A4241574033C78F342D11F97D8CA238312129 +0D467F2A371BA35E52024740F82CD91A23525EF0597B06A1CE57C7D568B25A96EA0E62756F5E07 +1A63F9D2C22E1C3806B2F150A57E5ECAF61A999E3573E613F94591FC4B0B8F4BDBC7D2619E800D +A2CD525EA0B722CC25C26C740265774CAB6C3CF110C6A1C7BB9F0A2EA2D03CC8C483DFBBEEE0AE +831A31706F790C0F695B926C89081ED62B5D5E1F02F405DC455751D87BF06CC05147D56CDB03E2 +16E4EF39CA3E976F786DEDB9CB0FFC98E3B115E4BFF4BD63C2BF6D577971ED3FD5525448558DCF +C4D40E681C9FBBD650712C69FA78EEDFF970ABA0BDB69E33A8DDF3A08BC0E4DB8909A2DDB35096 +4FA94F03284532ACE8C62E8E0C5FC06EF66266944FBE4C6C239CB66A4445BF6E50E1221F8C9BA3 +2F11E198D306F31DFF8C9CAA5AEEAAB08B30F0ECBCE3CC3329AA58B1F165F151362BE3646EF3BE +6120E2B618135127192D4CBC77CBD03A83F6717133B61DA06E2118AEF126FCEDA71A426B6801C6 +C70AE8192EA70C6276EE360B9D89388C37D075644A5009E4450B3E6F88697DE0C0A2E6A1FE58A0 +72422BD671FA241FE11788AE83F63AF4114D06702D251FEC634E562CE367948521FBA53344D5D6 +18B0A9A2C5E013F8C790BD5DE8AD289DE859768CB488D06F45DB114FE12B2BA3FCD88099F955CE +2A3ED377192307CECB2E7227DB751776DAA54BA17F5E7137E1AA1F1B6DFFE782F715FF29E0C370 +76BFF950438DC7B7222A67238157D769C27F48CD9E39AFC1B0AAE6E670E20E982506FA564ACD52 +9D108F72E9A615C61907F00F6DC9B3FED3D99380B99242A53027A154891DB04C3ED328DC4B188D +9080BDB06D9513098D1C8A69D844320CD494DA7DCA8FE6B008D0DF6B3121599E951AE22A9EE37F +DEA7A4092509F1743505DAD2B07E1DAB21D84038115C10B5EACCC9C96C62A111AEA09B3259BDA6 +20202DED8FC1BBE20A8CB09E7C77055A9D0BD7D5F39B8F065B290900603EA23896CE2E7438E6CF +63BB8435EFA37FA35A2588519FC79533D3A1C1B376EC7BBE92388C3F3248C5239C4D21730DBAD6 +65A7785867BB355EDAC969FED613A52354E97501D56909BAFA0F87258B068CAF0907464B498861 +1D3E7E80E645F7AEA5DCBA04CE122C7A47007A73E725DE31C475A57988CE41BE7D1FE972A589F8 +D9CDE0977492E07457698B8E9E184A70EE761583058AC50884A880936F001D53D182CF9605E588 +92910AB45E3C752B6D266CAF22397BAFF1591976B6DEA208495EF675876E92ACFBEC1887245048 +30F05659B2E73E8E049647F4F28F529684085CB30EE66FA5929774E49C15875493F661B77F0C4D +6391EFE5A0D384BFCB2FC1820130E2E519C3715CFF2AC4B8A74E81C368C55FB5782ADB9BF9644E +2FD416320DD3C6CBEC64A992B3FB79991E62F129D5187763E7C7D8473F963F43F0D70A8EB508B4 +970A1572835201AE91F48B7FC35D0D12E7015CBD6DE0677D715E0BF94F1F9D3242F8600EB2B4A9 +590BA94CE6D342D9342057E69E0B71175B475F9F9FC8CDF962690867B6B962989D94B7CE670CFE +23D28E1197AD6C118DAE3CA2BF62FFBF5A6D03C7E1D85199908F9DAB1709E1A3FA4C1D18535AE9 +5306E0641C9C328886C72C91B49B498202C8B72EDD5C7F5DDF178584A24E6A89DC9EF5437EBED1 +CFD46ACFAB9678F27F4BB80279CDB62D9A23761E70ACF40ABEB38BB3242FBC012B8AD563073BC3 +240C6AE167A56B084DABE9096EF07C38BA3E6D380E2A1D1CDED670305CF0EA1D070E5FB8574D30 +8598EEBFB0C6FC907E25108902BBAD331F177EC95717078B97EDFF258F55793FAB9EDDC508FFC4 +719F491D791F5D8487FD5A31992A1E6E4DF7C82AA1BEF383C2F74ED7163AB6DE334D48A11520BE +2B47FA5C0B07FCEE735F63CCAA25507A78971012EC943DC2D1607B3F44DE13882DF23070BC066F +F74646DF196E1688D7350D7672F93691FD5950AD7ECE2FBD6D4B1CD777C88DFFCB90B57F9C829B +A0C9F061F7DCC650CEA49D70B440B84276E432FE47D7D4D67C241F8097469638E4F5076A65FF5A +15FBE8690B4F6788E843753F6D961043BD8C7908EC2A2EB795AD2955DDB8CD9B6A8BCB3C2BC673 +0A24CBCC79F15D44A6AD0CA0856E661EB07890BD79E93FCAF93AF80BD1BDF915B799C9118DE981 +496A963B4A9498E11893F19446FD9AAE7E4B4FACA51601F5C54D46E7DA49750FE88F420E9D7325 +DEB5A6B091469240AD0DB4537A46E71595FF598BDE54972860305F59F593CBCB7B0B26130CCE19 +E0B553E8D52B1953AA0E463D49A01B3B2B588044D423418A58665DC05B5AAFC47E264985934F03 +C358035E5E4DADDE030060BC07E7F0526FBEEE7FBD26CA50111E8BE27FC021214AA7BC8518E51D +93934E23270DBEED1246F623EF50C9B12A3A79FD2425DDAA17B4375FBC51A1FD8A7A456441C5F5 +C8DCE1A112C00058434E3250B841ACCFFFE4EE5CE4E8DCAD1DA76C39CA24EEF79A2297B70D6AEC +75B3179FBFA7A4D90B4522A0F4243D14FFBD028961211739790B55947C4DC63F0DB959A3AFC7C5 +65D672D80422330AAB64D51993BCD2A34FDD8B1848F5C400BF5236188C683BCFE47412108B59EF +41B7465B020FFA6A9BE53269B4F8AB5FE2A9373C3AC12A740EFD72228AC156A999C6079687FE52 +19BA162C917DE80869339BC76A9D7DEF6224AAB13F1E17BB4FBE9722B94DC84256529932A33391 +D085A85A4DECAB06978B9166F075B51DACD371F172D428081AE1826645F9A461C257A46BAEC29D +D6848025FB7C6F027D67A89EB217AA9879DCE693729D36171F815C3C6967F8DDD4A0EBDCDABA1B +AE3C7901A071501004DAA11EBF4E6B20242EB6C4932403A6FBC9C190C8BB789CB3C3F2DB0CEC69 +1FA2A1632F625FC6A1E91CDD863CE75338CE56B6F8863D77FC57B211D413F75B2F7C16F5392015 +C33B55B49BA91C9EBDD5AECBF97D80FFF1B84488FB259623C858B14BB3D78215185A866576F34A +0E259D58C750992B67B0900001AE2CB8184419C9BEEA52ED099057805F53B7FBAFE7BF2FFCB3F9 +7571A88C794B5AF35DF67BCB66CC21536AD69F860DA40C66AA8F6DC6E52A9C0CF052BAB6708EA0 +0ACEBE8A2D3FDD21CEE891EE4B905F72845B3BAE8591A20D99EC177C44528F56A09111A498160D +9EFF65D62BDFD201B608B578E9E052EC257CBE33662040ADF68209F5E7876E1BFB861E21405F5D +5D3A2F684C07F20223E26B289CC7256B10D699637E5A15F409ADE71779032310DB5FB5C98CE037 +89EAFF598241368500C76315D8E3FBE028F587237B1A4E71BF0B52C181AAE9B88754ABBE054185 +A035D118630FF66EB5A48C47949779276B5AC20699F3A33ACB5F9510263670B25A7E3E92666F3C +0EE6AFF2CCC733780A0D98569B4E08254D9D88DEDAC4F50EB1FE9CBF8588E301FED58E36336167 +7F47386A37B86186D0A0A4627C2BD0C956DF9C0C9209F3275BCD65869D14B94943DCB3A2FA8B5B +D7434CC1265F7CDA7D86300A5E033AD24468ACC1809460A8DC4231B5409909F865C6CAF7A2D998 +3BC3ED0BD15585A43C6598D8D3103547170067B51D0638150669DB52C1E371B6391D2311E5265C +6FDF27951111A7524A304E865898634CB768EE72B812A99DFDEBA1C284A0FC95442921B8DC7280 +2EF144335923FE114747EB3CF24FC652DA97A25C2C92ACCFDD15E82144500A6BC1B2F79FF4F722 +E06450D2E6335839962111DCBDB1094FA2D3E817EABAD4DB131F01E453ED5CCB794316E5D259E2 +7A0625D1B5827706503B0F67BF168DEA99FFC9AD1C6CBBBAC271BF0B92745C422F9BA22A2D2F36 +A0964C052062EC7AF373244D8A49F60EB8C2881906FCC197BC9510125DC61628C8C1B29BBE00DD +343075F33AD0AEF24F32B0F2EDF873401A60CE8A8B6176ACB9C1A395C8861BA36322DC7DC85796 +6C8C77F815477C820716F965B1E1F0AE5129A01DF4507E0E04B5168FA3566AF291F084CB65D0FC +E86EDE9EC19EFA7CF75C9749CF4B5BE79083E8FB7508A51C5800D546FB14D4D8B5191C598BA5B4 +82E8A0C17F77CE96EDA3179A4A5613C9235758699EF8E2B4682F920A70CEF54FDF59101C5135EC +3FEC9998660F8D9620B755F45A6A9FF807519A5548EE4BB55CBA5FE6D407499AD47707606DDDE6 +32D7AD1A58FC63F97357F4F5C63E4622BF4017B0CD757D554390F27123D17494630A756CA2F1A1 +A872F8C09BA62F76E5910578DCD4AB4B0DF33F6BF4DB1237EF65E5FA97C593C90728B12FB17407 +FD681A44EF78E14918E7B0530705A1B8F27495B3029252DA7A3934F7209D8BA8442FAC0EA0C03D +08623347C4B17B249B91E3FB30FF88DFB190AA14276D7A878D6711BB273FD611E15D13541CEB1B +B6B059985449B7A63C8C425A57AF00293AE85AB3FCA9B709FA60C55EB6AAA639EBCEF4847DA4EB +F28A235000471D355202F948B24C9283FD0C9C9E3AAF88735E3769B7D60A9410B61C9D62AA5425 +9E43AAC9208A794D56886F983EB006ECB5084CDC8295D1EC0F52B12AD4BDDC14E672450D2BB481 +420AF2E5836683F31FB7ABEEB5FFE9D5E1AE551D3A6E123ABBB141BF313E5D4ECAF00A12C441AF +E36DE60877FDAE8D255DD1F8BB0C0DEBAF10EDAB4CD2C79B4ED1CDE61E57D12B389C541A8A1823 +53637D9C1A48CE343C88CB15AC45CC54EE6895C685F89691D09AC4216FDDAD8549D164E8BCF101 +1C2D97B3F1DEA3D7C0EE3049860A949D8A558553D5E8FB358C8D2F31A1DF90BAC093E7AB45DCAB +9E9D4A36B5ADE3C696921C3545E6BD29587068B57A79DACD07C50610EEF8D16BF0CDDB6CB0F459 +8EE921AE8764247A771F63A3E8F39B072DF066C1229948CCD60B26C2FA9FC8467F09762BCD38BC +3C5A17EBF085DF652CDBC0386E5F8F908C6EEB9E8B35FCF8BF69177FE9002592F93733D3502725 +1035E29E2E4A2C17FF86B5E884ECF851CE8D1CF2E667D9F9FA62EA5C29858EE46647F77FEBD6B6 +071C827470A97888B53EDF69920EE368044F9DCDEAD7D40D21D44A90C44CEBA90B64D800B6F083 +5EB84A3D66BE4F6B1B173B8AF1D0CFE9D11FA65CA2AE847EFEF063BC4400D508C49C220BE19F9B +14A6E76E2D65E54DE811D104FBC001508ED53A71E6965FEB07423F4846BA0F0C70518D2D9377C6 +FAB46993572179E9A0D75EA6F67C5B7FEDF1B756C882DF1010549DA4B6519E9CA28C56053BAD1A +9EF5D0428F2CF9355320B70ECFEE125C9B752E2D30C6E259F9A44FD44BB45CE8F66C3AB6C27DC6 +E2A8919A2214220E0E5ADCF6C885966647797B9AEDFDDDDA5726F45F407034327F70C388B6EBA3 +5227ED48CC572516A3FF067B4F7707DB59CAE2B37663CFBA1E7128B43A2F1BBC209BBA10D71D53 +14A31B03E68F68A9A97F32C14205D4E998359039CD08D21B0B4A01FA2CB7FA8B28DB40F23B1301 +2D1664F42D084CD6D49588BF294EECB7C2CF18B65106BC49DA160DB79A63A9A7194C9F2F79F2A4 +F97EFA10698F291334E8B4F74C9D948F557C25C4FBC798ADA8A53B9B0E6DD4BA50968F5A5707A3 +A6428BC7CC56704534463F5031272BB5C08DD6F4033FD1B5E1A395316AD330599EDC4E021EB125 +7BF081AC55857A913DFCAF39F66A1ED2289A57AB6CDE8A2F56D11157569484BF6EF26B04C7CA9F +C821FC46B9F13CA07AC0D90FAD8AC2866BA8DA0D67B908A01387E54F9F9DDEF25F50A1DD65717A +3533023CE04038271DAC6CB401D3F692266712D3E380970368A34962C60646B12D129745C961F1 +F6E17FA854630F7FFA9E030A0C2D6001692E71495AD7492FD65912BBE636050F85DE19D51F2722 +E8FEA3C931541C9C370626163C528C1A3C0E587C7275806D08892C2618D0CB66B6AB37EB96EE34 +26274E9E4A036C57AE33B1C7D50BC5E2BA42BE0F14D32F02F77375087BEA2D3D44366E13F9CDB2 +096459878D802A151789E54C21E09FDC98C6A3567B7F6EF03E7E67228998E1F893ADCD0EE49F95 +22FFBA193A8BC1D5A2A43FA75300C4C72A1E388A792586B3716979DB9679BD3779EC4D9F427F18 +E4017D87C0B8C44460FE64C1A591875E589CB9A4818341FE9FF1E515F6D510685338514684D90B +A40FD68AA77BE2F5D5536772A6232B386CEE391C88D1796CD076A2133474F9B1506B446F61D138 +E5CE584D113BDE06EAE89D82F1AF25B78891766CB386332EFC60A57352BC96B42905C0072DDC23 +61F20E89BA1DF2EFC1C18FB071CF04396A45293E44FE656A19F3AE3A5635560763D03B6039EAC4 +605AC30D4E3B1A68AC6CD68B00D694399B9527F13D81099DA664919A3D15C3E6DEF460134A1736 +B1FD53DDBD20C248D0832074C2A22802B7405EB6D33D864D97B78252BEAE3BF9BA5DDFC4CA077D +806289B7ACCCA239E6603C7D2BA41B7DC820F86D1F8530604D7E3F8A1239081D7FBF9FF9C2D9ED +4D672417853364CAF9F010CF08E4E060038A67E70EC743AB7FD3BFD62E7C209B0281F592700E1E +CD0B18F65DF4947D24B2D9FA6C645348495864F66008BFE85089E6442856D0DFF9B27648A793B2 +22E98EF332692C08FFB08A7AFCF9EE4DC33343F8FC0B2BF5F59EA5FF484EEC4D0903A7DE30447B +F6159C922C3691A97C2308CC2B32683A72B3CB14023E76410345781F0949E918D47481630EB60F +891D13EA3AA81DA60DA50E67D0DD63E6823DC1375FC60738B633996A10B16BAC8CBF574732679C +B238B9BB0C1507515558A5E1419A17DAF43BEA11E31A9F10AA8DF17DD9BD9EFEC13EF6F6D1B47E +CE37F8D45D2817B5CAECBE38D45BDE09604146FDA57CC7E0814AC69558F170A7AC2F8DA6A5C7DF +485C1E16BB96C3E1DA2EBC5D76630A99A007AEB8F680F2A10182EE55A0ECBD17267F6A0E4AB5D5 +4E062DDDA4DEE9506528043578853DE1CE8ACDE68938EFFE8283419D9A779BBC39221379BA2767 +DE78BFECCEA814269A456AEC28CADA35B7A1F5DF89D57F9FE64B2818EFEDB506B1CBDE22F9E706 +54A84DF0C0124124646EBAF633E054D704305B2723EE6848011985DCC11CB1DA81ABEB7CD5450E +31C218B45C3556B7D1DCD47D4BEA4E3FFC5930037B2664ECCFAD1204D8CDD7289BFA1B2F4BC59E +B586883A9E8757EBB0525A53EB83996963ED8DF4760CC16B542BB7C60FE6C0F3A18E18B26EFFC6 +CB96792CF2C2113E04C8E64335082EDB3FBD78DE0F1D61B55EBABDFD44786416F0AF593379728C +FF15973618B201D872628100BA908908A978EF091A126505221F6C52E7096CFCF13710DA707347 +308943095A0222411C858DC7BAA314EC1107CF9C7C699EE623981946E79B70177FE70BEEC2624A +928FBAF73B1CC7D65A6E76387EF3812177BA0914BAEBCC99564A2A26710129E23899D8822DF447 +06AFECAAD63168BC96BB879D418D3A26C214E4F26E186ED9B645F9023013086767A5276DCE1B81 +031D6F08055D5898C6C1DF53CF9695F0B1DDAAB78BB824B2EDCB8D726B2F477289C16AB9E85013 +1E1E23221929D95E17F4011D2126D783C1363403D650D426D642AF6928AC7A017E2D36A60CE6E9 +7EC189432627B4BB14B94E2F46D4ADA823DFD6093F9ECC8F01FE148E59C11AAA4417EBC801B0C8 +D8B380A4922D9AA366BA64BEAC25DE3BB50E5EEFC4E0AA8E8D6E7D664FE249F01058D5CAAA8C3C +AAC732A1507B9F84AE531A3F5A6CA32C812EC23E31F3F491F21835F655ADFD42E6387D03C500B1 +D924D99572BC8F362BDB56FB6962800DDEBA947659674DB719E4CA9CA2CA8BB36E28CBECFB9EF8 +16EC9B0AB6B464B959DFFD30F564E6C7480B72A5BE58B2B1527BF6967F08F929D98378B2D18AB6 +2A73010C9FF49CAEF7C76CAA65695F1FEDFCE05A487CBE6CA689F4B095BDBA432E349816190CE4 +BD03D7246F73B5A6BCA12E262BCCBA77E25C3A19241202EF50A600D21D16E8CFFA05EBB85E65B0 +E3AE69730D4D3EF79A0525BFAD3659DDEC3F536BFF0EEA6693A683BF9259E098B1CB8EC38B1DC6 +AD3B20DDBB88E1863ED1DF64A2452977A1C70CFAE0AC206977526D2EF4885561EDE9C0642D6524 +12A2BCFF8B37DBA2D31079C4AC6B9CF26518BABF3639D9169FACEC29E42DA1F0AE2EE290FC0F35 +149E0EC8807C70C4EBAFB12CA44B7DE7D95608DDBAFAEB476E98836E317187715C1F07C3719EB2 +0560EB5B241932106C464D074EBF0B4B6EC4E86CAB3C00357D406EA833652D729D32069140817E +F7F906E8650CAE88FABE5545CFE266F4966FCFD8F83DEED5C086876952F0D024108B42E06D4DB0 +89EF77802BB2DEC90966D331F6E34D92675DAB18FA3334DF9918806BE5058BA582F35B2D742EDC +F4FF8BA830F0C86148C235788EFC15400E08ADC57D6ECE093E1F7711590DA9D30017B730774052 +6937D9A8A4756ACCB0A6BD2888CE2295658A9B534B88EE43DF464BA3AF64CE2504814D2B065B85 +0DC705049E0B346D007B43AFC18028D4E9539EBC7CD14737CC1B7F10F2CB000A7F219DF60B449A +12D21E16E8789B7B8F67C354574B6CB5E0B6B612D9C5D5B0AE7D87342AB404E967494718582FA7 +D32CE4D6A81A1C9EAF3EAB6060DFBA250685BABE46B4FF3BCC701AFA8A868F7029B38F3568834A +8C34EB0E6DF3D67334FD0E4838075286331AB693179C65BA5087988383D3D5EC5E0AE7BDC99BFB +C358BA2AA274A4521E286CC6052A5C477696C5578D5608267CCB164694974BE93AE7E35F389F2B +AC6B7980E61C29B1DD2D15B42195E795B00D2B89E6C4BEC4379413B11B939A1528C56006ECC994 +7E4F14E3D60F7400FEE32D77798FF6383B3319C6F92E494BF73A90083F986CE5F2105C0E801027 +57AFBBFFAF368A20EBBCC6516B79682D8B70A23D8DF3A2BBE4EE081D4ADF70847F95DDAEC10B35 +13B069B9A6E50FDE25E3458050F568625F680D3DAB2FCD3B7007109358EF6428756F742C90118F +E443EFD7E6D879CD082F73B0B95E230C06C67DA5CC8DB4792EB274FD596DCE8C966F84B54FCB14 +8B57141947461BCC69A012B50DE3667F6DD9F0FC7706525BF5EABB07164BB07B9C973B5D31D0A2 +2CC99E37697A6D14B6F4EE4745329EAC6A5DE7BCEF1B10DEEB46DA4AE14BB82CBABC31040987E1 +74EA49EE6F543DBDA0063B6C1042EB379F610DB5C0D4263CFC08A9C5604B7FE2345E775EFF6BC3 +5C581500BCFFD98E23665B2115CFE33A184BBE1DB4EF955F409074512F61A37827DB751757E284 +A23C89932BA251ECCEE545B6DDC98246970B17C12FC7F9237E6D00E8187F7F45E048307688EE64 +2FA6CABEA56C1D8C1FB31E0B0B95D7DAFC1BE2E90F933A44AF03E94BA2DCE76D358C2D7A2216C5 +E95788A6BDC9350135621D59F52FC74BC96D94F93E6E63123B4F56326413974495E822DE96FC05 +315EFDDFEB919FB2A36BFD8580D6A21D11515EC7835082359F3D0B2F79901FD6CC2AC41E2D7B9C +412A49C9D7B8FD6EFA11517821643349EE9FDD5A6F4D55F440CB7284726C6DD45E84049F8931CD +570388CDD6DD5F7AA0323533EEA3DA70FF0AA8BC42F3B129D0AFEDFD840FBAF2CBC35FF45B8656 +BDDAC912ADA0A3C2EE447684AD4A0DADF205A419E583D57D352B30356D611E5E8B67538E2AB612 +787177B8C8CAE9A3F63E58913E026E2BDBCD9CDF272AB9B181BE3CD650AFAF3FB9D6E07D32F915 +4852862C3F7DB6748FC834C868619A4E7823733CA044DBE48F642944A087FAC70432D01392A52A +3FA0D1C54EBA4662AC8DE38827B17CF644C2987ED7E57D436E4A88B29A1C91F454A4637CA5424D +11B82D1137D58867A9BA363CA0E07C005DFEB038136D4FDFD5AF85F48E58E50D2AAEDC886A4B22 +CE2DBFBFD24F4A05A3A9FCA87A95A871BF8D6237C8C63E618FA4DBC9E15ABB677EB7F1706B1C9B +125D4F5E39A168A989FC53D34F45C24A52292627E11F64A7BE21E5A61D4D8F8C9F7DC3B0E139FA +1E7EACB8BE224E679A29DD3B44FB9B29220EDEE3FF41E88D15C914E9E2EA6FBD1D409753D69FB3 +ABF266FA7991E82B74C7C73BA7DEA82B0A0CFBD6291B4DFFA1D68306D24B50906A3EE87A0C3A17 +3ED5A1F983138E7BD4381E1B21AEC00F72873F4EA6C622118F37619F6A451DBC52D2BA704DA804 +17298BB1CD70A5FE38163F83ED96C2D5EC1CF2DC8CFDC9C1A8C2EC735ABBC1851C1A3270714B88 +ED8E2FB5A0469A18EB27C0B191169E37D71D62D6FE06E23B18B4DFC93F8E220DFEC3B57F34657B +0BCEB41F10C0DECED95960DD664C499BC607614D97C60CD7794807F2D509B6589EE4241E4349C9 +33A94C3F1E58FC40D320CFC31153BCB12F7CAE903D829E8B2300F41DE6D21B5BCED26673042B60 +3403B1918E2A57662FA77A21D16EAB58C3C81243EBC05D6922C843EAADC9DA99B83AE09FA329F6 +A6F0B5BA44AB4C1FE88B63BFA4D629EE411CB1EF26ABAA16264204637182774F1AB200C7E20057 +17E5168F766E790C248C4A38B93F5F9B5C07E612D72077C36688A597DAE740D04171E33FF960E4 +4C1E795C1C813E39BE2C0365341D1EC946BD30DC8BCBED7F9B4AFED3283B263155414CAF138365 +2C1935E75541A553121B7FEE8293ACCAC906EBABB343B875E4774387FD8DE4557830B2A8CFA3C8 +4B734F4AD5094754B96AB12E977DDC29F8E43697F737E52A6D9DD9A2D8840906B4ABE9C246F684 +10C38B404FA6251A2E8A31E2126D11929B73ABBC01ACE04A84FF25A8F7F1AE3A9C8FC04C2FF867 +5A41EB0453373722415563EC07A9DF738F7E8E9423DB8A09DC6714472982ED98165984C99F885C +9E9941F2A64D10BF1936C749019845FE5C5DEDF1C057837AE0C6BEE3072C0ECC044B5A33D4AEF5 +3506438F750804B696AAD17897036057E77A0BD7E02F2918CE13A48FED56C55FA447B0F32F47C5 +2AA0F53F03F6334E6C484AF42F265EAD25088232BC109B4AA86A475BC11FB22FEE50F92FB4C4B5 +01DBBE211228D5C14ABA48B56E59A34C813016D43817AF1B707D09BBCA2B20F3B3C90058EF7E56 +DDD4004F8754EBF0A16DBA018F8195FFBFD5668D4D21E7B6AF279A08A17D081811D2C34DA41E91 +3399F6F3B4BE23879972BBA56C65F6612606DD000A6C857F8F283E6008281E5D18828EBC6BCA53 +29977E4C792E468DEDA9BC087DD8B4FCC6D9279BCC069B5B7544585FB305EA3516268FFE6A3F91 +CB25909A61EF71B0016EF040365D193CCA29409EAD1AF569DC290514A10980B94D6E8C609728B4 +A35E97299E3DD1EC28764A71AEDD26C6D76F5276139EF13F052403F529713702E5B1089BAA4390 +78F4D5B1B2FA80FE3CB11B14BC466434BA54F839B8A9C887B769FB59463D0D50DAF8C71FA0A9F4 +0E73AF18FB6C7312FD51D0EB70027ED4A546232410E7D29A156A2291E29F6137FB42525BEFC6DB +3049AFAF2357A8ED9CED95CF7E33FE3845883E35632507F3BEE56533E42DF08FA0183CDCCE22CA +7E06D568D08D161560D106E22E9C9576ABE08ECA90A62510C2811D7CC28730D2BE9A1642052647 +394F4CD2A4A93ACC984C954F0E8C57670C08CF0D21D46E08925ACE4665D9D724EDC75EE0392322 +E9381632D8C287BCEF09E84D42E3BC345DEB24C2AD0C68FF094E07D32685866270DC457391BF08 +15A73D64540C28A7BC178F9A8EEBFF4C4478924B72FE21D51ACE32EF43C0D3628AE353B74FC36A +7267FC679DCB875BDFC77821233B30F41A6E1EFDBCAEE3B4319BBE29D253624E48201DD2EA2498 +34F67D2F111BF268942F6842939365C8E2BC3330F0243CD1AC7C5B62B7F0A2FBFCD0965AA10627 +73634020A2C7C364CDC14EA24B500CBF4A8C79B01D6DF55DB738CBE3B978111D65DB99A78CD0AE +43619F2E28BD444DEB85A7B585B19C594940C45870E21D4B1B110028A4F3A60C951A0884D57E28 +D5E26E0E928619000D5CFF442D019097C45DB01BE693F6528A00120A14845923BCB81F27BBEEBC +15A9FF9124371E485BF4AA8B51B2DA49DE8C2E5F4F1D909B2731B2B14B287D921949115891AFDC +2E9424E11D6A6E01800002B41B60F7AF908FFA016E775C82582A4C15F47F941ABA8889891F9441 +F2C850A29185D4B2B68CCF46C38ADFBF046CB7BCF9B610379E95CD8D2F68ACB47107225ACDC6B1 +2DD0A72F291E27199399F916370B1F7D6F4EC7D0109EEABE3191393C7D6446F86F10EEAD7F9D79 +B5AB0C053768EDBE0E0F211F306507510E589686D29D226E55D9F07696A144BB4A6400647A8743 +ED136D3C5DA6B183D0AF2B565D9D9C345EAE5B63BABA6867BED519CFD46CE594AF18AB49DA423F +0C781EAC2BFCA83F4B11B431C1DFF69E12287098A487BA099786DE0906EB2806278912B958D9D0 +CC168D6246251F550445413478B8A460A24FA8D80A0924253985753DA56A30920BB237E4521C2A +78B4E79A256EB66A4B2061F4B71B421D85223FCC8DB4FED0C3A4C4918FDEDC558C57850A62917A +0E57EA5C771D64A137E17D12F1C5EC08FDB94D1232B090127259DF02581C2584754EEA872D88EE +7E583D13C54D278DCB5D6AAC44F68E76186133A3EAC6AC3D22FFDE29D0EE251495A96DD973AA89 +867C6BF4A1B71B0956F32CA07D796A19A2B64CAEAC3B04AEE03E943B6FE66EE9840DDC086E8C80 +A0849F14992530B74EE8C58CA3F4E765A7A097D98D45DC90C48A3F6262E9999BC34EBF07D5DBE8 +7185B7CC1BE34DB8D09856E84A5B9B30C01CAD5E72034433045BBC57DE1DB1186BA78C08B6B224 +07FA803CFFF1CAB082856810D5639AF9E8653470B3FC95E1CF8FD80DBBB597FEA6A4E3CF584AFB +4A88D02C1EA61B65FB0CC7A96EF09AD692D035EEF27EB3BF2967364A42DF2D7565C61400B0E338 +168B81E69C07FCD2CE5B20526A707F36786C0C6D53B7E4567D41DF6435B4DCF13256B7E802441E +4C86A0A329EA7293B1A5FA8D532FD0F529A2CA7CBF0F667C784826A1891E8FB93564158B14EB52 +7AFD02156785CB4089DCAA8056EC101F85FCA80333A89AD17EB94C100BDD0552006139C9496EDD +FFE06E4D10C1258BC6912C5889D3D9108622BE978F52E855729C691DAFCB358169154A78659CEE +C855C995B334280BF279955835BD13DF6AD0066702C7B2A7804A223947A5F8528F0E2A962F76FF +2B41655FCEFD02F3F6F8D848D60B65399746806A9A4E671F62FD3A46A8766E6F94422B84E9E3CC +3F1ECFF2C86FD88EAB7C5665743F5F7E26F34864C701B57625A79CDCD1BAA2A43F482FAE42F9B9 +4BDBAA91ADCE7780AD209D2C19994574B9BBB132169B488E6BA22ED05C971D2CC5A9A0262844B2 +1698BA297412019CD7F6C796944202C89B7D7B188DCEB11C91F90F0A338F62F636B759924BD999 +B488C61DDAECC4B68E0104D51C9B8E38354AAA61EBB5B53A10F5798C3E755662C2F92523CE4710 +14B322D56181A39DB9073EF5CF6C99028C66A48DCD259DA4A9CA17375AC33C1AA56235BF1A57E7 +B3872799CCF1AE0534C5EC3AAA96128DAC5592C6A3AEF6AC4EC77F1CBFE1F7CBEAED6935913164 +C7CBAAE272A953ECFD2F9B95E63968190066A66DE5F87CDBB126AB5B806DB3E8F0665952D051A3 +DF91F4BBC261BAB836F921DFB0E6132283C40B9BE25DBA4DB5E9561658D735F4E7C635BA312C55 +A499A10352BAEA349607623649CBBD0AEEF6DFD9F436CA20A9A887A13C8B1E40064BC2B5E8F788 +887C4D1B853C40D74E4E759D417421FFFF7B2ABFF74E70FF8446E268C784BE7BF93CF20D3B085B +B4136068A30E1471895FD2345E05BB57D5C32F1EE6C3A288D1BFECA8276D35139876240E36DAA2 +99C18AB7A45DEEBC470F8DAFCE5884FA632F11845C1B28A3B39D820CD09B24ABE6BDF342A90D1B +E453764A959A0766C1F1B6F72579977F6BAF22C2620C22D16E52C78220AED5E5B0F977E69BB95C +A44F67FCFBA74F292773BBF4590773FAFC9632855223B640F8B5F3B991685215F92F1751EBA738 +5C09B7CAA12A617A4BA5497747AF13918DDD1AD89085AA3510443E8CD9B799F325AE43863E7F02 +CBEEC80A79A785DA41FAD2572E57A19F9A8DDBD1A12004F41158077B0B9D67E9CC4F9F10C29502 +50C74CEDA126664FC366E6C8E5D6C8DA0E935D68DAC7BEFFB648FC6215145ABA587DCC95F2A0BC +5E187C70FB879E6F75FEFB9FF1A09D4BE80EB65AF18BD7CF9ECA28F44E49BE391D4A95633B1329 +06A003D3879D1DA13717502851178B791137E3B8D7954BFB34E55B27FB430027D6A836C5773184 +C9384BC708991D81665F7D94803EE28BA76CD43DA908B279C772A4249E88DFC85A10849607DF1B +CA4D481614518C59017B1079ABDD1FF4A5FDAF8053A6225CED3FBE6F61A3404C797A61DD6845B4 +261B7BADCD7FBA647562514F72C0B2EF4077DA86BA5A71E192B2F4E7D9CDFDC1BC990F4A295CED +BE13590B98608C1B1A5F8E2A1690A4153B9304F5A32C764E0B05BA8CFE4907E39E33D69C4C424E +6BE32F2C298286EC2C7EE5D6C1B825DE78BA87F2E4FD59985FEFA23933832A4E61A21617B519B2 +9360D57CCC21A685DD415048A06C2C8F34A3C98498CF74CDEFD3E5A595140F52F02B47A34202E9 +2C07EF8E790186E56920F5967BFDE5DD6E2462DDCE6ADB38FCC059E189F8DA70A8687940CF9D80 +98FFAD9D7929487A9191C250ECFF0A90012E0FE9F902F78A2C146ED6E5420C00DD89F7415F2573 +3B5146D271A89598EEA4005DB32FD27DFA0E293423E4D433DD78A31910988D75F2726B3B8A7719 +EBD40A889AB7E38216F1301D6FB53363240E1A07C2ADE47B26D4B6B438FA69786A582C72855A76 +77E6C51555F39F3EFB53C79905BCDB3CD88D3A5801F971BC8809BF73D384B53C1E03D65CC34039 +2A7A564270526CBD6F9FBA7871BDDE6D9BE23C38D5E53B51CFE4EF588E519148ECA0649AAC1E1A +2606EFFB8EC97C9E64D46E9BB5DAE9BB73CFA6A9CCA578DB26ACEEB662D020F9D2F163B877AE89 +746A4B63040082385DF1C5BEC77350F9F5EA41F5941C90EAB5700820C0C29AB8371180F30BF009 +5D7CEF5446D549D0931961B246DA8F1C3535F8967D64FD070B625904D7D7DD6E31B9E410CF3D5B +DBB7B6D6473771B85F8E2924CA2F4D8DDFB2DB3D3E4CD46FC27C65F7058E8F908DAFA540BF2726 +A5A1A66DE298D6EB770FDD4C2EB07F3C81F190712C2C5253379D518A931097A96866C1D73AF6D3 +587202857D0A83D2A526D281B42AD8A29E5084228C527AAC631E85E9FBE26AB60F14D94FEF2E3B +9A24EFF6DB66998C5E2D36966A11AF147CD293723A5F2F34625F6AC2C4FB51D0F851AA5B4B54CA +E1C8002ECE653890BBC684E4D4EF528BF815BA9B3DAC3A6EF34EE74BCEBD75F35F370363879C6A +F67E849750D4953A880081DA1B64582E8D790C288B65DC1B69BBCB0630C77ABFDE5A40E0630D90 +F542F09AAAAFD8BFC57BCB9BBED422602DE45CB377C2E634B47AA83CFAAA35E3C869C0819E6E0E +1CA918941B15F66E9552672110FACBB538E8FB8A7CE8AEB2FF61EA94E098B89062FE76EF53C6E8 +2CCDA0E8A19BCA2B33F4671BD38C0DE622522CE84ACC4114473F10554F8B13AF6E50A8F7443EFD +AFEF23430F4C2AFC9188ED069E25647C5D89D657E5C570A27A4EE5981E1D9D317CC90F5B25695E +9E1B914773FD447A91E76E5E87E6613127CA54E8AFA17052094F6467438B369C8549E5A0A59B04 +D32B5A0B02FAB315F25CD4C7E16FCFF78544D88D983EF7C49AE1DDD72275759ADAFF6F206B563A +5912AA256CFCB35CE30CAFCFA481301F6A25F673A8B90E9795B2981601BA88400DD247AF468011 +8C698A366B875A8631AF3A5B4CEA30F1B98870C096B0285AD22D2AE0C3E7C2600BBE9DB96A9A40 +96BCB3275481F63EC41789444E088A98C3564F22C7CC1D5D343EE6E3494E46C99B1546AD0FC7A6 +561C239B5D233450A80A13F4DB163FED87BFD98FAEBA9178CFABD4B5828EE864403949429940E9 +BF97455B4B10F6FD8720930BE10E639F7173B460F56701B5D4AC799A794C9CA075D34829B98461 +0FA438749B33EB9FEC2BBC2A2D354DCAED8F46CDB103EF0F64670EB7FE92FFFD4734BCC9F5B68E +CBCB0BFF982FC7558774F9814B00802B4147A50F96E52FD1E107E1BBC7CD878D9BB194A3280DE8 +0D3BEF8FD0CE0FBEE8919B8E6A9C8A45FA2DD71197AB8F15E122B6D96347181D1363A190CAC8FD +84EDEBE0752BD3EB0312C7EC7864E68CD0962B3AC5B919CA24A3F3B75729AC6578254974D749E0 +9E460263EFF0F666129514DA59329972C02FBC41C2965D3F2C7AD1B834D210EAAB5FE5B50DF9C6 +E16A3DD52EB2A3E703364958B977060CCEF91334232C9E71E27C03A1DE128CFB721881902A1C27 +5FF14F0FD65AEA05A3A58241E874E6222596AB117144C5255EA57322E49F07A7DE465C39DF690A +6A9836B10E035928E05AD103954B6BAFCEC520D364A7E4FFA27EDB5299F47ADD3009FF45463D38 +8A3C8571B21DC64DD8CF7028BDFEB4F66D105BACD33DB5E8A00363B47B9D348AA1611C059205EA +3B5897658160F069213875205D4979EA1A1F93F196A322B6ACFA8545EBA221B363A4F6C32C5FC5 +FCB4E4DB0E2D103AAE01AC84FF8B1BF81D05CEDCA5A356981AED6A5F4A5978ED737CEE2B686275 +2612B63BB055641ADE4F9DFCE2BE94F9B593BA495A1351626702E648B62E781885ED4770A45940 +FB25E5C4DCF2CA34BCE72693C063D1F130D728D7D04729E8005CB872D264AB8EE6D125962DD6BD +27C0BD80247AE1DF710BFA28C8A5E32CD34E45D60AF37EACBF49682A1A76B15ED787E1E6371B5D +D56DB046DC21B5DD9463996A4D805135A4971B8C187AAD32C422087D8FB8B46B5B472BDAA9AAE6 +85C6C08431BE762313E443A37812D19F535AA285DBA7041997EA73498D5630D24F727335289DAC +BDAB419E8B044E45D08B45B24134B5BAC9CF14D48DE6AB4705607E8B7ACFA9772C1F4E86A35383 +FC11C4AA84A7C734915A2A5EE0C630268C6DC794DD6164C9D28C33E6208266D51ECD5FAC58C455 +ABE4DD2E28AE428BBA827C18F347127E07E9E14BDF6FF4555E4E6C79697073F5D01927422FB534 +7E854223D6932003F6F7F2B6BE4FBBAA65F2AF984012ADBDFE1DD4AEA80E3CD859BBF018084B8C +0E6D3E4B81B9F2023F818BFCAB27AB55D3930F03EDDF80D2274FB6BDCBD888ABEE7B9C3AACA6A7 +70FEB66CF346D7545537531AC4FA6DE2AE0B5F0751CB10EDCC047527117F0974A8E0E48413155F +B8E15D487942B6AEB71989CD74C88AC77809E1415C14A5BD4776A2593692BAFB9D3F8B398D9C0E +1DF346BB9A75915575B2ED1F1EAE8BA4DE510ED7F5E795314D5E5FEA572DDE48FC742F6318CD26 +4DEF0C83C92032465C5209ACC826D2CC9507097A18679C44329E25C87D98AC7A007B4795FA3F14 +E93993E927358E2E5142E7FB9CB2E62C0AA0C494768014DC0FCF8BFA1B299CB788B74A660CC404 +F661DCF070C900E4E418C0ECEF6BB7A7572C2A632A9FB4F18C963FAD73B5A0C863ACF3203489D1 +EDE5AFF38D67FEDE75F17AFE06F9130700BD092A55129DA2CED26CF10C5C088FCF82B192AF54FB +BE884D701A15D71F21099303F9204D0CEE6CE1CD4491FB5B0285EC589C17079AA6599ED30377F6 +7538636C92BD6D49B53C1671DDA036FB4A9251BDDDF41383F818F332AED33E010C642605051FB6 +5F1E68DDB634644026B08ECE7608AF5AD2F648E32B6DC1ED202F02E12B31E008790FF62B097F9C +C871A36A23737F8DB0EACCC75740CEDD89EBF1D1619BC558D35FC49FACF0C4696F577674879B35 +DA2342F894FBC85F7EE7F4796B680D12ECD8E344D5FBA7F5E56FE4D5C138309CABC4871D81134E +C07D9825556F78F74C9239BAC7365767761577FDF31609C5C884CD95571410856CB2A87CE42BD8 +9F92B8AFADFEB5BA618BA10396AC6B31A4E87C2B89B521FA100D8622F39C80190749C5E9C26F9D +1040F6B90D2D380BED092EEA62D6BBD648B1021719799FCF210C5EF3BAE4D44C4D798D6529238B +5BA06D3C9F9AE5367CBB81993C19F9286E690DE1345FFDDAFF9FE36E +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndResource +%%BeginResource: font lsd +%!PS-AdobeFont-1.1: LucidaSans-Demi 1.001 +%%CreationDate: 1993 Aug 11 21:10:03 +% Lucida is a registered trademark of Bigelow & Holmes Inc. +% NOTE: This is a partial font in Adobe Type 1 format. +% The complete font in fully hinted ATM compatible form is available from Y&Y +% (508) 371-3286 USA, email: tech-help@YandY.com, http://www.YandY.com +11 dict begin +/FontInfo 9 dict dup begin +/version (1.001) readonly def +/Notice ((c) 1992 Bigelow & Holmes Inc. All rights reserved. ) readonly def +/Notice ((c) 1992 by Y&Y Inc. All Rights Reserved.) readonly def +/FullName (Lucida Sans Demibold) readonly def +/FamilyName (LucidaSans) readonly def +/Weight (Demibold) readonly def +/ItalicAngle 0 def +/isFixedPitch false def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /LucidaSans-Demi def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 54 /Aditi put +dup 39 /Alessio put +dup 41 /Ali put +dup 47 /Andre put +dup 49 /Andrzej put +dup 51 /Angelika put +dup 53 /Anton put +dup 55 /Ari put +dup 65 /Bent put +dup 67 /Blair put +dup 69 /Bonnie put +dup 71 /Brian put +dup 73 /Burkhard put +dup 75 /Castor put +dup 77 /Charles put +dup 79 /Chi put +dup 81 /Christian put +dup 83 /Christoph put +dup 85 /Chuck put +dup 87 /Clovis put +dup 89 /Cyrus put +dup 189 /Heinz put +dup 56 /Jacqueline put +dup 57 /Jagannatha put +dup 58 /Jan put +dup 32 /Jeff put +dup 66 /Joel put +dup 38 /Johan put +dup 68 /John put +dup 40 /Johnnie put +dup 70 /Jon put +dup 72 /Jonathan put +dup 44 /Jorgen put +dup 74 /Jose put +dup 46 /Josh put +dup 76 /Juan put +dup 48 /Justin put +dup 78 /Kamal put +dup 50 /Karl put +dup 80 /Karlheinz put +dup 52 /Kaspar put +dup 82 /Kees put +dup 84 /Keith put +dup 86 /Kenchi put +dup 88 /Kettleson put +dup 90 /Kieran put +dup 98 /Lalu put +dup 100 /Leon put +dup 102 /Louis put +dup 104 /Luc put +dup 106 /Lunjin put +dup 110 /Malka put +dup 112 /Manuel put +dup 108 /Marcy put +dup 114 /Mariusz put +dup 116 /Martin put +dup 118 /Masahiro put +dup 120 /Matt put +dup 122 /Maurizio put +dup 121 /Sebastian put +dup 97 /Roger put +dup 99 /Ron put +dup 101 /Rudi put +dup 103 /Russell put +dup 45 /Will put +dup 105 /Sam put +dup 107 /Sami put +dup 109 /Sanjay put +dup 111 /Saroj put +dup 113 /Saul put +dup 115 /Saulius put +dup 117 /Scott put +dup 119 /Sean put +readonly def +/FontBBox{-309 -205 1151 967}readonly def +%/UniqueID 5029006 def +currentdict end +currentfile eexec +AE40F8585C2492B57FC8C19373E315912C02C4E404DE7D857CFC574863562CE335405BDCD8F11F +96FF6E8F1C7B7081B95AEE4E19EF19E210EB377985E3A9C4049662C57E12D3250AA62F97535698 +C97032B09BB86FAED093CD2338831E8859F00CB0C108EB8E6EF582C1A64E00289B62C4DD3C7ABE +9D68E37629997DAA1BD0F494A609A153E01C0FC558EC2510717C5F3C0D1704E13894839A500B55 +234B67E33C3EE5A6E7E905C23EECF0D7320E431F93A893DD533D15A7D941B043EA7698B0BAAC30 +D437917A0AB35CB6E43354D38151D2BCAB7D2B5C7EB260C888CD713A2960FB2E510299FADCF020 +C4A535A0791F9B9DA4A3D25C989EB20DD198AAF09029DE3109374D40071EB6255A9B872322B00C +EE340A09F572634C77960BD50BFCC684BA77A4D15CEB51519C9728E8A3D90555B3EAF8C342A020 +6282A97EDAA25BB74F1AE6F862477A7AEAF1A2743843460B3EA6653A0E7348D33FEEDBDED3D45D +85CF2AA51168B0647C1DE8B3C9A78C2EA43726659F3E8EDBC6A899F644DC2932A855CF3F64B115 +B46D556E5D9985D389F7F250B017F690E2D057D6C651FD591D0186F44E4E72137572BB6C02B816 +DD19473CAF196D22DD8C2CDC3EAB84CAA908B1895059B7CF29D716DE195A6561EDE1D69FBB65D7 +CC82A9A4661DF15F693EE6E383D7B8204B693A7B0660686A66F634FB881D0DCB0309DCC421EFC2 +F0AEACC7EBDC0D36B4B23BE86EC1BF92CA08E7F7FE75A9573149F4DF5B0FF2E3F1B7152EE18AA4 +4C79B6B5B8ADF21B9D463241D00B8D0B1E4C53E374EAECD2370C762B7B6BEFF36ADA6C616B9395 +16561AB36577ED5709D2AB556D6828CFE3312375F8352709005A1AB5889D6EE142AFA34C135FF6 +A16327F64BA637F66BBEA267A0CF74E93C5FA0BC0025041987825AFB1AE5BBA228C40BC35EAE0B +620B9E90510DBD9762195207113830727F293787D784CC8B3096AAE08DAA086D3F2D02742EACB3 +7D210FD447B489559EF0641DAD182D275B4CFA7311FA695AFBC9B689CBE20DEC441EBD2D6CA829 +F3C9D7A5F0BD06082A0348E70A97A463340BFE7B8A183D6E01735C49361731501A6BE18C334DED +5FDD2E20E0DC11010983CA608F9A6AF1E2C5887707CD4E1EB02F38BDE030DD8E0DB7D9B39470D9 +993CB97420EED3C2238E2D9C5558794D1EA89D7DD24C8E426BA238743695FA0908AFB11012C071 +2ECFD83A269452B1DBE37E142A6A45E05E4D3FBFEDA1B8D3B3A8D165F24B8ECC37EAF5F56DAAF2 +2FB1E178D15C742CB146B41265017FD85A6EB653C0F69DE9EE0D5C488D1E9FCD5516F6B8721DCB +DF10E9A94F678124D6668A291B25A3E898923040749ED3458B9DDD204B196470F18DB90B3B0B0B +62F4979942FAA9F1FC00D98E345560CEA1D8C89CF7BC141ED12696AB78BC44B2483E3B5FDD8F8A +257B81175F5ECADB194647FD147826560D21CC2C1E619079C5E03D47E85014CE98E7AA57F32B97 +0F7211D7FA44C26FC12A0BD6F12604B8F3EEBD1DCB0E8959857A5EB5FBAEF277ECD1AC6B564658 +A547C9306B51C96E76D46D4878C5B0CA4ED3EA9800F9797A4B5D18D91244C74DAC07C659F3656D +2C2D9B3CC8B2F6FAFA22E74782D61492462936DCABA1363C51EBF7EEE92BA72A7A8E27C733D488 +C9363C086AAA51C07577851640AA5232FD80E70934CEF2CE74F5158DA22C7411989672133BEE50 +558A852537938BED9A34115416DB0E62A0CF53C5857C7280605EDB2DFAFE3B15A82F64A2C541BF +83903E3381468B8EB372547B548AE62E16131D0E4ACBF1575E3F609835D9DF46FED02D58C0C3E1 +804DA0DFB55F6335B910691A3F5E3709B83F3B9FA35771DA4266BD8ABA9FE7F42F5A877D6A4457 +BFC547DB8988CA6E77E04FF7845E90E7B72CCADE8A5A14E594E27BBB993E4F73FF91CFE0306C23 +A8E6B352A0DFFCBFF83E4D9E6F7C0F05EC7EEE1DA737E4E1B5B70243083FF2EAE5F5F88AE7F040 +E7D8CF58D7AD5A2B25B626B4B5525377CA40EA542236128AA40E592421D0D871A37C34FB45DBD6 +A45451B15298530EA0E1DC851C212BA010685A92B1F805547CC57D62DD2D7CD4156C420D073AEB +CF0CDBFECAA3AFFCA3F1B1B4F817DE41535B77504E891DF0CB42AEE39CA3E37E1B5F787D467CB7 +306304950015AA42A53A340AD1D7CD32F2C0D2A7EA8A7297BD0FAB1B2FD027D0FCEF35DC8A32BC +DEDCA3F3702008ABC82389A0F12F70859E5F4126A88CA4FAC548C2515A46A3FCFC3E958575CCF2 +30858E0465CF6D43D41973057077BF986E4DCB3078CC14096CE6279C919082DC237A9610589B29 +E9DC232CA680CC17DB5C545BE9418CBF16AE837E02681BFC873CF630D9044524A9F4373DF78A7E +EC5881CECB664A92123639D62758235DF94C854A740A4D38859C9386E1431C5152331D71AE0812 +CB23884FAEFD580C53552DB1D51BE03559E7129A8642AA14132AED38CC4357259257698DD96624 +76589CD1AF7D72A53A8BA78A6E2737AADE9D3D880140C3907D1C20F6819A0F6465686B6D30A4F5 +04E0488F5C8CE701D2096B45BF447743BB1D981E52C65BF78CB8F4D4BB5E1E4B0E3F48CFB19D29 +9A4210F36A2FD8557AE2AA0477683FDAC64590A3E6ADEB3E3C24DEE4ED90D8A3EFBC3ADB61346B +6E167CD20F60FD028CF251CBEAF221F423505126973808297125312ADE2F0337C0079BA876BE4F +94D9F38EE5165BA3BF025C012EF13CC89451C63D943AA2D0C40083036AAE18197E87AEAA4E6A4C +678BD07DC68D87C2B18A5BF0B371789D216183C02DCAE89A8BF26C15B6A3ACB23F406D77AD9869 +B02E9DA376F0F2299767CAB7DCD0D8330D96A43A1D70EEBD80362872616E3176C3B6CA44B5A8BC +9C0171B08FDCC575ED942B90C55470C69C3DDB7FC6CDBDCE4911418054C7C723F1CAC9646CACCD +23F594B344129B30F7569104989A986099901CB110CC535E57D6AA8CA80FE75C4A208A7B5E39F4 +019D8D8A515C0AAF8AEC711A55C6C0DAA0F17C34C3066683AD4AA6A7D3EC57F20D32E15EDCA57D +61FCC7C8F8AD61260B574593CDDC128AD465C59A785983857898D437017360192FF44E19998358 +6453672475B760A3F8F6003D3EFA6D22505EE7A12ACBDBEA47B63E5E3540968AEE5B6E7FA8774F +B5410F44F9090E880D2B6E7E7E6A7D1D4D717B144D8A7E4DB66CDD5998BE26621B9F4D7C719223 +B7A5AF8EB116AA03C6AF30FE61E32A62B4969B4429D0D101889F1BDE8EEF0662FC4D64C06665DB +D474E811F87D31BF576271A7A3E52F7990BD79E96C3B4A936E2B1FBFFD2D31509CF7F5BC739F4B +7C0216B5AE0FD8AD25FCE86B33A4D22B2D616C96AE155DBDCD095A77AF84EDC4B7979B078C563F +8588CD016B3C08695D31C8EAF1D497C01A9737F6C1AA4626BA952175B6B898FA389E9493A8DF87 +8D4A1C38C0CAEA89B225567AABA00DAA5B6F3E038C0F3198E8B5CCA6302646EB464F062D4BBC8F +A8446418626319018C9C8CA08B1C42D0714AE74E49CB33A09CCFCF7A208D1B7212C255AE7701E4 +E01D7E5EDACC772C8DE238B4DCE0C3D6A1C7D55FA9819A3570718A6732AD4746A71DACEF94E459 +0269025736DB98D2F053305C27D30D50DBACD697EA875932778F2A544C9460A942DE2DDA61AAB2 +109FF6363A5EE7E6E336394B882557F7E13F3D740ABFB291290AA5585922FDC27873A8B29525DB +ECFE5A994BCC926A5A4B34C49210279F8763281A5D91816D974BC5F22847D68DCB911D265F7B02 +FBAADB2E96FB0E46DBA70031B7D7A4BB32711C127FEB546F52C1FA36C7993D40EE93C0D4915B12 +FEB19EA6972A3651FDD1DB039B1507600477877D43AF8F23B4D41284F50621DE3902A3BFE3BDAE +B057C127605869A6FF573334D00AC079DECA898EC5E7C28CB76B23A617DCA022313B449518FA4E +3556B2335E4A45A8C61121293C3BAA23BE8ACFC53658B3617458168B3F5FDC321715AF886021E4 +AF9187E2FF6CCC09AF7FDD019556DF58061AC74581BADCA856650460E5B45C9DCCE4B4CCD18DE6 +5AE71D2B3D4F472FD56B46DE9126E08DA99B91A758BD9A94E28A8D951262F220111C3301972A7F +49CA8615AA7E7BA61171300F8E66A9BA949FAC666EAA23720CA825DE4D0F6A9ABFFF233187791C +E57E3EFC5FDE95D277D13CA6112D5934D6E27C07B614971D3AD7FD74CF08B4CAC94F1DE512019B +CF2400998F207B27277C42562C7EAADE4D090D8261C818DDDC65F65CC793E5A479F1E03E3942DE +EEDBEA85B103FE2BC309C6B16D87804C85900E39F51E96276D9BC9F62825D42D1EAEE49694D61F +AD59AD71A3EA6E53CB0C06E7916F0FA7A3BC0DA39E224ADF4F23EF2A15A4E0A56D9E38D4D7454E +CDF3E8D010A6950975E1967E54F4C63018731DDCCF5F6DA12B4D2AD4A228473E49F6EC799D1967 +B7F333ABB650B2B573F24B755BB71607D20FE142C5653358714EDEEB94D1862B435C877C80C1DF +7B02B148E8800CA3A1957207854011A7EA1AE2B831F2ACE4D56F9A2CECCAA4BDA65C6CF8CA936A +05FB76383900D5CF4CF85DA2F2D4E0E10C43B2FE280CC15C75349B170E87909E7113C3AE32E62B +584D7D350D1097EB7161C2DDA01D1CE66B622D041228C3A93F6FD48048ED070EAA88B5AE5751B1 +9034DB79FBD58D16639930CDC92B93F439EF6E900FCEDE677D1CA321B93FEC8C22B6563A069710 +54DBF7D60967EEF580203D0D4294A16C912B06252B97ADBBEA61CC04F9305A249E88B95ECD4AF7 +1F6331BB6DDBB4608CA1548E270CB79FD972293B9EF8DB393898198E0ECAE14C92293506C39170 +5CB3B0526B95E3BE6B8D3323D30D1A8933CC0C558C70D22736BEDDEFD0E5DE972D2BF42EE9E340 +0F64CA97D4AF620384797F9E17BB831776A38A03E6C719917AAD65B3FE3850EAE611B9ABF47678 +D750C0E55CDFCF90E7902A8AD5F0CFBA8125F9C35A49BF4332CC5BB1AF7E6601046E9DB0AFB3B0 +F047A17F1E3346F5B3C4E4817A6E75753A3A66FF2F6226B57788DC7C5FE3352A6DE50E7E44723E +B4268EB179EB916BCB57F3C7330323B554C5DF750B5B84563DB7248137E312AF17D2BFCFED3E7F +09323553E04E4049B05E4F8C546D198FCF51CAF6D3ED424FC973C3391D9B190E1ECAFF617B6E26 +B1F2638FB32391EC52B27D0C353B9E7085B810276FA4728E699E50BB54274130A2B290F8B2E49F +5DCDF560B56DE2A43B41ECB94FD8F4238771D8B55712DD101FAB9A58E4319E58200776583C35D6 +0EF2D7181170411BD45A5C2967D7F19487E8C2B17A5483E90316EE7F6ADE0C11AB7355BC66E021 +2BCD832EE4AD4DDDC4AD33DB5358CA406876B077CD8D4CB77D1DDFEED860DA562615F51A54F596 +C474DF3C2D253EEB1E9B85352211F2F627927893E9F59E70CD59B2163E35D0C72AEB17EE83CF1E +F47FD6ACCAC3667E5E297DEE0E7F88644054E99E90DAFF89448641620EB4D165D629A9B59A0561 +A144A1CDA31FA7C64E9003B9F66C880793D1A968FDA68159508B61D90C52DA56A5EFBB937D03EC +C3F56B7C4E58CC65ABA31D9EFA6F49D3739ED898D2B2FD941180BAB89F6BEBFA09F2AAA3F543B8 +447C15E372EC5683C81B987D492F6FEE10317F2C5FD884F813C4E281B5A7D120C24D1C7844CDAA +5CFA497E5760A150E0D22A548AAB3DDFD13429A2CE12526162A66C45B38824E56D4CD47B6FBBD3 +3D66795ACC5DCCD1AB9BA0C3D6E2AC6A8E0D14DBB9F693CAC9F3FF65BCB714253A607DC2B25B15 +1A7B07690DEB14C2829AE2D043812BDB6881EDBF658C21FBB5DAC05326BD8683B2506ACF3B637E +055E94B6141C24EA1BD6CD7437CB2713700EE829254EF783A926E2768B06545FE263663F79CA3F +D4E9C750BA92F6CB2CC44B03D679750FD68524246F4C63CAA44F8C0976EC39F782131014D136FB +96E441F9DF8DA9BE84D7A59497AF90656B9F308BE1B909E51AFE8396CD977B2BD9D6B1D248C594 +4B3F0DF9042614F333B91C3511DCBFBD6DEB5D5F323B7F021DB863F63DE2DC9A1774CB6598DF80 +011AEBDEAC09EFA9E1644FA39165747C88C8EA6B4AF1897B34E805BE0F0F89FE2B9F71F4236058 +E5FEA48B32CECA6C5C4DABD7A2EDE43E477CB3760628DCD2B64E03ECBD3D28D9A13445ACC39C3E +540D0185230D1E89750D1C3DFB6DE4DC9A258156FB559870A29F057121419228AC452A0907E683 +74F58C6DAB6DFD46FD4B7B7417A3539F5F2DD26F8FDD1723B6C4030D86C352190716EB980791CF +2426A868B756255AC3CE719D37C81D8BEECC143B623880C1AC8530698369322B6309C672FAF6F6 +0C8BB5E787447A61E79877B8405C652A5A71F85B222F724EB406A8E5451B8AB3448121430B4ED3 +34299EBF820709C1519E35803396B3DC845302F716DECFF7B34E53E60EEB0C30AFD9862749DA7C +335475A5D432D4161BEEA5D72A3772B499539CB672E9ECB32CE919DB201E20EFF2555B71B569BF +CF8B902564763EE7D559D5AA9870837679E4718BE751759A9BACCC51A9061196BE327510BA4865 +ECD5B2A3593234E0E6D198DB19D2EA74A437BA555CD8FE70BA380B852858881E83A44FDC32FCEC +52BE9A0EE93ED500F8BD0C660D0894034FAA09B92BA8517CD3D294D16EA7F0D038BFF2B744FFE1 +2817B83C7F0DE337F0527433A982B6B43569C18D8D882BC722603FD1A9BABDB464230FA2B0C9E9 +13A47D30EDF69AEB8D6737658718321A34A8D5CD33FDABDBE65A9E9DEDCA6F80ECF455DFC6A80E +28687F23D4ECD8D8FF396567EFA09929F748CE124D08360CE3637BCDD08D1A9D54EFA80EE56CA6 +43360FEFA5E987845150CCDBC23E5EFE2E3E2F571C1CD5F838EB1884BC39387CF19A0B4CAB69F6 +829987C0FB8634BF8F8424E649F9CFCD769E96A040B1CC46EBBA3B17886302C2C98D02ACF9ECC2 +0D6495C1A80E2018B1267BDE4D82C9AEC7E284BB825E6E500F85E5554E9E55E7657947879BD719 +81582946A1D6F0D70B878B5E280E49C23D3C5F176E43E1878F82210FD465F347B37041FA8FC749 +20A45B3D73E71EF44F50CECFA9590BA94CE6D34CCD4FC878DCBCAF0CF713F4AF5F54FBFF508C42 +DC97117CC92442E180E4B2307A2FF364E89BC538501A2E3526C77EC08E8B211DDF42042633C978 +8EDD3A24389AA1690ED0715F531173163A95E36E87554924FCE4879941C50214A485A26C04960D +FBD7A03B9AFCE70866723375086C6DDCB249AE3EEA17CB1BCEA611FF44364DAE6371AC79652C50 +0EDC774B75B790B204C9479F3CE3030F6288D1E2C2F9F083F990F217DD42AEB8A95933E7A318D7 +CF6656D9C57DEBDEAFF6D532CF206F4BFBA0EC53913CE7D9E2BC72F5BECDC0CCB313131688D769 +12FE09419536C188F34C840608A17BA22DC57A7DE9B758E05C3800A8BCA77F95C0842094377A16 +B80DACDAD77A3B65651CDF7F7C4550F1214DC47D6E88C006AC5D5066C3AEB2012F2E0C39A055FB +BF174FAAC6A9A28D2434E03874446E15DCE7ACE5D7BE7050390186125F0435D4024DF4B5C25B16 +719B3240ECE2B00C53EF9091E1043313BC83FB1128F19DD592BDC748E1172069E61AE8A05B6FA2 +73CD67F68AA8F783E90D042C630811A8A71C0E22A6142B17D6C2F443F27ACF59C6F4474014DCC7 +FE9257ECA7B4C46470DAC7540C34A03B7FC1AA96D6B48179D28A0BFDDC35BBAF155BBB5DD8D40C +2F3CFA7719E0BC7832EED6A37702223D1466A8B4FAB31D2D91AFEA30194B9DC756EA0931A28D92 +8B68C0E09F7940A1BFB8817CEBBB0A5A4E65CD9170014C9577F321AD444420BC7522D91672DD1E +E7517AB30B7DFF7436C75999DBAB0F7B3A7D452173F9FC066EA136998AB8D3A46AF5CB99ADE3EF +F0213AD487A7C50A07E25B5363F2C3E47B79961BC58B4FBC206F8C17D4897A26101714848ECF2C +D7219D372F38188AE6657CA5A9D5140B832533226677A992CBD205BD8A7EEB8618B6D2DCE91AF1 +8401EBF19DB900BCAB2C7146A0832A3AED3755B8906C9A0AC65CE2FE44E3DF2F68A75FD285A1DE +60FC073205DE3B4BA9ACB0E06C29D5818F55A9DD737F2069BAABC52FD9B3F386127B9DC32B24FE +9F39921778FFFC702300C1FC92E3809379FAD3189B34D98EC371F9FAD6763C81B424B0E8339934 +9282C1204BA70499E24CE718B2010FC17458D8208492EE56F9DE924FD848705969B622BB0F2481 +6BD0FF48BF235DD71BD6F61C38B6294AEE8676AFCD9B8564E36EA6A95C4876872B94C615DC0994 +D522CEEC5B7CA9ECFE9DA4A70613537A1FFDDCB26A909A0C8512796F70FCE357472476F30C9D7C +AA718917065C69D2EC1EA9620982EB4B869035E7183A71A910212F18BBCEB054B9BC7419E45ECF +2E0C600F865B44538AEA23950B5E4010BD45921CA12C0C1968C65EB900ECE26C5AF8D29D31346E +A2CA571A9E40938D85D4483DD894907ACD68738986D864190CE11362E7C50346473639BF4BEF9B +81160FDEEA602FCE03FA4ED3FC5CEEBD50F3576CDCD4F21408A2D80E265D5D607CF00CF15388F2 +C6EC9A1B47C77DCAE2E4F2F978508923FB4AF9CE6C8BD1941F66866465D9826879918CD49BBB89 +9A0B12CDA6A069B9944666479515F2B7E39F94202D4B369FAA1887EF5BF5304E8C2B2BF291D6B1 +4E656EEBD98A422438DC43124E73DED0C86F71F98AC1DEC79E65C71AE390A9D7BA0A2A5AE8EDD5 +5D22DF7FEC889A8953ABC0B0BB9898FAC1CD7B25263F7AB9DE276B20203ED2F2F43E7D52E442EA +02EA9BD77721C48D819AF6A522481180B75C940780AEF72D451D556A9B6781C45369984390B393 +A873A2E0ABAA5D91DF10A1A29E7AF13F74FC678716FAAD7523B721B2B9C0C46C358887D0A7F655 +40E317B0F9B6359CB0C7FD951F28FD77D33160CF072D79559B31687A19AE294FE3CE1E9D30B083 +F955672E43D601A8FED9C7FB8C735C681B612B327D3806794D061C3C95AF819B08515A2D60E536 +D3DAB7BF64E37758CC9209777C62677547E065E20B74175EA87DD3836D107D867805AA0D7A913C +E8201BF1BB8AA51657E08999788761B3C5747F40511D58798397D64512FFC2BE814C776B9EBB54 +9E4F5A3CBE75D920B2BE77CC141D1D26ACDD762BAD54CA7C37EA9BB718059948E6DD2C404BA4F5 +08AB7634D7F7CD84A3C6A1881026AF15EE46DCB249436A9EC02E96D88AB19180FC2D01742ED7F0 +2D7684B698AD17273CFA4164688C5B411D9E43DCA5806223040AF23ED0534A1E9D922380EEA882 +A5B861CADBE7637EFD6064E56107BD6237EBEEB8DA25B11BDF0A02569374B70F09818E9A8A0F6E +F9267967EB87CFB403D57215869D265E58194178AD151C0F774C726A2619B08515D3FF9D9ECDF1 +4A7A40F43A154D499086B62D82BA643A2742C2F9420D73D7137C20C5C9F9CBAB60278E6909F8C9 +AD368E6CA36624FDDE2E1F9DC3A76681FDC202A09CCD9FA7904BD49F29C645AE4B4BDE9433D44A +D304FA982F5BD914F42A77EE7C4338435F8312EBDE34BF5F8D805ED362C6A99440A641DDB01CB0 +CAB5E911A0E5A2935F340AE81B91592BED1B4272CC03247B1F27AB2E9B23CF77D3DD021B907460 +F8A877545C42AC468B68586F0066342AC40F497397DE037EC5F5C517146A72CFEFEC3675C88146 +52AA1A648DD3194BE106291289E0A0170FE7C1F0616A12E78E8FE112B7B2F60A623F49836F3FC8 +CFE47E820E9911C19AB297882D2311F41D76452CC9DD6F6F95B0520BA3EB394C15189F9DE9573B +85C09AF740EA834A5EEE27A0400F1E3A6B5F86D0C69F8FA26C7BDE10DABAAB8F7B3EB7071A72D0 +A21D82F17485DA6AD12BE8668D39CE0B6A4BC7B59A9D8D6A47A15F62D2B41283E9F23C35D2865E +10BFB2603A607E5246775F67A41E2EEC5683A709D02C92F4D021E07649C4C60A5F0E98D44CD83E +A34297942AEC4D397C4672E5ED5E1FB1CC51F3B6CC7E8FD0128D7935B05872A6B8D76F5154BB3F +17A4EB5BA0437DF785A63009C1D8084FAA7EB5145E5BDD31E9984DCC2ED1711A2FCA3725445AE8 +C78BB1C692F2FCAD9556C68E7C9196541B9A4F2465D16B4205E345D096E8E5B172CDB1E784B228 +0D22A28813998F653A4D47B5346C636D7C22CEBF2DBF433A8790FAE8989A18C674BDB566FFAA7A +CCDF631AE4B1B2C876E45B911CF9F4B9D7BFCDD2684553B1CC0F3BEC3624E44F023BA223E83EF1 +40D0E6D506E11ADB79C0DCDEED41894073B75A931D0DF6AA89078910D35E6F65B956AD74F939A4 +B30DA755CC42918F3E6B748F066E891F0A158DDB4FFDEAACC6E71A9AE04DDBAF899F796A80F6DC +02703C64BC7E021BC292A9684305D59CEB84F579B0BDB215E4FE8399DD885C8337A6ED127AB50F +E2B562EAFD20C841E7E5DD1DF6993F4E60B59C6FB2B8660ED942D360C5DC9D48A9ED8D9A08BB4B +8F7D51AA81D0F6B5C63E3633EB4A8DD8EE07E99ED5A455B6D5021D91C154AA57807357D477BF2D +626D54E365DED3AA67230CD8FE70C51E3EBBEF88FC014AD287EE77170EA9E47828271235BAA930 +087CD8749F3528C7C60AF3EFA55DA68C6D3B166ECC7B0A88E4077EB2C93BC5894EF84D9BACB493 +203015DA8CD9EF106CFD123E8057AEEA2454C9651D312E4F6CB7CD12BDC1DBB475A1DC725A21DB +FB24F55AC85BA2F07531B23ECC411FB2B0DA6B7379F3BDED7DF2F412A016E9905865ABA4274EE3 +1D932014FFD8836B8CD636568CF0BD2A7B7D4F51D716BCDC50D56936A297C0E7807674BCDA480A +1DD90412EDFEB4F18016E5A5EBEF885D3D33E2D925831343B0CDD184AD9D9779F0F50805894776 +3DBFE9EED1AFE3FF0DE7D8691104B4155821FCEFF8D0BA9F35DE1C39B063394E2F76B0245555AD +78965B301411E1D93B5D7C2284848B3CA29776059D9AA4CD2AEE88CC0007376C6EDEADA2DD1CA3 +F5293EE8E2C9B0F1A8F5EE9D009C63589CD0A7003B7911C254B780C8545203165601845624AA95 +2519CB7F1A1CC004B84458A19C7EE68FB249930A268BA05F34C08FA72BA4E4E6919EE667DC762D +F206E8BD03D6A1996887DE81640A2BCEA4052FCAECEA52900A9296A4A399F7ED0C3D7D3852A897 +9F339D42D32911E6E119BCA337B7F09F2BC74BDE2B71113C439397481A8A5AB3EEE1EF9A2DD798 +E9CA52E836034C536C07CD377259B9B72FE7FE68A1FCB8D4707B223AA693CCEED0AB7D97FDF90D +84DEE522697C071AE0EF306ACBC192AB9A9FA397E6CCB97F42FBA37818A844FA045AD2BCE7AD5F +0731590C7A26AB951EF94059198AEEDBDD869096FEDF9EA55D22C23EB6E4ABDD469B3155CB9451 +04C51EA9717EC395B7BB64E2E4AF5D31AB85876028BC78E0CD3BDBDE214CE56F5687B3009DAB8B +0AC6D75B13752782F56C590AC4FAAEB6DA1462988BD69173190F7A486077BB49CBF5FFF612B0C9 +57474F5401B8B1E8F240EC3F20808DCA2F9F2D810A07498297DA66D9AF329991DAC432BAB46C01 +F1B17BF8DC6FFF54F40397026ED09977520A41BEB1411F9334E8CAA93E5CBEE598A88A01B25601 +8E529F173153A67AACDE4A8296BFCC5B88E6E20B29D083889C18B4D38418B12F8F3514FC95130C +58A0891AAF8A9C4457603EC6FFD26F0E1B957E783D4F309F4B654980C22D29CB8646C104621282 +BB301829676E5F3D07F090E172F9A74E9E36103D3E7FD4D7AF0F6AFABCB9A21250BD6E07A1AB03 +66719B2AE6B8B98B6782AC722DCCD0DDE69FE9E39293130A206E9CFD64184A589C4893C03375B7 +D7094CAA426EB2DA5FF79C2DE45F5893EE2AEA388A2AADBAE87FF70B629F304AB0D81D41F44352 +1FC0BCB558119C9FECF5C9EA1A876A0A06610CCD279BCCF198AA606A2F4554880BB1BE38A91B55 +48D503EE76A3ADA011EF1B31F25B3A6FFC1A6C6544431CD1E1DCC06789C88584FD1878D3F5F565 +3B6FBB4B5B4795779F976252E9F3F09A482F9C8DF00B5EDAD6F0BDCB811E622A4FAC70FC0D6F6E +37625FC077D143C6AF7E76280B45F241C2FB62951447F84012AD8401C0BB7B794709B48BA3FEA5 +D85AB7D9875320A13BE8934E8FBC8B353DCE93A16979FE3A97D0E9A8B5D1F7DF52C6C18F60AC87 +C8B17DC80235023652ECA4275A901D9468AA7766128FA157DD051060A62CA5EE8235E79CD8D5D2 +B651066E2D8481A717EC08FF985BCC2B4B5D4BAD6408B0557285903F26BB6698710CEF6102230D +042EEFD6069623A5003CCBB8B71F6FCA85A88347DD13459AEB84EB4802ED2ED98D02494CC9CEE7 +FF5FF87319C591C72CBC3F43DC7DEE2BCD0E96DF6EE42949CAC9A7B7CFEAB55D3473DFC3724105 +81D8C7CE893A1C374D933FC9CFDF462481D98FCA27085AFDCE8CF359E127DCC1EED7B558FC6980 +813EFE260620D7A7BAD331651C09B2C7F5EA13A7D095368B1453C7E14E6F6F4C99CEA3F3F51256 +77A448D040F2D496616C86D2F6774F2307163FF9C0AB8AC88B20A6023E60A2C8B63E1BCB6F59A4 +2D24C107DEF5875E7EA1062646DAC43CCE029F56E91A49B0BC6873D1796DDF7A0117ECC41DD4DC +792B5B97077E2AB5492876A547074A73D404CBA4B5C0FA1938349B7C156FEA5952AF7DAB0002CF +84A92D63E38C0ECAF31FAA2B2A033A3D382C3A4416F554E4E00100D122B2D75AF0BE42C42C7B1B +4E515B81F4EE8D3F9C39796A63506223415C2A55FFA26EB9E28ED5EBCDC5D2E83A3B27DFC8B6BA +8DE74DAEC630AE7BB6DDB12A42C1F666A05EB18665EFC68FCE7DE3820485FE9159E35EB35E2932 +62FCF5712BFFEDBC974E5990BAD0D64D820564F54324323B31ACF948B3A27F4AC397A958864268 +5F86D44EA685BE3CBF1DC01C293397B8E3E457F619D8B6A85E75D838219CCBABADF23C0E4434A7 +787DC52DB315BAE832819F2973F11C045A4662F51256BE3967C3231CF42AC7DD045786B27E377A +A42DAA473A697EFE962CEBF368F10E0F3AC73EBDDBA259ED770D8E43F8B39175BCFACFD1E31DB3 +88950902A66926774EFA8EDF9649BD8AAC64702EA9ACF5717B5C91B4C150EA2A98CD128235B6D2 +645FED4EB709C91D4F71F2E3B6B971A378A7B3499773293D47B59AE87AA1F3220CCC3022066508 +5965385DE8031B42CBB2A2A0FCB9A038AE2BB898991A476373CE559ADF3263F47D6C103112A5CC +E3EDA9EEE4C24079F0EC6F88E9AD54D1629606C97F6EF26ED0225718AFAEAF1A21C712315C03C6 +9B019D238C17AB4FDD0A52E840E28C6D83D6DBC7F04051CD5F8A61654B3037FDD8388C222A55EA +4A423F99635EBE452DB660388127204288A88BA9E08B6C31F92960CB9B7557CD754A3400D48F1F +33EB9C6E820BA19A66FAD15A086EEDCEC0386DDE30E8FD98B3A63EAD8AA52656EAEBF9D3995C08 +083CB2901C8C04E8CDDFA28F89FA371822652E71531782D1388AE97BC059278DCB3DF5D175DB21 +FC34D07B6D3DD38F44E6BA13133D6E2D54033C4A77F0A4B282069477761F5DE689F4EA7F734BB4 +5C0C3AD0198A5C9F9AB087A38A0F47BB85CFCA1DA6E818ACB5B1D9B322EA1A67681427A2E92A5A +72E27208D406D2F24CD583EB914DB7615EA17B0F471DE94AB404502DA4CC394ECE88024B6AE998 +CC7FF2D1383E183DD4562ED30BCC8BB6ECE442449BBD57E546AE5E6993E2993A9E0E49784366D2 +6A0D3A301F81AD2413F564C4F36F7F8CB3F01E1BC0609F9B6CA4051E30485865768C9CDFFCBC7E +8E5A91904F43024638C4D70994F32D75845F9F865E9037491E7AA0877ACEDA00AED81E74122F94 +BB270ADAB594F5055D2B856F9615F1EDF02AE54BEFF75D33F53589F82AA67139C454ECD8077C8F +53509A3151A7EF94E80BF03F881A0553D321B41CEF83350CE9B40F8CD187D37F9B0C0D7537D498 +BBF7ECE55A8F58FBECCCD0A67EB9D86889EAC4E61CD90C40992344C0D79FD1C8ED6D7272B48406 +81B99C5A06266FD81B0904D89F1CE6CD26D9844358263E5385CAD345FFD28000BD449B1391BEAF +FEB2E5EE56A63637690F48105EE0102E398868DE9D2CB1246234605FB2A5165085370E4EF4481A +DD0BC5214BAB5055AEF44E54A56E884F96CD9DEB53F44D2BB3D29839F3780655909B8F5968B491 +83E5D0978A1D3EF4A15D97EA1D3F1B16FFCEAE52E18F34BA676F2D478A5CE9EF0EBFFA5E0E8DBA +AF563359E5B0E1FA0A861DAF2F664F78B338999DE20CBA9DD87A91C7FD06E12F3FDDA8EA27F945 +DEA14960910D04FDE66293A8BFDECBCA8F5D1267CCD28B5161C89CEAFCE617CE08496BB3DE963D +34AF77B9BF7533C46F910A673D6DBC905C11D166B26809AF418B3A8CC243E92F7680B1B02A56F3 +355FB37EBD6F1CF721BB8B55199F04707C9947CF0747A124D6136C18091F700C1DAD3F30CADD8C +AB54C79ACFDFD261A443C3221174F869DC157F61E198A69E6267C9B48E78E907CE5FE7FD4B53EB +9189094E0EC33829F7C27C6AE1CC732C3D191D522CDFAAD023A181FD7B5694F0A65FCC20F51570 +95EA8DB3323E2DD26FC06CDCE01EB98A5ABCF0DF84F3A14DD67EDC748193627EB51C8F6692D45D +C830F3EF7C823BE662184B79F6B523D75ABB3E83F0BD78369669A26728BE6B6709A835C3299A54 +25D05DDCA7CB954F4B325CB2E5E6C28C50C59EB0163915521956EED1A2B2DB82B22F7A1B9E9CC9 +F40044CED31C72E9E85B0244EAEE92EE90CBB3A8620A53F805E9A20A6A0FBD52DE2E75ADDBEB97 +3C3A794EF204C634F464E0725FD33E8146D31A976D305EEFEEF70DACCA2BE227A1689BF53D61AB +CA013B235A2E921FAE0BE489107B223E99209B7CAC5355A33F2F8C04996D075E18007DAA3C1319 +EA66E669C4198838FAAC9903B074510749D671308C9BCE1D173D6C296AF100581E501106717F9C +59E3A29537A16D376D9BA8DA51C3FCAB70B0D0F61445AC05758F1B579DCF0B5CAC6738FC4C47E3 +6F5A3A27AC9F19045BE6B3D5482E2D30962C3141E12AC96D59E6D43448F85D1999A39827C3DF8A +933571A6585DB257603471CE0C77950F8A7D3C25FD60888A26F6CD77281BFC5F4A72394ACCB7C6 +A9894B6015226109D1B043004363DCB6CBE56449917861747F1828E6DB19F835E328524A69464B +60DE76F08CA1FEBA7DD75D78778CF64F0050E225DB6A44C785592459BF38CC075ED97583AF0E17 +EC67B74D752E580533F98000A39CAA0A3DEEA46B89D864E22115A084F97B5B0D3A050AB3ADD338 +080096BE5A156EA956947EA2B1BE6C357BB1901DE7FCDF02D78B647E1FEC144FF3C8A7711A894A +1E7D849A60E0860EBB256E15C5C995951308CF30F1A87E8D3E678421B7537199E27270B4755DB5 +536CACC90C4772CE0CAAE1780BC54ABE0C3BF2627B64451DEEB875362F3B47E95577A80CEA03B3 +C6284BD3623306A66907C6EE6F4E16617783DDFE3AB55448F80A97E8D5CE6B73493B8426DD163B +96978D8052FFCFF0B0CD91F1D366FFF67514F92F6B1FEE64C3C023EF905C2830BA7BB7CDDD8532 +F18CD1BC5EEDD4E57FCF043625483C58AFFFE5EE5159F1707BA49760CF3D6900B2A6C9B64EED82 +ADA8F0B96D7BD624A1AD4B3DF0118E86B98B46D72A0744FC895ED2248618E6A349C51A44A89C6C +BEC27E525FEA388BF4A52D963AD520CF9A768B8E1BC6345EB434013BD9FCF6FC5A309CF7953DF4 +E6A92DF3FBEF92FB1A4A7FC4AACA0B95F070E908AAAF4738227375A3FEA047E3B4823BA8FA26A1 +F497936F94ACBF1920E2C18099F154F2D74E50A5FA623B2048920B7E0AF9446EED9C8D4B737AAD +85515672B6AF1543E5AF733C178FF90B89B6EB1E92162EAA240B158A78652680F3509F9C1BB21D +EE46DD3B39A2D17029BC29E260AB570B29B02624F152F6D56DD4F2FE3DBB352A3CFC4AC0534F45 +E31ABEB8C099BC8B7B829F6C7D2DA0C2B9D58E22A8A8BF73D9EB1CA278086FC1FAF212EFA755D2 +96C938CB7EE5AA4E007EADC88E7205FA0874D44B769CA1E0D757968A39FCF4F553C14DCD9B34FC +5246D3595625943439F4F876FB6A52EBFA06056850F5C92D434FE017FB3D4B0E9022B2CD28C3EB +95F084EE99911CE955B5B93196BCBB65C2699A0C942A998F785A59B43C8F8DD87BBA6107854FDD +70B3763161AC79C7CFF4FA36EACDDABEA6F5CE84567AF95E389F9C2CE9E972B540391F167369AB +CECA3C3D9967D41DDE6F455445D686B3B8223C6E8727BE334A73EFD62477DA3D89DE65F3EBF81C +4DACFC5CB89587AC9267B8670AAEC340FBD51971A3323B17978E110745B84C5E6FCD74E132BFE2 +19BA1D812A645002FE8827DDEE54546099B47E82F3935006F0B44E174B675CAF24A8FA4CE10017 +0F34E1914F3222DD851F0A874650A14866DD1EFEC6A2D97969F4E3DAB9D449AC50B5E4524BB5AB +96932237FA7896A5284F85E592B01D20C761D35BA83B4945F5608F30A77A84D918B6847516F96C +F351874BF52EFFF38ACCE88174634AB0338A377E99BC3136A0600362EDFF0E1D42F8C5F984ADF4 +AEA2463EC1B3DAE2A6CF86CCC2AA846C7EF31653605619C7D0573D27F914DBE344E5C11B697154 +347E09F54C4108A1D71FA878E4B07D35FE056DFBA2D7B99C8F01134CEEAD849AAD3AF0CB60505D +519AFC82A4BF5B342575B774D88173F1BCF2D914026D3413FF187F9C8FCE3709CF0F7E9A793483 +876A4FD3F0A29DD8DB7F470E88DFEC249A91BACCAA65AE26EFBC9CBD550A935741A5501021B9AE +064596C775BE5967FDFD3FC595EC5CEC2F185EDCF11492E76C8EB22CF5C91BB63E9AE2649D8A5B +CC7A47943E40E3B473EB5E792919F03F09688B71ABC0B0E2CF64E1DD286236360F7EC828CECDE7 +64CBEDB243828139AC4C72378B3EAE67D43CDCFB95DFE17DDEB6C2354FB8C52ADC0A666C40E2A0 +4FBCD8C01936F04F1A983B68462205765CC6E782A2F459C040958CD16D8AACA06E1A7BF14BA6FF +D570675A54E431B2D2CE78D008F082693123D18E1C3D27171DE5940F63C3FA5480E80B5727F684 +EBC48DEF479E345D2C9003481AE5A7FE20A1EB0CB422FD2BA07A3208901CA8D782DA95F0A6DE2C +CA3DE689C498A10CB8E5AF0A2203C5C147BC17BA14B4C59A34B9351321EFB281494423D0B784E1 +622E2F3EE7591A23113B3B90D34D824549B3A0B513B8BFBAADA9E1C4879251BCA93E6C40A8731D +19B411F1FA3C3F3BCEB63F5B9B8E868D4F0B966AA867EB2D4C301FE6A1D35159B4B7BAF8227D6F +F7A86BBD70178E4EF798799F4B43E296A889120BE0828EC211A38BF5A5AAC3C00494B0AEE6ADC1 +B8FF56733A3FAF015E6BA38FA59DB63FB3C9BA355E5F2A555903E4A22F2D1F26AA89C21A623DC0 +F0D8AD654C3FBC752FF21C16321F5027B4353F6C12FD340D272C2D4F30ECC9B58DC4A42F71B954 +B2764E077E0CEF1FDEBA5A6A8FE14F3AF0122C0918DAF87B157BE507BBB50DA1F208534607D906 +D45CA3444CE68FCCE04739262BA5B3B0DC0FAEADD86FC94FF14548C98592F91F89948A173B76B0 +8D2F3F845DD251F09AFE656F69D115157309D537E4F663CAFFDA726A5C62DF8EDE1EEC7916F86E +CEF600BA02901BC5A56086478A867024C58A4D8A631736FEA04F09C9DCB4B3EEF89A0C5767B3EB +8B0C2E5D08974638E79EB2CFDB509E0948BC42E1A9A29DDB09BD44BF28186C3C5AD4629D7B1396 +610782E464BC4EC12B2C484F01250BCBBECCEE474F25DA98AC82583467B62D51689EE98AD2FCB1 +AA13D44BC1CEE4CFEF34D37FB8789AF5BFA59D05D15449332B46347A7CD1F0791D48BD563BA6A0 +876C8B00496E3947C0ECF78782945109BD9306030CBF511C2B4FC1E28868EED9E2039002C98F20 +43828EBEC486919082BE71A7CA278361D0EB9DD7E21AE9CA80EFA147DCE160ACCD39924F45A821 +D89721CEAC542ECD09E76ADD11FB1710804C63B1268FBC89CEFD28314D9D3AFC26FAA897B3B7E8 +C882C4125D3DF9A67E2DE27A0245D4FD9075DE5D7FCBC8E48125D8BEC3972FFE5F8ADEFF1258C7 +5506691E5DA81359C24A978EAE086E7E885D8151A515F15A475FDB038946F7D369644279C2186D +ACD69FFD922EEB5397F5C3196548CE35D6E35C4DE6D95BE566665E4E0EE11EA43CFB9D0133B5E9 +D2A6656AE1861C158AAA97C48DD426205842BBDFAA90DA4D5EB11EF29C24898D9FE9B29B2AB913 +2A774418F0190C3D0FA29755168BFB149E0066DFD3BAD7FC405B28A27B2DFB2A356CF6F86ABFC2 +18C7E164F6F0D6D4CBE011E77EE8A045A1D1134E115D730D944CF34248C1020E15955661DFB6A1 +687CB54FAD1AD759B7EB209E6A78B4F3B4F049258E799B6FF7243B26B573D2B26AFCBC36324E2E +9AAF7206D3680EFE913A6E9F4CC8CC7FE5FDBE60D262D378A123D8BA928CDD6651999854F3ACF5 +126C00179347DBDB34954378AE5A08A690A98413115809C95A6142A662DDB89BA25B6026064A6B +A7D85963FB4D10C0BA1BCF3E73CD597D99C4CA47CEF4692A0EA5DC89C2A92DE5630EF15819840F +10FD394BA987AE798BE15A61AC464345E203B06A3ADD25E1607F9C750887F5E7ED7F2A12109914 +542CD396392738C7B7A7DAF58A7823414D648CDA083CAF2133CBC0318CB11464411F85B8FC813B +4D07757D3989E1E5E063F2D8E07E50BCF85811766CD79210C6AAFAF085C74BFA3DA37B45386A6D +C83DDCFE3DDBA6B3F999F91406D35374E60CF88F2920208C1D2A162CCA6B27984D905F3C271524 +1FBA18949B6684E3433019D3C8B45E454C18485E54A74D196AAF9636E85D179E1B5F0544D09BE1 +8855F32091CFE26A425F114C556B995935F821D811E0E5CCF779764DE6EC47256481B25EDCB409 +E7A1FD2D72D6B5DD56EC9D4474CD5A9660972D366649D840986AACAA04765435F4EFA7C513A10B +1B67FBB112BBD10490B0BDCF5E5BD4F80787E43895D4EAFC807CF18103A4EE315EC4B71BBB6022 +FEB88DE20D8C7E0244B95015DDD03CB93417A691CED38B37C27BD1C510EC50E2D82C5ABD32D24C +29C30888A2E889D0EFC93945681CA613478CBBB222810C4E4478915E598628BAD3A8E31402C1F3 +4653671CAFFAA244053AB7174E8576085F90019E0DE486014A115F88DD9DB9B10E91F129DD5A6D +00AA208459CFC5A7A2BD1095DF24BE5DCBCDE96D79E90871084AE04C1DA8DC2459FA0E191FBFFD +EA46B20240E40B6467A2455C72427B119BBB07C5725B823C112E734A09D07970748F0D0D969B75 +1BAF2451D346FC2C56122EDDB88287B1042B9F24C933F541492D0683DE0B0325AAE667521F66A3 +27C863F4AF7F4A937F7BEA60B5299FA5D170F9413A2E6EF5EF70484C0D861EE719126A942E0262 +52279876430581F0AF1841719DA6E4D8C3B932837FBDAA3FE08C18E1C89AF300E3AD7DF34FB439 +9BE9A757C830E18699450B98B49EED738C09084CA5E06DEF86BC58359DD0D203FFB11EFEB043E3 +7B184DA9B71C1AB17A9709FFD273432A34B3D924CB2F29BF5DF84596AD447A049E3A451131D660 +57FA9D4C24BF824D43DADBA7D1B2926C9CA62D8AA8C29FB2D00B0EAB7322873FA5F9E2963EF721 +6BEDB2D97548F6C40E233B25CB3785258D0E7FC096ACBC0FABACC39DE29BC0E770474A541D87AF +69D3B8E9BFF00AF11DAF9DE908EF674079C7975D7443F30FE21E02B73FF15FD44C619EAA8B9BAA +889266458C136A3A92E7979EB53A04EB00 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndResource +%%BeginResource: font lbtr +%!PS-AdobeFont-1.1: LucidaTypewriter 1.001 +%%CreationDate: 1994 Nov 12 10:47:10 +% Lucida is a registered trademark of Bigelow & Holmes Inc. +% NOTE: This is a partial font in Adobe Type 1 format. +% The complete font in fully hinted ATM compatible form is available from Y&Y +% (508) 371-3286 USA, email: tech-help@YandY.com, http://www.YandY.com +11 dict begin +/FontInfo 9 dict dup begin +/version (1.001) readonly def +/Notice ((c) 1993, 1994 Bigelow & Homes Inc. Pat. Des. 289,422. All Rights Reserved.) readonly def +/Notice ((c) 1994 Y&Y Inc. All Rights Reserved.) readonly def +/FullName (Lucida Typewriter) readonly def +/FamilyName (LucidaTypewriter) readonly def +/Weight (Medium) readonly def +/ItalicAngle 0 def +/isFixedPitch true def +/UnderlinePosition -100 def +/UnderlineThickness 50 def +end readonly def +/FontName /LucidaTypewriter def +/PaintType 0 def +/FontType 1 def +/FontMatrix [0.001 0 0 0.001 0 0] readonly def +/Encoding 256 array +0 1 255 {1 index exch /.notdef put} for +dup 54 /Aditi put +dup 35 /Ahmed put +dup 37 /Alasdair put +dup 39 /Alessio put +dup 41 /Ali put +dup 43 /Alois put +dup 173 /Ammar put +dup 47 /Andre put +dup 49 /Andrzej put +dup 51 /Angelika put +dup 53 /Anton put +dup 55 /Ari put +dup 33 /Arne put +dup 59 /Art put +dup 61 /Ayman put +dup 63 /Barry put +dup 65 /Bent put +dup 67 /Blair put +dup 69 /Bonnie put +dup 71 /Brian put +dup 73 /Burkhard put +dup 75 /Castor put +dup 77 /Charles put +dup 79 /Chi put +dup 81 /Christian put +dup 83 /Christoph put +dup 85 /Chuck put +dup 87 /Clovis put +dup 96 /Curt put +dup 89 /Cyrus put +dup 187 /Don put +dup 255 /George put +dup 189 /Heinz put +dup 179 /Hong put +dup 178 /Ivan put +dup 56 /Jacqueline put +dup 57 /Jagannatha put +dup 58 /Jan put +dup 60 /Jason put +dup 32 /Jeff put +dup 62 /Jerzy put +dup 34 /Jim put +dup 64 /Jiri put +dup 36 /Joe put +dup 66 /Joel put +dup 38 /Johan put +dup 68 /John put +dup 40 /Johnnie put +dup 70 /Jon put +dup 42 /Jonas put +dup 72 /Jonathan put +dup 44 /Jorgen put +dup 74 /Jose put +dup 46 /Josh put +dup 76 /Juan put +dup 48 /Justin put +dup 78 /Kamal put +dup 50 /Karl put +dup 80 /Karlheinz put +dup 52 /Kaspar put +dup 82 /Kees put +dup 84 /Keith put +dup 86 /Kenchi put +dup 252 /Kendall put +dup 88 /Kettleson put +dup 90 /Kieran put +dup 92 /Koen put +dup 94 /Kristian put +dup 98 /Lalu put +dup 100 /Leon put +dup 102 /Louis put +dup 104 /Luc put +dup 106 /Lunjin put +dup 110 /Malka put +dup 112 /Manuel put +dup 108 /Marcy put +dup 114 /Mariusz put +dup 116 /Martin put +dup 118 /Masahiro put +dup 120 /Matt put +dup 122 /Maurizio put +dup 124 /Max put +dup 126 /Michael put +dup 177 /Murad put +dup 91 /Robert put +dup 93 /Robin put +dup 95 /Rod put +dup 97 /Roger put +dup 99 /Ron put +dup 101 /Rudi put +dup 103 /Russell put +dup 105 /Sam put +dup 107 /Sami put +dup 109 /Sanjay put +dup 111 /Saroj put +dup 113 /Saul put +dup 115 /Saulius put +dup 117 /Scott put +dup 119 /Sean put +dup 121 /Sebastian put +dup 123 /Shuichi put +dup 125 /Stan put +dup 163 /Stefan put +dup 171 /Surendar put +dup 188 /Vladimir put +dup 45 /Will put +dup 247 /Waldo put +dup 215 /Wilfred put +readonly def +/FontBBox{0 -211 743 940}readonly def +%/UniqueID 5054489 def +currentdict end +currentfile eexec +AD776B2EBF901A49F071BF30E3DCFAC47FA0F916EC503FFC9EFF58A2E5E6ABC78B442C3E49096A +372F9AAE7622C3ECBD02783028DD91D32C0749B44F46D712056235A4901EE1E3989B3DC1451624 +40AF8B496D8B010216C5D0E3D6D7F34AED88500CEE93E2A4889C2FC011056B0222BA09F5697B86 +A1350BEA78ACFDFDB589C8D82923F5F8AD8C1480A7D7EE8ABF2004A86A75BE914F200B220B02DC +E0C7FDAF4B89502B119D1FBD3035453DDB3DC564DD8289E85D637884AFEAAF7C6FF38A32C70EF5 +C1B638CB40003001895712A251C27020F3B8D9166E77E2A69E1FF83886E0BE4327AC9142301CA3 +F4DB60613570C39367B465BD2E11A593DC63EDCC1810C1F5EDBF099DE46A7BC166F52311BE4A2C +DFFAB7110560972AD364AE5170A11FEF4E1FC57E896F7B0FE2389F3BE19EB48DB67AC766314064 +174EF2E1412F25E41CF45CB6990732C755064FABE454F1B1D5EA703331A09A7A9AF323557024F3 +7B24CB30C52216514E014870A174249B7B1C05638083915C9B633E3FA00DBA2DCCAD433B078A91 +E405EFD2CF75CEB10E524FD95A2BBFF9EEDDFE3016F6C2D3E901B81B723E4F422A0B1442A0E63C +CC52A0E72EDB5035D945A2FA1441886E56D2B10A7B5950BAB79A9653CD37F0AF255B3850E1ADE0 +9CFF282133A2E30770C76618F58007FC51C72485EA377798C5C8A00DAB46815939973C8FDEBBC3 +7B5C966BEFCE797755B7E73A5E55CC69BDAB56C7E658C86B8FF147630B6D222993D3AC6AD4542C +078835BECCF377ECA61A10F66C41ED8379C2FCC2A5380AC1CCA64D05CB08109D76CB1901D00BD5 +4761978C3481B305877CEBCD436944FB66AF914A1C8D2D125DB01ACAFDA9A8F71BA3CC83FB11B1 +6ACFFDE43513DF984167288E886247E02501210DD81ED939D5D18EE3EB3644D5EF61D2BE58B7C8 +106045C8A3684AABBF8EA6EEE01208F99F865E297A03B426EB16D44B34467735A1FECECEA719CB +F2E24F2A15395A18EC4F6A3990D9EAC78BF523D5911AF11C3EAC620D859B0B642984658A94897D +4BA3F1F622F2DFB6861BC85CEED6172393058E882721A9B3D2E00437CF7FB8DA4D1EC8CB1217E1 +697149B23FB1BAE92A7E0FEDA0374AF59FF5CD141426C498D2749C85FA6E6E2DD07EE3FFDCEE86 +DC3F0225A5EF81DAB98FA26C89B1B020F884D485893B5EFD6019A149D82925F3DD9694A1058065 +EE57C94BD63E5DCEF57F5C3C850419EAC7C4BC2FB81A7D0BC322CB0F88943A6F507A2FE460EEEF +A17DBA7B0E7493890299AE86ACE258EE4C7EBC2C9713406E365A5B30FB045AE0163723667C9322 +B05319D528C8C67AAEF79A6C34459311764B75BC63AB5165F831F1857F6B1D6801E39931FAD9F8 +8B61B304696763D30C0B58313D31CC287EED59C97397E8C0A748426DB6C0B7C4CA57A43E7E27A9 +A123734DC7EA137F307B9C9074B908E53E60F99E98CA0DE14A5D61967727709E1CB009EC9CD98E +9D796CF35B7B1FF2536FF8CD9E1C24B7CDC0E89DC29BEB398CB420DEC645001D90D59C7A5B5E33 +20425FCCFAA23ED880C41BB82A8CADDCB8B5BDB1D57F414F380BBC00B6A8B9591B25AEEEC69B64 +D671A078F39369EDA9E5C9FED9D179AC25F37A4E4D1E438B180B24D851812E407B242F932D9D07 +EE2E42BAF2FE9EFD338345C15F1C8329E91644DB1EA96E6F45871D8EAFF292286D7A70281381F5 +82CF13F5F987F423463C2DB96A23D3D9CEF5B4636A092BA8FC7C97AB42BADB4DE493C0B0A54C81 +82650C094D0B4591A2891949270492240334842911DFD640AEB2B5CB036BEEF59CEAAE37AEEB4F +4CB45AAEDEBE062358058A0D697972BB11E9F30ECBEAE599E404C7BC4C93FC3C2A604CF7F9183A +96962D3D0F03FEBF8D7A171E9537EDB0F8769AD1A442BBEE6F003B87F9EC0C4DCAB4C1BE74EF54 +73FAD92638E347980505361CA70D6A28EB18E83ACCBC73C481D4B81F62EC2FB250696E436A8788 +2728E8E960E09A330121492079CD349F5C8FDF0CE6824495FB17A3A97D7C031F9E8B50D10234D3 +C02792AF0C0BBAB393968B49EDF5BD4F84D83DDB9500A9EAE7EEDDA7CEDFC2A6B3B71F885487B3 +31028361BDA2334E83820C7E73A67B200F8E08B742DC3BFFF6E363AA1EA72DB7CEA77826A5D024 +68C8B19EFF5F8ADEFF5235AE6AA50F43C5F2EB56AFA58470FB2CE038D35DF1FDB5135B8CAA9F3E +F27BACD9D828623636044D161009F558132A6B6DF4AE9CA3EA9DCF94D961D7CB962C4EA67E887F +B9D7A3C5F91166D41C8427A1E0C8BA49C21E968D52B92BD7E7B1F5B1800A27F3F7321E3D200B77 +98D3F4B0AC1A396BE11D0C919F55CD8AF1406321E8EEF169B785AB38BA5AA61A5EB09A9F312697 +92D98DE98AE49A1308A5706738125DE51C98AA3AFBBB10124FFCE47F72BA6A1E5D96FB5BD8F989 +D1AB41DA7C2C71FD1C02CE697C81A0512182ECA66EC14CC8E473378FA9EB3927BC9EA91B1BBA8E +0C70BA78B1F7DB3124246AA9E4E349421623DC408D756578B11218BE2D6B613186D1D094179200 +8960A7F1B266D7C4DABF9081725EF2E5806AE27E5D8E81CC7B98C9CDF8D319208DD7A75C2B0B1A +7C13DE5CA9912EF40371D9F415840ED99AC446E1EC958001243B0C39641846EE67E79217DC6AF3 +02891C024119B55AE58D14B28B68225733BFDA7BC4D54EC2EC58AEF027BD34EDDDE2336EA8B34C +63EAACC4D255340CEB8166FBDA86587E207C06C6F804C366822435388ADD4BDCA7E345DA3C3912 +16C19BD9F424C5C5596E3D1BF1C6601D5967942070320981295BECA7EACAA9017B29EE70538768 +5DAA8B31D815A53E446EEEB107B369B824C97D5730A4D28ADDB131FA243225A69DB5CC61C9CB21 +018510F1930F3AF2AE3987D5110BED80CD8B6BF24998AC07DFB9C648B0BDE300DA8853FCBC3C4E +C47181B1665670E4809D03B0FEC298D1E22937C45159BF0E1C3278D727E40CD00A3DAB814D16C0 +453C20F343C8767778E20C3E12A9C0F30CF38F782C91B678FA8B73FAF9AB8337EBC636E05518DA +74C57B6696BAF384BC34CF1F50DC361C2E745A9906DD87BB93310DAEA23BCD0AA967E8C062EE03 +F573B67C6DBA52C3C78E4A6BC9A879A97924F26EA053CB90F1AE4968BEB209B7496B99E7102390 +4591EA1246F12A2B401C36C3D585A3C3E42E95316D7B3BB95509256DBECBFCFA8182EE874AA624 +B74C146E164A7509867514349FC6ED41A0EA7375C81E58CAE6AFC5524E4506458FDFF6B6F94A50 +18BB41CB3BFFA90AC6A605B372714552AC2CABD4BBB9400485A50E1122F69011BEFD2EA53EF4B5 +4DF3481CDB4F97F8BBB549612C3EEF4E860143EB2FAD42E5B9D5913E53DAE0B3468B191C8ED4E2 +4B5E8CED287E7012FA0D16B8019EB890D9A8BAA01629B0CEA69402973EFDC1618CA995505606DE +DD18D0474B4E08F7FFE947C323A138F944A950734A4586FE82A08B7C2967E67BC975B875A2AAE5 +05935906A0484CC6C2478EF1EC03E885D86CEBBE5101101C11B7B8165E132D2B427B8583BCFC89 +85A7BBD5B56D12F8C11796232B430613A8B4540BF45C97B6067A74BBFBF64851305257D1BEC901 +238A7303E12BA887117301DF80559342A4B551F8189E9DDBC5251D2D384831269A092ED1971292 +2396105767405896450A1F07F6B660F4BFD98369836EC514D418E4ACD93095A6AA2C44D0912217 +F48B92A5D7CA170A6293B0A4139BBBB39131E2B6F5CCFACB550AD74DCD4D466AD9AF69A409D09F +5ACE8C98851C20E19E4D44B1DB30905B9BE08AC52E0A1548793C591CE0E29DD2B102756822B36C +6E4BC505003DEE549BBAA843BA5EFF252F0A5E4CF14D1EA86F46ADDB6EF52427E0B6E2861583D0 +885196B68E53D9B72793100CBAF160F7ABAD3A8E2887D078E7F78FDB1437F0A58A20C7E300ABA8 +031E30B35D34628DF6E8A9689F2C5A779D51D6B673F38730E2C28CD4822168D037138B5DFA7A66 +4318B681D41864AF487BDAC6E635996D21C5EF1D16BE5CAF809C6E34AA787121164292ACFFA289 +15A115A11700B26B0BECD9B05A4CE538438BF67209443B4ADAB5BBC40F9F354A90CE53F0C24AC1 +F2C37FBB9022B23FC9111E292ABA30410005355D49B56D38F4C33C37F8A891A88B2F51957420EA +E5D22618FEFFB7C1A6436E75E4E6F4F8B3B847D4CA12D3D925A3F1F66EB6D87B19A53042FC860D +2A57D2B2967F001F6B56DABED79E82D33107FAD1F46172D4EF1A52FFBAB95A33180B0AEBECB34B +BFA4DD57AD85FCC81833CECA2A9D4667923A57CF8CEA991565051E3BD29DC4CAAF8B8DFBF3A76C +8EDAD02C5F5EEEC19D462EB48758B2440329F43A38CC21D68D26FC54179ECF102F15AD9AB1DA75 +046419CD4B0FE0BB79C77A72CB9583EB321C978C8F68A3568C52CF0A85C938A8065D18DFAC5C2B +FDC4659C10A237F09B924DDE6B6E09EFB77C158F9DC22E6310ACAB98218FFB6D547ED3D5590541 +AD5862078A9CB34C2BB08B4C3E620E0802E99DD0572B36E7B7B9DB269FBAD73F7A49F711E2F790 +2C0F15494D642FD63010E3F1B5240ED79B617A655D5FBBB5EACD66B85F02C54023640DF5150BF9 +88B62D82E068EA4E35824FA098321F86B68DFDEEB8F575B85AA76ACFD6FE55B40D2B141DCC1B65 +DDDAAA3E790F6B0B491E80DE0277D25D48DEAB2D8E48A004C36665468CBE3BA496C57596AB679D +C80E9F744FBE8041D3AD6F077CF65B0612F180E8403CB8D58BDF46FA5615F5BAE1AFE3959FD4A3 +EB1743ACC7DE83ABB701E949613BA573A67B4E9C816348078B2F857609582E5F144BE599EE4B15 +85A08F81174FFDBCD8AC2258B7FF161EB3A1849054B66934DD76DE536680E3AA92EAF1985D5B56 +C68B693A3EC10AB0FFB2B88609E8870670D2AACBA8B20E9FC5ECA607D3D90167453BB172484A55 +141AD585EF5173AEF115B5BD89B653246AF9C2FE922A8F56B78E797C497318FCACD97E8F33627F +579C8D1254166906EB06F96DD5003DB43878316E2EC4109E8FCBFA4B978AA15701BB16D633C2B6 +502F6566AA3869B9C94AB303617C3787C7CC6CBA808FE9C4E67725672D654E075657CD646E26A5 +82C68B47CE90C154A51CA289747585668A5A2D4D73D97E730FDA8F9B648B685B409A742AEAFAA2 +A818D0897970766B186FAB6836899A1091CD3B9503533334293ED15CF42143C13CE2D05A6EAA2E +D1D12A3DAF28F9178B9448E4EC2A8FF6CADBFBEEE028AEC622D3CBA1118E92C98C4B303F8588A2 +3012067D2E1481E68B4ADCD6594737FB2206763B5023A0148BA31A165DE5384C63480CAF82E59C +28A133A775A6E7E3A5A17CB8D9D6A3C9F3E638F67CE5D58926932DA3A9DEA6ED2CB7B5BBF07C6E +CA417769D07B64A534906E5CB96DEC73E8093209CD2A85120F6E3216B5171B4BA67F2538785907 +BF3B8A912CD7E6362E528AC47FC14F2832924FB512259CCE6B650AC1730C5E531AA826D86CB8A9 +D9AD673294D4F1D3CFDF738BE5BC6C9401A164C6E7850794ED6587D592F44D409855639AB72C01 +6C55878BCBE20DEC3D4C15B0C0D47EEE44D6A4E91AA1C297D25A44378636BE4EB6517BD486DE12 +950F53AF60D94F28419AE67BC2316E26BA82ADA180577C6CE2A56FDF0C1EA9B9CA2EF55A95125F +D667870226ED5D780A34EB34F468460EBFB8152024F200E40C6D42D5C5513E163C02B82C42FBF2 +E4433B60344D3EBEA637C78F734FF3321E743437F5AD1B92429B46ABBDE8E115AEE2904B3F3FE2 +369679466A59EC0433FDB261E8B2F227CEA66E4C57DF67F92284F0332A4F4E46431F282EF59975 +C430121C5E833A8174095118BCF0CEC899EBA8313C3690E85225F5212ECE4BB82902B0C662D78C +37747BE77B81F47C24F088F5F94A18BA923E54DDF65B9DDF5E9D64E4D8B086BB808CA791A0E8DC +2DBBA31CD58D21489EB64B11560AF93796A8E1E206DC7C15F4310FE985E47A929F76A6BC154FF4 +2C07B6F96E03F1D6BEB10A0E053C8C7DF0692929D1B62A3074DCAC64B1A6821FD25F6B434BB016 +E3CB58286848D04B8E743C400D477FA5F2130352AB8932CBFDFB9FB5C6C6A6EE9DDBA6DC41589A +89D5F223DEBECC40BBFE5CB5E5DA18A511450C6A679D10FBF99F6A391B11189B921246FDF6F552 +5083A1361F6B232E1F5A25F5E1D0DFDB1B812BA87143407C8ECABC78E5C7AA0531293AC7909A8F +7E27C5A87099723739C93CC4F955995D664D4D043D5F4B27028D336A03313A6BFD8A4E1F4023DE +1AA5A0F7EFAAC52FF9378BB890ED9B29F50DBBB920676A54FDAD07963E2846D3733B7417BA5334 +5F57F1372E89F4020DC6A0AB9035328B0DF0DF71110C2A452D2702488A229B54FEE6845814C21F +764007C8E119CF84454F608C91E1797DB85D9B8210BA1F7A7CD12B2A8AD55DAA18CF2042F4857E +D37C2ACDB63984DABCCC6BDF6A119C464C7D6EC30CB2E4620948B1B7BEA3A2DD88B15EFA953B3B +69C2A624A0CAEAEF17915ED4389D1217080B7F7D91887E055A86A6B287490DAD12D6165A0243A7 +A64587BD329E130F8E522D6570E59A33595672C7110FA2B8DDA2EC48F45671492804DAE5DB40A5 +42E21C27D2A5F2C37F00E871C3087613F11C6249EB926A0463D0486C5D5919A0A6A556D27A6AC6 +0E6065AE76BCCFCC3525732DF91F7C0F24A09A8C2053C231348BAEEB93395AD4DF4AF7A99DB0CA +9CB512D3D71496A74CD776A68E38B90673300A297F6A244CCD0341112F42CB9955DA3980C15BD9 +68A2B0DDACE0A835ECCEF41E8CF4EDCB493B59882F812BC4D85694E508FC0CAA2AFDE8C0B21F2E +A861F1620F6D01DFAF25B3ED11A7753395F97FBCBBD1E3AECC00B5940A6651BBFAB3556F720081 +8AB5744975F71644FD46B060CF74147238B6ADC1E9FAFCBB3C2D2A3F92FD4C141C520978A992EF +90B23EE6178602D2ADCD143E49C6BD72D24C3581F7F1A76E9122B4D8C9DFA3FA94D3CABE5F84DC +BDD90ED86A2E6D8C63EF7177AE85AEDE1A594DBC3C249A7B108AFCC6C75A502EE3CA0E733808AE +ED05CD0B95431DF8AFCBE86D9EA04971A1ADC6558B5B82E5BC3F98AF6DC4401B04A4D39335C7D8 +13DA80152ACDBF6498B99B3E314D18981340A1117D206368E4F2BE11F46911B33BD6FE35B0109E +5B294F59D3F025FEA5C2834ACFF2BE105AB95BAF201BC50A4D98B85C970AF3E39E0B05D15DF28D +0A18E82FCC16D85BAC813A9501A10F4CDFD022905FA5B10C8763361BFC4CB0FCE8654062C0002D +AADE193096D10973533795666EEE0AE8B7BC76D60B1713769DAB8AEAFE36A6E6786DCF15A1A890 +7C4DF6D252A5CCE68B28B6F564060A53FCC5E39E97FF61DCDA09DB31BAC530C8F5B999B1FC4E36 +A2906088897488081D74802A693DED16DCF651F62C15EDD2BC721619F848EBDCF226DFC535A526 +C3247E225CB344AAAFE6A954E89B8330A9F5B05961B5A7D362CCD2268D993EDCEBFD46C2944C91 +7F004CD27CAC0F142366D8F2419CA77C36770355CAB1C3BBAEDBD7F4D0150C4BEA551AAE4CF898 +E5962B6579F5B13A3CAD2EC25AD7AA6015D07028BE165BD40F27A9B33FD805B8F42326CF94589B +29249E4859A8D0F306E3BCB3A7EC3298904B0CC87E913B90149C765A43CC39144D523D6B26A509 +E00236093EE99B3513AC69DC5A2941F1E48A71B213559621E5BE6A641D943FE3A13FFD796F2BB1 +A6C452A24E4B9864FBD9A9B5331DFBC5DCAAFF5EC6232F15E9412BC2230E8394F5C0F92244FE91 +8043D83E3790475F6B35673F695244CB303D708E8E92731C657D81C7A28EB491FD849179BD0886 +E72E47F1B4C34B465B4B0A212D57DD804C7CDF5814B1E6B87C9ACB9C74E1EAD3C4B8889EA4F25A +0CE27AF6F91593F0DA3F55C15C9EC3CDA8D6BEB60FA0D8CFDD2C34C1B0143C36A80B3F77E9E4CA +CD42068746943063788129B9B10DD969706035C3FB7971E9A56EF6FB3A0B4ADD1D977E014E1417 +ED81B819435C8D8002AF809C6A252FCF5F17BFBC747BB7E604C9328F353016B85A69F468164401 +67563700E8EF94313BBFCEC58B3FA6C89C0F79AAA61537DCE0B489ADF40540989FB040E2FFC535 +0B85D9C011A94B7A806482E02C1038F47D392BE62F7A192CA4659D8F0A17F1D53DBE33A6749125 +CB64549F2DF8FC0283E48713E166A6401D1DB6193DA6F4DFA2AA7430EBFDE3DB993A6C8B58132F +3D57AB5E466566ABB13D5C29BA2262F3F6F574D275CDCD653E1F8F824F516B1C688CE97C14FF3E +BAB81F8FBF0A6F64648BBE7F5AD5C331614E5CFF13CEA871D865F4F788E4ADE8984BD939AB33E5 +17121276461DD3125F3B56CA87900CB449B6497FA6D4F5FB859038374D5BE0AD2A34B1ACC9479D +5530AE8EF469891C174F8860837F7A22F72590CB8309079CDE324BC60787EC690F901A69FAE187 +2B6D4D4576F06F5CC37495D0C72A45AD47D2F6CD216FAE7981E4859B5845FBCFCB61829A6BC8A8 +E7A9A0F53C020767B5AABE20CFBF2504BE5BC7D32DE9B56BB1F0C48330635D3E72E4913CB1BE01 +28C6BD47FEBED891A3FAD8BBD5F916B466E974F9CB2B3129B29DF1F5FBC7B2BF2AB8B2769C12E0 +435ED3208EB20E9657200806391492BB1E5899EE594DDAD170A0A61BB6A1D0581D685C80CC2F9C +5E5AF62ADFAB656A33D22F7A572FD25DEBBFEC4B36242F8D77D18A0CBDE2FA03CB8E9394B9CD88 +D63CAB57E79081650E58E4BCD0E5A878CE4621251A287C64035BBEAA80881D504C75032F89280B +FBFC4991241167BEBA653AF5EAE9B1A3280A58B9C4C59B2FC47659FD1F42D37DB5470E46D2ACB5 +62A1D0DA3F4EC9DBEC40635018A141152BDC88F33E79C6DA6DD616BF689E052C0464B62A1E61A3 +E58CC805DEE666FE4B4F0096D6D682384A2E95FFD0B542AEF848E1B54056BAEECE36F0C62099F0 +4E0AEBC007352614E0349A18A2614FD3998C9907BBDB681C74DC3A24E5C002EB64AEFF55CB6EDB +44CA80E99DF02F8A7B1016824AD38FE7264BDAC41E848CC7B7B38B0C50FE417455BE9AE00F0F8F +79B0A5F492C89CDD1D18F6FAC750437A96608C131AAF7A9C5BC0D3110CCBC25B19C7F1E3906C27 +8935A398909D2EE97723CE0207E9CB29807CB9F8ADFA813900D190DD0CC8E3CA457E8CD392441B +B800B2B30D034ED66518D487F4F3C33DE3FAC0F88D9A6A597379C2500A6954EF80302912AC116A +74A520C2E40AAC299B78F63879F31E2A8429B13DAF83428B12DB5AEEE33E1150A0FF4174DCCBF3 +9610D0BB68DDEE4AC044123B208F3D37A5CA6A646DBB821975DA03DEDBC42714949104033A4C31 +0FE6BF0B70F922EFF8C51CA42B1CE7FC496B43E2DDB4B20AE6373972105DFA5843E9A64F63342E +36B154E1575BA26998878A96CBC9A34B2E07188D6E1E8E69FA557DB604BCFFAE3675E237D97F5D +EF4C8D2257AD409B239F1D9519F9B718C27B998D69EC2B5321F97AFEDD8F7466E64F45A0843594 +7B35221BDF77146E4E33F08935C37F0FFD44D506D8382536365FB3972C455A6EAF0761A03A85EC +EC2E8D0FD1FBF0BD829F18874C7C25D8F0ED087F9859136919DD52AC3AE08A7D848E5EB11CEB54 +2BF71B537DFA59D6E081574AF536813DF6D9B8B31B83BFD52DDEC2D7D833621EE2608619F0A61F +CAFF7EC32F2B0727B24937644F40DE81F6D86FC17A3417392B04448A5EC54C0B0BB1B60F38767A +508ECB5B30113246F3A3066310BE7A115CD9D35EF4133A4110B10D62EF3077CBBC8A3C64E5566C +19BBA49AD10E1D5D11BD5A31DC8ED59EE62CC19143533502D580237950FE90B7ED3803F662A522 +A3DF2BD026CEAE7D614EB0EB2D29681934DCF9AB2E6124A18FEFA62F2F478B87E2764C59C2EFF8 +946D326860363543F0392CB582F6AB173AF2FF031E77C939597381F724D242E49D323CF0BD1023 +74B67D028C331B64DB4642946C72E82092A4890A5491130E312ED47DCB238161CFCF412BF7738E +81B3AABB3CA492B716F92BC684615519BB513526C06FD5BAB6F196807D675DA47A7AD0216B7BB1 +35C9EFBA46313A9A7D3E40A5B7E6436114846D1032A163305534DDD10DFBBABB912B1E18882A47 +5154FD2A0FB33F1E4AA97827FAAD01CD51F62E492AFCF3B870B5B90AF7CE345F99D07F134A790D +312A7FF00B01DF37741A5E2B98DC2CCEE6BAB34978374CF1CE2F83F03ABA437790E0BA33A0124C +2C8F4A13F3F0D00383141A952242B2129A0B96A45B1CC13255B3118991293700BDDB4E29BC913D +0A3B44D9E5F7FCE6D153EF4FF3824FA229F841EF6DE46E113C9B602A298868AFDD1825CEB017DD +D59F67ABD724D8ECC9261BF90C413BB4818D060CE5FE0B0EA9CBB65850E5FA181E9713FDA06800 +FFE7C53D9EB62B222ABD8E12EB6E149CCA7713C5639ED530A30DD12D69E271782458E53CC14DB7 +5B053E7D61DE9E231A78C2391DC18EE092A5F76CD61AE5B7894B78CD378E0FBF8056701D4990DE +1EF0F36E918D98CD907F624E654836F18A579C7BFB23DE3AA9D59229C3FB1A4B857D9EFBD289AD +0FFC27B6EB42148E7AF8A802C99B14ACE59B52A111DBEC97EC5BFB0F970C9B27AD6231D66F1744 +74207E935CD40B5D3787D85B46D4C33AFF9DD5029A0172118C624DA5307F9FA33C256FDA460479 +205650A52F5591A14027695126E5AE946A7BAF34835CAC37560EA030B3DD2B06A6DFFA0D02F634 +E344CDB5260D84FC6338DAD799DAF44C46E4C4DA1854160E76FBCC0916A3EBDE474E358E9E8B32 +8F1223DF95A0F1F8CCF619FBA607F0276C5373C293BC4C4D653893B83F3583D9BA549F8D229DB9 +44D7B4B835F97197608BEB526AFD58416980C3C8ACA1080C09797DA0A24B185C793636A15FB82C +E003906B613CA3D16DF1D7C51033480123FCED0205AE45BE3DBD332DB88D0BDCBB4DB845AC13A4 +215B94ECFFA4D4E88B4BC5093770D5DB8FD7B87E8E4FA0E58F651270701EE92A3B287644F56B40 +97237BAD7453C25D29B293ACDD4A295284480A3E19DD134E77498E16512ECB44D77EB24D6C35EC +4586D9B73B2F60FA1F758FA86378485C37D595ECE1B0FD80D64CEE30B7F5A51A724E72E18A9B22 +AECA8129067304660294A309E9797F8BBE2402581F43D8636648EE6675C4D30A8B50DFE587FC41 +E5C04B4430C58AD44F57C8F6AAFD4750AEAE51BD4715838D8BFE522C6F17ACAE809C3C39F50D72 +CBADA2547CD9D0DE80980C53D9ED68E73214037B8A8E365BB3DDF7350A2D1B9AF3ED802436D1EC +75C60C3617995E3AB7B8469915D80285E99BEAB6BB88A9B5A388D7D7CB950E7DBC168885FC5173 +4FAD3CABD91109104F52525316943C6E16ACD17CAE128D81C0D98357B0B806ACB460A5E7F5F7B2 +385060402CAE0CDAF70188977249C809CD4C6B133ED8447B926E1A30D4FCD0968FD3FD45B50F6E +BA94E72E87D4BC7ADA4DCC3D6DA0F31517EA9DD89F6751F707980CA84CF406F7A786AD8E4377D7 +5506A96F7293999800C1A59CD813F18398A4094D7426E250BD21F87DC58C094BC00A567541BDE3 +D17E1BB01C4AAD986D1E79CC4B29234A28A6A323C0FB98B530012E523AFDA4915851952149B238 +CCA18B8F974BAF6CCB738D05B6BB1FCB0825FC1920C4E3AE8A1DB3B7C02991A543AFC9D38DDC1A +563793DEC85BF313F6CC40A1C8BBC09580E54EA3CF1E399F8EDB969290A3203D86D67327E567F8 +ED390542AABB07A0DA177C3C6B44F5BFBEFB181DBCD1753C6712A6D7835A64B36922173FEEAE67 +735FB82A09CBF309246D104DF7B14AD6A6A87DF431004EE72FE7887929F4DB593B0A113F176409 +E69892A4EC6CF250F984F2CC2904C788FC7FB9B164B7C3AAF3B9BF5EB17108C52EED49E5E43D16 +F94ABBF85F784008958557FF8DA38DC55BB43D6F8671BD2764A9F276C2A039FE5179D23455BD55 +539DEA38921C66C7E19EE407CFA868E9CEC0694D756EBD5B9EBDFE6D18D5E9E33433C886B24CA0 +B0F131746FA8FFD23D427828A4998D0776549AB2B4F5B610F07AED694655A7152740A275DE60AC +BD7811F31203F32D071761E74D0B34BBD8158DC1282ED895F803B7FD689D429C9A2C32B30E098A +A790D6247386B89F03310DE4665C3AE77665D885E456B655846956CA33E3A702F79A9695CE7510 +329536FB24143DB109D0E858CB20B3056078F0C151419BF06BBB871F925ECC7B4131E54A935645 +D4E00EF0EA720ED493E6731508EFF11B81D9A4DDDBBAC935DFDD1B798BA0E34B0D5695233933E7 +8C0C9C1DAB44C7BEE45543C3C310C452FCE97964D2B635C5433318FA367D20DDB9DC8CDCEFE0B1 +1DDBBA2D7A7010375EE581C7FFE97F89BB91E3FF1624F0EF5FE27CF9A027BC8D1939F91D88A873 +5861127EB0CFD88300D3B821DDE0B54B62762466790A949B2DB6372C75732E87F54CE4F05325D2 +0643A2F8388DE10E1C4CBFDA85A70F7551CC8A8F088FD46483446E0BE03BDE1B5F2B23D9B99EEF +D4641BD0EE2AE3310B0CC0AE418D0C6797840CC5BFC4F54F0D6AF8DC1AAF3DF297D3955ABAC771 +214ED10BC9E88A4CEFBE6E07EDF9F7A2F52C144086C13071F24CE826D468098707090EBC28BBCE +12E0AED14488B547A70EB783D97C98CEBF55858B924F0DB6754B3CF833EBB5EC487046A6C3BAE3 +AF59F61B699782A6109E0D7544846F4383C849A917ED1750A8F5813F552C231A3E5954F57C8EF4 +D02BC790A6DC865F77B78D920D274C2276F9DE3887540C460B1A6029419B9EE6B88FE29204CD4F +62321824A8B72FEF463400CA6A83C2CF8E161C76058CEBB021216ED92B4D889A9CEAE5619E0CE7 +DE0B6927577AF0DC385FDD45EB6F116778E91BC1EBB2B6027FC5D39F8A233D27BF581DB38D31F4 +20AF47E77AFC2D67A7FE90A10F0D6AF0816BEB7CE905FF00E5C2DA7CEC75EFC3A170495999AFCB +7A9781375C03C495FC9CDD90F9783CFF0926D795F155CE64AF0817726FCBE7BFF6566FA1A1DED6 +D4D6C2395E7DC3DDE9484A2FFFE1C67EDD9D8741E17D526079ADA966C5F17105235C7A5E09B82D +1752B97568029925A6E25DD461063227613F02B66AC5DDE9B4018E253263CFB3EEB717BCE0F8FD +36B0EDF5D82D2DB2DF28F72B13D148F741379D7C31443DD9C452B3F5A8889C93F15957064DA4C8 +BD8D3032D94A3133695934D299CA4303797B6A49932A1B672A72DDE67106E2BE984CE7E6BAAD36 +396AE3EBAFBC268105DCC191E2773ACCBD92A3D32EAF57721C0EF3E34744AE1ADFD9C56669A08C +C7E95C1908D43B569D82CFD4CBD7A41D841D10C107E00CE93F033C7449B78660FBF82D157601F6 +A9C721C3FC1264A86363B5A151F63C8B646E2D7E5D44C3DD46CBAE571FF53A9F4064540768148C +B69B9752D1E99EACDE8BD201373708BF20C689BDE479A0D11DEDA4243E6D0ECD265294C079C7BF +427F12C737CE72238894FAF3571DC588143F2C86EABF4512C63672D5211514D72120ED97AE70E2 +FE4291903259BA3521EF94C9D13C5A614AAC9BF14514761F5D3678F4F96DD8B0A20AC00EBB9A43 +235A571280B34341E5761EEA38808C7485C6B9D15B72BA4A0281A517FD2E5E660EF9EB5BEEBD43 +2D537F8E3E2FD2BC8D221CB3C6E578B1627EF869CAE922CC154B38D2239A7FBC8D85727C1D533D +C71E873CF062F0DB2AD29763A482B6A601EFCC9BF9214E9B270BD9633BAD41C2308A02B94E860E +9B74808796488497C3658F3F33CC29EB099CE42B134AB7A5E168013C64F056375DC95FFFCE9AAA +7813C498FF43DDA22D5186F6E7B3AAEA39A72A5C0EEB95A0CB79539FF14FD409F7D357FB06629C +D99C5F277996778C7FD19E776CDC015FB37A29AABFF21ACF0BB36A0F8F7D6758F4AFA31FE61F95 +10905BE91866BCF1B92CC5638BF90CEDE72FB7F46FB1892F4F4E965DE76D6162C515195A39FBF5 +1A7299F01D20021720B8046FF10A5D5185B217BE8B62874281AF2007EAEA8C41911DB195B8C3E1 +BF0E466CE3F398A111A03958BAF0707BBF153C1E4F966E4645795126C6912828923BB3952C5099 +C0FF6855AFAB944B776511C96B77A9E0459FC52749F0AD982077A227792126507426736F2965AC +BEDCD7938A0E27351E5CBBEC3E331BC2568679E1823DBDCFDE6E46E999604924084D583696F05E +D161CF7CAE7A56A31A7EB0BDF8F5883A5825597227619EE45655F15CADDD3100604877F7221866 +A27520BA9F4C72A5B7A1B45549C599BECDA8D24BF7504ED6032981AD5EB25E7DCEF6B0E7295F01 +0C881F0B0B28C39CBF0708B8F96AFF3A0193AED2DFD8AC7E6F4D85F2EE21971A670C010857737D +4D3C1CC4D1EA8FEEA7756D34FA95B2BE2A27E5864A4183F75861F2EA00D050F04D6C48113EDD40 +75A78C5C64E41B437AB8FD6E12C5A25ECA76816702CEEC2B3FE8DE398A130CC49330BDEFB0D76D +047E035448A59484D48D18EFC534328A8556858D4B45CC05377B8140598AFA383939E4A7F73561 +68C7B016D012C37B405D4523A1DB884F005A2572A039847C7C065B8B92DDC9BC1E803692A39CC0 +0A49CDF0AD24168154D03BFD56E1EADFE29E556B52FD11CF838378E4E4FEAD5243456648DBED06 +2A47FA57542E137A9E035569D068F08E43DC4031D85925DEC164FF91F8C207692E8DADBAED305D +D38FB4952C61F50F9E4E4CBDE408A16801732F3EFD6F2D600CFAD6F691BD36279AD251D991F24D +18DA3168749E8469A9A39F2106B98701956F265C3DA4081278A3366118DAC644DD5B4B5DBCF7B6 +EF6AB84D9C41350B18320C0FFEE0B5C26AEAE1A6028093337FDB82EC40105175175CC19A7884A0 +B07DC34C349177DD4BCDC16323E36197073F1D6447BAA0A45F0DE7453E6891AF0FE2D21C26D9BE +37454F2F83F6E974DFBB014511275360A9FDBF6CB77510C92A45C0C1FF6A004F854FDD323CA4EA +45EF334B4BD189F1131FFA7B4C7FBE315DD788FF2D89DC3804ACC9D689816A22E39BA45AA98AAD +6971FFD22B5CF38794385EA00AE18FEA562E0AD2688CF6176E1FF4CF8910ABE1C4E98F59750C26 +9858AD2B32E717C29D97878953F729AE13B3403F997593542639DEEACE7BB88D45B6C4FCDBBAFA +3B18BC0F085B25A87B16BBD084EE088FDBF6D62F4E65052E374F2DC012DF690E23C6A00A5E8760 +B2B2A213FA8D0B31E08070741FD2D8752274CD71B1CF566890113EA34518457B1778DC1CA38345 +78502A62CF4CF563252B3ECF554D477283CBE6AA7A434A279AB71B2CF20765F5B197592C681FE4 +6ABC6115B49D776B1CD457A3335FB3B61B4258EB77327688686072B7906B2D8016C5FB12A626D7 +E8B2590CDF574F3A410D75FDECE4BE7DDBAD69EDA08F44B73D6F7C92B97C67201FA2AD698D058C +EB7AE6C88B699207669D68FAEBAC5E75905B9688707B199F516E944056C2CBE773CC95BCE59D82 +AA93DF52227D477CC2345EA8F1A2CB96A00D186F3A02C30FC0330EDACC404ABCCE86F0462784B9 +7C1F55A03C4ED89C79C0BD3A0AF3B19259963CE966F654D7D4EF9B9093B27526E5C09A084F3C9F +DDF3C8F261A5720DFEE14B6B198D8F0CEA0CCCC7B70CE185F0B65B0B4E5CE79898A8E3DBEBF65E +A2A7F82EFD92AA7EB65AABAC5A3CEE49070E78D5C591409756EB4A706DE5192D13083C4A10BBCE +3A818990406945A4036CAB65E3F53A54E6992866E130F01DBADC1F15751256DFCB408DCC671CA0 +731A01A6457CB40B4A04BBB0BF77C8B655ABD484705AD31CBB88CDDC3C599B35B86D3C4BB8B8E6 +7751A095E43C9B9228C58A920E48D679DEAA88DEEC58F7B5573DE4D7C7288BA9F0A5899D1E6588 +557ECAA123CF7D504406BB03F580FE02A2E88FA32F9A824B5A895CE8EB1BC271FF2702FA463454 +717D37672DF5C7F78561F889EB0E57984A96E1430B26E27BAEFFA17AAB5FB94A890AF8FB57AEF2 +4FE880121E0B31708F1AE9B09DBE64B26A5EBFBE42A4BBC0C3ADEC0A14CF7496AA53263D4889B0 +929645EC2B8C5144A4D76FDEDE6345B1407F990C5D7644B21C0D827AEA7D4E8D4D17311099A703 +689B2F68A9EFE15696C589BC02FAC8F5CD6FF68964EB222EE012E28A490614BA93405E4F2798EA +0E8A8B5EED8D7C554737ECD26CCFF16F50C8AF2373E8688DCC297269C2836E4FED50EABA465EF6 +908DF9F55DA80A501E0165DBEE8E3F9FCE4F6B9C31AD5505E71AD3D7FFE6EAA9D764B965FC163A +B0ABF7DFEE391546EB78C79466886C7393D4036FA247E9C4DEC84FE72D4B5AFC6D7FE58714C70A +AC3799C4B419D3701267915677FBD571073B70D68F141651A59ABF8B6483E216F90117879A34CA +43BFA857B831DFE321C2FAFB887131B607D2B9AE7F0290705C254716161DB40AA383006A8B74A5 +767DEDEF5D60711B5A9E45D63A6EBDB15740AA04BAAE078FAD7FDCB9D26AE3DBB66ECBD9D7E641 +D064B881BF5190FB31EECBF3659036FC145D8BF0DFB325A78F0B3723ED8DD2A967BF916A90A92C +32292F3330D3F1FA1F31CD6AF9373D12A1EDFA00EE7A4859BB6F6D4D6F6F7F944ACDE744E3D6DD +CD646F83539F983B1C70BD94E1FF6CD3E072F06DF4193676388C95A3E4E3D07ECD40FB6928AC52 +CBCCF63B71B47DF4567E19E0840D6452494EC3883F6144E5791853B0EBF93D6DDDF15B3C8AA14D +8A20E191DE9ABEB1ADF7B19B3B688961F0B86E215451E4DD52BA655B00D1495BF08660AA5CE7F7 +134698F4C73B97103D1074220946455466FDC08FFC63A1C97D60E0B931E94A6A559BAF54574696 +D5F5460FB18B3213144F42F1AA8D5FEC8361A6E401A82454C897403E82DEED2B65E6E50CC603DC +34BEF5E2EF0F2FC24421E5DF012640D1C6E5C87F2CC8A3997362E27463CE29C903A5B32863321C +55B8540DC3DDAB6892FF114F3EF72647A3525119AED1A65DBC779358C5AF9F3AEDB5AE85085CF8 +9F55C71EE44D229C122DE658C83290BD82FC39F044163EB56F841A9E568D50493B535837415A12 +7D618BE80156E1AF95AC39BE234ACA11CFE3744A8AF714724C04359EC8729BBEA07EB8908FC41D +4E5D045D2261A9E20C66A161F98584A2FD1AA56473A0287082ABF956B6F34C0AC3D6139C00020C +A13C7CDC60F1F1778CAB99930BF104139967B728C75120BB7FC3625513C7F992CAE757EEAC275B +7172522F0E178F4EB6F862080D0494FCC5F159DA45FEDD5C7A19064BF1EC59531E973A9846C5A2 +F8BD12B34B0152021D6C41F7226BE7DD8876AEFE003A4DD181EC983284F8855F9535318246A668 +196BACDC3A71CCBB1BDA4547168F0624CB896CF96E7629EC8D1BD11530E5E8D5568D77D9DCAC00 +ADB7021BD4BF6FC3E1F178C51E67781337D7D3AC1A09ECA650B8278FF569501CBB021B2C8C9ED1 +C9A23380D3CA67ED0E27A41929FD835DB776103C8CBE4498470C2ADA09AAD19EA5D781C3D5132E +8C343AFC91E36ABD78327AF6A4F589F146E702BBF6A6C3EA6F720B5052FA18E4BCCDD1A7B8C7A0 +E654A9883396E6442EDCF3ECB05C55B0895C130ECD3B9544A3FAEB5ADA3F5CE8C5FF342D2DA291 +2E9FA59276DB5418BC5B065FCE1ABD42FF3238894BF00C86C52030258449D995943259F600B1BB +8F63809E2D84425DB00AF60E9E8AE791E5ACB6D3E5C7FC9023144DF022F86FFFB37D30899ED2D9 +FA1A5CA5E442170A2BF817985767EEA87C4F57B8E19681F607EBAA22860C8C549738FE95D85F4D +2027CF0F99F31985FC568EAF856FFFC056B118EAAF09E8982C0DFE550FDD8652F3D94CA70DE411 +00C17F820E4A7A2217619B20FC0303AF62BFF042764382147169272BE9769043C3D41F9A246A01 +C4C63FC7DC2FD62306EE813196D620F584B007BCA0286A39E296B210F64F684CFB2F9CCCA5B74E +950D35A1F18B19A26940674DF66392255091A6A6ECE640DD8142F5CBEF4A7810FD8175C9833539 +A34A911E0BDF64DBFFC534EE22CA6229D62B7A95DCACC46D3989BCC85749B248523AD44ABFE05B +E796126E6745E1DD1653FB938612FCF0C877566CA9F686823F4D069234EC7E3826D0080C32615A +88423A09651A9F3EE6A9DCC95646FB0E7E24C7C3372C6D6CDF1375CB4EB1440FE95C5C7FE435B7 +290E78ABCC143A9C015B410A8555271833A466D49AC0611340731580BD29F73A2DCDBCBAA6E07B +643DCF9B18613A6652B655A2167CBB1CCB0FA71534BB0759873FF5B4CDEE677AFA1059E1F4519E +EFC1BEF079A9C04D13842F516B096D3D281533502C4023E13C25C59C662340A45B6874B5C9F08A +08BE03B7C35FE00ED31BBFC5119463F2FB1165D22F117A04F27FCB5F0949BFAD0E882703755454 +B629821B7EB4B048FBBC21E1390620EDFDE83B894FFB434632EB7B4B21647D4C9660E7213902E3 +E2B6AF6181D797F2551513F3529E6C7679712CBF72F2437CD4685E117AD8C2D61A28132170427D +398392C7A27EBA6C244C6BD7700969004D52395FFCE11000B07A7093714F781E353BBC152F2EA5 +B275818DA2E9FD5C04F63B23EF722257EAB81FB2AB97C5B8BF455B2AFE648C895A6D38BE154683 +831704144F5D8FD68BBC0A96165E27F262804140E34A7C7361CDCDD5F14BA4A45EB7BDFFFF91BD +7429BFC9775BAD532BD4DAB6F7FFE85CBD60FA6D0B138CE116058504803D0F449ACA8C380A7829 +A0ED3623A5EE64BB34A345A8720C7B57B1A7C18560A5E56A5DC8C553B58A73762FB04036217CD6 +081F8227F61556BE59FF02C0DEA3639D44A6C3C97F921CA96752FB9B9D28597873AE2AE2C38D46 +A2AF40DBC3DB23A297503A5579998B0DB6B93D1AA1ED3BF5BCC480D0CD9688135FDD40A3E487B9 +A4005AAED374C2E9E036BAAB288AC862726F3FAB60D38B5BB135799A3BE5F4470903445D3A66C8 +24256158426369C70439148F4701DDC2F6F6F77559DE968F0305C42B43E665F7E8DCC6D72F055F +038616F9C030A9AF1A06E6036E72640D11962CD4A622A9DCD07C8EBAF060BEB846F25C1ED28835 +C28059C5C1FD4987CDBAC09780B5AC782964DBBEC7F776B5DB51B44E3817BFF658D2DC37C4291F +E1778D7B964E22AFC5EDDBB03538567378B7F62E806422EAD35C9F6F82046E7E79BFD6FAF3E7E0 +A52C63DD5E8C0A838B3969022987DCB7377E15BAC7B1525EA24C666E0C69508881C204BB515233 +C9B6FFB3F0B4EE37D12EDE6E192B1A17A7F6699FD6C1E87F03C2D8AC0B9DEC767234A2E7C32016 +D3AD9A8015F489BEDA95EC6400EA9DB2CB8626FA253A718FF13FF0E013A172E06C3E5591C15715 +C60C30795CAAAB098B52CE441EB71F2063ABBE3DD3558B7F07DB17F49C24A7861589ECD8E825EC +797ABE3521B5924F53045230CF94C34F5BD6F197E008F3BC38401B3AA6BAA7EFF54F1F926677CC +FC0E77D5EA05B218213737DB84C21AA724E05F37896667FA8EF4E3899727DDD936BE2F8E64ADBA +CA74032C2FF23805D1E6029E7B305F0CD7259865D7271444A5886B5C76CE0DF62429164E844F2E +95880B6BECDBB0BD005229964442A20AE582DF5F3735885E217E4C399535B965047A892BE0985F +6C1EA35B95457414038746316BC93CF4C776AA50650E617A6F0DCC586D3F4CBC19F6043DD04915 +F0CE9EA31EFF2F8D36268A044EF15BCA63FC5AE91D7DB0879FE5AA9A3D51BDA3160658ECEFC447 +CD2C9A848D1DB4BB48D277EC154B52297EBD188B2B7ABA0E4B840831E1B9B647AF654E1BB08D0A +64446A3BB49FB7F19E8FD8E9084C8B8C93924EFDFD9A9458A4F3B4F1D948B123681DEE542CA97D +6A5857A3E47622A6C6B2EC09768705223894BD7867242D819277C5DB24DCCE8DA6062199482923 +4F17F56BB1A0C2A2E099BEAA6D94942AF9706FA6A1D0C67560BD1E3861F8FFD465CE6C48AEC2C1 +F762BFD3D4A68B8B25D0FFAE02376B34DC1BAD9B39DAD6FAB6491002A1E6796BE978DC1DC62EA3 +9D708671DC9CFE4F757CCCE4DD7F1B0ED59EBF5EF3DCE61C4AA16DD6411B68E8A9CE4FF6AD85E6 +F98CE16CE25A8405801669678204CDB7305BD7A29469C539BE2348B8AC412DC95EACA3012D3D96 +A3BA334FF4E16EDB9115B83AFD66192142423BDA32D8A76277A763C373217BE75370C5813FD53D +E7DCE0807C087DDE87E029F0211CA9F1B1A67E72D7922388A6C84B3C6E3D44B192B0B7588A7DED +100C04F87780F070DDFEF41C90EFC0E0BB8F3692F7D360BA180E1D4579FC1AC671454E413A8613 +F40F9CDA8AEFEC06CE40F1DF6FAEBFAEB57AAF73898F869C6BD165B9A3A60C5942A48292B5805E +01897F3DC17253668A774D13E23C5D5D90BB6B8F60E89875B353A8FE0D03ECEC140EBB2B3BE613 +907F32DE8F445CFDC60272E5EBC753BC2ED4CBEC34588879870277190FCFBEAAA6D81759C2CE36 +6CE0EED2B8915F93BD1ABBA0613DD9E2EE93633EF81F4B36C29F4A24847104ACEC56CA46416884 +462AE9C21D1A21D20125B71DC52D38989FBAF0A0A6EC1068E7C963B2B6894326A5E70AE420214F +EDAB638988110066D741B301760451CEA275988C2270532D4A78712F28922011D564F12928B4BB +9484657DC0F2378F07A139C75843624CE599A261AFC6192D58F89F36556AFE32531138FA46B505 +54898E65B82883BE97CC02B92B7C7D1979F799720345EE930BE3CBC3BA01CDC2311147AA768202 +A59BD84F601A5FBF6F882DA51E7644D7B734D89555FFDECED4BD2B14DB3D3C57E0403680796446 +3DC5C9D6427B591A00A82E2EE4DB81D533D52857A250E579F9C9D45109F06862E64564B5E18615 +4B6AFF5AA065792AAD0D38340C26A0B7C7E4DC7F054A850C0BA6EC8F66535E5CE1758160CF83B3 +CD1D0F7EFDA4B0D11E679C74386C2234505F7FB083578BE4D43C4922330EEFE114DAF7C58C0AB8 +7E4F6C6511A1B311FB9FC645FD7199015B5491584D2E135C573206A96EC49B6F0BD7428755A69C +9D1DAE3978F70CF6F2B518C74B81908258509FC96282AAB0DEE885CD5D66B5A91BBBF74B08142A +827DA25A4F0FBC4E1BDB4952556B04F32DB3A8CE6873DA2EE081E81DC1D3C429BD76E62986CCBE +D21F956E4F45F869E0E00FBFD1B17011439E6E0196C8A7726A96186634E51951B5DC1CC4F96850 +9AF5DB930D892EA290C70EDCC65DD905D6AF9221AF3C6EE64E01FC3A37EB358A759DDE53CDDC74 +B6937F1DA36B00174481A40AD8B6E9BA2F9BA1A15D80C560BF4A3CAB972DD12B2890C3BDEB06EB +FE05BAB7E2BCDAFC641643B67D553AD78D5CC498B43A458C06E9A428307498EB76BD7096F2DEBD +2905AB09BC0E748239D90663C26A3FAA9347C32D44BEEA2DDECCA24825DD2A154E8A82282F4122 +96D11C6E0CA8F28CCD52A3E0A9B442838BD6FE90A931C8A462A97759CC9EE21B47C44B2032E5B4 +083750CA3483E688F67FBE91EAC9199D49963060712314618A725457FB71945C535BCD330A9D8D +850EA0EB723BE0A00F2C3A8E6C80660F59A84DE34A52F00725C945521ACFFFCE8FA1CBC2CA9F9C +C98AB2987C636CFB83DB46B4B3A7F1CF4EECF6E08A3B94229B54CB34272829C4BC264E303DFA2B +170D5E7A66A7EE3C463502D5425AB0739F1DFF5FE9B751975E4379569580B641C7296DFEA54E7A +99A9478583A0D8DE565575DB2CD00B35D2BF82A5597F4134CD3F7A201C80DA9AF49EB8D9D049C2 +5869843331F140753DAAF303592715A35751B4597F458F5BD9A894D8E2173E03C85853515E3D71 +CDB51E7000279E462386A1DBAC817073DDD29CB89F211CD5FCEB9657C107041E605DDBBB7275F8 +B084FBB48A233D826F9D3079F56BEA088092B8156B4C38ECCBAE22EDF9135E5E2DE147EAF1D562 +2735F9FC9C5124149AEE31FD4B35CBBD848E81605EF9B89C0E116E4394195122D3F5D28A60CCD3 +19A85D7EF24CFEA5AA946B8EE737786DFD5A6B2C1100F3F2DCABDEBC012CBC19AD314198536720 +37233DA6D3B6AB83458179190D11FC866BD3343C9CB85381BBFE2226D612BCE91D13226F4AA348 +C48D5F05D927518E5587BF7EEAE0B2E40F6D2F5847B25832970681DCDDE5A3DAB4E305DC7CCF1D +817F07975F4575D97355347E3AA2DA7A8B230B81673ABF1052EEE2F524D5330975E811FC32AF0F +E8538EF37B67EDE2F2D521F45AEE885D379835E820C8EFFDDD7E3E381BF267E32E9E6DC40A1D36 +D0068A698B970C492B79D5AE4C645286631FF56704053F81474FD546FC9498CDE9176F7483F9F1 +7FF8654B0EAFC6352FF7070D969C8F7005389B7F465EF1B6C0A1329A2B18F577586CF4B9427D48 +886B0AC61575474C87A37340B7EFC0090F3E489505EF51BA12B1394144F3895AABC6916DFA5C6A +4E8D07D3E351853A2E0370688E5E6000F5B751AFB8821C4C25DE80A9640ECC48B99E05C94E4932 +D120A4893E85CC91CDFB5A7218C972A482914E5401ACFE7BFF59B4D8D5E5F563AEAE5E34B052A7 +2ED5ED7854C32C20C933D68992DEAAD311F6DE5C03DD24B878F536560A2F43E5FC70452A39C7B0 +AE56A0A559607EDC991BE7F571857A7F55FEDC84C679B9BE89401F504805BDDCC9CAA625B2111B +C4815AC79A78AAEA643466199721879697A341639ED003B5FA52331D3A2AE25D8F20EACCBAF791 +D62421A00937BFDDF444EB59D2F460AAFDF8BE9F82D5FD1D48F6712B908E5FA81345A567C18705 +6944C722C55A0D418ABB1BC622EEC5D416F6F52BC188DD51405215AD6B75B04DBF4BC6D85F0618 +FA111126E41351C3F7B0667F8FC08ED06342B2DB6201A1A63AB018B2FE5FD760366A9A420F56A6 +C61B835F9AB9F385A81430F867146C8B01784534CC959126389D1CAFE10E3AF40DBE594B6B9219 +8F50D9759E60519DE8AB4CC0224ED624A3AA9FC95AAFD676706448A9F05BF008095121314FD044 +A3A350ABFD1CCCD5EB18DBD2EA71C3DB2F37066021E39F4E77CB1B155D05CE1FA00C8A59FF39A3 +A16891235A599F95F9A62E6EE47839135A0750A2CB528F11EC47F0D4D3BA828501C9B76FDFE178 +21F11814DEFDE3AB561ADA314060D7112BC8BF02E92793A3D864B83AEA78F8D49DF9AB07AC0762 +229534C0288FBC00662E53035A037B1C9745195CFAB54D22032A16E7AE0B971CAC5A67FF0EDE11 +E265B88805314BC7563CF177BABB367618A27734611D7B662DA407911EF2FEC47D74C482F7DF82 +3960081466CECBF4BA94FC5AC8C9F91AC151FB1ECB78BA5D5607A1D59D34C18C83000F8507AB1F +1C44347FCA2BC27087A28F0F3B24BDD8E7A0DDCF782CBCED5DDA4565308E10062145895A9C437C +CAED86458890311EDCDE2109233BF9ABCEF0535080D7C5A76D6E3BCE8210C7E89FB95E63CD8A76 +FEA978AF5000DFE7C0E659B902503758736C6DB295B9368EE50F5F8CF3E200456B5B2087219150 +294871F7B980800E59A5DE5973AB9ED52F7DBC7C433FD0E099D3E3EEF6DF7D77E40D1C8B34C117 +588ADBBD7A29AB4805A87C13CE93A65854DFDA87321ECF7D34E72C193365B632B455F8A2916BD1 +E63441A633D144C254E3FD89FE2884840146B4C992A07BE6A0FCEEB6AE9B0234D234645D73C064 +EAFEDA1EB7A9DE6661D31226A6F54BC9510DF6F64F7200CEC5EAF90357716E7C246D47C04E0906 +98C5F6AC446DC6107E6342FE8B746C0FFA058FBBCA0730CFB20A367ED10661670C1618A4D467DC +2A7E87894DE0D5392B3F0DE6582901693C28568D2253D514A3FACD1B063B02A5F8A19C1D6DFBAE +CC79435F694E914014DEFC5553A5984993154997E63768DD7BC462BDF6D1A8B28DF568B22FF460 +087163AEEC37F0BDDBBA4C30322AD71922AC802DD491207E6A6C255F50EEB0C492EC86AFED9040 +B068671FE4A1E66AF15D3D976C7267F3EEE19462487772087ABF36700B4821D2DB5193BBEFCE82 +BF67F7034972A708E93C55E0F7A52EAEE47E68FDC6F1BC49B9370F28DAE122D13CB2CBCB55933F +A27291003E862FB0C7E20A0F979DFD8BA918322F6CD597809F9E05DD210F7996F314B65F54FD7B +F453F15CCBEB2CD5E53535261E696EB73F2698D1159076D0EAE35FFB1FB53F98808ED2325B2CC7 +9D90772C15273EE50294AC931626EC573BED7CCE2D713328962528EE0F00FADB1C1ED8B302F24A +40F9A22D1D6411EC669670ADF93C4C67D8520109FDE9F64CB0382842C88845267528F57AB7E408 +9EDE614E79799D08D3D01378AE9D42D7601D821C9C5BFB77EEFF37B634D2698BDC11CB60192B6B +4FFDEE834EDEA99CCCB760D3E7548E6810FE300596C246AE56DCC6BA8132AE3779ECD5ECFA6963 +F9B5C4B9AD8B6C480BB184FE31EF0F8DD3ADAA96AFBFA250FCBFEB529239AD2A524B3C8AA1C2C2 +7ED016E8EE24B355BA84D1D0AC6AF00B0A230578609A3F09639D2CA7175710FE9D455A58A6982B +7B7FCA52BB5490FBAA064D1C506C9598D88B5CB330C97F434BD1EF060ADC21B9F6ED9FB7A7E604 +20FA1B481881C73B1DEEDA0A7E197B8D38EEE68CD8D442D083772FE2BA1F1C07A57D5B67BD8230 +80BF438089A4D6C311D421F5F16C35B3207649CC0433AEE4987E3AB5698D55309B5F5C8B95332C +77157E3309EDB4954613428AE9DA6686799ABCE483FCFA8C060F0614995E01FD14A6189AB61A0F +7AC9465BE297F053E85AAD0EFD921502269D01FA6D5ADAD672F3D48C5D4EDEEA65E53E03A24AA9 +E78660AFF7942E7F23E3754582CB2976FB65997FF35582FF83FE9BF43CE5CA20AE5EB62CA819D9 +B63ABE39EA3A13AC163F64A55B4E840B12FEED5BF447E3CA1FD61E6FB51D6F7B3176F697491217 +306EC21CC462AEFA069C9432AFAFDE4D586D5EF8DD4E49882CD701C4F4FBDBF42E370AE7F332AB +E22DDB2FA70D17B0E053BD6332A1B51840A6C18760A46EDB9C8933039C8B724FBA4C4D62B98876 +71F94505D1242067281063F91A7DE032FCE95DA4B54C32B46B762CC927667306101A7186DA78BB +BFF306C62708B92D76D2225B1FACC18157268623387B5D80FF9E394E3DB68D5404AE3CAF3A8654 +7704EEE75E7BCBC9A96610D96E96C0CEC85785FC7D54BF035D0E03E6B1ACE9691D7DD71B607B9D +C37DC020E9B5D4216AA991C5022AC52A4637FCA79DC21DC1FCBD5BA4B28B591F69CEFD0D99E35F +C568550A5E11B32BD59BE83149B82FC840C99267AA84AF41FC56D1C4F7F6365B65DBED15163D55 +9A95630AF5005C7FEF23EE87208AAE88AB3CA22FEAF682088FB1F2F78027FDED141D161183FD67 +5E16ECE34A9664C1373C2793C35080519D0BBE2D9B98BEF67D2716B4036A25274B4370AD209164 +BEAC0BFFBCC3F6B2956AEF76143644485280FD50462B63F324A992F3A5B187321107BEC7A301C0 +4338312EA32DCABA2C13A6ADA387B668A45743B4D7C02F2BFFC69F49AFB429434EA529B04EB8B7 +4596D90FE74AE32F57CEC0433922B00236C189FFCD8A1FDD896CCC957DFA2EEABB23BD8E5A428F +FDC06F4F75C3222DC161472687547B173F632D15BACE92A07A0A71DCCE2B8EB739EFFEA173E57C +4DF651FA936221DABBDB3B8AE5C30D595C33DCFC485EF2721743A6957E26A79A97EFD24BE5AC7F +D6792166AD1F09A8590F5871E74B2215E9012BF05DC89BEF6A2FFBA06BC619A08B14D6679877A1 +10165E943223B0DDC672C591F26D6C865B78B59703C3C977FFD605CB241C35FA1FD928A4A4F11C +052EA00B2FC0CEAD4BD9041899EE135DE98A260518AC927508ADD78D7A6D8049C88B42241D25CA +5DF0550706C3671B2DB3D848C3B94CC77D7FC2D157E37B8D4780B6B7F3B04502F3167D8D5B99A4 +6B63151FA7FC1FE52BD66ACF20DB58A7A092623E63FF6F7C7D0001AB09059A5CB6D79504900589 +A349E8D19E76F6FBEA194D18CB6526691C7B66E219092FCB73A4F7807E6BFD82510687A50BFA3C +EEB4F8818B11A8B9F7B71676C5B44078996994DA808DC39D3CB6A66B476FA2ED6390B7181A591D +171DE548152A5CC5B71F5F9DCED5B648AEF57E2B3644909577EA607E49C8D0105DB7FC57FA1A2D +E0105EADBF35AA385C972F9CF07D379454FBFB1EAC4B573498C10B2E98C3FB6F1483A123237B96 +0BAA3A3CDC0E9327F0FCABF72E8AC7DB04E22CDAA0F6EE108564565AEAC4A4DA8328F30AA878DD +B35D6AB16FC49D928066ED24C583434447AFBE2E4D22848A516862207480EAF650624943925E0C +351A6407ABE0BF04E36C87BE715B11FE53B8A13AB4669B7B2238D0B295D60028D1111A5AFE23AC +E77C59415C466042B93790A8055FD8C39B262848BBCEE84DA425462871EA73BFC927DC4DAF9336 +E13B1BC99887E8C1D8721311B5396209A634F3A1F91D51EB7B28F0A827A50688ED60370F6BF3EC +A867BB995B125BAB4203DE9E26DFC0D3D8E91D3E749AA0407C6A74C86E98FDF8A314B201E1EE0C +98015360074379F70367DE7CEE75864C9789533ECEBE1323C12261A8622C5666C932177CFDCACD +2D494F1741EC983E51CE4E3A63AE6FD282DA64A32CC3B2F55549080C7A190BFDD2C2393C675DE4 +90C79A325DCC04D14E0445C218AAFA0E54A305A889DBE613D4F28FB08253892A0D673908479B87 +E9D8E13F467B7F9EBCD8E5E16D7CD3358C71CECCD08C6B8ACA8525657D37560BF2221F91258EF4 +E6B70118BD1CB1F4EB421C4C32C76437340EA398E22351CEA31D250E46F946D44D97C2B3DE06F8 +D8003381600E2E2C28AFBADC25DC94224AFAD0D7D951609BB2478C476085C01AA601F3AFFED544 +F251D5A49BD263D64F4FEFB0803F162BD5FE1082FA2949BA8987AFFA1D9A7A4EF28BFCAFFD3311 +0E1A1A2A22C76734DF6CC30E3C4662DFAFB32DF55DB12D138148435A6F7ADB4ACC4F4124EF772A +A63D5F65490E9763FFD66C6153F5B0FEF1A307D6A9753102CE51DA88E2EF7275FFFD2A7B4F81E9 +DF549938193AB7A58D5C237D669ACF27DFA35744F7622F8D54B5B54AA31D9403841D4C5D193D87 +E60622E18C2D7E333AD4CB2DB27DEE813D9902D17DD0F2D3BDC8B340DFE9C8D34B993CC2CC91BD +47B4861809902E11197967922FC625989AC6F4BA0D48166F3F4B6C6C47D3B9A932F3D47A8613F3 +6329406BF5ADEE519002394FB288D3A8AC3DCD5C37270AC7F5C5CDE46BE5C2A103FD468FEBC0F5 +180143DB4312076FB062CE88DC373B5F120C591B9C09B9E3E1B26F52A48339AE70F729BA02977A +B60666637D9FF9287DB4CC52BD5C7B2D4F038E5C927B97B54F611396E2211514A8684A02D5DB1F +DE728DB58AE1BB7253740349771118D2D33211D2ED7BBEB97BB4776666F6A2AC7B54A1E2DB79D2 +A9DE31745745CB39BDEE3E7CF425C27F86CFA89F825A09F9C7027E8DF7A773497690F328D22FF5 +A5CB2821623A570C29D03081E9DCE770F3E7F5B7377A1BC3F52B383EA0CB1C1BDC00E67AE90F72 +9DC77450407C0A9D0ECB2CE16C91CC3C7D487457800654F86BA7A8E26A25B78204CC7F58BBF69C +5C406BA012563A4379506C28A39538F9A5D57BD197443A02A9D3C67149D654FF12FC6E05612981 +7F7236BF90FA626FB91D49C48D824248EABD764EB3C20634D56BDC2E170A814567D278F7AFB96B +F6AEF216C0B42AAF85AE299752C50E6D2963FA5DB384FD110868D43DA804FDB9D0CA26BBC8CD72 +EFAC451FBAF4BB0B44C675DD4E0B4AD8D6149DAE44DC4EC36942CE1876C8602E3F97CD6E18BD0B +5BCCF7B1773619FC8AC3B3D4958F71E5D2C631C6B17EEE7ADCBA30CA0E30B538249113223FA987 +4D4B294563B9F42D9D259374F28A8D8A654F26D7BFD8667CCBC43F75B61C2F5CF8D7E06642E93D +76554642B7666B7905D6859F79DC080CB5574D03A072DB0D47AB82461DF6638C77234A3F97428F +D2FC973687786BCF1D2F65AABAF55C257914247AEA0B3AF17A867C0CF1E5A6883D68680343CC5F +3604DC8E1E7A9DAB9CFA316A14D4CF7A3A60CA56E947AE632762B2303C0EDAF9B3AA206191730D +18B522FCD29D036AA4E6540F6A0DA836638A2EACE334B232199F61B357B10F4322A1F58F249101 +CB1399E5E60483F12A6008F8FFB52709F34136D93902FE367A01419F79A4D4DEDBBAE63741526D +3D9EB7BFB4332C1775E2F0A05A4D7B203C2816F30081A67440D09D1FF94DDB3B7BB91B63703581 +A696ECEB393963FA9199AB61A3F449061E048FA2C1F91897C5A60A4D30D0C276DE88EA143BA4FC +545FFC8F0B0950A38AAD126D73DA6BBDBDB480C3AFF4D2C7657A33652D5728E1866DB82B8F1A8A +72235DAB477C38ECFCCD0CDBB77D30A0436FDDC1D70426C0C5B408A4ADD039CC2B5750B7BB5E07 +CC56039DB7FF3298151718E167CD482E88AE498B2D89C79C572FCE5ECEA3BBFE5603FD7AF6F4DF +2C06BD8EF8501B52E8CBFB5481CA45CBAE44D87D455DFB6F030FBC0938EDFF80592B68390452F2 +42584D9C529BBAA2615F9A493BDB3C4BCD99422B69FB658ADA813AE39E447151F9312A005AB210 +D9FFB508C7A036BFA34C7264CFC1B92929C7CD892CD8BE48D388545B8CE7A79F70D0F1B852625D +F331D75342E9EC57219DE4E61BFFEB066D82DC6256892E89B25BCE034F7F6FF09D7DC8ABBC8739 +3B70FDAB372D2FDFC51902A6E7FBE5DF3F41A91DAFA35D9A99A18DCD9E9D9050CA9D6FD417C9B8 +DE3C0648F8458BA2E0ABCEE10E759C97F019D1A1C8E1CC9EC8A6680C2566F42E478EB1F5706435 +16EBAF85E4F9E972BA3FA6D20B8BD1734229563A1ADA6D4D1857257EB760050F4FD997090653CA +7771430101EEE3BCA1EA8E5F230F1B54E25A50458A1F7EBC35AEC36A88E4E345EF4CD9F97978EC +E8F3C53ABD56FD3DB6C71206DEB0058509F24D0EB4C68BCFAD5A773EFD04F5472984000960F67E +261B9152A176B230EB447633653ED0CBD3F50B214773DB454E89625BE27B7B75C93330E1F782BE +EA101988B04AEF3601BA7FE868F614035647349D97F9F1AA598FD808885D91F5E24FE348015E46 +D80FCC9E62 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +cleartomark +%%EndResource +%!PS-Adobe-2.0 +%%Version: 0.1 +%%Creator: troff, Plan 9 edition +%%Pages: (atend) +%%EndComments +% +% Version 3.3.2 prologue for troff files. +% + +/#copies 1 store +/aspectratio 1 def +/formsperpage 1 def +/landscape false def +/linewidth .3 def +/magnification 1 def +/margin 0 def +/orientation 0 def +/resolution 720 def +/rotation 1 def +/xoffset 0 def +/yoffset 0 def + +/roundpage true def +/useclippath true def +/pagebbox [0 0 612 792] def + +/R /Times-Roman def +/I /Times-Italic def +/B /Times-Bold def +/BI /Times-BoldItalic def +/H /Helvetica def +/HI /Helvetica-Oblique def +/HB /Helvetica-Bold def +/HX /Helvetica-BoldOblique def +/CW /Courier def +/CO /Courier def +/CI /Courier-Oblique def +/CB /Courier-Bold def +/CX /Courier-BoldOblique def +/PA /Palatino-Roman def +/PI /Palatino-Italic def +/PB /Palatino-Bold def +/PX /Palatino-BoldItalic def +/Hr /Helvetica-Narrow def +/Hi /Helvetica-Narrow-Oblique def +/Hb /Helvetica-Narrow-Bold def +/Hx /Helvetica-Narrow-BoldOblique def +/KR /Bookman-Light def +/KI /Bookman-LightItalic def +/KB /Bookman-Demi def +/KX /Bookman-DemiItalic def +/AR /AvantGarde-Book def +/AI /AvantGarde-BookOblique def +/AB /AvantGarde-Demi def +/AX /AvantGarde-DemiOblique def +/NR /NewCenturySchlbk-Roman def +/NI /NewCenturySchlbk-Italic def +/NB /NewCenturySchlbk-Bold def +/NX /NewCenturySchlbk-BoldItalic def +/ZD /ZapfDingbats def +/ZI /ZapfChancery-MediumItalic def +/S /S def +/S1 /S1 def +/GR /Symbol def + +/inch {72 mul} bind def +/min {2 copy gt {exch} if pop} bind def + +/setup { + counttomark 2 idiv {def} repeat pop + + landscape {/orientation 90 orientation add def} if + /scaling 72 resolution div def + linewidth setlinewidth + 1 setlinecap + + pagedimensions + xcenter ycenter translate + orientation rotation mul rotate + width 2 div neg height 2 div translate + xoffset inch yoffset inch neg translate + margin 2 div dup neg translate + magnification dup aspectratio mul scale + scaling scaling scale + + addmetrics + 0 0 moveto +} def + +/pagedimensions { + useclippath userdict /gotpagebbox known not and { + /pagebbox [clippath pathbbox newpath] def + roundpage currentdict /roundpagebbox known and {roundpagebbox} if + } if + pagebbox aload pop + 4 -1 roll exch 4 1 roll 4 copy + landscape {4 2 roll} if + sub /width exch def + sub /height exch def + add 2 div /xcenter exch def + add 2 div /ycenter exch def + userdict /gotpagebbox true put +} def + +/addmetrics { + /Symbol /S null Sdefs cf + /Times-Roman /S1 StandardEncoding dup length array copy S1defs cf +} def + +/pagesetup { + /page exch def + currentdict /pagedict known currentdict page known and { + page load pagedict exch get cvx exec + } if +} def + +/decodingdefs [ + {counttomark 2 idiv {y moveto show} repeat} + {neg /y exch def counttomark 2 idiv {y moveto show} repeat} + {neg moveto {2 index stringwidth pop sub exch div 0 32 4 -1 roll widthshow} repeat} + {neg moveto {spacewidth sub 0.0 32 4 -1 roll widthshow} repeat} + {counttomark 2 idiv {y moveto show} repeat} + {neg setfunnytext} +] def + +/setdecoding {/t decodingdefs 3 -1 roll get bind def} bind def + +/w {neg moveto show} bind def +/m {neg dup /y exch def moveto} bind def +/done {/lastpage where {pop lastpage} if} def + +/f { + dup /font exch def findfont exch + dup /ptsize exch def scaling div dup /size exch def scalefont setfont + linewidth ptsize mul scaling 10 mul div setlinewidth + /spacewidth ( ) stringwidth pop def +} bind def + +/changefont { + /fontheight exch def + /fontslant exch def + currentfont [ + 1 0 + fontheight ptsize div fontslant sin mul fontslant cos div + fontheight ptsize div + 0 0 + ] makefont setfont +} bind def + +/sf {f} bind def + +/cf { + dup length 2 idiv + /entries exch def + /chtab exch def + /newencoding exch def + /newfont exch def + + findfont dup length 1 add dict + /newdict exch def + {1 index /FID ne {newdict 3 1 roll put}{pop pop} ifelse} forall + + newencoding type /arraytype eq {newdict /Encoding newencoding put} if + + newdict /Metrics entries dict put + newdict /Metrics get + begin + chtab aload pop + 1 1 entries {pop def} for + newfont newdict definefont pop + end +} bind def + +% +% A few arrays used to adjust reference points and character widths in some +% of the printer resident fonts. If square roots are too high try changing +% the lines describing /radical and /radicalex to, +% +% /radical [0 -75 550 0] +% /radicalex [-50 -75 500 0] +% +% Move braceleftbt a bit - default PostScript character is off a bit. +% + +/Sdefs [ + /bracketlefttp [201 500] + /bracketleftbt [201 500] + /bracketrighttp [-81 380] + /bracketrightbt [-83 380] + /braceleftbt [203 490] + /bracketrightex [220 -125 500 0] + /radical [0 0 550 0] + /radicalex [-50 0 500 0] + /parenleftex [-20 -170 0 0] + /integral [100 -50 500 0] + /infinity [10 -75 730 0] +] def + +/S1defs [ + /underscore [0 80 500 0] + /endash [7 90 650 0] +] def +% +% Version 3.3.2 drawing procedures for dpost. Automatically pulled in when +% needed. +% + +/inpath false def +/savematrix matrix def + +/Dl { + inpath + {neg lineto pop pop} + {newpath neg moveto neg lineto stroke} + ifelse +} bind def + +/De { + /y1 exch 2 div def + /x1 exch 2 div def + /savematrix savematrix currentmatrix def + neg exch x1 add exch translate + x1 y1 scale + 0 0 1 0 360 + inpath + {1 0 moveto arc savematrix setmatrix} + {newpath arc savematrix setmatrix stroke} + ifelse +} bind def + +/Da { + /dy2 exch def + /dx2 exch def + /dy1 exch def + /dx1 exch def + dy1 add neg exch dx1 add exch + dx1 dx1 mul dy1 dy1 mul add sqrt + dy1 dx1 neg atan + dy2 neg dx2 atan + inpath + {arc} + {newpath arc stroke} + ifelse +} bind def + +/DA { + /dy2 exch def + /dx2 exch def + /dy1 exch def + /dx1 exch def + dy1 add neg exch dx1 add exch + dx1 dx1 mul dy1 dy1 mul add sqrt + dy1 dx1 neg atan + dy2 neg dx2 atan + inpath + {arcn} + {newpath arcn stroke} + ifelse +} bind def + +/Ds { + /y2 exch def + /x2 exch def + /y1 exch def + /x1 exch def + /y0 exch def + /x0 exch def + x0 5 x1 mul add 6 div + y0 5 y1 mul add -6 div + x2 5 x1 mul add 6 div + y2 5 y1 mul add -6 div + x1 x2 add 2 div + y1 y2 add -2 div + inpath + {curveto} + {newpath x0 x1 add 2 div y0 y1 add -2 div moveto curveto stroke} + ifelse +} bind def +% +% Tries to round clipping path dimensions, as stored in array pagebbox, so they +% match one of the known sizes in the papersizes array. Lower left coordinates +% are always set to 0. +% + +/roundpagebbox { + 7 dict begin + /papersizes [8.5 inch 11 inch 14 inch 17 inch] def + + /mappapersize { + /val exch def + /slop .5 inch def + /diff slop def + /j 0 def + 0 1 papersizes length 1 sub { + /i exch def + papersizes i get val sub abs + dup diff le {/diff exch def /j i def} {pop} ifelse + } for + diff slop lt {papersizes j get} {val} ifelse + } def + + pagebbox 0 0 put + pagebbox 1 0 put + pagebbox dup 2 get mappapersize 2 exch put + pagebbox dup 3 get mappapersize 3 exch put + end +} bind def + +%%EndProlog +%%BeginSetup +mark +% +% Encoding vector and redefinition of findfont for the ISO Latin1 standard. +% The 18 characters missing from ROM based fonts on older printers are noted +% below. +% + +/ISOLatin1Encoding [ + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /space + /exclam + /quotedbl + /numbersign + /dollar + /percent + /ampersand + /quoteright + /parenleft + /parenright + /asterisk + /plus + /comma + /minus + /period + /slash + /zero + /one + /two + /three + /four + /five + /six + /seven + /eight + /nine + /colon + /semicolon + /less + /equal + /greater + /question + /at + /A + /B + /C + /D + /E + /F + /G + /H + /I + /J + /K + /L + /M + /N + /O + /P + /Q + /R + /S + /T + /U + /V + /W + /X + /Y + /Z + /bracketleft + /backslash + /bracketright + /asciicircum + /underscore + /quoteleft + /a + /b + /c + /d + /e + /f + /g + /h + /i + /j + /k + /l + /m + /n + /o + /p + /q + /r + /s + /t + /u + /v + /w + /x + /y + /z + /braceleft + /bar + /braceright + /asciitilde + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /.notdef + /dotlessi + /grave + /acute + /circumflex + /tilde + /macron + /breve + /dotaccent + /dieresis + /.notdef + /ring + /cedilla + /.notdef + /hungarumlaut + /ogonek + /caron + /space + /exclamdown + /cent + /sterling + /currency + /yen + /brokenbar % missing + /section + /dieresis + /copyright + /ordfeminine + /guillemotleft + /logicalnot + /hyphen + /registered + /macron + /degree % missing + /plusminus % missing + /twosuperior % missing + /threesuperior % missing + /acute + /mu % missing + /paragraph + /periodcentered + /cedilla + /onesuperior % missing + /ordmasculine + /guillemotright + /onequarter % missing + /onehalf % missing + /threequarters % missing + /questiondown + /Agrave + /Aacute + /Acircumflex + /Atilde + /Adieresis + /Aring + /AE + /Ccedilla + /Egrave + /Eacute + /Ecircumflex + /Edieresis + /Igrave + /Iacute + /Icircumflex + /Idieresis + /Eth % missing + /Ntilde + /Ograve + /Oacute + /Ocircumflex + /Otilde + /Odieresis + /multiply % missing + /Oslash + /Ugrave + /Uacute + /Ucircumflex + /Udieresis + /Yacute % missing + /Thorn % missing + /germandbls + /agrave + /aacute + /acircumflex + /atilde + /adieresis + /aring + /ae + /ccedilla + /egrave + /eacute + /ecircumflex + /edieresis + /igrave + /iacute + /icircumflex + /idieresis + /eth % missing + /ntilde + /ograve + /oacute + /ocircumflex + /otilde + /odieresis + /divide % missing + /oslash + /ugrave + /uacute + /ucircumflex + /udieresis + /yacute % missing + /thorn % missing + /ydieresis +] def + +/NewFontDirectory FontDirectory maxlength dict def + +% +% Apparently no guarantee findfont is defined in systemdict so the obvious +% +% systemdict /findfont get exec +% +% can generate an error. So far the only exception is a VT600 (version 48.0). +% + +userdict /@RealFindfont known not { + userdict begin + /@RealFindfont systemdict begin /findfont load end def + end +} if + +/findfont { + dup NewFontDirectory exch known not { + dup + %dup systemdict /findfont get exec % not always in systemdict + dup userdict /@RealFindfont get exec + dup /Encoding get StandardEncoding eq { + dup length dict begin + {1 index /FID ne {def}{pop pop} ifelse} forall + /Encoding ISOLatin1Encoding def + currentdict + end + /DummyFontName exch definefont + } if + NewFontDirectory 3 1 roll put + } if + NewFontDirectory exch get +} bind def + +%%Patch from lp +%%EndPatch from lp + +setup +%%EndSetup +%%Page: 1 1 +/saveobj save def +mark +1 pagesetup +12 /LucidaSans-Demi f +(The) 2255 1230 w +(Text Editor) 2526 1230 w +12 /LucidaTypewriter f +(sam) 3247 1230 w +10 /LucidaSans-Italic f +(Rob Pike) 2674 1470 w +(rob@plan9.bell-labs.com) 2266 1590 w +(ABSTRACT) 2626 2030 w +10 /LucidaTypewriter f +(Sam) 1080 2326 w +10 /LucidaSansUnicode00 f +(is) 1337 2326 w +(an) 1458 2326 w +(interactive) 1616 2326 w +(multi-file) 2162 2326 w +(text) 2662 2326 w +(editor) 2894 2326 w +(intended) 3222 2326 w +(for) 3692 2326 w +(bitmap) 3873 2326 w +(displays.) 4255 2326 w +(A) 1080 2446 w +(textual) 1197 2446 w +(command) 1582 2446 w +(language) 2108 2446 w +(supplements) 2599 2446 w +(the) 3269 2446 w +(mouse-driven,) 3471 2446 w +(cut-and-) 4234 2446 w +(paste) 1080 2566 w +(interface) 1380 2566 w +(to) 1842 2566 w +(make) 1978 2566 w +(complex) 2279 2566 w +(or) 2732 2566 w +(repetitive) 2873 2566 w +(editing) 3368 2566 w +(tasks) 3745 2566 w +(easy) 4036 2566 w +(to) 4289 2566 w +(spec\255) 4426 2566 w +(ify.) 1080 2686 w +(The) 1301 2686 w +(language) 1521 2686 w +(is) 2003 2686 w +(characterized) 2122 2686 w +(by) 2815 2686 w +(the) 2969 2686 w +(composition) 3163 2686 w +(of) 3799 2686 w +(regular) 3935 2686 w +(expres\255) 4319 2686 w +(sions) 1080 2806 w +(to) 1368 2806 w +(describe) 1500 2806 w +(the) 1944 2806 w +(structure) 2133 2806 w +(of) 2605 2806 w +(the) 2737 2806 w +(text) 2927 2806 w +(being) 3153 2806 w +(modified.) 3460 2806 w +(The) 3990 2806 w +(treatment) 4206 2806 w +(of) 1080 2926 w +(files) 1211 2926 w +(as) 1446 2926 w +(a) 1585 2926 w +(database, with changes logged as atomic transactions, guides) 1673 2926 w +(the) 1080 3046 w +(implementation) 1280 3046 w +(and) 2087 3046 w +(makes) 2312 3046 w +(a) 2670 3046 w +(general) 2771 3046 w +10 /LucidaSansUnicode20 f +(\030) 3178 3046 w +10 /LucidaSansUnicode00 f +(undo) 3210 3046 w +10 /LucidaSansUnicode20 f +(\031) 3458 3046 w +10 /LucidaSansUnicode00 f +(mechanism) 3536 3046 w +(straightfor\255) 4134 3046 w +(ward.) 1080 3166 w +10 /LucidaTypewriter f +(Sam) 1330 3322 w +10 /LucidaSansUnicode00 f +(is) 1630 3322 w +(implemented) 1794 3322 w +(as) 2515 3322 w +(two) 2705 3322 w +(processes) 2965 3322 w +(connected) 3531 3322 w +(by) 4115 3322 w +(a) 4315 3322 w +(low-) 4455 3322 w +(bandwidth) 1080 3442 w +(stream,) 1642 3442 w +(one) 2058 3442 w +(process) 2288 3442 w +(handling) 2712 3442 w +(the) 3186 3442 w +(display) 3391 3442 w +(and) 3783 3442 w +(the) 4013 3442 w +(other) 4218 3442 w +(the) 4525 3442 w +(editing) 1080 3562 w +(algorithms.) 1453 3562 w +(Therefore) 2072 3562 w +(it) 2580 3562 w +(can) 2681 3562 w +(run) 2884 3562 w +(with) 3084 3562 w +(the) 3324 3562 w +(display) 3514 3562 w +(process) 3891 3562 w +(in) 4300 3562 w +(a) 4427 3562 w +(bit\255) 4518 3562 w +(map) 1080 3682 w +(terminal) 1340 3682 w +(and) 1791 3682 w +(the) 2020 3682 w +(editor) 2224 3682 w +(on) 2560 3682 w +(a) 2732 3682 w +(local) 2836 3682 w +(host,) 3110 3682 w +(with) 3401 3682 w +(both) 3654 3682 w +(processes) 3925 3682 w +(on) 4454 3682 w +(a) 4625 3682 w +(bitmap-equipped) 1080 3802 w +(host,) 1982 3802 w +(or) 2274 3802 w +(with) 2426 3802 w +(the) 2681 3802 w +(display) 2886 3802 w +(process) 3278 3802 w +(in) 3702 3802 w +(the) 3843 3802 w +(terminal) 4048 3802 w +(and) 4500 3802 w +(the) 1080 3922 w +(editor) 1282 3922 w +(in) 1616 3922 w +(a) 1754 3922 w +(remote) 1855 3922 w +(host.) 2245 3922 w +(By) 2566 3922 w +(suppressing) 2722 3922 w +(the) 3359 3922 w +(display) 3560 3922 w +(process,) 3948 3922 w +(it) 4400 3922 w +(can) 4512 3922 w +(even run without a bitmap terminal.) 1080 4042 w +(This) 1330 4198 w +(paper) 1574 4198 w +(is) 1891 4198 w +(reprinted) 2011 4198 w +(from) 2499 4198 w +(Software) 2771 4198 w +10 /LucidaSansUnicode20 f +(\024) 3189 4198 w +10 /LucidaSansUnicode00 f +(Practice) 3289 4198 w +(and) 3704 4198 w +(Experience,) 3924 4198 w +(Vol) 4525 4198 w +(17,) 1080 4318 w +(number) 1279 4318 w +(11,) 1697 4318 w +(pp.) 1896 4318 w +(813-845,) 2095 4318 w +(November) 2604 4318 w +(1987.) 3140 4318 w +(The) 3496 4318 w +(paper) 3717 4318 w +(has) 4035 4318 w +(not) 4243 4318 w +(been) 4443 4318 w +(updated) 1080 4438 w +(for) 1524 4438 w +(the) 1709 4438 w +(Plan) 1910 4438 w +(9) 2157 4438 w +(manuals.) 2266 4438 w +(Although) 2783 4438 w +10 /LucidaTypewriter f +(Sam) 3273 4438 w +10 /LucidaSansUnicode00 f +(has) 3535 4438 w +(not) 3749 4438 w +(changed) 3955 4438 w +(much) 4412 4438 w +(since) 1080 4558 w +(the) 1363 4558 w +(paper) 1552 4558 w +(was) 1864 4558 w +(written,) 2081 4558 w +(the) 2486 4558 w +(system) 2675 4558 w +(around) 3049 4558 w +(it) 3427 4558 w +(certainly) 3527 4558 w +(has.) 3973 4558 w +(Nonethe\255) 4239 4558 w +(less,) 1080 4678 w +(the) 1338 4678 w +(description) 1532 4678 w +(here) 2114 4678 w +(still) 2369 4678 w +(stands) 2584 4678 w +(as) 2943 4678 w +(the) 3089 4678 w +(best) 3284 4678 w +(introduction) 3531 4678 w +(to) 4166 4678 w +(the) 4304 4678 w +(edi\255) 4499 4678 w +(tor.) 1080 4798 w +10 /LucidaSans-Demi f +(Introduction) 720 5158 w +10 /LucidaTypewriter f +(Sam) 720 5314 w +10 /LucidaSansUnicode00 f +(is an) 968 5314 w +(interactive) 1230 5314 w +(text) 1768 5314 w +(editor) 1992 5314 w +(that) 2312 5314 w +(combines) 2536 5314 w +(cut-and-paste) 3035 5314 w +(interactive) 3776 5314 w +(editing) 4314 5314 w +(with) 4685 5314 w +(an) 4923 5314 w +(unusual) 720 5434 w +(command) 1137 5434 w +(language) 1649 5434 w +(based) 2126 5434 w +(on) 2447 5434 w +(the) 2603 5434 w +(composition) 2791 5434 w +(of) 3422 5434 w +(regular) 3553 5434 w +(expressions.) 3932 5434 w +(It) 4611 5434 w +(is) 4710 5434 w +(writ\255) 4823 5434 w +(ten) 720 5554 w +(as) 917 5554 w +(two) 1065 5554 w +(programs:) 1283 5554 w +(one,) 1825 5554 w +(the) 2079 5554 w +10 /LucidaSansUnicode20 f +(\030) 2277 5554 w +10 /LucidaSansUnicode00 f +(host) 2309 5554 w +(part,) 2563 5554 w +10 /LucidaSansUnicode20 f +(\031) 2791 5554 w +10 /LucidaSansUnicode00 f +(runs) 2866 5554 w +(on) 3125 5554 w +(a) 3291 5554 w +(UNIX) 3389 5554 w +(system) 3667 5554 w +(and) 4050 5554 w +(implements) 4273 5554 w +(the) 4885 5554 w +(command) 720 5674 w +(language) 1244 5674 w +(and) 1733 5674 w +(provides) 1959 5674 w +(file) 2420 5674 w +(access;) 2616 5674 w +(the) 3008 5674 w +(other,) 3208 5674 w +(the) 3542 5674 w +10 /LucidaSansUnicode20 f +(\030) 3742 5674 w +10 /LucidaSansUnicode00 f +(terminal) 3774 5674 w +(part,) 4221 5674 w +10 /LucidaSansUnicode20 f +(\031) 4449 5674 w +10 /LucidaSansUnicode00 f +(runs) 4526 5674 w +(asyn\255) 4787 5674 w +(chronously) 720 5794 w +(on) 1285 5794 w +(a) 1441 5794 w +(machine) 1529 5794 w +(with) 1970 5794 w +(a) 2208 5794 w +(mouse) 2297 5794 w +(and) 2654 5794 w +(bitmap) 2868 5794 w +(display) 3242 5794 w +(and) 3618 5794 w +(supports) 3832 5794 w +(the) 4295 5794 w +(display) 4484 5794 w +(and) 4860 5794 w +(interactive) 720 5914 w +(editing.) 1266 5914 w +(The) 1709 5914 w +(host) 1931 5914 w +(part) 2183 5914 w +(may) 2419 5914 w +(be) 2659 5914 w +(even) 2818 5914 w +(run) 3084 5914 w +(in) 3289 5914 w +(isolation) 3420 5914 w +(on) 3874 5914 w +(an) 4037 5914 w +(ordinary) 4194 5914 w +(terminal) 4638 5914 w +(to) 720 6034 w +(edit) 865 6034 w +(text) 1097 6034 w +(using) 1335 6034 w +(the) 1648 6034 w +(command) 1850 6034 w +(language,) 2376 6034 w +(much) 2899 6034 w +(like) 3215 6034 w +(a) 3435 6034 w +(traditional) 3538 6034 w +(line) 4084 6034 w +(editor,) 4308 6034 w +(without) 4675 6034 w +(assistance) 720 6154 w +(from) 1256 6154 w +(a) 1526 6154 w +(mouse) 1618 6154 w +(or) 1978 6154 w +(display.) 2117 6154 w +(Most) 2560 6154 w +(often,) 2832 6154 w +(the) 3154 6154 w +(terminal) 3346 6154 w +(part) 3785 6154 w +(runs) 4018 6154 w +(on) 4271 6154 w +(a) 4431 6154 w +(Blit) 4523 6154 w +6 /LucidaSansUnicode00 f +(1) 4676 6104 w +10 /LucidaSansUnicode00 f +(termi\255) 4751 6154 w +(nal) 720 6274 w +(\(actually) 911 6274 w +(on) 1359 6274 w +(a) 1527 6274 w +(Teletype) 1627 6274 w +(DMD) 2084 6274 w +(5620,) 2365 6274 w +(the) 2694 6274 w +(production) 2894 6274 w +(version) 3469 6274 w +(of) 3867 6274 w +(the) 4011 6274 w +(Blit\),) 4212 6274 w +(whose) 4476 6274 w +(host) 4829 6274 w +(connection) 720 6394 w +(is) 1291 6394 w +(an) 1410 6394 w +(ordinary) 1566 6394 w +(9600) 2009 6394 w +(bps) 2300 6394 w +(RS232) 2516 6394 w +(link;) 2861 6394 w +(on) 3110 6394 w +(the) 3272 6394 w +(SUN) 3466 6394 w +(computer) 3702 6394 w +(the) 4204 6394 w +(host) 4397 6394 w +(and) 4646 6394 w +(dis\255) 4864 6394 w +(play processes run on a single machine, connected by a pipe.) 720 6514 w +10 /LucidaTypewriter f +(Sam) 970 6670 w +10 /LucidaSansUnicode00 f +(edits) 1224 6670 w +(uninterpreted) 1498 6670 w +(ASCII) 2201 6670 w +(text.) 2489 6670 w +(It) 2782 6670 w +(has) 2886 6670 w +(no) 3092 6670 w +(facilities) 3253 6670 w +(for) 3694 6670 w +(multiple) 3871 6670 w +(fonts,) 4307 6670 w +(graphics) 4626 6670 w +(or) 720 6790 w +(tables,) 861 6790 w +(unlike) 1222 6790 w +(MacWrite,) 1556 6790 w +6 /LucidaSansUnicode00 f +(2) 2029 6740 w +10 /LucidaSansUnicode00 f +(Bravo,) 2105 6790 w +6 /LucidaSansUnicode00 f +(3) 2404 6740 w +10 /LucidaSansUnicode00 f +(Tioga) 2480 6790 w +6 /LucidaSansUnicode00 f +(4) 2750 6740 w +10 /LucidaSansUnicode00 f +(or) 2826 6790 w +(Lara.) 2966 6790 w +6 /LucidaSansUnicode00 f +(5) 3202 6740 w +10 /LucidaSansUnicode00 f +(Also) 3278 6790 w +(unlike) 3526 6790 w +(them,) 3860 6790 w +(it) 4178 6790 w +(has) 4282 6790 w +(a) 4488 6790 w +(rich) 4581 6790 w +(com\255) 4802 6790 w +(mand) 720 6910 w +(language.) 1058 6910 w +(\(Throughout) 1630 6910 w +(this) 2301 6910 w +(paper,) 2545 6910 w +(the) 2920 6910 w +(phrase) 3141 6910 w +10 /LucidaSans-Italic f +(command) 3535 6910 w +(language) 4078 6910 w +10 /LucidaSansUnicode00 f +(refers) 4594 6910 w +(to) 4942 6910 w +(textual) 720 7030 w +(commands;) 1111 7030 w +(commands) 1726 7030 w +(activated) 2308 7030 w +(from) 2796 7030 w +(the) 3081 7030 w +(mouse) 3289 7030 w +(form) 3665 7030 w +(the) 3950 7030 w +10 /LucidaSans-Italic f +(mouse) 4158 7030 w +(language.) 4525 7030 w +10 /LucidaSansUnicode00 f +(\)) 5007 7030 w +10 /LucidaTypewriter f +(Sam) 720 7150 w +10 /LucidaSansUnicode00 f +(developed) 975 7150 w +(as) 1513 7150 w +(an) 1658 7150 w +(editor) 1814 7150 w +(for) 2140 7150 w +(use) 2318 7150 w +(by) 2526 7150 w +(programmers,) 2680 7150 w +(and) 3408 7150 w +(tries) 3627 7150 w +(to) 3880 7150 w +(join) 4017 7150 w +(the) 4238 7150 w +(styles) 4432 7150 w +(of) 4747 7150 w +(the) 4885 7150 w +(UNIX) 720 7270 w +(text) 1013 7270 w +(editor) 1262 7270 w +10 /LucidaTypewriter f +(ed) 1607 7270 w +6 /LucidaSansUnicode00 f +(6,7) 1751 7220 w +10 /LucidaSansUnicode00 f +(with) 1904 7270 w +(that) 2167 7270 w +(of) 2416 7270 w +(interactive) 2572 7270 w +(cut-and-paste) 3134 7270 w +(editors) 3899 7270 w +(by) 4294 7270 w +(providing) 4466 7270 w +(a) 4985 7270 w +cleartomark +showpage +saveobj restore +%%EndPage: 1 1 +%%Page: 2 2 +/saveobj save def +mark +2 pagesetup +10 /LucidaSansUnicode00 f +(\255 2 \255) 2783 480 w +(comfortable) 720 840 w +(mouse-driven) 1368 840 w +(interface) 2116 840 w +(to) 2604 840 w +(a) 2766 840 w +(program) 2885 840 w +(with) 3366 840 w +(a) 3636 840 w +(solid) 3756 840 w +(command) 4054 840 w +(language) 4597 840 w +(driven) 720 960 w +(by) 1057 960 w +(regular) 1205 960 w +(expressions.) 1584 960 w +(The) 2263 960 w +(command) 2477 960 w +(language) 2988 960 w +(developed) 3464 960 w +(more) 3996 960 w +(than) 4280 960 w +(the) 4529 960 w +(mouse) 4717 960 w +(language,) 720 1080 w +(and) 1234 1080 w +(acquired) 1453 1080 w +(a) 1912 1080 w +(notation) 2006 1080 w +(for) 2450 1080 w +(describing) 2629 1080 w +(the) 3176 1080 w +(structure) 3371 1080 w +(of) 3849 1080 w +(files) 3987 1080 w +(more) 4229 1080 w +(richly) 4520 1080 w +(than) 4824 1080 w +(as a sequence of lines, using a dataflow-like syntax for specifying changes.) 720 1200 w +(The) 970 1356 w +(interactive) 1186 1356 w +(style) 1726 1356 w +(was) 1986 1356 w +(influenced) 2205 1356 w +(by) 2748 1356 w +10 /LucidaTypewriter f +(jim) 2899 1356 w +10 /LucidaSansUnicode00 f +(,) 3115 1356 w +6 /LucidaSansUnicode00 f +(1) 3147 1306 w +10 /LucidaSansUnicode00 f +(an) 3221 1356 w +(early) 3374 1356 w +(cut-and-paste) 3643 1356 w +(editor) 4387 1356 w +(for) 4710 1356 w +(the) 4885 1356 w +(Blit,) 720 1476 w +(and) 940 1476 w +(by) 1155 1476 w +10 /LucidaTypewriter f +(mux) 1305 1476 w +10 /LucidaSansUnicode00 f +(,) 1521 1476 w +6 /LucidaSansUnicode00 f +(8) 1553 1426 w +10 /LucidaSansUnicode00 f +(the) 1626 1476 w +(Blit) 1816 1476 w +(window) 2003 1476 w +(system.) 2406 1476 w +10 /LucidaTypewriter f +(Mux) 2844 1476 w +10 /LucidaSansUnicode00 f +(merges) 3094 1476 w +(the) 3487 1476 w +(original) 3676 1476 w +(Blit) 4078 1476 w +(window) 4265 1476 w +(system,) 4668 1476 w +10 /LucidaTypewriter f +(mpx) 720 1596 w +10 /LucidaSansUnicode00 f +(,) 936 1596 w +6 /LucidaSansUnicode00 f +(1) 968 1546 w +10 /LucidaSansUnicode00 f +(with) 1040 1596 w +(cut-and-paste) 1279 1596 w +(editing,) 2021 1596 w +(forming) 2426 1596 w +(something) 2846 1596 w +(like) 3394 1596 w +(a) 3601 1596 w +(multiplexed) 3691 1596 w +(version) 4304 1596 w +(of) 4691 1596 w +10 /LucidaTypewriter f +(jim) 4824 1596 w +10 /LucidaSansUnicode00 f +(that edits the output of \(and input to\) command sessions rather than files.) 720 1716 w +(The) 970 1872 w +(first) 1189 1872 w +(part) 1422 1872 w +(of) 1656 1872 w +(this) 1792 1872 w +(paper) 2009 1872 w +(describes) 2325 1872 w +(the) 2824 1872 w +(command) 3018 1872 w +(language,) 3535 1872 w +(then) 4049 1872 w +(the) 4305 1872 w +(mouse) 4499 1872 w +(lan\255) 4861 1872 w +(guage,) 720 1992 w +(and) 1091 1992 w +(explains) 1313 1992 w +(how) 1761 1992 w +(they) 2003 1992 w +(interact.) 2252 1992 w +(That) 2726 1992 w +(is) 2985 1992 w +(followed) 3107 1992 w +(by) 3562 1992 w +(a) 3719 1992 w +(description) 3816 1992 w +(of) 4401 1992 w +(the) 4541 1992 w +(imple\255) 4737 1992 w +(mentation,) 720 2112 w +(first) 1285 2112 w +(of) 1522 2112 w +(the) 1662 2112 w +(host) 1859 2112 w +(part,) 2112 2112 w +(then) 2382 2112 w +(of) 2641 2112 w +(the) 2781 2112 w +(terminal) 2978 2112 w +(part.) 3422 2112 w +(A) 3724 2112 w +(principle) 3835 2112 w +(that) 4300 2112 w +(influenced) 4533 2112 w +(the) 720 2232 w +(design) 917 2232 w +(of) 1282 2232 w +10 /LucidaTypewriter f +(sam) 1422 2232 w +10 /LucidaSansUnicode00 f +(is) 1680 2232 w +(that) 1801 2232 w +(it) 2033 2232 w +(should) 2140 2232 w +(have) 2509 2232 w +(no) 2775 2232 w +(explicit) 2939 2232 w +(limits,) 3335 2232 w +(such) 3676 2232 w +(as) 3943 2232 w +(upper) 4090 2232 w +(limits) 4416 2232 w +(on) 4725 2232 w +(file) 4889 2232 w +(size) 720 2352 w +(or) 946 2352 w +(line) 1081 2352 w +(length.) 1290 2352 w +(A) 1695 2352 w +(secondary) 1797 2352 w +(consideration) 2322 2352 w +(is) 3013 2352 w +(that) 3126 2352 w +(it) 3350 2352 w +(be) 3449 2352 w +(efficient.) 3601 2352 w +(To) 4092 2352 w +(honor) 4249 2352 w +(these) 4569 2352 w +(two) 4865 2352 w +(goals) 720 2472 w +(together) 1012 2472 w +(requires) 1457 2472 w +(a) 1889 2472 w +(method) 1977 2472 w +(for) 2382 2472 w +(efficiently) 2554 2472 w +(manipulating) 3062 2472 w +(huge) 3733 2472 w +(strings) 4008 2472 w +(\(files\)) 4374 2472 w +(without) 4675 2472 w +(breaking) 720 2592 w +(them) 1185 2592 w +(into) 1472 2592 w +(lines,) 1700 2592 w +(perhaps) 1998 2592 w +(while) 2428 2592 w +(making) 2720 2592 w +(thousands) 3118 2592 w +(of) 3661 2592 w +(changes) 3798 2592 w +(under) 4236 2592 w +(control) 4560 2592 w +(of) 4942 2592 w +(the) 720 2712 w +(command) 924 2712 w +(language.) 1451 2712 w +10 /LucidaTypewriter f +(Sam) 2007 2712 w +10 /LucidaSansUnicode20 f +(\031) 2223 2712 w +10 /LucidaSansUnicode00 f +(s) 2255 2712 w +(method) 2355 2712 w +(is) 2776 2712 w +(to) 2905 2712 w +(treat) 3051 2712 w +(the) 3325 2712 w +(file) 3528 2712 w +(as) 3727 2712 w +(a) 3881 2712 w +(transaction) 3984 2712 w +(database,) 4573 2712 w +(implementing) 720 2832 w +(changes) 1441 2832 w +(as) 1890 2832 w +(atomic) 2046 2832 w +(updates.) 2422 2832 w +(These) 2923 2832 w +(updates) 3261 2832 w +(may) 3698 2832 w +(be) 3949 2832 w +(unwound) 4119 2832 w +(easily) 4619 2832 w +(to) 4942 2832 w +10 /LucidaSansUnicode20 f +(\030) 720 2952 w +10 /LucidaSansUnicode00 f +(undo) 752 2952 w +10 /LucidaSansUnicode20 f +(\031) 1000 2952 w +10 /LucidaSansUnicode00 f +(changes.) 1083 2952 w +(Efficiency) 1597 2952 w +(is) 2106 2952 w +(achieved) 2237 2952 w +(through) 2712 2952 w +(a) 3150 2952 w +(collection) 3256 2952 w +(of) 3773 2952 w +(caches) 3922 2952 w +(that) 4299 2952 w +(minimizes) 4541 2952 w +(disc) 720 3072 w +(traffic) 965 3072 w +(and) 1303 3072 w +(data) 1534 3072 w +(motion,) 1795 3072 w +(both) 2221 3072 w +(within) 2495 3072 w +(the) 2843 3072 w +(two) 3050 3072 w +(parts) 3277 3072 w +(of) 3576 3072 w +(the) 3726 3072 w +(program) 3933 3072 w +(and) 4401 3072 w +(between) 4633 3072 w +(them.) 720 3192 w +(The) 970 3348 w +(terminal) 1186 3348 w +(part) 1623 3348 w +(of) 1854 3348 w +10 /LucidaTypewriter f +(sam) 1988 3348 w +10 /LucidaSansUnicode00 f +(is) 2240 3348 w +(fairly) 2356 3348 w +(straightforward.) 2635 3348 w +(More) 3484 3348 w +(interesting) 3764 3348 w +(is) 4322 3348 w +(how) 4438 3348 w +(the) 4674 3348 w +(two) 4865 3348 w +(halves) 720 3468 w +(of) 1070 3468 w +(the) 1213 3468 w +(editor) 1413 3468 w +(stay) 1745 3468 w +(synchronized) 1985 3468 w +(when) 2677 3468 w +(either) 2979 3468 w +(half) 3305 3468 w +(may) 3533 3468 w +(initiate) 3778 3468 w +(a) 4156 3468 w +(change.) 4255 3468 w +(This) 4711 3468 w +(is) 4960 3468 w +(achieved) 720 3588 w +(through) 1179 3588 w +(a) 1601 3588 w +(data) 1691 3588 w +(structure) 1936 3588 w +(that) 2409 3588 w +(organizes) 2635 3588 w +(the) 3144 3588 w +(communications) 3334 3588 w +(and) 4167 3588 w +(is) 4383 3588 w +(maintained) 4499 3588 w +(in parallel by both halves.) 720 3708 w +(The) 970 3864 w +(last) 1188 3864 w +(part) 1397 3864 w +(of) 1631 3864 w +(the) 1767 3864 w +(paper) 1960 3864 w +(chronicles) 2276 3864 w +(the) 2807 3864 w +(writing) 3000 3864 w +(of) 3375 3864 w +10 /LucidaTypewriter f +(sam) 3511 3864 w +10 /LucidaSansUnicode00 f +(and) 3765 3864 w +(discusses) 3983 3864 w +(the) 4486 3864 w +(lessons) 4679 3864 w +(that were learned through its development and use.) 720 3984 w +(The) 970 4140 w +(paper) 1193 4140 w +(is) 1513 4140 w +(long,) 1635 4140 w +(but) 1923 4140 w +(is) 2127 4140 w +(composed) 2249 4140 w +(largely) 2791 4140 w +(of) 3158 4140 w +(two) 3299 4140 w +(papers) 3517 4140 w +(of) 3889 4140 w +(reasonable) 4030 4140 w +(length:) 4602 4140 w +(a) 4985 4140 w +(description) 720 4260 w +(of) 1306 4260 w +(the) 1447 4260 w +(user) 1645 4260 w +(interface) 1898 4260 w +(of) 2365 4260 w +10 /LucidaTypewriter f +(sam) 2506 4260 w +10 /LucidaSansUnicode00 f +(and) 2765 4260 w +(a) 2988 4260 w +(discussion) 3086 4260 w +(of) 3639 4260 w +(its) 3780 4260 w +(implementation.) 3939 4260 w +(They) 4807 4260 w +(are) 720 4380 w +(combined) 913 4380 w +(because) 1433 4380 w +(the) 1869 4380 w +(implementation) 2066 4380 w +(is) 2870 4380 w +(strongly) 2992 4380 w +(influenced) 3429 4380 w +(by) 3978 4380 w +(the) 4135 4380 w +(user) 4332 4380 w +(interface,) 4584 4380 w +(and vice versa.) 720 4500 w +10 /LucidaSans-Demi f +(The Interface) 720 4740 w +10 /LucidaTypewriter f +(Sam) 720 4896 w +10 /LucidaSansUnicode00 f +(is a text editor for multiple files.) 968 4896 w +(File names may be provided when it is invoked:) 2608 4896 w +9 /LucidaTypewriter f +(sam) 920 5066 w +(file1) 1180 5066 w +(file2) 1570 5066 w +(...) 1960 5066 w +10 /LucidaSansUnicode00 f +(and) 720 5246 w +(there) 949 5246 w +(are) 1250 5246 w +(commands) 1451 5246 w +(to) 2029 5246 w +(add) 2176 5246 w +(new) 2406 5246 w +(files) 2650 5246 w +(and) 2902 5246 w +(discard) 3132 5246 w +(unneeded) 3535 5246 w +(ones.) 4065 5246 w +(Files) 4409 5246 w +(are) 4678 5246 w +(not) 4880 5246 w +(read) 720 5366 w +(until) 975 5366 w +(necessary) 1234 5366 w +(to) 1749 5366 w +(complete) 1887 5366 w +(some) 2373 5366 w +(command.) 2674 5366 w +(Editing) 3256 5366 w +(operations) 3632 5366 w +(apply) 4188 5366 w +(to) 4489 5366 w +(an) 4626 5366 w +(inter\255) 4782 5366 w +(nal) 720 5486 w +(copy) 907 5486 w +(made) 1175 5486 w +(when) 1483 5486 w +(the) 1781 5486 w +(file) 1977 5486 w +(is) 2169 5486 w +(read;) 2290 5486 w +(the) 2578 5486 w +(UNIX) 2774 5486 w +(file) 3050 5486 w +(associated) 3243 5486 w +(with) 3794 5486 w +(the) 4041 5486 w +(copy) 4238 5486 w +(is) 4507 5486 w +(changed) 4629 5486 w +(only) 720 5606 w +(by) 957 5606 w +(an) 1105 5606 w +(explicit) 1255 5606 w +(command.) 1643 5606 w +(To simplify the discussion, the internal copy is here called) 2217 5606 w +(a) 720 5726 w +10 /LucidaSans-Italic f +(file) 807 5726 w +10 /LucidaSansUnicode00 f +(, while the disc-resident original is called a) 956 5726 w +10 /LucidaSans-Italic f +(disc file.) 3085 5726 w +10 /LucidaTypewriter f +(Sam) 970 5882 w +10 /LucidaSansUnicode00 f +(is) 1222 5882 w +(usually) 1338 5882 w +(connected) 1715 5882 w +(to) 2251 5882 w +(a) 2386 5882 w +(bitmap) 2478 5882 w +(display) 2855 5882 w +(that) 3234 5882 w +(presents) 3462 5882 w +(a) 3916 5882 w +(cut-and-paste) 4008 5882 w +(editor) 4753 5882 w +(driven) 720 6002 w +(by) 1062 6002 w +(the) 1216 6002 w +(mouse.) 1410 6002 w +(In) 1836 6002 w +(this) 1966 6002 w +(mode,) 2183 6002 w +(the) 2526 6002 w +(command) 2719 6002 w +(language) 3235 6002 w +(is) 3716 6002 w +(still) 3834 6002 w +(available:) 4047 6002 w +(text) 4540 6002 w +(typed) 4769 6002 w +(in) 720 6122 w +(a) 844 6122 w +(special) 932 6122 w +(window,) 1299 6122 w +(called) 1734 6122 w +(the) 2051 6122 w +10 /LucidaTypewriter f +(sam) 2240 6122 w +10 /LucidaSans-Italic f +(window,) 2490 6122 w +10 /LucidaSansUnicode00 f +(is) 2921 6122 w +(interpreted) 3035 6122 w +(as) 3610 6122 w +(commands) 3750 6122 w +(to) 4313 6122 w +(be) 4445 6122 w +(executed) 4598 6122 w +(in) 720 6242 w +(the) 858 6242 w +(current) 1060 6242 w +(file.) 1457 6242 w +(Cut-and-paste) 1718 6242 w +(editing) 2490 6242 w +(may) 2874 6242 w +(be) 3120 6242 w +(used) 3285 6242 w +(in) 3563 6242 w +(any) 3700 6242 w +(window) 3915 6242 w +10 /LucidaSansUnicode20 f +(\024) 4330 6242 w +10 /LucidaSansUnicode00 f +(even) 4476 6242 w +(in) 4748 6242 w +(the) 4885 6242 w +10 /LucidaTypewriter f +(sam) 720 6362 w +10 /LucidaSansUnicode00 f +(window) 970 6362 w +(to) 1373 6362 w +(construct) 1505 6362 w +(commands.) 1992 6362 w +(The) 2619 6362 w +(other) 2835 6362 w +(mode) 3127 6362 w +(of) 3435 6362 w +(operation,) 3568 6362 w +(invoked) 4100 6362 w +(by) 4516 6362 w +(starting) 4666 6362 w +10 /LucidaTypewriter f +(sam) 720 6482 w +10 /LucidaSansUnicode00 f +(with) 972 6482 w +(the) 1213 6482 w +(option) 1404 6482 w +10 /LucidaTypewriter f +(-d) 1753 6482 w +10 /LucidaSansUnicode00 f +(\(for) 1933 6482 w +10 /LucidaSansUnicode20 f +(\030) 2141 6482 w +10 /LucidaSansUnicode00 f +(no) 2173 6482 w +(download) 2332 6482 w +10 /LucidaSansUnicode20 f +(\031) 2803 6482 w +10 /LucidaSansUnicode00 f +(\),) 2835 6482 w +(does) 2936 6482 w +(not) 3203 6482 w +(use) 3399 6482 w +(the) 3604 6482 w +(mouse) 3795 6482 w +(or) 4154 6482 w +(bitmap) 4291 6482 w +(display,) 4666 6482 w +(but) 720 6602 w +(still) 922 6602 w +(permits) 1137 6602 w +(editing) 1547 6602 w +(using) 1925 6602 w +(the) 2231 6602 w +(textual) 2426 6602 w +(command) 2804 6602 w +(language,) 3323 6602 w +(even) 3839 6602 w +(on) 4106 6602 w +(an) 4270 6602 w +(ordinary) 4428 6602 w +(ter\255) 4873 6602 w +(minal, interactively or from a script.) 720 6722 w +(The) 970 6878 w +(following) 1194 6878 w +(sections) 1684 6878 w +(describe) 2125 6878 w +(first) 2578 6878 w +(the) 2816 6878 w +(command) 3014 6878 w +(language) 3536 6878 w +(\(under) 4023 6878 w +10 /LucidaTypewriter f +(sam -d) 4384 6878 w +10 /LucidaSansUnicode00 f +(and) 4860 6878 w +(in) 720 6998 w +(the) 862 6998 w +10 /LucidaTypewriter f +(sam) 1068 6998 w +10 /LucidaSansUnicode00 f +(window\),) 1335 6998 w +(and) 1820 6998 w +(then) 2051 6998 w +(the) 2319 6998 w +(mouse) 2525 6998 w +(interface.) 2898 6998 w +(These) 3436 6998 w +(two) 3774 6998 w +(languages) 3999 6998 w +(are) 4543 6998 w +(nearly) 4745 6998 w +(independent, but connect through the) 720 7118 w +10 /LucidaSans-Italic f +(current text,) 2605 7118 w +10 /LucidaSansUnicode00 f +(described below.) 3245 7118 w +cleartomark +showpage +saveobj restore +%%EndPage: 2 2 +%%Page: 3 3 +/saveobj save def +mark +3 pagesetup +10 /LucidaSansUnicode00 f +(\255 3 \255) 2783 480 w +10 /LucidaSans-Demi f +(The Command Language) 720 840 w +10 /LucidaSansUnicode00 f +(A) 720 996 w +(file) 836 996 w +(consists) 1034 996 w +(of) 1474 996 w +(its) 1619 996 w +(contents,) 1783 996 w +(which) 2279 996 w +(are) 2607 996 w +(an) 2806 996 w +(array) 2970 996 w +(of) 3261 996 w +(characters) 3407 996 w +(\(that) 3955 996 w +(is,) 4227 996 w +(a) 4387 996 w +(string\);) 4490 996 w +(the) 4885 996 w +10 /LucidaSans-Italic f +(name) 720 1116 w +10 /LucidaSansUnicode00 f +(of) 1023 1116 w +(the) 1155 1116 w +(associated) 1344 1116 w +(disc) 1887 1116 w +(file;) 2115 1116 w +(the) 2332 1116 w +10 /LucidaSans-Italic f +(modified) 2521 1116 w +(bit) 2975 1116 w +10 /LucidaSansUnicode00 f +(that) 3136 1116 w +(states) 3360 1116 w +(whether) 3680 1116 w +(the) 4104 1116 w +(contents) 4292 1116 w +(match) 4742 1116 w +(those) 720 1236 w +(of) 1021 1236 w +(the) 1153 1236 w +(disc) 1342 1236 w +(file;) 1571 1236 w +(and) 1789 1236 w +(a) 2004 1236 w +(substring) 2094 1236 w +(of) 2587 1236 w +(the) 2720 1236 w +(contents,) 2910 1236 w +(called) 3394 1236 w +(the) 3712 1236 w +10 /LucidaSans-Italic f +(current) 3902 1236 w +(text) 4298 1236 w +10 /LucidaSansUnicode00 f +(or) 4516 1236 w +10 /LucidaSans-Italic f +(dot) 4653 1236 w +10 /LucidaSansUnicode00 f +(\(see) 4844 1236 w +(Figures) 720 1356 w +(1) 1116 1356 w +(and) 1220 1356 w +(2\).) 1441 1356 w +(If) 1642 1356 w +(the) 1749 1356 w +(current) 1945 1356 w +(text) 2336 1356 w +(is) 2568 1356 w +(a) 2689 1356 w +(null) 2785 1356 w +(string,) 3008 1356 w +(dot) 3363 1356 w +(falls) 3565 1356 w +(between) 3807 1356 w +(characters.) 4255 1356 w +(The) 4859 1356 w +10 /LucidaSans-Italic f +(value) 720 1476 w +10 /LucidaSansUnicode00 f +(of) 1017 1476 w +(dot) 1153 1476 w +(is) 1352 1476 w +(the) 1471 1476 w +(location) 1665 1476 w +(of) 2089 1476 w +(the) 2226 1476 w +(current) 2420 1476 w +(text;) 2809 1476 w +(the) 3071 1476 w +10 /LucidaSans-Italic f +(contents) 3265 1476 w +10 /LucidaSansUnicode00 f +(of) 3713 1476 w +(dot) 3850 1476 w +(are) 4050 1476 w +(the) 4241 1476 w +(characters) 4435 1476 w +(it) 4974 1476 w +(contains.) 720 1596 w +10 /LucidaTypewriter f +(Sam) 1235 1596 w +10 /LucidaSansUnicode00 f +(imparts) 1494 1596 w +(to) 1906 1596 w +(the) 2047 1596 w +(text) 2244 1596 w +(no) 2477 1596 w +(two-dimensional) 2642 1596 w +(interpretation) 3507 1596 w +(such) 4215 1596 w +(as) 4483 1596 w +(columns) 4631 1596 w +(or) 720 1716 w +(fields;) 856 1716 w +(text) 1187 1716 w +(is) 1412 1716 w +(always) 1526 1716 w +(one-dimensional.) 1879 1716 w +(Even) 2804 1716 w +(the) 3062 1716 w +(idea) 3251 1716 w +(of) 3488 1716 w +(a) 3620 1716 w +10 /LucidaSansUnicode20 f +(\030) 3709 1716 w +10 /LucidaSansUnicode00 f +(line) 3741 1716 w +10 /LucidaSansUnicode20 f +(\031) 3917 1716 w +10 /LucidaSansUnicode00 f +(of) 3983 1716 w +(text) 4116 1716 w +(as) 4342 1716 w +(understood) 4483 1716 w +(by) 720 1836 w +(most) 876 1836 w +(UNIX) 1159 1836 w +(programs) 1435 1836 w +10 /LucidaSansUnicode20 f +(\024) 1943 1836 w +10 /LucidaSansUnicode00 f +(a) 2084 1836 w +(sequence) 2180 1836 w +(of) 2678 1836 w +(characters) 2817 1836 w +(terminated) 3358 1836 w +(by) 3928 1836 w +(a) 4084 1836 w +(newline) 4180 1836 w +(character) 4591 1836 w +10 /LucidaSansUnicode20 f +(\024) 720 1956 w +10 /LucidaSansUnicode00 f +(is only weakly supported.) 852 1956 w +(The) 970 2112 w +10 /LucidaSans-Italic f +(current) 1197 2112 w +(file) 1604 2112 w +10 /LucidaSansUnicode00 f +(is) 1799 2112 w +(the) 1925 2112 w +(file) 2126 2112 w +(to) 2323 2112 w +(which) 2467 2112 w +(editing) 2794 2112 w +(commands) 3179 2112 w +(refer.) 3755 2112 w +(The) 4097 2112 w +(current) 4325 2112 w +(text) 4722 2112 w +(is) 4960 2112 w +(therefore) 720 2232 w +(dot) 1208 2232 w +(in) 1410 2232 w +(the) 1542 2232 w +(current) 1738 2232 w +(file.) 2129 2232 w +(If) 2385 2232 w +(a) 2492 2232 w +(command) 2588 2232 w +(doesn) 3107 2232 w +10 /LucidaSansUnicode20 f +(\031) 3400 2232 w +10 /LucidaSansUnicode00 f +(t) 3432 2232 w +(explicitly) 3509 2232 w +(name) 3985 2232 w +(a) 4291 2232 w +(particular) 4386 2232 w +(file) 4889 2232 w +(or) 720 2352 w +(piece) 855 2352 w +(of) 1143 2352 w +(text,) 1274 2352 w +(the) 1530 2352 w +(command) 1718 2352 w +(is) 2229 2352 w +(assumed) 2342 2352 w +(to) 2806 2352 w +(apply) 2937 2352 w +(to) 3233 2352 w +(the) 3365 2352 w +(current) 3554 2352 w +(text.) 3938 2352 w +(For) 4227 2352 w +(the) 4417 2352 w +(moment,) 4606 2352 w +(ignore the presence of multiple files and consider editing a single file.) 720 2472 w +cleartomark +saveobj restore +%ps_include: begin +save +/ed {exch def} def +{} /showpage ed +{} /copypage ed +{} /erasepage ed +{} /letter ed +currentdict /findfont known systemdict /findfont known and { + /findfont systemdict /findfont get def +} if +36 dict dup /PS-include-dict-dw ed begin +/context ed +count array astore /o-stack ed +%ps_include: variables begin +/llx 23 def +/lly 241 def +/urx 587.48 def +/ury 550.6 def +/w 0 def +/o 0 def +/s 0 def +/cx 2880 def +/cy -3972 def +/sx 4320 def +/sy 2520 def +/ax .5 def +/ay .5 def +/rot 0 def +%ps_include: variables end +{llx lly urx ury} /bbox ed +{newpath 2 index exch 2 index exch dup 6 index exch + moveto 3 {lineto} repeat closepath} /boxpath ed +{dup mul exch dup mul add sqrt} /len ed +{2 copy gt {exch} if pop} /min ed +{2 copy lt {exch} if pop} /max ed +{transform round exch round exch A itransform} /nice ed +{6 array} /n ed +n defaultmatrix n currentmatrix n invertmatrix n concatmatrix /A ed +urx llx sub 0 A dtransform len /Sx ed +0 ury lly sub A dtransform len /Sy ed +llx urx add 2 div lly ury add 2 div A transform /Cy ed /Cx ed +rot dup sin abs /S ed cos abs /C ed +Sx S mul Sy C mul add /H ed +Sx C mul Sy S mul add /W ed +sy H div /Scaley ed +sx W div /Scalex ed +s 0 eq {Scalex Scaley min dup /Scalex ed /Scaley ed} if +sx Scalex W mul sub 0 max ax 0.5 sub mul cx add /cx ed +sy Scaley H mul sub 0 max ay 0.5 sub mul cy add /cy ed +urx llx sub 0 A dtransform exch atan rot exch sub /rot ed +n currentmatrix initgraphics setmatrix +cx cy translate +Scalex Scaley scale +rot rotate +Cx neg Cy neg translate +A concat +bbox boxpath clip newpath +w 0 ne {gsave bbox boxpath 1 setgray fill grestore} if +end +gsave +%ps_include: inclusion begin + %!PS-Adobe-2.0 + %%Version: 3.3.2 + %%DocumentFonts: (atend) + %%Pages: (atend) + %%EndComments + %%EndProlog + %%BeginSetup +mark + %%Patch from lp + %%EndPatch from lp + +/picstr 98 string def +23 241 translate +564.48 309.60 scale + +784 430 1 [784 0 0 -430 0 430] +{currentfile picstr readhexstring pop} image + +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0001 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0001 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0001 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0001 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0001 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0001 +02001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfffffffe7fffffffe227ff0feffffffffffffff3ff87ff11ffcffffffff +fffffffe7fe7ffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffde01ffffe7fffffffe227fe7f9f833900fffffef3ff3e0711ffcffdffff1 +e0fffffe7fe7ffe7f3e0ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfcfffffe7fffffffe233fe7f3f3b39e7fffffcf9ff3e7311ffcff9fffe9 +ce7fffffffe7ffc7e3ce7fffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfcfe3ffe4f879cfff773f80f3e7f3de7f0e73019fc0673bbffc8e03ffe9 +ce7ff3907f07ffa7d3ce7fffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfcfe3ffe27339cfff779fe7e7e7f25e7e6673cfcff3e73bbffc479fffd9 +ce7ff3de7e67ff67b3fe7fffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfcfe3ffe7279cdfff779fe7e7e7f25e7ce737cfcff3e73bbffce79fffd9 +ce7ff25e7ce7ffe7f3fe7fffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02ffdfcfffffe7279c3fffffcfe7e7e7f25e7ce70fcfe7f3e67ffffce79fffb9 +ce7ff25e7ce7ffe7f3fcffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fcfffffe7279f7fffffcfe7e7e7f93e7c07dfcfe7f3e0fffffce79fff80 +ce7ff25e7ce7ffe7f3f9ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fcfffffe7279e1fffffe7e7e7e7f93e7cff87cff3f3e7fffffce79fff80 +ce7ff93e7ce7ffe7f3f3ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fcfe3ffe7279d9fffffe7e7e7e7f93e7cff67cff3f3e7fffffce79ffff9 +ce7ff93e7ce7ffe7f3e7ffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fcfe3ffe67339cffffff3e7e7f3b93e7e6673cff9f3e7fffffce79ffff9 +ce7ff93e7e47ffe7f3c07fffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fcfe3ffe0f879cffffff381f3f8393e7f0e73e1f9c0e7fffffce7c3ffe0 +e0fff9300f27ff81c0c07fffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889ffffffffffffffffffff9fff3fffffffffffffffcffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221ffffffffffffffffffff9fff9fffffffffffffffcffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889ffffffffffffffffffffffffeffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffe7fffffffe227ff0feffffffffffffff3ff87ff11ffcffffffff +fffffffe7fe7fffffffffffcfffcffffffffffffffffffefffffffffffffffff +fffffffffffffffffeffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221e07ffffe7fffffffe227fe7f9f833903fffffff3ff3e0711ffcffdffff1 +e0fffffe7fe7ff83c1fffffcff7cfffffffffffffeffff9c03ffffffffffff3e +0fffff00ffffffffff3fffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889e73ffffe7fffffffe233fe7f3f3b3939fffffff9ff3e7311ffcff9fffe9 +ce7fffffffe7ff399cfffffffe7cfffffffffffffcffff3f9ffffffffffffe3c +e7ffffe7ffffffffff9fffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221e73e3ffe4f879cfff773f80f3e7f3d39e0f07279fc0673bbffc8e03ffe9 +ce7ff3907f07ff399cffe720f80c8fffff9cfff0701fff3f9fffe1ffe73cfd3c +ffffffe7fff87ff9cf9fffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889e73e3ffe27339cfff779fe7e7e7f2539ce67313cff3e73bbffc479fffd9 +ce7ff3de7e67ff399cffe7bcfe7c47ffff9effe73cfffe7f9fffccffe73cfb3c +ffffffe7fff33ff9cfcfffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221e77e3ffe7279cdfff779fe7e7e7f253bfe67f39cff3e73bbffce79fffd9 +ce7ff25e7ce7ff399cffe4bcfe7ce7ffff92ffff3cfffe7f9fff9cfff37cff3c +ffffffe7ffe73ff9efcfffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889e0fffffe7279c3fffffcfe7e7e7f2507fe63f39e7f3e67ffffce79fffb9 +ce7ff25e7ce7ff819cffe4bcfe7ce7ffff92ffff3cfffe7f9fff9cfff0e01f3c +0fffffe7ffe73ffccfcfffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221e67ffffe7279f7fffffcfe7e7e7f9333e070739e7f3e0fffffce79fff80 +ce7ff25e7ce7fff99cffe4bcfe7ce7ffff92fff03cfffe7f9fff80fffde01f3c +e7ffffe7ffe03ffcdfcfffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889e67ffffe7279e1fffffe7e7e7e7f9333ce7e339f3f3e7fffffce79fff80 +ce7ff93e7ce7fff99cfff27cfe7ce7ffffc9ffe73cfffe7f9fff9ffff87cff3c +e7ffffe7ffe7fffcdfcfffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221e73e3ffe7279d9fffffe7e7e7e7f9339ce7f339f3f3e7fffffce79ffff9 +ce7ff93e7ce7fff99cfff27cfe7ce7ffc7c9ffe73cfffe7f9fc79ff1f67cff3c +e78fffe7f1e7fc7e3fcfffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889e73e3ffe67339cffffff3e7e7f3b9339cc67333f9f3e7fffffce79ffff9 +ce7ff93e7e47ff399cfff27cfe7ce7ffc7c9ffe63cfffe7f9fc7ccf1e73cff3c +e78fffe7f1f33c7e3fcfffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221e71e3ffe0f879cffffff381f3f839338e270707f9c0e7fffffce7c3ffe0 +e0fff9300f27ff83c1fff2601f0ce7ffc7c9fff13e1fff3f9fc7e1f1e73ffc0e +0f8fffe7f1f87c7f3f9fffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889ffffffffffffffffffff9fff3ffffffffffff3ffcffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff3fffffffffffffffff +ffcfffffffffffff7f9fffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221ffffffffffffffffffff9fff9ffffffffffff3ffcffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff9fffffffffffffffff +ffcffffffffffffe7f3fffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889ffffffffffffffffffffffffeffffffffffff3fffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffefffffffffffffffff +ff9ffffffffffffc7effffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889e0fe7ffffffff0fffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fcfe7fffffffe7fffffffff807fffffffbfffff03ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fcffffffffffe7ffffffffff3ffffffff3fffff39ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fcf07c8f87ff80c670e5bfff3fffc3ffc070fff39ffe73fffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fcfe7c4733ffe7e066601fff3fff99fff3e67ff39ffe7bfffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fcfe7ce673ffe7e64f249fff3fff39fff3cf3ff3bffe4bfffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fcfe7ce673ffe7e7cf249fff3fff39fff3cf3ff07ffe4bfffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fcfe7ce603ffe7e7cf249fff3fff01fff3cf3ff33ffe4bfffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fcfe7ce67fffe7e7cf249fff3fff3ffff3cf3ff33fff27fffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fcfe7ce67fffe7e7cf249fff3f8f3ffff3cf3ff39f1f27fffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fcfe7ce733ffe7e7e6649fff3f8f99fff3e67ff39f1f27fffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221e0100ce787ff81c1f0e49fff3f8fc3fff870fff38f1f27fffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffff80000000800000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221c00000000001fffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff3f80000001800000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889c00000000001fff87ffffffffffffffffffffcfffcfffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff0f80078c67f00000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221c00000000001fff3fffffffffc0ffffffffffcfffcffdfffc1f8fffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff1f800ccc61800000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889c00000000001fff3fffffffffce7fffffffffffffcff9fff9cf4fffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff3f8018cc61800000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221c7c73398f0c7ffc0633872dffce7ffe1ffe320fe0c8e03ff9cf4fffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7d80180c61800000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889cc63f1f998c3fff3f033300ffce7ffccfff03cfccc479ffffcecfffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffff980180c61800000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221c063319b0cdbfff3f327924ffcefff9cfff33cf9cce79ffffcecfffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffef080180c61800000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889c06301830cdbfff3f3e7924ffc1fff9cfff3fcf9cce79ffff9dcfffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffce080180c61800000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221c7e301830cdbfff3f3e7924ffccfff80fff3fcf9cce79ffff3c07ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fff8c0000ccee1800000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889cc6301830c6dfff3f3e7924ffccfff9ffff3fcf9cce79fffe7c07ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fff08000078760f00000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221cc6301830c6dfff3f3e7924ffce7c79ffff3fcf9cce79fffcffcfffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe00000000000000000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889cce30181986dfff3f3f3324ffce7c7ccfff3fcfc8ce79fff80fcfffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffc10000000000000000ffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221c767c3e0f06dffc0e0f8724ffce3c7e1ffe0e01e4ce7c3ff80f07ffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ff837ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889c00000000001ffffffffffffffffffffffffffffcffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffc77ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221c00000000001fffffffffffffffffffffffffff9cffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffef7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889c00000000001fffffffffffffffffffffffffffc1ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fffffffff7ffffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffffffffe7ffffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889f3ffffffffcffffff9fffffc47ffffffcffffffffc47ffffe7ffe7fffff +fffffffffffffffffcfffffe1ff83fffffffffffffffffffffffffffffffffff +ffff7fc9f078380f0ffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221f3ffffffffcffffff9fffffc47dfffffcfffffff7c47ffffe7fbe7fffff +ffffffff7ffffffffcfffffcffff3ffffff7ffffffffffffffffffffffffffff +ffff7fc4e7339e7e67feffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889f3fffffffffffffffffffffc479fffffcffffffe7c47fffffff3e7fffff +fffffffe7ffffffffcfffffcffff3fffffe7ffffffffffffffffffffffffffff +ffff7fce7f33fe7ce7feffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221f27c3ce7fe0f91ce41f83ffeee0387ffc8f0f8380eefff3907c0647ffff +ce7ff8380fff8723e0fff0f01fff3f078380fff07198ce1e73ffffffffffffff +ffff7fce7f31fe7ce7feffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889f1399ce7ffcf88ce79f39ffeef9f33ffc466739e7eefff3de7f3e23ffff +cf7ff39e7fff3311ccffe67cffff3e7339e7ffe7381c0cce7bffffffffffffff +ffff7fce70383e7c07feffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221f393ce6fffcf9ccf79f3fffeef9e79ffce4f33fe7eefff25e7f3e73ffff +c97fff9e7ffe73399cffcf3cffff3ff33fe7ffff399cc9e64bffffffffffffff +ffff7fce673f1e7cfffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889f393ce1fffcf9ce679f1ffffff9e79ffce4f31fe7fffff25e7f3e73ffff +c97fff9e7ffe73399cffcf3cffff3ff31fe7ffff39fcf9e64bffffffffffffff +ffff7fce673f9e7cfffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221f393cfbfffcf9ce6f9f83fffff9e79ffce4f383e7fffff25e7f3e73ffff +c97ff81e7ffe03399cffcf3cffff3f0383e7fff039fcf9e64bffffffffffffff +ffff7fcce6339e7e67feffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889f393cf0fffcf9ce6f9ff1fffff9e79ffce4f3f1e7fffff93e7f3e73ffff +e4fff39e7ffe7f399cffcf3cffff3e73f1e7ffe739fcf9e727ffffffffffffff +ffff7fc1f1383f0f0ffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221f393cecfffcf9cf1f9ff9fffff9e79ffce4f3f9e7fffff93e7f3e73ffe3 +e4fff39e7ffe7f399cffcf3cffff3e73f9e7ffe739fcf9e727ffffffffffffff +ffff7fcffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889f3399ce7ffcf9cf1f9f39fffff9f33ffce66739e7fffff93e7f3e73ffe3 +e4fff31e7fff3339c8ffe67cffff3e6339e7ffe639fcfccf27ffffffffffffff +ffff7fcffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221f07c3ce7fe019cf1c0383fffffc387ffce70f83f0fffff9300f8673ffe3 +e4fff89f0fff8739e4fff0f03ff8071383f0fff130783e1f27ffffffffffffff +ffff7fcffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fffffffffff87feffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fffffffffff3ffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fffffffffff3ffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fe0e47838cc07feffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fce62339c0f3ffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fcfe73f9ccf3ffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fc7e73f9cff3ffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fe0e7381cff3ffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffc67339cff3ffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffe67339cff3ffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +02001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fce67331cff3ffeffffffffffffffffffffffffffffffffffffffffffff +ff81 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007fe0e738983c0ffe00000000000000000000000000000000000000000000 +0001 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007ffffffffffffffe00000000000000000000000000000000000000000000 +0001 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007ffffffffffffffe00000000000000000000000000000000000000000000 +0001 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +00007ffffffffffffffe00000000000000000000000000000000000000000000 +0001 +0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffc1fffffcffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fff9fffffcffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ffffffffffe1e7ffffffffff3ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fff9fffffcffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffffcfe7fff03fffff3ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fff9f87c3ce7ffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ffffffffffcffffff03ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fff9f3399cefffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffff0107f077fff9383f87fffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fff9e793ccdfffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ffffffffffcfe7e677fff89f3f33fffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fff9e793ccbfffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffffcfe7ce71fff9cf3e73fffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fff9e793cc3fffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fff80fffffcfe7ce7c7ff9cf3e7ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fff9e793cc9fffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fff80fffffcfe7ce7f3ff9cf3e7ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fff9e793cccfffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ffffffffffcfe7ce7f3ff9cf3e7ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fff9f3399ce7ffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffff1fffcfe7ce7f3c79cf3e7ffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffc0387c3ce7ffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ffffff1fffcfe7e4673c799f3f33fffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffff1fff0300f2707c78380787fffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffe7ffff9fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffffffffce7ffff9fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ffffffffffffffe0fffff9fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffefffffffefffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ff9ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffcfffffffe7ffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ff9ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ff9cb7399cf3ffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ff3ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ff3c03399cf9ffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ff3c1c6633879cfffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fe7c9339cdfcffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fe79ce0703339efffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fc7c9339c3fc7feffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fe7fce67327992fffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fe7c9339f7fcffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fcffce7f3e7992fffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ff3c9339e1f9ffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fcfc0e7f3e7992fffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ff9c9339d9f3ffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f9f9ce7f3e79c9fffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffcc93119ce7ffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f9f9ce7f3e79c9fffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffec93899cefffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f3f98e7f3f33c9fffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f3fc4c1e0f87c9fffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7ffffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fe7fffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fe7fffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fcffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7fcf07198ce1e73effffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7f9e7381c0cce7beffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7f9ff399cc9e64beffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7f3ff39fcf9e64beffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7f3f039fcf9e64beffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7e7e739fcf9e727effffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7e7e739fcf9e727effffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7cfe639fcfccf27effffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff7cff130783e1f27effffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff79fffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff79fffffffffffffeffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221dffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0001 +00000000000000000000000000000000000000000000077fef81fffff3ffffff +fceec00c0303e633f060300060060fc77ffe7feffff8f07fffff3ff3fff3f9f0 +7fffff3fdf3fffffffffffffffdfff80e07ff01c1f8ffffffffffffffe000000 +0001 +0ffffffffffffffffffffffffffffffffffffffffffff77fef9ffffff3ffffff +fcee600c060626330000300030060c677ffe7fcffff4e73ffffffff3ffe3f1e7 +3fffffff9f3fffffffffffffff9fff80e07ff019cf4ffffffffffffffeffffff +ffe1 +0ffffffffffffffffffffffffffffffffffffffffffff77fef9ff1fff27c3ce7 +fc44603f860c061303e0301e301fcc622ffe4701fff4e73ff9c83f83ffd3e9e7 +3ff9c83e0323ffffe4739ffe0e03fffeefffffd9cf4ffffffffffffffeffffff +ffe1 +0e001ffffffffffffffffffffffffffffffffffffffff77fef9ff1fff1399ce7 +fc44300c0c0c06d30060303318060c622ffe23cfffece73ff9ef3f33ffb3d9ff +3ff9ef3f9f11ffffe233dffce79ffffcefffff99cecffffffffffffffeffffff +ffe1 +0e889ffffffffffffffffffffffffffffcffffe7fffff77fef9ff1fff393ce6f +fc44300c0c0c06d30060306318060c622ffe73cfffece73ff92f3e73fff3f9ff +3ff92f3f9f39ffffe7325fffe79ffff9e3ffff39cecffffffffffffffeffffff +ffe1 +0e221fffffffffffffffbffffffffffffcffffe7fffff77fef83fffff393ce1f +fc00180c0c0c06d3e06030630c060cc00ffe73cfffdce73ff92f3e73fff3f9fe +7ff92f3f9f39ffffe7325fffe79ffff3f8fffe79cdcffffffffffffffeffffff +ffe1 +0e889fffffffffffffff3fffffffffffffffffe7fffff77fef9ffffff393cfbf +fc00180c0c0c03630060307f0c060f800ffe73cfffc0673ff92f3e73fff3f9fc +fff92f3f9f39ffffe7325ffe079fffe7fe7ffcf9cc07fffffffffffffeffffff +ffe1 +0e221f19e1f0673c3c1c0707ffc1ffe720f91f070f39f77fef9ffffff393cf0f +fc000c0c0c0c03630060306006060c000ffe73cfffc0673ffc9f3e73fff3f9f9 +fffc9f3f9f39ffffe7393ffce79fffe7fe7ffcf9cc07fffffffffffffeffffff +ffe1 +0e889f81cce6673999cf3e73ff9cffe7bcf88e66673df77fef9ff1fff393cecf +fc000c0c0c0c03630060306006060c000ffe73cffffce73ffc9f3e73fff3f9f3 +fffc9f3f9f39fff1e7393ffce79fffcffe78f9f9cfcffffffffffffffeffffff +ffe1 +0e221f999cce673399ff3e7ffffcffe4bcf9cce4f325f77fef9ff1fff3399ce7 +fc00060c0c0623630060303303060c000ffe73cffffce73ffc9f3f23fff3f9e0 +3ffc9f3f9f39fff1e7393ffcc79fffcfce78f9f9cfcffffffffffffffeffffff +ffe1 +0e889f9f9cce673398ff3e3ffffcffe4bcf9cce4f325f77fef9ff1fff07c3ce7 +fc00063f0603e36303fdfe1e031f8c000ffe73e1fff0707ffc980793ffc0e060 +3ffc9807c339fff1e7393ffe27c3ffcfe0f8f9fc1f07fffffffffffffeffffff +ffe1 +0e221f9f80ce67301c1f3f07ffc0ffe4bcf9cce4f325f77fefffffffffffffff +fc0003000600000000000000018000000fffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffcfffffffffffffffffffffeffffff +ffe1 +0e889f9f9fce6733ff8f3fe3ff9cfff27cf9cce4f393f77fefffffffffffffff +fc0003000300000000000000018000000fffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffcfffffffffffffffffffffeffffff +ffe1 +0e221f9f9fce6733ffcf3ff3ff9cfff27cf9cce4f393f77fefffffffffffffff +fc0000000080000000000000000000000fffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffff9fffffffffffffffffffffeffffff +ffe1 +0e889f9fcce4623999cf3e73ff98fff27cf9ce466793f77fefffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221f07e1f2713c3c1f8707ffc4fff26019cf270f93f77fefffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889ffffffe7ffffffffffffffffffffffffffffffff77fefffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221ffffffe7ffffffffffffffffffffffffffffffff77fefffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889ffffffe7ffffffffffffffffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221ffffffffffffffffffffffffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889ffffffffffffffffffffffffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221fffe0ce7ffffffffffffffffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889fffcece7ffffffffffffffffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221fff9fcf7ff23e1ce7fffffffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889fff9fc97ff11cccf7fffffffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221fff9fc97ff399cc97fffffffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889fff9fc97ff399cc97fffffffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221fff9fe4fff3980c97fffffffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889fff9fe4fff399fe4ffffffffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221fc79fe4fff399fe4fffc7fffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889fc7cee4fff39cce4fffc7fffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221fc7e0e4fff39e1e4fffc7fffffffffffffffffff7222f07f3ffffffff87 +fffffffffffffffffffffffffffff3ffff87c3ffffffffffff0f87ffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889fffffffffffffffffffe7fffffffffffffffffff7088fe7f3ffffffff3f +ffffffffe0f83fffffffefffffe733ffff3f9fffffffe07ffe7f3fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221fffffffffffffffffffe7fffffffffffffffffff7222fe7ffffffffff3f +ffffffffe6739fffffffcfffffe733ffff3f9fffffffe73ffe7f3fffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889fffffffffffffffffffcffffffffffffffffffff7088fe783e47c3ffc06 +33872dffe7339ffc8fff01c3ffe23279cc0603c38cffe733980c078719ffe0ff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221ffffffffffffffffffffffffffffffffffffffff7222fe7f3e2399fff3f +033300ffe73f9ffc47ffcf99ffe23139cf3f9f99c0ffe7339e7f3f3381ffce7f +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889ffffffffffffffffffffffffffffffffffffffff7088fe7f3e7339fff3f +327924ffe73f9ffce7ffcf3cffe93399cf3f9f39ccffe7739e7f3e7399ffcfff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221fffe0ce7ffffffffffffffffffffffffffffffff7222fe7f3e7339fff3f +3e7924ffe73f3ffce7ffcf3cffe93399cf3f9f39cfffe0f39e7f3e739fffc7ff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889fffcece7ffffffffffffffffffffffffffffffff7088fe7f3e7301fff3f +3e7924ffe73e7ffce7ffcf3cffe93399cf3f9f01cfffe7739e7f3e039fffe0ff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221fff9fcf7ff01e1c670f39fffffffffffffffffff7222fe7f3e733ffff3f +3e7924ffe73cfffce7ffcf3cffe93399cf3f9f3fcfffe7339e7f3e7f9ffffc7f +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889fff9fc97fff9cce066739fffffffffffffffffff7088fe7f3e733ffff3f +3e7924ffe739fe3ce7ffcf3cffef3399cf3f9f3fcff1e7339e7f3e7f9fe3fe7f +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221fff9fc97fff39ce64f39bfffffffffffffffffff7222fe7f3e7399fff3f +3f3324ffe6701e3ce7ffcf99ffef33388f3f9f99cff1e7311e7f3f339fe3ce7f +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889fff9fc97ffe79ce7cf387fffffffffffffffffff7088f0080673c3ffc0e +0f8724ffe0f01e3ce7ffe1c3ffef307c4c0e07c383f1e078981c0f8707e3e0ff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221fff9fe4fffcf80e7cf3effffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889fff9fe4fff9f9fe7cf3c3fffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221fc79fe4fff3f9fe7cf3b3fffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889fc7cee4fff3fcce7e6739fffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221fc7e0e4fff01e1c1f0f39fffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889ffffffffffffffffffffffffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221ffffffffffffffffffffffffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889ffffffffffffffffffffffffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221ffffffffffffffffffffffffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889ffffffffffffffffffffffffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221ffffffffffffffffffffffffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889ffffffffffffffffffffffffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221f878cfffffffffffffffffffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889f33c0fffffffffffffffffffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221e79ccfffffffffffffffffffffffffffffffffff7222fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889e79cffffffffffffffffffffffffffffffffffff7088fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221e79cffffffffffffffffffffffffffffffffffff7000fffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889e79cffffffffffffffffffffffffffffffffffff7ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e221e79cffffffffffffffffffffffffffffffffffff7ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffff +ffe1 +0e889f33cffffffffffffffffffffffffffffffffffff0000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000ffffff +ffe1 +0e221f8783ffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffffffffffe7fffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffe0ce7ffffffffe7fffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffcece7ffffffffe7fffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fff9fcf7ff19e1e0e478393f0ffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fff9fc97ff81ccce6233989e67fffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfff9fc97ff999ccfe73f99cce7fffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0effdfff9fc97ff9f9cc7e73f99cce7fffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fff9fe4fff9f80e0e73819cc07fffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fff9fe4fff9f9ffc673399ccfffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fc79fe4fff9f9ffe673399ccffffc7fffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fc7cee4fff9fccce6733199e67ffc7fffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fc7e0e4fff07e1e0e738983f0fffc7fffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffff9ffffffe7fffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffff9ffffffe7fffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffff9ffffffcffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fcffffffff3fffffffffffffffff3ffffffffffffffffffffffffffffff +fffffe1fffffffffffcfffffffffffffff07fffffffffffffffffffffffffffc +fffffffffff9fff9ffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fcff7fffff3fffffffffffffffdf3ffffffffffffffffffffffffffffff +fffffcfffffffffff7cfffffffffffffffe7fffffffffffffffff7fffffffffc +fffffffffff9fef9ffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffe7fffff3fffffffffffffff9f3ffffffffffffffffffffffffffffff +fffffcffffffffffe7cfffffffffffffffe7ffffffffffffffffe7fffffffffc +fffffffffffffcf9ffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221e0f80fff8723c1c8f83c3c1ffe0323e1ffcb7879ce0f87ffe1ce63383c3 +c67ff018ce1cb7ff80c8f87ff9ce0e7383e7fff07198ce1e73ff80e1fff83ffc +9f0f39ffce41f0191fffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fcfe7fff33119cc4733999cfff9f11ccffc03339cce733ffccce7033999 +e07ffcfc0ccc03ffe7c4733ff9cce67339e7ffe7381c0cce7bffe7ccfff39ffc +4e6739ffcf79fcf88fffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fcfe7ffe7339fcce673399ffff9f399cffc92799ccfe73ff9cce7333f3c +e67ffcfcc9e493ffe7ce673ff9ccfe73f9e7ffff399cc9e64bffe79e7fff9ffc +e4f39bffc979fcf9cfffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fcfe7ffe7f39fcce673398ffff9f399cffc92799cc7e73ff9fce73f1f3c +e7fffcfcf9e493ffe7ce673ff9cc7e73f9e7ffff39fcf9e64bffe79e7fff9ffc +e4f387ffc979fcf9cfffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fcfe7ffe7f39c0ce67301c1fff9f3980ffc92799ce0e03ff9fce73f833c +e7fffcfcf9e493ffe7ce603ff9ce0e7381e7fff039fcf9e64bffe79e7ff81ffc +e4f3efffc979fcf9cfffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fcfe7ffe7f399cce6733ff8fff9f399fffc92799cfc67fff9fce73ff13c +e7fffcfcf9e493ffe7ce67fff9cfc67339e7ffe739fcf9e727ffe79e7ff39ffc +e4f3c3ffe4f9fcf9cfffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fcfe7ffe7f399cce6733ffcfff9f399fffc92799cfe67fff9fce73ff93c +e7fffcfcf9e493ffe7ce67fff9cfe67339e7ffe739fcf9e727ffe79e7ff39ffc +e4f3b3ffe4f9fcf9cfffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fcfe7fff333998ce723999cfff9f39ccffc933388ce733ffccc473f3999 +e7fffcfcfccc93ffe7ce733ff88ce62331e7ffe639fcfccf27ffe7ccfff31ffc +ce6739ffe4f9fcf9cfffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221e01f0fff8739c4ce793c3c1fffc339e1ffc9387c4e0f87ffe1e260f83c3 +c1fff0383e1c93fff0ce787ffc4e0f138900fff130783e1f27fff0e1fff89ffc +1f0f39ffe4c03e19cfffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffffffffffff3ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ffffffffffffffffe73ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffff07ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffffff0783fffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ffffffffffffe7f3fffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffffffe7f3fffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f83ffe0cb783e7f3fff838cc670f39fffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f39ffce40339e7f3fff39c0e06673dfffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ff9ffcfc93f9e7f3ffff9cce64f325fffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ff9ffc7c93f9e7f3ffff9cfe7cf325fffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f81ffe0c9381e7f3fff81cfe7cf325fffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f39fffc49339e7f3fff39cfe7cf393fffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f39fffe49339e7f3fff39cfe7cf393e3fffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f31ffce49331e7f3fff31cfe7e6793e3fffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f89ffe0c938900807ff8983c1f0f93e3fffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00000 +000000000000001fffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffff3fe7fffffffffffffffffffffff3fffffffffffffffffffff +fffffff9ffffffffffffff3fffffffffcffffe79ffffffffffffffffffc00003 +006000000000001ffffffffffffffffff07fffff3fffffffffffffffffffffff +ffe1 +0e221f03fffffdf3fe7ffffffff7fffdffffffffdf3fffffffffffffffffffff +fffffff9ffffffffffffff3fff7fffffcffffe79ffffffbfffffffffffc00003 +006010000000001ffffffffff7fffffffe7fffff3fffffffffffffffffffffff +ffe1 +0e889fcffffff9f3ffffffffffe7fff9ffffffff9f3fffffffffffffffffffff +fffffff9ffffffffffffff3ffe7ffffffffffe7fffffff3fffffffffffc00003 +000030000000001fffffffffe7fffffffe7fffff3fffffffffffffffffffffff +ffe1 +0e221fcf91ffe032307e0fff8380e0e03c3ffffe0323e1ffcb7879ce0f87ff2d +e0e73ff93f0fff39c1f0f83ff80e1ffe0f91f041fc3c1c0787ffc1c8ffc7c733 +63e0fe731f1ccc7ffc6787c380e0e47c1e7f0fff279cffffffffffffffffffff +ffe1 +0e889fcf88fff9f11e7ce7ff39e7ce79f99fffff9f11ccffc03339cce733ff00 +ce673ff89e67ff399ce6733ffe7ccfffcf88e679f999cf3f33ff9cc47fcc63f3 +b060303f318fcc7ffe073399e7ce62399e7e67ff139cffffffffffffffffffff +ffe1 +0e221fcf9cfff9f39e7cffff3fe7fe79f39fffff9f399cffc92799ccfe73ff24 +fe67bff9cce7ff399fce673ffe79e7ffcf9cce79f39fcf3e73fffcce7fc06333 +18603033018ccc3ffe667339e7fe67339e7ce7ff399effffffffffffffffffff +ffe1 +0e889fcf9cfff9f39e7c7fff1fe7fe79f39fffff9f399cffc92799cc7e73ff24 +fe733ff9cce7ff398fce673ffe79e7ffcf9cce79f3ffcf3e73fffcce7fc06303 +18603030018c067ffe7e733fe7fe67339e7ce7ff39ccffffffffffffffffffff +ffe1 +0e221fcf9cfff9f39e7e0fff83e7e079f01fffff9f3980ffc92799ce0e03ff24 +e0737ff9cc07ff39c1c0673ffe79e7ffcf9cce79f3fc0f3e03ffc0ce7fc7e303 +186030301f8c065ffe7e033fe7e067339e7c07ff39cdffffffffffffffffffff +ffe1 +0e889fcf9cfff9f39e7fc7fff1e7ce79f3ffffff9f399fffc92799cfc67fff24 +ce737ff9ccffff39f8cfe73ffe79e7ffcf9cce79f3f9cf3e7fff9cce7fcc6303 +18603030318c065ffe7e7f3fe7ce67339e7cffff39cdffffffffffffffffffff +ffe1 +0e221fcf9cfff9f39e7fe7fff9e7ce79f3fe3fff9f399fffc92799cfe67fff24 +ce78fff9ccffff39fccfe73ffe79e7ffcf9cce79f3f9cf3e7fff9cce7fcc6303 +18603030318c039ffe7e7f3fe7ce67339e7cffff39e3ffffffffffffffffffff +ffe1 +0e889fcf9cfff9f39e7ce7ff39e7cc79f99e3fff9f39ccffc933388ce733ff24 +cc78fff99e67ff119ce6723ffe7ccfffcf9ce479f9998f3f33ff98ce7fcce303 +30603030338c039ffe7f3399e7cc67391e7e67ff33e3ffffffffffffffffffff +ffe1 +0e221f039cfffc33900e0fff83f0e27c3c3e3fffc339e1ffc9387c4e0f87ff24 +e27cfff83f0fff89c1f0f93fff0e1ffe019cf2403c3c4f8787ffc4ce7fc767c3 +e3fc1e7c1d9f019ffc1f87c3f0e2673c900f0fff07f3ffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffff3fffffffffffffffffffffffffff +fffdffffffffffffffffffffffffffffffffffffffffffffffffffffffc00000 +000000000000011fffffffffffffffff9ffffffffff7ffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffff3fffffffffffffffffffffffffff +fff9ffffffffffffffffffffffffffffffffffffffffffffffffffffffc00000 +000000000000031ffffffffffffffff39fffffffffe7ffffffffffffffffffff +ffe1 +0e889ffffffffffffffffffffffffffffffe7fffffffffffffffffffffffffff +fff1ffffffffffffffffffffffffffffffffffffffffffffffffffffffc00000 +000000000000071ffffffffffffffff83fffffffffc7ffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffffffe7fffffff9fffffffffffffffffffffffffffffffffffff +fffffffffffffffffffe7ffffff83ffffffff3ffffffff3ffffffffffffff9ff +fffffffffffffffe7fffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ffffffffffffe7fffffff9ffffdfeffffffff83fffffdffffffffffffff +fffffffffffffffffffe7fffffff3ffffffff3ffffffff3fdffffffbfffef9ff +fffffffffffffffe7fbfffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffff9ffff9fcffffffff39fffff9ffffffffffffff +fffffffffffffffffffe7fffffff3fffffffffffffffffff9ffffff3fffcf9ff +ffffffffffffffffff3fffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f278cf0f078307c8f83ff93ce60301c3c8fff39ffe0e03ffc3c8f87ffe1 +e1e3323e1c67ff8391f07ff19e1f3f8783c183e47c1ff83e03ffc1c07ff0191f +0fff8793c9f0f8307c0787ffe1e1e3323e1c67ffffffffffffffffffffffffff +ffe1 +0e889f13c0e667339e7c4733ff89ce79fcf99c47fff9ffce79fff99c4733ffcc +ccf0311cce07ff3988e67ff81ccf3f33399cf3e2399fff3f9fff9cf3fffcf88e +67ff3389c4e6739e7f3f33ffccccf0311cce07ffffffffffffffffffffffffff +ffe1 +0e221f39ccce67f3fe7ce673ff9cce79fcf3cce7fff9fffe79fff3cce673ff9c +9e733399ce67fff99cce7ff999cf3e73f99ff3e7339fff3f9ffffcf3fffcf9cc +e7fe799cce4f33fe7f3e73ff9c9e733399ce67ffffffffffffffffffffffffff +ffe1 +0e889f39cfce63f1fe7ce673ff9cce79fcf3cce7ffc7fffe79fff3cce673ff9f +9e73f399ce7ffff99cce7ff9f9cf3e73f98ff3e7339fff3f9ffffcf3fffcf9cc +e7fe799cce4f31fe7f3e73ff9f9e73f399ce7fffffffffffffffffffffffffff +ffe1 +0e221f39cfc070783e7ce673ff9cce79fcf3cce7fff9ffe079fff3cce603ff9f +9e73f3980e7fff819cce7ff9f80f3e0381c1f3e7339fff3f9fffc0f3fffcf9cc +07fe799cce4f383e7f3e03ff9f9e73f3980e7fffffffffffffffffffffffffff +ffe1 +0e889f39cfcffe3f1e7ce673ff9cce79fcf3cce7fff9ffce79fff3cce67fff9f +9e73f399fe7fff399cce7ff9f9ff3e7f39f8f3e7339fff3f9fff9cf3fffcf9cc +fffe799cce4f3f1e7f3e7fff9f9e73f399fe7fffffffffffffffffffffffffff +ffe1 +0e221f39cfcfff3f9e7ce673ff9cce79fcf3cce7fff9ffce79fff3cce67fff9f +9e73f399fe7fff399cce7ff9f9ff3e7f39fcf3e7339fff3f9fff9cf3fffcf9cc +fffe799cce4f3f9e7f3e7fff9f9e73f399fe7f8fffffffffffffffffffffffff +ffe1 +0e889f33cfe667339e7ce723ff99c479fcf99ce7ff39ffcc79fff99ce733ffcc +ccf3f39cce7fff319ce47ff9fccf3f33319cf3e7391fff3f9fff98f3fffcf9ce +67ff3399cce6739e7f3f33ffccccf3f39cce7f8fffffffffffffffffffffffff +ffe1 +0e221f0783f0f078300ce793ff83e27c3e1c3ce7ff83ffe27c3ffc3ce787ffe1 +e1e0f39e1c1fff899cf27ff07e18078789c180673c9ff807c3ffc4f87ffe19cf +0fff8783c1f0f8300f8787ffe1e1e0f39e1c1f8fffffffffffffffffffffffff +ffe1 +0e889f3ffffffffffffffff3ffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffff9fffffffffffffffffffff +ffffff9fcfffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f3ffffffffffffffe73ffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffff39fffffffffffffffffffff +ffffff9fcfffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f3fffffffffffffff07ffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffffffffffffffffff83fffffffffffffffffffff +ffffff9fcfffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffffffffffffffffffff9fffffffc1fffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f39fffffffffffffffffffffff9ffffffbf9fffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f39ffffffffffffffffffffffffffffff3f9fffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f11c3c6787ffe1e1e4739e1c8c1fc391c079f39ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f1199e0733ffcccce2339ccc479f9988f3f9f39ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f493ce6673ff9c9e6733d9cce79f399cf3f9f3dffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f493ce7e73ff9f9e673999cce79f399cf3f9f99ffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f493ce7e03ff9f9e6739b80ce79f019cf3f9f9bffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f493ce7e7fff9f9e6739b9fce79f3f9cf3f9f9bffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f793ce7e7fff9f9e673c79fce79f3f9cf3f9fc7e3ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f7999e7f33ffcccce73c7ccce79f999cf3f9fc7e3ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f79c3c1f87ffe1e1e73c7e1ce403c39cf8403e7e3ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffeff3ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffcff3ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffff8fe7ffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f3fffffffffffffffffffffffffffffff3fffff07fffff3fffffffe0fe7 +ffe7ffffcfffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f3ffffbfdffffffff07ffffffffffffff3fffffe7fffff3ffffffffcfe7 +ffe7ffffcfffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f3ffff3f9fffffffe73ffffffffffffffffffffe7fffff3ffffffffcfff +ffe7ffffcfffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f279cc06038791ffe73ff2de0e73ffc183cb727e7ce7ff27e1fff87cf07 +f0e73c3e0fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f139cf3f9f3388ffff3ff00ce673ff9cf3c0313e7ce7ff13ccfff33cfe7 +e667799ccfffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f399cf3f9e799cffff3ff24fe67bff9ff3c9339e7cf7ff399cffe73cfe7 +ce66f399cfffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f399cf3f9e799cfff8fff24fe733ff8ff3c9339e7e67ff399cffe7fcfe7 +cfe5f399cfffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f399cf3f9e799cffff3ff24e0737ffc1f3c9339e7e6fff3980ffe7fcfe7 +cfe1f019cfffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f399cf3f9e799cffff3ff24ce737fff8f3c9339e7e6fff399fffe7fcfe7 +cfe4f3f9cfffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f399cf3f9e799cffff3ff24ce78ffffcf3c9339e7f1fff399fffe7fcfe7 +cfe673f9cf1fffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f3388f3f9f339cffe73ff24cc78fff9cf3c9333e7f1fff33ccfff33cfe7 +e667399c8f1fffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f07c4f87c3879cfff07ff24e27cfffc1804930700f9fff07e1fff860100 +f0e73c3e4f1fffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffffffffffffffffffffdffffffffff3ffffbffffffffffffffff +ffffffffff9fffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ffffffffffffffffffffffffff9ffffffffff3ffff3ffffffffffffffff +ffffffffff9fffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffffffffffffffffffff1ffffffffff3fffe3ffffffffffffffff +ffffffffff3fffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fff9fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fff9fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fff9fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f3991f0e33c39cc9f0f23ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f3d88e6703999cc4e6711ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f259cce733399cce4f339ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f259cce73f399cce4f339ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f259cc073f019cce4f339ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f939ccff3f3f9cce4f339ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f939ccff3f3f9cce4f339ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889f939ce673f9988cce6739ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221f939cf0e0fc3c4c1f0f39ffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffffffffcffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221ffffffffffffffcffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889ffffffffffffffcffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e221fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e889fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0e001fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffe1 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0001 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0001 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0001 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +0001 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffff +showpage + %%BoundingBox: 23 241 587.48 550.60 +%ps_include: inclusion end +grestore +PS-include-dict-dw begin +o 0 ne {gsave A defaultmatrix /A ed llx lly nice urx ury nice + initgraphics 0.1 setlinewidth boxpath stroke grestore} if +clear o-stack aload pop +context end restore +%ps_include: end +/saveobj save def +mark +8 /LucidaSans-Italic f +(Figure) 720 5332 w +(1.) 994 5332 w +(A) 1099 5332 w +(typical) 1183 5332 w +8 /LucidaTypewriter f +(sam) 1470 5332 w +8 /LucidaSans-Italic f +(screen,) 1673 5332 w +(with) 1979 5332 w +(the) 2173 5332 w +(editing) 2324 5332 w +(menu) 2619 5332 w +(presented.) 2864 5332 w +(The) 3326 5332 w +8 /LucidaTypewriter f +(sam) 3497 5332 w +8 /LucidaSans-Italic f +(\(command) 3700 5332 w +(language\)) 4137 5332 w +(window) 4553 5332 w +(is) 4875 5332 w +(in) 4967 5332 w +(the) 720 5432 w +(middle,) 869 5432 w +(with) 1182 5432 w +(file) 1374 5432 w +(windows) 1519 5432 w +(above) 1877 5432 w +(and) 2133 5432 w +(below.) 2308 5432 w +(\(The) 2609 5432 w +(user) 2804 5432 w +(interface) 3000 5432 w +(makes) 3371 5432 w +(it) 3647 5432 w +(easy) 3726 5432 w +(to) 3926 5432 w +(create) 4028 5432 w +(these) 4295 5432 w +(abutting) 4524 5432 w +(win\255) 4880 5432 w +(dows.\)) 720 5532 w +(The) 1026 5532 w +(partially) 1200 5532 w +(obscured) 1560 5532 w +(window) 1945 5532 w +(is) 2269 5532 w +(a) 2363 5532 w +(third) 2444 5532 w +(file) 2666 5532 w +(window.) 2816 5532 w +(The) 3192 5532 w +(uppermost) 3366 5532 w +(window) 3816 5532 w +(is) 4141 5532 w +(that) 4236 5532 w +(to) 4428 5532 w +(which) 4537 5532 w +(typing) 4795 5532 w +(and) 720 5632 w +(mouse) 895 5632 w +(operations) 1173 5632 w +(apply,) 1612 5632 w +(as) 1879 5632 w +(indicated) 1994 5632 w +(by) 2376 5632 w +(its) 2496 5632 w +(heavy) 2615 5632 w +(border.) 2869 5632 w +(Each) 3209 5632 w +(window) 3418 5632 w +(has) 3736 5632 w +(its) 3900 5632 w +(current) 4018 5632 w +(text) 4332 5632 w +(highlighted) 4503 5632 w +(in) 4967 5632 w +(reverse) 720 5732 w +(video.) 1033 5732 w +(The) 1317 5732 w +8 /LucidaTypewriter f +(sam) 1488 5732 w +8 /LucidaSans-Italic f +(window's) 1691 5732 w +(current) 2078 5732 w +(text) 2396 5732 w +(is) 2571 5732 w +(the) 2663 5732 w +(null) 2815 5732 w +(string) 2991 5732 w +(on) 3250 5732 w +(the) 3376 5732 w +(last) 3528 5732 w +(visible) 3699 5732 w +(line,) 3971 5732 w +(indicated) 4165 5732 w +(by) 4550 5732 w +(a) 4673 5732 w +(vertical) 4752 5732 w +(bar.) 720 5832 w +(See) 934 5832 w +(also) 1088 5832 w +(Figure) 1271 5832 w +(2.) 1542 5832 w +10 /LucidaSansUnicode00 f +(Commands) 970 6108 w +(have) 1574 6108 w +(one-letter) 1857 6108 w +(names.) 2408 6108 w +(Except) 2847 6108 w +(for) 3227 6108 w +(non-editing) 3424 6108 w +(commands) 4063 6108 w +(such) 4650 6108 w +(as) 4934 6108 w +(writing) 720 6228 w +(the) 1094 6228 w +(file) 1286 6228 w +(to) 1474 6228 w +(disc,) 1609 6228 w +(most) 1872 6228 w +(commands) 2151 6228 w +(make) 2717 6228 w +(some) 3016 6228 w +(change) 3314 6228 w +(to) 3699 6228 w +(the) 3834 6228 w +(text) 4025 6228 w +(in) 4252 6228 w +(dot) 4379 6228 w +(and) 4576 6228 w +(leave) 4792 6228 w +(dot) 720 6348 w +(set) 929 6348 w +(to) 1121 6348 w +(the) 1267 6348 w +(text) 1470 6348 w +(resulting) 1709 6348 w +(from) 2186 6348 w +(the) 2466 6348 w +(change.) 2669 6348 w +(For) 3129 6348 w +(example,) 3333 6348 w +(the) 3827 6348 w +(delete) 4031 6348 w +(command,) 4377 6348 w +10 /LucidaTypewriter f +(d) 4936 6348 w +10 /LucidaSansUnicode00 f +(,) 5008 6348 w +(deletes) 720 6468 w +(the) 1106 6468 w +(text) 1299 6468 w +(in) 1528 6468 w +(dot,) 1657 6468 w +(replacing) 1888 6468 w +(it) 2374 6468 w +(by) 2478 6468 w +(the) 2631 6468 w +(null) 2824 6468 w +(string) 3044 6468 w +(and) 3364 6468 w +(setting) 3582 6468 w +(dot) 3954 6468 w +(to) 4153 6468 w +(the) 4289 6468 w +(result.) 4482 6468 w +(The) 4859 6468 w +(change) 720 6588 w +(command,) 1106 6588 w +10 /LucidaTypewriter f +(c) 1654 6588 w +10 /LucidaSansUnicode00 f +(,) 1726 6588 w +(replaces) 1796 6588 w +(dot) 2236 6588 w +(by) 2435 6588 w +(text) 2588 6588 w +(delimited) 2817 6588 w +(by) 3310 6588 w +(an) 3463 6588 w +(arbitrary) 3619 6588 w +(punctuation) 4072 6588 w +(charac\255) 4692 6588 w +(ter, conventionally a slash.) 720 6708 w +(Thus,) 2079 6708 w +9 /LucidaTypewriter f +(c/Peter/) 920 6878 w +10 /LucidaSansUnicode00 f +(replaces the text in dot by the string) 720 7058 w +10 /LucidaTypewriter f +(Peter) 2528 7058 w +10 /LucidaSansUnicode00 f +(.) 2888 7058 w +(Similarly,) 2984 7058 w +cleartomark +showpage +saveobj restore +%%EndPage: 3 3 +%%Page: 4 4 +/saveobj save def +mark +4 pagesetup +10 /LucidaSansUnicode00 f +(\255 4 \255) 2783 480 w +9 /LucidaTypewriter f +(a/Peter/) 920 830 w +10 /LucidaSansUnicode00 f +(\(append\) adds the string after dot, and) 720 1010 w +9 /LucidaTypewriter f +(i/Peter/) 920 1180 w +10 /LucidaSansUnicode00 f +(\(insert\) inserts before dot.) 720 1360 w +(All three leave dot set to the new text,) 2056 1360 w +10 /LucidaTypewriter f +(Peter) 3947 1360 w +10 /LucidaSansUnicode00 f +(.) 4307 1360 w +(Newlines) 970 1516 w +(are) 1437 1516 w +(part) 1622 1516 w +(of) 1851 1516 w +(the) 1982 1516 w +(syntax) 2170 1516 w +(of) 2522 1516 w +(commands:) 2654 1516 w +(the) 3249 1516 w +(newline) 3438 1516 w +(character) 3843 1516 w +(lexically) 4326 1516 w +(termi\255) 4751 1516 w +(nates) 720 1636 w +(a) 1025 1636 w +(command.) 1124 1636 w +(Within) 1710 1636 w +(the) 2059 1636 w +(inserted) 2258 1636 w +(text,) 2697 1636 w +(however,) 2964 1636 w +(newlines) 3445 1636 w +(are) 3911 1636 w +(never) 4106 1636 w +(implicit.) 4416 1636 w +(But) 4883 1636 w +(since) 720 1756 w +(it) 1006 1756 w +(is) 1109 1756 w +(often) 1226 1756 w +(convenient) 1516 1756 w +(to) 2081 1756 w +(insert) 2216 1756 w +(multiple) 2529 1756 w +(lines) 2964 1756 w +(of) 3228 1756 w +(text,) 3363 1756 w +10 /LucidaTypewriter f +(sam) 3623 1756 w +10 /LucidaSansUnicode00 f +(has) 3876 1756 w +(a) 4081 1756 w +(special) 4173 1756 w +(syntax) 4545 1756 w +(for) 4901 1756 w +(that case:) 720 1876 w +9 /LucidaTypewriter f +(a) 920 2046 w +(some) 920 2156 w +(lines) 1245 2156 w +(of) 1635 2156 w +(text) 1830 2156 w +(to) 920 2266 w +(be) 1115 2266 w +(inserted) 1310 2266 w +(in) 1895 2266 w +(the) 2090 2266 w +(file,) 2350 2266 w +(terminated) 920 2376 w +(by) 1635 2376 w +(a) 1830 2376 w +(period) 1960 2376 w +(on) 920 2486 w +(a) 1115 2486 w +(line) 1245 2486 w +(by) 1570 2486 w +(itself) 1765 2486 w +(.) 920 2596 w +10 /LucidaSansUnicode00 f +(In the one-line syntax, a newline character may be specified by a C-like escape, so) 720 2776 w +9 /LucidaTypewriter f +(c/\\n/) 920 2946 w +10 /LucidaSansUnicode00 f +(replaces dot by a single newline character.) 720 3126 w +10 /LucidaTypewriter f +(Sam) 970 3282 w +10 /LucidaSansUnicode00 f +(also has a substitute command,) 1218 3282 w +10 /LucidaTypewriter f +(s) 2792 3282 w +10 /LucidaSansUnicode00 f +(:) 2864 3282 w +9 /LucidaTypewriter f +(s/) 920 3452 w +9 /LucidaSans-Italic f +(expression) 1050 3452 w +9 /LucidaTypewriter f +(/) 1514 3452 w +9 /LucidaSans-Italic f +(replacement) 1579 3452 w +9 /LucidaTypewriter f +(/) 2121 3452 w +10 /LucidaSansUnicode00 f +(substitutes) 720 3632 w +(the) 1300 3632 w +(replacement) 1499 3632 w +(text) 2142 3632 w +(for) 2377 3632 w +(the) 2560 3632 w +(first) 2759 3632 w +(match,) 2998 3632 w +(in) 3372 3632 w +(dot,) 3507 3632 w +(of) 3744 3632 w +(the) 3886 3632 w +(regular) 4086 3632 w +(expression.) 4477 3632 w +(Thus, if dot is the string) 720 3752 w +10 /LucidaTypewriter f +(Peter) 1926 3752 w +10 /LucidaSansUnicode00 f +(, the command) 2286 3752 w +9 /LucidaTypewriter f +(s/t/st/) 920 3922 w +10 /LucidaSansUnicode00 f +(changes it to) 720 4102 w +10 /LucidaTypewriter f +(Pester) 1380 4102 w +10 /LucidaSansUnicode00 f +(.) 1812 4102 w +(In) 1909 4102 w +(general,) 2033 4102 w +10 /LucidaTypewriter f +(s) 2459 4102 w +10 /LucidaSansUnicode00 f +(is) 2564 4102 w +(unnecessary,) 2677 4102 w +(but) 3341 4102 w +(it) 3536 4102 w +(was) 3635 4102 w +(inherited) 3851 4102 w +(from) 4319 4102 w +10 /LucidaTypewriter f +(ed) 4584 4102 w +10 /LucidaSansUnicode00 f +(and) 4761 4102 w +(it) 4974 4102 w +(has) 720 4222 w +(some) 942 4222 w +(convenient) 1256 4222 w +(variations.) 1837 4222 w +(For) 2426 4222 w +(instance,) 2635 4222 w +(the) 3123 4222 w +(replacement) 3331 4222 w +(text) 3983 4222 w +(may) 4227 4222 w +(include) 4480 4222 w +(the) 4885 4222 w +(matched text, specified by) 720 4342 w +10 /LucidaTypewriter f +(&) 2038 4342 w +10 /LucidaSansUnicode00 f +(:) 2110 4342 w +9 /LucidaTypewriter f +(s/Peter/Oh,) 920 4512 w +(&,) 1700 4512 w +(&,) 1895 4512 w +(&,) 2090 4512 w +(&!/) 2285 4512 w +10 /LucidaSansUnicode00 f +(There are also three commands that apply programs to text:) 970 4728 w +9 /LucidaTypewriter f +(<) 920 4898 w +9 /LucidaSans-Italic f +(UNIX) 1050 4898 w +(program) 1290 4898 w +10 /LucidaSansUnicode00 f +(replaces dot by the output of the UNIX program.) 720 5078 w +(Similarly, the) 3131 5078 w +10 /LucidaTypewriter f +(>) 3793 5078 w +10 /LucidaSansUnicode00 f +(command runs the pro\255) 3897 5078 w +(gram with dot as its standard input, and) 720 5198 w +10 /LucidaTypewriter f +(|) 2708 5198 w +10 /LucidaSansUnicode00 f +(does both.) 2812 5198 w +(For example,) 3394 5198 w +9 /LucidaTypewriter f +(|) 920 5368 w +(sort) 1050 5368 w +10 /LucidaSansUnicode00 f +(replaces) 720 5548 w +(dot) 1160 5548 w +(by) 1359 5548 w +(the) 1512 5548 w +(result) 1705 5548 w +(of) 2019 5548 w +(applying) 2155 5548 w +(the) 2608 5548 w +(standard) 2802 5548 w +(sorting) 3268 5548 w +(utility) 3650 5548 w +(to) 3964 5548 w +(it.) 4101 5548 w +(Again,) 4270 5548 w +(newlines) 4618 5548 w +(have) 720 5668 w +(no) 983 5668 w +(special) 1144 5668 w +(significance) 1515 5668 w +(for) 2126 5668 w +(these) 2302 5668 w +10 /LucidaTypewriter f +(sam) 2601 5668 w +10 /LucidaSansUnicode00 f +(commands.) 2854 5668 w +(The) 3484 5668 w +(text) 3702 5668 w +(acted) 3930 5668 w +(upon) 4229 5668 w +(and) 4514 5668 w +(result\255) 4731 5668 w +(ing) 720 5788 w +(from) 908 5788 w +(these) 1175 5788 w +(commands) 1472 5788 w +(is) 2036 5788 w +(not) 2151 5788 w +(necessarily) 2347 5788 w +(bounded) 2916 5788 w +(by) 3382 5788 w +(newlines,) 3533 5788 w +(although) 4023 5788 w +(for) 4489 5788 w +(connec\255) 4664 5788 w +(tion with UNIX programs, newlines may be necessary to obey conventions.) 720 5908 w +(One) 970 6064 w +(more) 1200 6064 w +(command:) 1485 6064 w +10 /LucidaTypewriter f +(p) 2029 6064 w +10 /LucidaSansUnicode00 f +(prints) 2135 6064 w +(the) 2452 6064 w +(contents) 2641 6064 w +(of) 3092 6064 w +(dot.) 3224 6064 w +(Table) 3483 6064 w +(I) 3783 6064 w +(summarizes) 3846 6064 w +10 /LucidaTypewriter f +(sam) 4468 6064 w +10 /LucidaSansUnicode20 f +(\031) 4684 6064 w +10 /LucidaSansUnicode00 f +(s) 4716 6064 w +(com\255) 4802 6064 w +(mands.) 720 6184 w +(The) 970 6340 w +(value) 1188 6340 w +(of) 1479 6340 w +(dot) 1614 6340 w +(may) 1812 6340 w +(be) 2049 6340 w +(changed) 2205 6340 w +(by) 2653 6340 w +(specifying) 2805 6340 w +(an) 3334 6340 w +10 /LucidaSans-Italic f +(address) 3489 6340 w +10 /LucidaSansUnicode00 f +(for) 3909 6340 w +(the) 4086 6340 w +(command.) 4279 6340 w +(The) 4859 6340 w +(simplest address is a line number:) 720 6460 w +9 /LucidaTypewriter f +(3) 920 6630 w +10 /LucidaSansUnicode00 f +(refers to the third line of the file, so) 720 6810 w +9 /LucidaTypewriter f +(3d) 920 6980 w +10 /LucidaSansUnicode00 f +(deletes) 720 7160 w +(the) 1109 7160 w +(third) 1305 7160 w +(line) 1578 7160 w +(of) 1795 7160 w +(the) 1934 7160 w +(file,) 2130 7160 w +(and) 2354 7160 w +(implicitly) 2575 7160 w +(renumbers) 3058 7160 w +(the) 3625 7160 w +(lines) 3822 7160 w +(so) 4091 7160 w +(the) 4245 7160 w +(old) 4442 7160 w +(line) 4637 7160 w +(4) 4855 7160 w +(is) 4960 7160 w +(now) 720 7280 w +(numbered) 964 7280 w +(3.) 1504 7280 w +(\(This) 1675 7280 w +(is) 1957 7280 w +(one) 2081 7280 w +(of) 2304 7280 w +(the) 2446 7280 w +(few) 2645 7280 w +(places) 2859 7280 w +(where) 3208 7280 w +10 /LucidaTypewriter f +(sam) 3543 7280 w +10 /LucidaSansUnicode00 f +(deals) 3802 7280 w +(with) 4099 7280 w +(lines) 4347 7280 w +(directly.\)) 4617 7280 w +cleartomark +showpage +saveobj restore +%%EndPage: 4 4 +%%Page: 5 5 +/saveobj save def +mark +5 pagesetup +10 /LucidaSansUnicode00 f +(\255 5 \255) 2783 480 w +(Table I.) 2323 900 w +10 /LucidaTypewriter f +(Sam) 2714 900 w +10 /LucidaSansUnicode00 f +(commands) 2962 900 w +10 /S f +(_) 720 968 w +(_______________________________________________________________________________________) 744 968 w +10 /LucidaSansUnicode00 f +(Text commands) 720 1136 w +10 /S f +(_) 720 1204 w +(_______________________________________________________________________________________) 744 1204 w +10 /LucidaTypewriter f +(a/) 720 1372 w +10 /LucidaSans-Italic f +(text) 864 1372 w +10 /LucidaTypewriter f +(/) 1047 1372 w +10 /LucidaSansUnicode00 f +(Append text after dot) 1993 1372 w +10 /LucidaTypewriter f +(c/) 720 1492 w +10 /LucidaSans-Italic f +(text) 864 1492 w +10 /LucidaTypewriter f +(/) 1047 1492 w +10 /LucidaSansUnicode00 f +(Change text in dot) 1993 1492 w +10 /LucidaTypewriter f +(i/) 720 1612 w +10 /LucidaSans-Italic f +(text) 864 1612 w +10 /LucidaTypewriter f +(/) 1047 1612 w +10 /LucidaSansUnicode00 f +(Insert text before dot) 1993 1612 w +10 /LucidaTypewriter f +(d) 720 1732 w +10 /LucidaSansUnicode00 f +(Delete text in dot) 1993 1732 w +10 /LucidaTypewriter f +(s/) 720 1852 w +10 /LucidaSans-Italic f +(regexp) 864 1852 w +10 /LucidaTypewriter f +(/) 1194 1852 w +10 /LucidaSans-Italic f +(text) 1266 1852 w +10 /LucidaTypewriter f +(/) 1449 1852 w +10 /LucidaSansUnicode00 f +(Substitute text for match of regular expression in dot) 1993 1852 w +10 /LucidaTypewriter f +(m) 720 1972 w +10 /LucidaSans-Italic f +(address) 864 1972 w +10 /LucidaSansUnicode00 f +(Move text in dot after address) 1993 1972 w +10 /LucidaTypewriter f +(t) 720 2092 w +10 /LucidaSans-Italic f +(address) 864 2092 w +10 /LucidaSansUnicode00 f +(Copy text in dot after address) 1993 2092 w +10 /S f +(_) 720 2160 w +(_______________________________________________________________________________________) 744 2160 w +10 /LucidaSansUnicode00 f +(Display commands) 720 2328 w +10 /S f +(_) 720 2396 w +(_______________________________________________________________________________________) 744 2396 w +10 /LucidaTypewriter f +(p) 720 2540 w +10 /LucidaSansUnicode00 f +(Print contents of dot) 1993 2540 w +10 /LucidaTypewriter f +(=) 720 2660 w +10 /LucidaSansUnicode00 f +(Print value \(line numbers and character numbers\) of dot) 1993 2660 w +10 /S f +(_) 720 2728 w +(_______________________________________________________________________________________) 744 2728 w +10 /LucidaSansUnicode00 f +(File commands) 720 2896 w +10 /S f +(_) 720 2964 w +(_______________________________________________________________________________________) 744 2964 w +10 /LucidaTypewriter f +(b) 720 3108 w +10 /LucidaSans-Italic f +(file-list) 864 3108 w +10 /LucidaSansUnicode00 f +(Set current file to first file in list that) 1993 3108 w +10 /LucidaTypewriter f +(sam) 3801 3108 w +10 /LucidaSansUnicode00 f +(has in menu) 4049 3108 w +10 /LucidaTypewriter f +(B) 720 3228 w +10 /LucidaSans-Italic f +(file-list) 864 3228 w +10 /LucidaSansUnicode00 f +(Same as) 1993 3228 w +10 /LucidaTypewriter f +(b) 2421 3228 w +10 /LucidaSansUnicode00 f +(, but load new files) 2493 3228 w +10 /LucidaTypewriter f +(n) 720 3348 w +10 /LucidaSansUnicode00 f +(Print menu lines of all files) 1993 3348 w +10 /LucidaTypewriter f +(D) 720 3468 w +10 /LucidaSans-Italic f +(file-list) 864 3468 w +10 /LucidaSansUnicode00 f +(Delete named files from) 1993 3468 w +10 /LucidaTypewriter f +(sam) 3193 3468 w +10 /S f +(_) 720 3536 w +(_______________________________________________________________________________________) 744 3536 w +10 /LucidaSansUnicode00 f +(I/O commands) 720 3704 w +10 /S f +(_) 720 3772 w +(_______________________________________________________________________________________) 744 3772 w +10 /LucidaTypewriter f +(e) 720 3916 w +10 /LucidaSans-Italic f +(filename) 864 3916 w +10 /LucidaSansUnicode00 f +(Replace file with named disc file) 1993 3916 w +10 /LucidaTypewriter f +(r) 720 4036 w +10 /LucidaSans-Italic f +(filename) 864 4036 w +10 /LucidaSansUnicode00 f +(Replace dot by contents of named disc file) 1993 4036 w +10 /LucidaTypewriter f +(w) 720 4156 w +10 /LucidaSans-Italic f +(filename) 864 4156 w +10 /LucidaSansUnicode00 f +(Write file to named disc file) 1993 4156 w +10 /LucidaTypewriter f +(f) 720 4276 w +10 /LucidaSans-Italic f +(filename) 864 4276 w +10 /LucidaSansUnicode00 f +(Set file name and print new menu line) 1993 4276 w +10 /LucidaTypewriter f +(<) 720 4396 w +10 /LucidaSans-Italic f +(UNIX-command) 864 4396 w +10 /LucidaSansUnicode00 f +(Replace dot by standard output of command) 1993 4396 w +10 /LucidaTypewriter f +(>) 720 4516 w +10 /LucidaSans-Italic f +(UNIX-command) 864 4516 w +10 /LucidaSansUnicode00 f +(Send dot to standard input of command) 1993 4516 w +10 /LucidaTypewriter f +(|) 720 4636 w +10 /LucidaSans-Italic f +(UNIX-command) 864 4636 w +10 /LucidaSansUnicode00 f +(Replace dot by result of command applied to dot) 1993 4636 w +10 /LucidaTypewriter f +(!) 720 4756 w +10 /LucidaSans-Italic f +(UNIX-command) 864 4756 w +10 /LucidaSansUnicode00 f +(Run the command) 1993 4756 w +10 /S f +(_) 720 4824 w +(_______________________________________________________________________________________) 744 4824 w +10 /LucidaSansUnicode00 f +(Loops and conditionals) 720 4992 w +10 /S f +(_) 720 5060 w +(_______________________________________________________________________________________) 744 5060 w +10 /LucidaTypewriter f +(x/) 720 5204 w +10 /LucidaSans-Italic f +(regexp) 864 5204 w +10 /LucidaTypewriter f +(/) 1194 5204 w +10 /LucidaSans-Italic f +(command) 1338 5204 w +10 /LucidaSansUnicode00 f +(For each match of regexp, set dot and run command) 1993 5204 w +10 /LucidaTypewriter f +(y/) 720 5324 w +10 /LucidaSans-Italic f +(regexp) 864 5324 w +10 /LucidaTypewriter f +(/) 1194 5324 w +10 /LucidaSans-Italic f +(command) 1338 5324 w +10 /LucidaSansUnicode00 f +(Between adjacent matches of regexp, set dot and run command) 1993 5324 w +10 /LucidaTypewriter f +(X/) 720 5444 w +10 /LucidaSans-Italic f +(regexp) 864 5444 w +10 /LucidaTypewriter f +(/) 1194 5444 w +10 /LucidaSans-Italic f +(command) 1338 5444 w +10 /LucidaSansUnicode00 f +(Run command in each file whose menu line matches regexp) 1993 5444 w +10 /LucidaTypewriter f +(Y/) 720 5564 w +10 /LucidaSans-Italic f +(regexp) 864 5564 w +10 /LucidaTypewriter f +(/) 1194 5564 w +10 /LucidaSans-Italic f +(command) 1338 5564 w +10 /LucidaSansUnicode00 f +(Run command in each file whose menu line does not match) 1993 5564 w +10 /LucidaTypewriter f +(g/) 720 5684 w +10 /LucidaSans-Italic f +(regexp) 864 5684 w +10 /LucidaTypewriter f +(/) 1194 5684 w +10 /LucidaSans-Italic f +(command) 1338 5684 w +10 /LucidaSansUnicode00 f +(If dot contains a match of regexp, run command) 1993 5684 w +10 /LucidaTypewriter f +(v/) 720 5804 w +10 /LucidaSans-Italic f +(regexp) 864 5804 w +10 /LucidaTypewriter f +(/) 1194 5804 w +10 /LucidaSans-Italic f +(command) 1338 5804 w +10 /LucidaSansUnicode00 f +(If dot does not contain a match of regexp, run command) 1993 5804 w +10 /S f +(_) 720 5872 w +(_______________________________________________________________________________________) 744 5872 w +10 /LucidaSansUnicode00 f +(Miscellany) 720 6040 w +10 /S f +(_) 720 6108 w +(_______________________________________________________________________________________) 744 6108 w +10 /LucidaTypewriter f +(k) 720 6252 w +10 /LucidaSansUnicode00 f +(Set address mark to value of dot) 1993 6252 w +10 /LucidaTypewriter f +(q) 720 6372 w +10 /LucidaSansUnicode00 f +(Quit) 1993 6372 w +10 /LucidaTypewriter f +(u) 720 6492 w +10 /LucidaSans-Italic f +(n) 864 6492 w +10 /LucidaSansUnicode00 f +(Undo last) 1993 6492 w +10 /LucidaSans-Italic f +(n) 2484 6492 w +10 /LucidaSansUnicode00 f +(\(default 1\) changes) 2578 6492 w +10 /LucidaTypewriter f +({ }) 720 6612 w +10 /LucidaSansUnicode00 f +(Braces group commands) 1993 6612 w +10 /S f +(_) 720 6668 w +(_______________________________________________________________________________________) 744 6668 w +cleartomark +showpage +saveobj restore +%%EndPage: 5 5 +%%Page: 6 6 +/saveobj save def +mark +6 pagesetup +10 /LucidaSansUnicode00 f +(\255 6 \255) 2783 480 w +(Line) 720 840 w +10 /LucidaTypewriter f +(0) 960 840 w +10 /LucidaSansUnicode00 f +(is) 1072 840 w +(the) 1193 840 w +(null) 1389 840 w +(string) 1612 840 w +(at) 1935 840 w +(the) 2068 840 w +(beginning) 2264 840 w +(of) 2792 840 w +(the) 2931 840 w +(file.) 3127 840 w +(If) 3383 840 w +(a) 3490 840 w +(command) 3586 840 w +(consists) 4105 840 w +(of) 4539 840 w +(only) 4678 840 w +(an) 4923 840 w +(address,) 720 960 w +(a) 1166 960 w +10 /LucidaTypewriter f +(p) 1255 960 w +10 /LucidaSansUnicode00 f +(command) 1361 960 w +(is) 1873 960 w +(assumed,) 1987 960 w +(so) 2484 960 w +(typing) 2630 960 w +(an) 2969 960 w +(unadorned) 3120 960 w +10 /LucidaTypewriter f +(3) 3679 960 w +10 /LucidaSansUnicode00 f +(prints) 3785 960 w +(line) 4102 960 w +(3) 4311 960 w +(on) 4407 960 w +(the) 4563 960 w +(termi\255) 4751 960 w +(nal.) 720 1080 w +(There) 973 1080 w +(are) 1294 1080 w +(a) 1490 1080 w +(couple) 1589 1080 w +(of) 1955 1080 w +(other) 2097 1080 w +(basic) 2398 1080 w +(addresses:) 2691 1080 w +(a) 3254 1080 w +(period) 3353 1080 w +(addresses) 3710 1080 w +(dot) 4241 1080 w +(itself;) 4446 1080 w +(and) 4761 1080 w +(a) 4985 1080 w +(dollar sign \() 720 1200 w +10 /LucidaTypewriter f +($) 1299 1200 w +10 /LucidaSansUnicode00 f +(\) addresses the null string at the end of the file.) 1371 1200 w +(An) 970 1356 w +(address) 1138 1356 w +(is) 1555 1356 w +(always) 1672 1356 w +(a) 2028 1356 w +(single) 2120 1356 w +(substring) 2446 1356 w +(of) 2942 1356 w +(the) 3078 1356 w +(file.) 3271 1356 w +(Thus,) 3524 1356 w +(the) 3832 1356 w +(address) 4025 1356 w +10 /LucidaTypewriter f +(3) 4443 1356 w +10 /LucidaSansUnicode00 f +(addresses) 4553 1356 w +(the) 720 1476 w +(characters) 914 1476 w +(after) 1453 1476 w +(the) 1718 1476 w +(second) 1912 1476 w +(newline) 2295 1476 w +(of) 2705 1476 w +(the) 2842 1476 w +(file) 3036 1476 w +(through) 3226 1476 w +(the) 3652 1476 w +(third) 3846 1476 w +(newline) 4117 1476 w +(of) 4527 1476 w +(the) 4664 1476 w +(file.) 4857 1476 w +(A) 720 1596 w +10 /LucidaSans-Italic f +(compound address) 821 1596 w +10 /LucidaSansUnicode00 f +(is constructed by the comma operator) 1770 1596 w +9 /LucidaSans-Italic f +(address1) 920 1766 w +9 /LucidaTypewriter f +(,) 1321 1766 w +9 /LucidaSans-Italic f +(address2) 1386 1766 w +10 /LucidaSansUnicode00 f +(and) 720 1946 w +(addresses) 945 1946 w +(the) 1477 1946 w +(substring) 1677 1946 w +(of) 2181 1946 w +(the) 2325 1946 w +(file) 2526 1946 w +(from) 2723 1946 w +(the) 3001 1946 w +(beginning) 3202 1946 w +(of) 3735 1946 w +10 /LucidaSans-Italic f +(address1) 3879 1946 w +10 /LucidaSansUnicode00 f +(to) 4370 1946 w +(the) 4514 1946 w +(end) 4715 1946 w +(of) 4942 1946 w +10 /LucidaSans-Italic f +(address2) 720 2066 w +10 /LucidaSansUnicode00 f +(.) 1165 2066 w +(For) 1272 2066 w +(example,) 1471 2066 w +(the) 1959 2066 w +(command) 2157 2066 w +10 /LucidaTypewriter f +(3,5p) 2677 2066 w +10 /LucidaSansUnicode00 f +(prints) 3007 2066 w +(the) 3332 2066 w +(third) 3529 2066 w +(through) 3803 2066 w +(fifth) 4232 2066 w +(lines) 4476 2066 w +(of) 4745 2066 w +(the) 4885 2066 w +(file and) 720 2186 w +10 /LucidaTypewriter f +(.,$d) 1115 2186 w +10 /LucidaSansUnicode00 f +(deletes the text from the beginning of dot to the end of the file.) 1435 2186 w +(These) 970 2342 w +(addresses) 1307 2342 w +(are) 1843 2342 w +(all) 2044 2342 w +(absolute) 2206 2342 w +(positions) 2670 2342 w +(in) 3164 2342 w +(the) 3305 2342 w +(file,) 3510 2342 w +(but) 3743 2342 w +10 /LucidaTypewriter f +(sam) 3955 2342 w +10 /LucidaSansUnicode00 f +(also) 4221 2342 w +(has) 4467 2342 w +(relative) 4685 2342 w +(addresses, indicated by) 720 2462 w +10 /LucidaTypewriter f +(+) 1895 2462 w +10 /LucidaSansUnicode00 f +(or) 1999 2462 w +10 /LucidaTypewriter f +(-) 2133 2462 w +10 /LucidaSansUnicode00 f +(.) 2205 2462 w +(For example,) 2301 2462 w +9 /LucidaTypewriter f +($-3) 920 2632 w +10 /LucidaSansUnicode00 f +(is the third line before the end of the file and) 720 2812 w +9 /LucidaTypewriter f +(.+1) 920 2982 w +10 /LucidaSansUnicode00 f +(is) 720 3162 w +(the) 839 3162 w +(line) 1033 3162 w +(after) 1248 3162 w +(dot.) 1513 3162 w +(If) 1777 3162 w +(no) 1882 3162 w +(address) 2044 3162 w +(appears) 2463 3162 w +(to) 2887 3162 w +(the) 3025 3162 w +(left) 3220 3162 w +(of) 3419 3162 w +(the) 3557 3162 w +10 /LucidaTypewriter f +(+) 3752 3162 w +10 /LucidaSansUnicode00 f +(or) 3864 3162 w +10 /LucidaTypewriter f +(-) 4006 3162 w +10 /LucidaSansUnicode00 f +(,) 4078 3162 w +(dot) 4150 3162 w +(is) 4351 3162 w +(assumed;) 4471 3162 w +(if) 4974 3162 w +(nothing) 720 3282 w +(appears) 1132 3282 w +(to) 1553 3282 w +(the) 1688 3282 w +(right,) 1880 3282 w +10 /LucidaTypewriter f +(1) 2180 3282 w +10 /LucidaSansUnicode00 f +(is) 2289 3282 w +(assumed.) 2405 3282 w +(Therefore,) 2936 3282 w +10 /LucidaTypewriter f +(.+1) 3477 3282 w +10 /LucidaSansUnicode00 f +(may) 3729 3282 w +(be) 3965 3282 w +(abbreviated) 4120 3282 w +(to) 4726 3282 w +(just) 4860 3282 w +(a plus sign.) 720 3402 w +(The) 970 3558 w +10 /LucidaTypewriter f +(+) 1191 3558 w +10 /LucidaSansUnicode00 f +(operator) 1304 3558 w +(acts) 1760 3558 w +(relative) 1995 3558 w +(to) 2391 3558 w +(the) 2530 3558 w +(end) 2726 3558 w +(of) 2948 3558 w +(its) 3087 3558 w +(first) 3245 3558 w +(argument,) 3481 3558 w +(while) 4022 3558 w +(the) 4316 3558 w +10 /LucidaTypewriter f +(-) 4512 3558 w +10 /LucidaSansUnicode00 f +(operator) 4625 3558 w +(acts) 720 3678 w +(relative) 947 3678 w +(to the beginning.) 1335 3678 w +(Thus) 2235 3678 w +10 /LucidaTypewriter f +(.+1) 2505 3678 w +10 /LucidaSansUnicode00 f +(addresses the first line after dot,) 2753 3678 w +10 /LucidaTypewriter f +(.-) 4377 3678 w +10 /LucidaSansUnicode00 f +(addresses) 4553 3678 w +(the) 720 3798 w +(first) 914 3798 w +(line) 1148 3798 w +(before) 1363 3798 w +(dot,) 1717 3798 w +(and) 1950 3798 w +10 /LucidaTypewriter f +(+-) 2170 3798 w +10 /LucidaSansUnicode00 f +(refers) 2354 3798 w +(to) 2676 3798 w +(the) 2814 3798 w +(line) 3009 3798 w +(containing) 3225 3798 w +(the) 3775 3798 w +(end) 3970 3798 w +(of) 4191 3798 w +(dot.) 4329 3798 w +(\(Dot) 4594 3798 w +(may) 4840 3798 w +(span) 720 3918 w +(multiple) 998 3918 w +(lines,) 1443 3918 w +(and) 1749 3918 w +10 /LucidaTypewriter f +(+) 1976 3918 w +10 /LucidaSansUnicode00 f +(selects) 2095 3918 w +(the) 2473 3918 w +(line) 2675 3918 w +(after) 2898 3918 w +(the) 3171 3918 w +(end) 3373 3918 w +(of) 3601 3918 w +(dot,) 3746 3918 w +(then) 3985 3918 w +10 /LucidaTypewriter f +(-) 4248 3918 w +10 /LucidaSansUnicode00 f +(backs) 4366 3918 w +(up) 4690 3918 w +(one) 4861 3918 w +(line.\)) 720 4038 w +(The final type of address is a regular expression, which addresses the text matched) 970 4194 w +(by the expression.) 720 4314 w +(The expression is enclosed in slashes, as in) 1681 4314 w +9 /LucidaTypewriter f +(/) 920 4484 w +9 /LucidaSans-Italic f +(expression) 985 4484 w +9 /LucidaTypewriter f +(/) 1449 4484 w +10 /LucidaSansUnicode00 f +(The) 720 4664 w +(expressions) 939 4664 w +(are) 1559 4664 w +(the) 1749 4664 w +(same) 1942 4664 w +(as) 2235 4664 w +(those) 2379 4664 w +(in) 2684 4664 w +(the) 2813 4664 w +(UNIX) 3006 4664 w +(program) 3279 4664 w +10 /LucidaTypewriter f +(egrep) 3733 4664 w +10 /LucidaSansUnicode00 f +(,) 4093 4664 w +6 /LucidaSansUnicode00 f +(6,7) 4125 4614 w +10 /LucidaSansUnicode00 f +(and) 4258 4664 w +(include) 4476 4664 w +(clo\255) 4866 4664 w +(sures,) 720 4784 w +(alternations,) 1058 4784 w +(and) 1710 4784 w +(so) 1935 4784 w +(on.) 2092 4784 w +(They) 2324 4784 w +(find) 2602 4784 w +(the) 2838 4784 w +10 /LucidaSans-Italic f +(leftmost) 3038 4784 w +(longest) 3478 4784 w +10 /LucidaSansUnicode00 f +(string) 3872 4784 w +(that) 4199 4784 w +(matches) 4435 4784 w +(the) 4885 4784 w +(expression,) 720 4904 w +(that) 1330 4904 w +(is,) 1568 4904 w +(the) 1727 4904 w +(first) 1929 4904 w +(match) 2171 4904 w +(after) 2516 4904 w +(the) 2789 4904 w +(point) 2991 4904 w +(where) 3291 4904 w +(the) 3631 4904 w +(search) 3834 4904 w +(is) 4198 4904 w +(started,) 4326 4904 w +(and) 4746 4904 w +(if) 4974 4904 w +(more) 720 5024 w +(than) 1027 5024 w +(one) 1299 5024 w +(match) 1534 5024 w +(begins) 1888 5024 w +(at) 2267 5024 w +(the) 2415 5024 w +(same) 2625 5024 w +(spot,) 2935 5024 w +(the) 3234 5024 w +(longest) 3444 5024 w +(such) 3857 5024 w +(match.) 4138 5024 w +(\(I) 4555 5024 w +(assume) 4672 5024 w +(familiarity with the syntax for regular expressions in UNIX programs.) 720 5144 w +6 /LucidaSansUnicode00 f +(9) 4064 5094 w +10 /LucidaSansUnicode00 f +(\) For example,) 4102 5144 w +9 /LucidaTypewriter f +(/x/) 920 5314 w +10 /LucidaSansUnicode00 f +(matches the next) 720 5494 w +10 /LucidaTypewriter f +(x) 1592 5494 w +10 /LucidaSansUnicode00 f +(character in the file,) 1696 5494 w +9 /LucidaTypewriter f +(/xx*/) 920 5664 w +10 /LucidaSansUnicode00 f +(matches the next run of one or more) 720 5844 w +10 /LucidaTypewriter f +(x) 2547 5844 w +10 /LucidaSansUnicode20 f +(\031) 2619 5844 w +10 /LucidaSansUnicode00 f +(s, and) 2651 5844 w +9 /LucidaTypewriter f +(/x|Peter/) 920 6014 w +10 /LucidaSansUnicode00 f +(matches) 720 6194 w +(the) 1171 6194 w +(next) 1373 6194 w +10 /LucidaTypewriter f +(x) 1636 6194 w +10 /LucidaSansUnicode00 f +(or) 1755 6194 w +10 /LucidaTypewriter f +(Peter) 1904 6194 w +10 /LucidaSansUnicode00 f +(.) 2264 6194 w +(For) 2375 6194 w +(compatibility) 2578 6194 w +(with) 3253 6194 w +(other) 3505 6194 w +(UNIX) 3809 6194 w +(programs,) 4091 6194 w +(the) 4637 6194 w +10 /LucidaSansUnicode20 f +(\030) 4839 6194 w +10 /LucidaSansUnicode00 f +(any) 4871 6194 w +(character) 720 6314 w +10 /LucidaSansUnicode20 f +(\031) 1169 6314 w +10 /LucidaSansUnicode00 f +(operator, a period, does not match a newline, so) 1233 6314 w +9 /LucidaTypewriter f +(/.*/) 920 6484 w +10 /LucidaSansUnicode00 f +(matches) 720 6664 w +(the) 1166 6664 w +(text) 1362 6664 w +(from) 1594 6664 w +(dot) 1867 6664 w +(to) 2069 6664 w +(the) 2208 6664 w +(end) 2405 6664 w +(of) 2628 6664 w +(the) 2768 6664 w +(line,) 2965 6664 w +(but) 3215 6664 w +(excludes) 3419 6664 w +(the) 3890 6664 w +(newline) 4087 6664 w +(and) 4500 6664 w +(so) 4722 6664 w +(will) 4876 6664 w +(not match across the line boundary.) 720 6784 w +(Regular) 970 6940 w +(expressions) 1389 6940 w +(are) 2022 6940 w +(always) 2225 6940 w +(relative) 2595 6940 w +(addresses.) 3001 6940 w +(The) 3603 6940 w +(direction) 3835 6940 w +(is) 4315 6940 w +(forwards) 4447 6940 w +(by) 4925 6940 w +(default,) 720 7060 w +(so) 1150 7060 w +10 /LucidaTypewriter f +(/Peter/) 1321 7060 w +10 /LucidaSansUnicode00 f +(is) 1884 7060 w +(really) 2023 7060 w +(an) 2344 7060 w +(abbreviation) 2520 7060 w +(for) 3182 7060 w +10 /LucidaTypewriter f +(+/Peter/) 3380 7060 w +10 /LucidaSansUnicode00 f +(.) 3956 7060 w +(The) 4079 7060 w +(search) 4319 7060 w +(can) 4694 7060 w +(be) 4921 7060 w +(reversed with a minus sign, so) 720 7180 w +cleartomark +showpage +saveobj restore +%%EndPage: 6 6 +%%Page: 7 7 +/saveobj save def +mark +7 pagesetup +10 /LucidaSansUnicode00 f +(\255 7 \255) 2783 480 w +9 /LucidaTypewriter f +(-/Peter/) 920 830 w +10 /LucidaSansUnicode00 f +(finds) 720 1010 w +(the) 999 1010 w +(first) 1191 1010 w +10 /LucidaTypewriter f +(Peter) 1423 1010 w +10 /LucidaSansUnicode00 f +(before) 1820 1010 w +(dot.) 2171 1010 w +(Regular) 2433 1010 w +(expressions) 2838 1010 w +(may) 3457 1010 w +(be) 3695 1010 w +(used) 3852 1010 w +(with) 4122 1010 w +(other) 4365 1010 w +(address) 4660 1010 w +(forms,) 720 1130 w +(so) 1069 1130 w +10 /LucidaTypewriter f +(0+/Peter/) 1215 1130 w +10 /LucidaSansUnicode00 f +(finds) 1897 1130 w +(the) 2173 1130 w +(first) 2362 1130 w +10 /LucidaTypewriter f +(Peter) 2590 1130 w +10 /LucidaSansUnicode00 f +(in) 2983 1130 w +(the) 3107 1130 w +(file) 3295 1130 w +(and) 3479 1130 w +10 /LucidaTypewriter f +($-/Peter/) 3692 1130 w +10 /LucidaSansUnicode00 f +(finds) 4373 1130 w +(the) 4648 1130 w +(last.) 4836 1130 w +(Table II summarizes) 720 1250 w +10 /LucidaTypewriter f +(sam) 1728 1250 w +10 /LucidaSansUnicode20 f +(\031) 1944 1250 w +10 /LucidaSansUnicode00 f +(s addresses.) 1976 1250 w +(Table II.) 2302 1430 w +10 /LucidaTypewriter f +(Sam) 2722 1430 w +10 /LucidaSansUnicode00 f +(addresses) 2970 1430 w +10 /S f +(_) 886 1498 w +(_______________________________________________________________________________) 923 1498 w +10 /LucidaSansUnicode00 f +(Simple addresses) 886 1666 w +10 /S f +(_) 886 1734 w +(_______________________________________________________________________________) 923 1734 w +10 /LucidaTypewriter f +(#) 886 1878 w +10 /LucidaSans-Italic f +(n) 958 1878 w +10 /LucidaSansUnicode00 f +(The empty string after character) 2089 1878 w +10 /LucidaSans-Italic f +(n) 3688 1878 w +(n) 886 1998 w +10 /LucidaSansUnicode00 f +(Line) 2089 1998 w +10 /LucidaSans-Italic f +(n) 2321 1998 w +10 /LucidaSansUnicode00 f +(.) 2383 1998 w +10 /LucidaTypewriter f +(/) 886 2118 w +10 /LucidaSans-Italic f +(regexp) 958 2118 w +10 /LucidaTypewriter f +(/) 1288 2118 w +10 /LucidaSansUnicode00 f +(The first following match of the regular expression) 2089 2118 w +10 /LucidaTypewriter f +(-/) 886 2238 w +10 /LucidaSans-Italic f +(regexp) 1030 2238 w +10 /LucidaTypewriter f +(/) 1360 2238 w +10 /LucidaSansUnicode00 f +(The first previous match of the regular expression) 2089 2238 w +10 /LucidaTypewriter f +($) 886 2358 w +10 /LucidaSansUnicode00 f +(The null string at the end of the file) 2089 2358 w +10 /LucidaTypewriter f +(.) 886 2478 w +10 /LucidaSansUnicode00 f +(Dot) 2089 2478 w +10 /LucidaTypewriter f +(') 886 2598 w +10 /LucidaSansUnicode00 f +(The address mark, set by) 2089 2598 w +10 /LucidaTypewriter f +(k) 3348 2598 w +10 /LucidaSansUnicode00 f +(command) 3452 2598 w +10 /LucidaTypewriter f +(") 886 2718 w +10 /LucidaSans-Italic f +(regexp) 958 2718 w +10 /LucidaTypewriter f +(") 1288 2718 w +10 /LucidaSansUnicode00 f +(Dot in the file whose menu line matches regexp) 2089 2718 w +10 /S f +(_) 886 2786 w +(_______________________________________________________________________________) 923 2786 w +10 /LucidaSansUnicode00 f +(Compound addresses) 886 2954 w +10 /S f +(_) 886 3022 w +(_______________________________________________________________________________) 923 3022 w +10 /LucidaSans-Italic f +(a1) 886 3166 w +10 /LucidaTypewriter f +(+) 1010 3166 w +10 /LucidaSans-Italic f +(a2) 1082 3166 w +10 /LucidaSansUnicode00 f +(The address) 2089 3166 w +10 /LucidaSans-Italic f +(a2) 2714 3166 w +10 /LucidaSansUnicode00 f +(evaluated starting at right of) 2870 3166 w +10 /LucidaSans-Italic f +(a1) 4290 3166 w +(a1) 886 3286 w +10 /LucidaTypewriter f +(-) 1010 3286 w +10 /LucidaSans-Italic f +(a2) 1082 3286 w +(a2) 2089 3286 w +10 /LucidaSansUnicode00 f +(evaluated in the reverse direction starting at left of) 2245 3286 w +10 /LucidaSans-Italic f +(a1) 4749 3286 w +(a1) 886 3406 w +10 /LucidaTypewriter f +(,) 1010 3406 w +10 /LucidaSans-Italic f +(a2) 1082 3406 w +10 /LucidaSansUnicode00 f +(From the left of) 2089 3406 w +10 /LucidaSans-Italic f +(a1) 2878 3406 w +10 /LucidaSansUnicode00 f +(to the right of) 3034 3406 w +10 /LucidaSans-Italic f +(a2) 3744 3406 w +10 /LucidaSansUnicode00 f +(\(default) 3900 3406 w +10 /LucidaTypewriter f +(0,$) 4304 3406 w +10 /LucidaSansUnicode00 f +(\)) 4520 3406 w +10 /LucidaSans-Italic f +(a1) 886 3526 w +10 /LucidaTypewriter f +(;) 1010 3526 w +10 /LucidaSans-Italic f +(a2) 1082 3526 w +10 /LucidaSansUnicode00 f +(Like) 2089 3526 w +10 /LucidaTypewriter f +(,) 2317 3526 w +10 /LucidaSansUnicode00 f +(but sets dot after evaluating) 2421 3526 w +10 /LucidaSans-Italic f +(a1) 3824 3526 w +10 /S f +(_) 886 3594 w +(_______________________________________________________________________________) 923 3594 w +10 /LucidaSansUnicode00 f +(The) 1439 3762 w +(operators) 1654 3762 w +10 /LucidaTypewriter f +(+) 2154 3762 w +10 /LucidaSansUnicode00 f +(and) 2260 3762 w +10 /LucidaTypewriter f +(-) 2474 3762 w +10 /LucidaSansUnicode00 f +(are) 2580 3762 w +(high) 2766 3762 w +(precedence,) 3015 3762 w +(while) 3637 3762 w +10 /LucidaTypewriter f +(,) 3925 3762 w +10 /LucidaSansUnicode00 f +(and) 4032 3762 w +10 /LucidaTypewriter f +(;) 4247 3762 w +10 /LucidaSansUnicode00 f +(are) 1439 3882 w +(low) 1626 3882 w +(precedence.) 1828 3882 w +(In) 2482 3882 w +(both) 2607 3882 w +10 /LucidaTypewriter f +(+) 2864 3882 w +10 /LucidaSansUnicode00 f +(and) 2970 3882 w +10 /LucidaTypewriter f +(-) 3184 3882 w +10 /LucidaSansUnicode00 f +(forms,) 3290 3882 w +10 /LucidaSans-Italic f +(a2) 3639 3882 w +10 /LucidaSansUnicode00 f +(defaults) 3797 3882 w +(to) 4221 3882 w +(1) 1439 4002 w +(and) 1537 4002 w +10 /LucidaSans-Italic f +(a1) 1752 4002 w +10 /LucidaSansUnicode00 f +(defaults) 1911 4002 w +(to) 2336 4002 w +(dot.) 2469 4002 w +(If) 2729 4002 w +(both) 2830 4002 w +10 /LucidaSans-Italic f +(a1) 3089 4002 w +10 /LucidaSansUnicode00 f +(and) 3249 4002 w +10 /LucidaSans-Italic f +(a2) 3465 4002 w +10 /LucidaSansUnicode00 f +(are) 3625 4002 w +(present,) 3813 4002 w +10 /LucidaTypewriter f +(+) 4247 4002 w +10 /LucidaSansUnicode00 f +(may be elided.) 1439 4122 w +10 /S f +(_) 886 4202 w +(_______________________________________________________________________________) 923 4202 w +10 /LucidaSansUnicode00 f +(The language discussed so far will not seem novel to people who use UNIX) 970 4538 w +(text) 4635 4538 w +(edi\255) 4859 4538 w +(tors) 720 4658 w +(such) 964 4658 w +(as) 1244 4658 w +10 /LucidaTypewriter f +(ed) 1403 4658 w +10 /LucidaSansUnicode00 f +(or) 1600 4658 w +10 /LucidaTypewriter f +(vi) 1755 4658 w +10 /LucidaSansUnicode00 f +(.) 1899 4658 w +6 /LucidaSansUnicode00 f +(9) 1931 4608 w +10 /LucidaSansUnicode00 f +(Moreover,) 2022 4658 w +(the) 2561 4658 w +(kinds) 2769 4658 w +(of) 3085 4658 w +(editing) 3236 4658 w +(operations) 3627 4658 w +(these) 4196 4658 w +(commands) 4511 4658 w +(allow,) 720 4778 w +(with) 1036 4778 w +(the) 1274 4778 w +(exception) 1462 4778 w +(of) 1971 4778 w +(regular) 2102 4778 w +(expressions) 2481 4778 w +(and) 3097 4778 w +(line) 3311 4778 w +(numbers,) 3521 4778 w +(are) 4015 4778 w +(clearly) 4201 4778 w +(more) 4548 4778 w +(con\255) 4833 4778 w +(veniently) 720 4898 w +(handled) 1209 4898 w +(by) 1653 4898 w +(a) 1822 4898 w +(mouse-based) 1930 4898 w +(interface.) 2652 4898 w +(Indeed,) 3193 4898 w +10 /LucidaTypewriter f +(sam) 3607 4898 w +10 /LucidaSansUnicode20 f +(\031) 3823 4898 w +10 /LucidaSansUnicode00 f +(s) 3855 4898 w +(mouse) 3959 4898 w +(language) 4335 4898 w +(\(dis\255) 4831 4898 w +(cussed) 720 5018 w +(at) 1098 5018 w +(length) 1234 5018 w +(below\)) 1586 5018 w +(is) 1949 5018 w +(the) 2073 5018 w +(means) 2272 5018 w +(by) 2633 5018 w +(which) 2792 5018 w +(simple) 3117 5018 w +(changes) 3482 5018 w +(are) 3926 5018 w +(usually) 4123 5018 w +(made.) 4508 5018 w +(For) 4884 5018 w +(large) 720 5138 w +(or) 1013 5138 w +(repetitive) 1165 5138 w +(changes,) 1671 5138 w +(however,) 2152 5138 w +(a) 2639 5138 w +(textual) 2743 5138 w +(language) 3129 5138 w +(outperforms) 3621 5138 w +(a) 4273 5138 w +(manual) 4377 5138 w +(inter\255) 4782 5138 w +(face.) 720 5258 w +(Imagine) 970 5414 w +(that,) 1411 5414 w +(instead) 1689 5414 w +(of) 2097 5414 w +(deleting) 2250 5414 w +(just) 2699 5414 w +(one) 2934 5414 w +(occurrence) 3168 5414 w +(of) 3756 5414 w +(the) 3910 5414 w +(string) 4121 5414 w +10 /LucidaTypewriter f +(Peter) 4459 5414 w +10 /LucidaSansUnicode00 f +(,) 4819 5414 w +(we) 4907 5414 w +(wanted) 720 5534 w +(to) 1114 5534 w +(eliminate) 1256 5534 w +(every) 1746 5534 w +10 /LucidaTypewriter f +(Peter) 2047 5534 w +10 /LucidaSansUnicode00 f +(.) 2407 5534 w +(What) 2515 5534 w +10 /LucidaSansUnicode20 f +(\031) 2755 5534 w +10 /LucidaSansUnicode00 f +(s) 2787 5534 w +(needed) 2882 5534 w +(is) 3282 5534 w +(an) 3406 5534 w +(iterator) 3567 5534 w +(that) 3968 5534 w +(runs) 4203 5534 w +(a) 4463 5534 w +(command) 4562 5534 w +(for each occurrence of some text.) 720 5654 w +10 /LucidaTypewriter f +(Sam) 2421 5654 w +10 /LucidaSansUnicode20 f +(\031) 2637 5654 w +10 /LucidaSansUnicode00 f +(s iterator is called) 2669 5654 w +10 /LucidaTypewriter f +(x) 3568 5654 w +10 /LucidaSansUnicode00 f +(, for extract:) 3640 5654 w +9 /LucidaTypewriter f +(x/) 920 5824 w +9 /LucidaSans-Italic f +(expression) 1050 5824 w +9 /LucidaTypewriter f +(/) 1514 5824 w +9 /LucidaSans-Italic f +(command) 1644 5824 w +10 /LucidaSansUnicode00 f +(finds) 720 6004 w +(all) 1002 6004 w +(matches) 1155 6004 w +(in) 1600 6004 w +(dot) 1731 6004 w +(of) 1932 6004 w +(the) 2070 6004 w +(specified) 2265 6004 w +(expression,) 2740 6004 w +(and) 3343 6004 w +(for) 3563 6004 w +(each) 3742 6004 w +(such) 4006 6004 w +(match,) 4272 6004 w +(sets) 4643 6004 w +(dot) 4879 6004 w +(to the text matched and runs the command.) 720 6124 w +(So to delete all the) 2930 6124 w +10 /LucidaTypewriter f +(Peters:) 3868 6124 w +9 /LucidaTypewriter f +(0,$) 920 6294 w +(x/Peter/) 1180 6294 w +(d) 1765 6294 w +10 /LucidaSansUnicode00 f +(\(Blanks) 720 6474 w +(in) 1115 6474 w +(these) 1255 6474 w +(examples) 1566 6474 w +(are) 2079 6474 w +(to) 2280 6474 w +(improve) 2427 6474 w +(readability;) 2871 6474 w +10 /LucidaTypewriter f +(sam) 3461 6474 w +10 /LucidaSansUnicode00 f +(neither) 3726 6474 w +(requires) 4119 6474 w +(nor) 4568 6474 w +(inter\255) 4782 6474 w +(prets) 720 6594 w +(them.\)) 1013 6594 w +(This) 1403 6594 w +(searches) 1653 6594 w +(the) 2121 6594 w +(entire) 2321 6594 w +(file) 2647 6594 w +(\() 2843 6594 w +10 /LucidaTypewriter f +(0,$) 2876 6594 w +10 /LucidaSansUnicode00 f +(\)) 3092 6594 w +(for) 3170 6594 w +(occurrences) 3354 6594 w +(of) 3981 6594 w +(the) 4123 6594 w +(string) 4322 6594 w +10 /LucidaTypewriter f +(Peter) 4648 6594 w +10 /LucidaSansUnicode00 f +(,) 5008 6594 w +(and runs the) 720 6714 w +10 /LucidaTypewriter f +(d) 1367 6714 w +10 /LucidaSansUnicode00 f +(command with dot set to each such occurrence.) 1471 6714 w +(\(By) 3860 6714 w +(contrast,) 4036 6714 w +(the) 4496 6714 w +(compa\255) 4684 6714 w +(rable) 720 6834 w +10 /LucidaTypewriter f +(ed) 1023 6834 w +10 /LucidaSansUnicode00 f +(command) 1226 6834 w +(would) 1763 6834 w +(delete) 2114 6834 w +(all) 2470 6834 w +10 /LucidaSans-Italic f +(lines) 2642 6834 w +10 /LucidaSansUnicode00 f +(containing) 2923 6834 w +10 /LucidaTypewriter f +(Peter) 3492 6834 w +10 /LucidaSansUnicode00 f +(;) 3852 6834 w +10 /LucidaTypewriter f +(sam) 3943 6834 w +10 /LucidaSansUnicode00 f +(deletes) 4217 6834 w +(only) 4623 6834 w +(the) 4885 6834 w +10 /LucidaTypewriter f +(Peters) 720 6954 w +10 /LucidaSansUnicode00 f +(.\)) 1152 6954 w +(The) 1307 6954 w +(address) 1547 6954 w +10 /LucidaTypewriter f +(0,$) 1986 6954 w +10 /LucidaSansUnicode00 f +(is) 2261 6954 w +(commonly) 2400 6954 w +(used,) 2961 6954 w +(and) 3284 6954 w +(may) 3523 6954 w +(be) 3782 6954 w +(abbreviated) 3960 6954 w +(to) 4589 6954 w +(just) 4746 6954 w +(a) 4985 6954 w +(comma.) 720 7074 w +(As another example,) 1169 7074 w +cleartomark +showpage +saveobj restore +%%EndPage: 7 7 +%%Page: 8 8 +/saveobj save def +mark +8 pagesetup +10 /LucidaSansUnicode00 f +(\255 8 \255) 2783 480 w +9 /LucidaTypewriter f +(,) 920 830 w +(x/Peter/) 1050 830 w +(p) 1635 830 w +10 /LucidaSansUnicode00 f +(prints) 720 1010 w +(a) 1045 1010 w +(list) 1142 1010 w +(of) 1330 1010 w +10 /LucidaTypewriter f +(Peters,) 1470 1010 w +10 /LucidaSansUnicode00 f +(one) 2016 1010 w +(for) 2237 1010 w +(each) 2419 1010 w +(appearance) 2686 1010 w +(in) 3286 1010 w +(the) 3420 1010 w +(file,) 3618 1010 w +(with) 3844 1010 w +(no) 4092 1010 w +(intervening) 4258 1010 w +(text) 4849 1010 w +(\(not even newlines to separate the instances\).) 720 1130 w +(Of) 970 1286 w +(course,) 1123 1286 w +(the) 1515 1286 w +(text) 1708 1286 w +(extracted) 1937 1286 w +(by) 2432 1286 w +10 /LucidaTypewriter f +(x) 2585 1286 w +10 /LucidaSansUnicode00 f +(may) 2695 1286 w +(be) 2933 1286 w +(selected) 3090 1286 w +(by) 3527 1286 w +(a) 3680 1286 w +(regular) 3773 1286 w +(expression,) 4157 1286 w +(which) 4759 1286 w +(complicates) 720 1406 w +(deciding) 1344 1406 w +(what) 1807 1406 w +(set) 2086 1406 w +(of) 2278 1406 w +(matches) 2424 1406 w +(is) 2877 1406 w +(chosen) 3004 1406 w +10 /LucidaSansUnicode20 f +(\024) 3394 1406 w +10 /LucidaSansUnicode00 f +(matches) 3541 1406 w +(may) 3993 1406 w +(overlap.) 4240 1406 w +(This) 4708 1406 w +(is) 4960 1406 w +(resolved) 720 1526 w +(by) 1194 1526 w +(generating) 1374 1526 w +(the) 1961 1526 w +(matches) 2181 1526 w +(starting) 2651 1526 w +(from) 3090 1526 w +(the) 3388 1526 w +(beginning) 3609 1526 w +(of) 4162 1526 w +(dot) 4326 1526 w +(using) 4553 1526 w +(the) 4885 1526 w +(leftmost-longest) 720 1646 w +(rule,) 1576 1646 w +(and) 1835 1646 w +(searching) 2054 1646 w +(for) 2562 1646 w +(each) 2740 1646 w +(match) 3003 1646 w +(starting) 3340 1646 w +(from) 3753 1646 w +(the) 4024 1646 w +(end) 4218 1646 w +(of) 4437 1646 w +(the) 4573 1646 w +(previ\255) 4766 1646 w +(ous) 720 1766 w +(one.) 930 1766 w +(Regular) 1209 1766 w +(expressions) 1613 1766 w +(may) 2231 1766 w +(also) 2467 1766 w +(match) 2699 1766 w +(null) 3033 1766 w +(strings,) 3251 1766 w +(but) 3652 1766 w +(a) 3850 1766 w +(null) 3942 1766 w +(match) 4161 1766 w +(adjacent) 4496 1766 w +(to) 4942 1766 w +(a non-null match is never selected; at least one character must intervene.) 720 1886 w +(For example,) 4366 1886 w +9 /LucidaTypewriter f +(,) 920 2056 w +(c/AAA/) 1050 2056 w +(x/B*/) 920 2166 w +(c/-/) 1310 2166 w +(,) 920 2276 w +(p) 1050 2276 w +10 /LucidaSansUnicode00 f +(produces as output) 720 2456 w +9 /LucidaTypewriter f +(-A-A-A-) 920 2626 w +10 /LucidaSansUnicode00 f +(because the pattern) 720 2806 w +10 /LucidaTypewriter f +(B*) 1716 2806 w +10 /LucidaSansUnicode00 f +(matches the null strings separating the) 1892 2806 w +10 /LucidaTypewriter f +(A) 3825 2806 w +10 /LucidaSansUnicode20 f +(\031) 3897 2806 w +10 /LucidaSansUnicode00 f +(s.) 3929 2806 w +(The) 970 2962 w +10 /LucidaTypewriter f +(x) 1188 2962 w +10 /LucidaSansUnicode00 f +(command) 1297 2962 w +(has) 1812 2962 w +(a) 2017 2962 w +(complement,) 2109 2962 w +10 /LucidaTypewriter f +(y) 2779 2962 w +10 /LucidaSansUnicode00 f +(,) 2851 2962 w +(with) 2920 2962 w +(similar) 3162 2962 w +(syntax,) 3526 2962 w +(that) 3913 2962 w +(executes) 4141 2962 w +(the) 4609 2962 w +(com\255) 4802 2962 w +(mand with dot set to the text) 720 3082 w +10 /LucidaSans-Italic f +(between) 2171 3082 w +10 /LucidaSansUnicode00 f +(the matches of the expression.) 2601 3082 w +(For example,) 4169 3082 w +9 /LucidaTypewriter f +(,) 920 3252 w +(c/AAA/) 1050 3252 w +(y/A/) 920 3362 w +(c/-/) 1245 3362 w +(,) 920 3472 w +(p) 1050 3472 w +10 /LucidaSansUnicode00 f +(produces the same result as the example above.) 720 3652 w +(The) 970 3808 w +10 /LucidaTypewriter f +(x) 1189 3808 w +10 /LucidaSansUnicode00 f +(and) 1299 3808 w +10 /LucidaTypewriter f +(y) 1517 3808 w +10 /LucidaSansUnicode00 f +(commands) 1627 3808 w +(are) 2194 3808 w +(looping) 2384 3808 w +(constructs,) 2789 3808 w +(and) 3363 3808 w +10 /LucidaTypewriter f +(sam) 3581 3808 w +10 /LucidaSansUnicode00 f +(has) 3836 3808 w +(a) 4043 3808 w +(pair) 4137 3808 w +(of) 4364 3808 w +(conditional) 4501 3808 w +(commands to go with them.) 720 3928 w +(They have similar syntax:) 2147 3928 w +9 /LucidaTypewriter f +(g/) 920 4098 w +9 /LucidaSans-Italic f +(expression) 1050 4098 w +9 /LucidaTypewriter f +(/) 1514 4098 w +9 /LucidaSans-Italic f +(command) 1644 4098 w +10 /LucidaSansUnicode00 f +(\(guard\)) 720 4278 w +(runs) 1105 4278 w +(the) 1357 4278 w +(command) 1548 4278 w +(exactly) 2062 4278 w +(once) 2439 4278 w +(if) 2705 4278 w +(dot) 2807 4278 w +(contains) 3004 4278 w +(a) 3449 4278 w +(match) 3541 4278 w +(of) 3876 4278 w +(the) 4011 4278 w +(expression.) 4203 4278 w +(This) 4835 4278 w +(is) 720 4398 w +(different) 842 4398 w +(from) 1302 4398 w +10 /LucidaTypewriter f +(x) 1576 4398 w +10 /LucidaSansUnicode00 f +(,) 1648 4398 w +(which) 1722 4398 w +(runs) 2045 4398 w +(the) 2303 4398 w +(command) 2500 4398 w +(for) 3020 4398 w +10 /LucidaSans-Italic f +(each) 3201 4398 w +10 /LucidaSansUnicode00 f +(match:) 3469 4398 w +10 /LucidaTypewriter f +(x) 3841 4398 w +10 /LucidaSansUnicode00 f +(loops;) 3955 4398 w +10 /LucidaTypewriter f +(g) 4294 4398 w +10 /LucidaSansUnicode00 f +(merely) 4408 4398 w +(tests,) 4776 4398 w +(without changing the value of dot.) 720 4518 w +(Thus,) 2454 4518 w +9 /LucidaTypewriter f +(,) 920 4688 w +(x/Peter/) 1050 4688 w +(d) 1635 4688 w +10 /LucidaSansUnicode00 f +(deletes all occurrences of) 720 4868 w +10 /LucidaTypewriter f +(Peter) 1990 4868 w +10 /LucidaSansUnicode00 f +(, but) 2350 4868 w +9 /LucidaTypewriter f +(,) 920 5038 w +(g/Peter/) 1050 5038 w +(d) 1635 5038 w +10 /LucidaSansUnicode00 f +(deletes) 720 5218 w +(the) 1104 5218 w +(whole) 1295 5218 w +(file) 1616 5218 w +(\(reduces) 1803 5218 w +(it) 2252 5218 w +(to) 2354 5218 w +(a) 2488 5218 w +(null) 2579 5218 w +(string\)) 2797 5218 w +(if) 3148 5218 w +10 /LucidaTypewriter f +(Peter) 3250 5218 w +10 /LucidaSansUnicode00 f +(occurs) 3646 5218 w +(anywhere) 3999 5218 w +(in) 4497 5218 w +(the) 4625 5218 w +(text.) 4817 5218 w +(The) 720 5338 w +(complementary) 946 5338 w +(conditional) 1740 5338 w +(is) 2324 5338 w +10 /LucidaTypewriter f +(v) 2449 5338 w +10 /LucidaSansUnicode00 f +(,) 2521 5338 w +(which) 2598 5338 w +(runs) 2924 5338 w +(the) 3185 5338 w +(command) 3385 5338 w +(if) 3907 5338 w +(there) 4017 5338 w +(is) 4313 5338 w +10 /LucidaSans-Italic f +(no) 4437 5338 w +10 /LucidaSansUnicode00 f +(match) 4600 5338 w +(of) 4942 5338 w +(the expression.) 720 5458 w +(These) 970 5614 w +(control-structure-like) 1328 5614 w +(commands) 2466 5614 w +(may) 3065 5614 w +(be) 3336 5614 w +(composed) 3526 5614 w +(to) 4096 5614 w +(construct) 4265 5614 w +(more) 4789 5614 w +(involved) 720 5734 w +(operations.) 1173 5734 w +(For) 1802 5734 w +(example,) 2007 5734 w +(to) 2501 5734 w +(print) 2648 5734 w +(those) 2929 5734 w +(lines) 3245 5734 w +(of) 3521 5734 w +(text) 3668 5734 w +(that) 3908 5734 w +(contain) 4148 5734 w +(the) 4554 5734 w +(string) 4758 5734 w +10 /LucidaTypewriter f +(Peter) 720 5854 w +10 /LucidaSansUnicode00 f +(:) 1080 5854 w +9 /LucidaTypewriter f +(,) 920 6024 w +(x/.*\\n/) 1050 6024 w +(g/Peter/) 1570 6024 w +(p) 2155 6024 w +10 /LucidaSansUnicode00 f +(The) 720 6204 w +10 /LucidaTypewriter f +(x) 940 6204 w +10 /LucidaSansUnicode00 f +(breaks) 1051 6204 w +(the) 1414 6204 w +(file) 1608 6204 w +(into) 1798 6204 w +(lines,) 2026 6204 w +(the) 2324 6204 w +10 /LucidaTypewriter f +(g) 2518 6204 w +10 /LucidaSansUnicode00 f +(selects) 2629 6204 w +(those) 2999 6204 w +(lines) 3305 6204 w +(containing) 3571 6204 w +10 /LucidaTypewriter f +(Peter) 4121 6204 w +10 /LucidaSansUnicode00 f +(,) 4481 6204 w +(and) 4553 6204 w +(the) 4773 6204 w +10 /LucidaTypewriter f +(p) 4968 6204 w +10 /LucidaSansUnicode00 f +(prints) 720 6324 w +(them.) 1046 6324 w +(This) 1401 6324 w +(command) 1649 6324 w +(gives) 2170 6324 w +(an) 2463 6324 w +(address) 2623 6324 w +(for) 3046 6324 w +(the) 3228 6324 w +10 /LucidaTypewriter f +(x) 3426 6324 w +10 /LucidaSansUnicode00 f +(command) 3541 6324 w +(\(the) 4062 6324 w +(whole) 4293 6324 w +(file\),) 4620 6324 w +(but) 4878 6324 w +(because) 720 6444 w +10 /LucidaTypewriter f +(g) 1151 6444 w +10 /LucidaSansUnicode00 f +(does) 1260 6444 w +(not) 1528 6444 w +(have) 1725 6444 w +(an) 1987 6444 w +(explicit) 2141 6444 w +(address,) 2533 6444 w +(it) 2983 6444 w +(applies) 3087 6444 w +(to) 3471 6444 w +(the) 3607 6444 w +(value) 3800 6444 w +(of) 4092 6444 w +(dot) 4228 6444 w +(produced) 4427 6444 w +(by) 4925 6444 w +(the) 720 6564 w +10 /LucidaTypewriter f +(x) 911 6564 w +10 /LucidaSansUnicode00 f +(command,) 1018 6564 w +(that) 1563 6564 w +(is,) 1789 6564 w +(to) 1936 6564 w +(each) 2069 6564 w +(line.) 2328 6564 w +(All) 2603 6564 w +(commands) 2765 6564 w +(in) 3329 6564 w +10 /LucidaTypewriter f +(sam) 3455 6564 w +10 /LucidaSansUnicode00 f +(except) 3706 6564 w +(for) 4065 6564 w +(the) 4239 6564 w +(command) 4429 6564 w +(to) 4942 6564 w +(write a file to disc use dot for the default address.) 720 6684 w +(Composition may be continued indefinitely.) 970 6840 w +9 /LucidaTypewriter f +(,) 920 7010 w +(x/.*\\n/) 1050 7010 w +(g/Peter/) 1570 7010 w +(v/SaltPeter/) 2155 7010 w +(p) 3000 7010 w +10 /LucidaSansUnicode00 f +(prints those lines containing) 720 7190 w +10 /LucidaTypewriter f +(Peter) 2135 7190 w +10 /LucidaSansUnicode00 f +(but) 2527 7190 w +10 /LucidaSans-Italic f +(not) 2721 7190 w +10 /LucidaSansUnicode00 f +(those containing) 2910 7190 w +10 /LucidaTypewriter f +(SaltPeter) 3751 7190 w +10 /LucidaSansUnicode00 f +(.) 4399 7190 w +cleartomark +showpage +saveobj restore +%%EndPage: 8 8 +%%Page: 9 9 +/saveobj save def +mark +9 pagesetup +10 /LucidaSansUnicode00 f +(\255 9 \255) 2783 480 w +10 /LucidaSans-Demi f +(Structural Regular Expressions) 720 840 w +10 /LucidaSansUnicode00 f +(Unlike) 720 996 w +(other) 1077 996 w +(UNIX) 1388 996 w +(text) 1677 996 w +(editors,) 1922 996 w +(including) 2346 996 w +(the) 2849 996 w +(non-interactive) 3059 996 w +(ones) 3862 996 w +(such) 4147 996 w +(as) 4428 996 w +10 /LucidaTypewriter f +(sed) 4589 996 w +10 /LucidaSansUnicode00 f +(and) 4860 996 w +10 /LucidaTypewriter f +(awk) 720 1116 w +10 /LucidaSansUnicode00 f +(,) 936 1116 w +6 /LucidaSansUnicode00 f +(7) 968 1066 w +10 /LucidaTypewriter f +(sam) 1052 1116 w +10 /LucidaSansUnicode00 f +(is) 1314 1116 w +(good) 1440 1116 w +(for) 1733 1116 w +(manipulating) 1918 1116 w +(files) 2601 1116 w +(with) 2848 1116 w +(multi-line) 3098 1116 w +10 /LucidaSansUnicode20 f +(\030) 3627 1116 w +10 /LucidaSansUnicode00 f +(records.) 3659 1116 w +10 /LucidaSansUnicode20 f +(\031) 4055 1116 w +10 /LucidaSansUnicode00 f +(An) 4164 1116 w +(example) 4340 1116 w +(is) 4798 1116 w +(an) 4923 1116 w +(on-line phone book composed of records, separated by blank lines, of the form) 720 1236 w +9 /LucidaTypewriter f +(Herbert) 920 1406 w +(Tic) 1440 1406 w +(44) 920 1516 w +(Turnip) 1115 1516 w +(Ave.,) 1570 1516 w +(Endive,) 1960 1516 w +(NJ) 2480 1516 w +(201-5555642) 920 1626 w +(Norbert) 920 1846 w +(Twinge) 1440 1846 w +(16) 920 1956 w +(Potato) 1115 1956 w +(St.,) 1570 1956 w +(Cabbagetown,) 1895 1956 w +(NJ) 2740 1956 w +(201-5553145) 920 2066 w +(...) 920 2286 w +10 /LucidaSansUnicode00 f +(The format may be encoded as a regular expression:) 720 2466 w +9 /LucidaTypewriter f +(\(.+\\n\)+) 920 2636 w +10 /LucidaSansUnicode00 f +(that) 720 2816 w +(is,) 957 2816 w +(a) 1115 2816 w +(sequence) 1216 2816 w +(of) 1719 2816 w +(one) 1863 2816 w +(or) 2089 2816 w +(more) 2238 2816 w +(non-blank) 2536 2816 w +(lines.) 3093 2816 w +(The) 3431 2816 w +(command) 3659 2816 w +(to) 4184 2816 w +(print) 4329 2816 w +(Mr.) 4608 2816 w +(Tic) 4814 2816 w +10 /LucidaSansUnicode20 f +(\031) 4957 2816 w +10 /LucidaSansUnicode00 f +(s) 4989 2816 w +(entire record is then) 720 2936 w +9 /LucidaTypewriter f +(,) 920 3106 w +(x/\(.+\\n\)+/) 1050 3106 w +(g/^Herbert) 1765 3106 w +(Tic$/) 2480 3106 w +(p) 2870 3106 w +10 /LucidaSansUnicode00 f +(and that to extract just the phone number is) 720 3286 w +9 /LucidaTypewriter f +(,) 920 3456 w +(x/\(.+\\n\)+/) 1050 3456 w +(g/^Herbert) 1765 3456 w +(Tic$/) 2480 3456 w +(x/^[0-9]*-[0-9]*\\n/) 2870 3456 w +(p) 4170 3456 w +10 /LucidaSansUnicode00 f +(The) 720 3636 w +(latter) 941 3636 w +(command) 1236 3636 w +(breaks) 1754 3636 w +(the) 2118 3636 w +(file) 2313 3636 w +(into) 2504 3636 w +(records,) 2733 3636 w +(chooses) 3169 3636 w +(Mr.) 3602 3636 w +(Tic) 3802 3636 w +10 /LucidaSansUnicode20 f +(\031) 3945 3636 w +10 /LucidaSansUnicode00 f +(s) 3977 3636 w +(record,) 4069 3636 w +(extracts) 4455 3636 w +(the) 4885 3636 w +(phone number from the record, and finally prints the number.) 720 3756 w +(A) 970 3912 w +(more) 1073 3912 w +(involved) 1358 3912 w +(problem) 1796 3912 w +(is) 2236 3912 w +(that) 2350 3912 w +(of) 2575 3912 w +(renaming) 2707 3912 w +(a) 3201 3912 w +(particular) 3290 3912 w +(variable,) 3787 3912 w +(say) 4233 3912 w +10 /LucidaTypewriter f +(n) 4426 3912 w +10 /LucidaSansUnicode00 f +(,) 4498 3912 w +(to) 4565 3912 w +10 /LucidaTypewriter f +(num) 4698 3912 w +10 /LucidaSansUnicode00 f +(in) 4949 3912 w +(a C program.) 720 4032 w +(The obvious first attempt,) 1420 4032 w +9 /LucidaTypewriter f +(,) 920 4202 w +(x/n/) 1050 4202 w +(c/num/) 1375 4202 w +10 /LucidaSansUnicode00 f +(is) 720 4382 w +(badly) 847 4382 w +(flawed:) 1156 4382 w +(it) 1552 4382 w +(changes) 1665 4382 w +(not) 2111 4382 w +(only) 2318 4382 w +(the) 2569 4382 w +(variable) 2771 4382 w +10 /LucidaTypewriter f +(n) 3198 4382 w +10 /LucidaSansUnicode00 f +(but) 3317 4382 w +(any) 3526 4382 w +(letter) 3742 4382 w +10 /LucidaTypewriter f +(n) 4045 4382 w +10 /LucidaSansUnicode00 f +(that) 4164 4382 w +(appears.) 4402 4382 w +(We) 4898 4382 w +(need to extract all the variables, and select those that match) 720 4502 w +10 /LucidaTypewriter f +(n) 3692 4502 w +10 /LucidaSansUnicode00 f +(and only) 3796 4502 w +10 /LucidaTypewriter f +(n) 4244 4502 w +10 /LucidaSansUnicode00 f +(:) 4316 4502 w +9 /LucidaTypewriter f +(,) 920 4672 w +(x/[A-Za-z_][A-Za-z_0-9]*/) 1050 4672 w +(g/n/) 2740 4672 w +(v/../) 3065 4672 w +(c/num/) 3455 4672 w +10 /LucidaSansUnicode00 f +(The) 720 4852 w +(pattern) 942 4852 w +10 /LucidaTypewriter f +([A-Za-z_][A-Za-z_0-9]*) 1334 4852 w +10 /LucidaSansUnicode00 f +(matches) 2959 4852 w +(C) 3405 4852 w +(identifiers.) 3515 4852 w +(Next) 4110 4852 w +10 /LucidaTypewriter f +(g/n/) 4379 4852 w +10 /LucidaSansUnicode00 f +(selects) 4709 4852 w +(those) 720 4972 w +(containing) 1026 4972 w +(an) 1575 4972 w +10 /LucidaTypewriter f +(n) 1731 4972 w +10 /LucidaSansUnicode00 f +(.) 1803 4972 w +(Then) 1906 4972 w +10 /LucidaTypewriter f +(v/../) 2188 4972 w +10 /LucidaSansUnicode00 f +(rejects) 2587 4972 w +(those) 2947 4972 w +(containing) 3252 4972 w +(two) 3800 4972 w +(\(or) 4013 4972 w +(more\)) 4186 4972 w +(characters,) 4508 4972 w +(and) 720 5092 w +(finally) 940 5092 w +10 /LucidaTypewriter f +(c/num/) 1273 5092 w +10 /LucidaSansUnicode00 f +(changes) 1745 5092 w +(the) 2185 5092 w +(remainder) 2381 5092 w +(\(identifiers) 2918 5092 w +10 /LucidaTypewriter f +(n) 3482 5092 w +10 /LucidaSansUnicode00 f +(\)) 3554 5092 w +(to) 3628 5092 w +10 /LucidaTypewriter f +(num) 3767 5092 w +10 /LucidaSansUnicode00 f +(.) 3983 5092 w +(This) 4088 5092 w +(version) 4334 5092 w +(clearly) 4727 5092 w +(works) 720 5212 w +(much) 1053 5212 w +(better,) 1366 5212 w +(but) 1733 5212 w +(there) 1940 5212 w +(may) 2237 5212 w +(still) 2482 5212 w +(be) 2702 5212 w +(problems.) 2865 5212 w +(For) 3430 5212 w +(example,) 3630 5212 w +(in) 4119 5212 w +(C) 4254 5212 w +(character) 4367 5212 w +(and) 4860 5212 w +(string) 720 5332 w +(constants,) 1046 5332 w +(the) 1589 5332 w +(sequence) 1788 5332 w +10 /LucidaTypewriter f +(\\n) 2289 5332 w +10 /LucidaSansUnicode00 f +(is) 2478 5332 w +(interpreted) 2603 5332 w +(as) 3189 5332 w +(a) 3340 5332 w +(newline) 3440 5332 w +(character,) 3856 5332 w +(and) 4382 5332 w +(we) 4607 5332 w +(don) 4785 5332 w +10 /LucidaSansUnicode20 f +(\031) 4971 5332 w +10 /LucidaSansUnicode00 f +(t) 5003 5332 w +(want to change it to) 720 5452 w +10 /LucidaTypewriter f +(\\num.) 1721 5452 w +10 /LucidaSansUnicode00 f +(This problem can be forestalled with a) 2113 5452 w +10 /LucidaTypewriter f +(y) 4010 5452 w +10 /LucidaSansUnicode00 f +(command:) 4114 5452 w +9 /LucidaTypewriter f +(,) 920 5622 w +(y/\\\\n/) 1050 5622 w +(x/[A-Za-z_][A-Za-z_0-9]*/) 1505 5622 w +(g/n/) 3195 5622 w +(v/../) 3520 5622 w +(c/num/) 3910 5622 w +10 /LucidaSansUnicode00 f +(\(the) 720 5802 w +(second) 943 5802 w +10 /LucidaTypewriter f +(\\) 1322 5802 w +10 /LucidaSansUnicode00 f +(is) 1429 5802 w +(necessary) 1544 5802 w +(because) 2054 5802 w +(of) 2483 5802 w +(lexical) 2616 5802 w +(conventions) 2961 5802 w +(in) 3580 5802 w +(regular) 3706 5802 w +(expressions\),) 4087 5802 w +(or) 4769 5802 w +(we) 4907 5802 w +(could even reject character constants and strings outright:) 720 5922 w +9 /LucidaTypewriter f +(,y/'[^']*'/) 720 6092 w +(y/"[^"]*"/) 1500 6092 w +(x/[A-Za-z_][A-Za-z_0-9]*/) 2215 6092 w +(g/n/) 3905 6092 w +(v/../) 4230 6092 w +(c/num/) 4620 6092 w +10 /LucidaSansUnicode00 f +(The) 720 6272 w +10 /LucidaTypewriter f +(y) 937 6272 w +10 /LucidaSansUnicode00 f +(commands) 1045 6272 w +(in) 1610 6272 w +(this) 1737 6272 w +(version) 1952 6272 w +(exclude) 2341 6272 w +(from) 2756 6272 w +(consideration) 3025 6272 w +(all) 3720 6272 w +(character) 3870 6272 w +(constants) 4356 6272 w +(and) 4860 6272 w +(strings.) 720 6392 w +(The) 1162 6392 w +(only) 1388 6392 w +(remaining) 1637 6392 w +(problem) 2171 6392 w +(is) 2622 6392 w +(to) 2747 6392 w +(deal) 2890 6392 w +(with) 3137 6392 w +(the) 3386 6392 w +(possible) 3585 6392 w +(occurrence) 4032 6392 w +(of) 4608 6392 w +10 /LucidaTypewriter f +(\\') 4750 6392 w +10 /LucidaSansUnicode00 f +(or) 4938 6392 w +10 /LucidaTypewriter f +(\\") 720 6512 w +10 /LucidaSansUnicode00 f +(within these sequences, but it) 896 6512 w +10 /LucidaSansUnicode20 f +(\031) 2350 6512 w +10 /LucidaSansUnicode00 f +(s easy to see how to resolve this difficulty.) 2382 6512 w +(The) 970 6668 w +(point) 1195 6668 w +(of) 1492 6668 w +(these) 1635 6668 w +(composed) 1942 6668 w +(commands) 2486 6668 w +(is) 3060 6668 w +(successive) 3185 6668 w +(refinement.) 3740 6668 w +(A) 4378 6668 w +(simple) 4492 6668 w +(ver\255) 4858 6668 w +(sion) 720 6788 w +(of) 962 6788 w +(the) 1099 6788 w +(command) 1293 6788 w +(is) 1810 6788 w +(tried,) 1928 6788 w +(and) 2224 6788 w +(if) 2442 6788 w +(it) 2546 6788 w +10 /LucidaSansUnicode20 f +(\031) 2612 6788 w +10 /LucidaSansUnicode00 f +(s) 2644 6788 w +(not) 2733 6788 w +(good) 2931 6788 w +(enough,) 3216 6788 w +(it) 3651 6788 w +(can) 3755 6788 w +(be) 3961 6788 w +(honed) 4118 6788 w +(by) 4460 6788 w +(adding) 4613 6788 w +(a) 4985 6788 w +(clause) 720 6908 w +(or) 1058 6908 w +(two.) 1194 6908 w +(\(Mistakes) 1467 6908 w +(can) 1957 6908 w +(be) 2159 6908 w +(undone;) 2312 6908 w +(see) 2744 6908 w +(below.) 2941 6908 w +(Also,) 3325 6908 w +(the) 3601 6908 w +(mouse) 3790 6908 w +(language) 4148 6908 w +(makes) 4626 6908 w +(it) 4974 6908 w +(unnecessary) 720 7028 w +(to) 1357 7028 w +(retype) 1493 7028 w +(the) 1836 7028 w +(command) 2029 7028 w +(each) 2545 7028 w +(time.\)) 2807 7028 w +(The) 3156 7028 w +(resulting) 3374 7028 w +(chains) 3840 7028 w +(of) 4187 7028 w +(commands) 4322 7028 w +(are) 4888 7028 w +(somewhat) 720 7148 w +(reminiscent) 1262 7148 w +(of) 1879 7148 w +(shell) 2027 7148 w +(pipelines.) 2305 7148 w +6 /LucidaSansUnicode00 f +(7) 2775 7098 w +10 /LucidaSansUnicode00 f +(Unlike) 2864 7148 w +(pipelines,) 3218 7148 w +(though,) 3739 7148 w +(which) 4168 7148 w +(pass) 4500 7148 w +(along) 4771 7148 w +(modified) 720 7268 w +10 /LucidaSans-Italic f +(data) 1197 7268 w +10 /LucidaSansUnicode00 f +(,) 1418 7268 w +10 /LucidaTypewriter f +(sam) 1496 7268 w +10 /LucidaSansUnicode00 f +(commands) 1758 7268 w +(pass) 2333 7268 w +(a) 2599 7268 w +10 /LucidaSans-Italic f +(view) 2700 7268 w +10 /LucidaSansUnicode00 f +(of) 2960 7268 w +(the) 3103 7268 w +(data.) 3303 7268 w +(The) 3622 7268 w +(text) 3848 7268 w +(at) 4084 7268 w +(each) 4221 7268 w +(step) 4490 7268 w +(of) 4742 7268 w +(the) 4885 7268 w +cleartomark +showpage +saveobj restore +%%EndPage: 9 9 +%%Page: 10 10 +/saveobj save def +mark +10 pagesetup +10 /LucidaSansUnicode00 f +(\255 10 \255) 2752 480 w +(command) 720 840 w +(is) 1244 840 w +(the) 1370 840 w +(same,) 1571 840 w +(but) 1904 840 w +(which) 2112 840 w +(pieces) 2439 840 w +(are) 2791 840 w +(selected) 2989 840 w +(is) 3434 840 w +(refined) 3560 840 w +(step) 3950 840 w +(by) 4203 840 w +(step) 4365 840 w +(until) 4619 840 w +(the) 4885 840 w +(correct) 720 960 w +(piece) 1097 960 w +(is) 1391 960 w +(available) 1510 960 w +(to) 1972 960 w +(the) 2109 960 w +(final) 2303 960 w +(step) 2554 960 w +(of) 2800 960 w +(the) 2936 960 w +(command) 3129 960 w +(line,) 3645 960 w +(which) 3891 960 w +(ultimately) 4210 960 w +(makes) 4727 960 w +(the change.) 720 1080 w +(In) 970 1236 w +(other) 1100 1236 w +(UNIX) 1396 1236 w +(programs,) 1670 1236 w +(regular) 2209 1236 w +(expressions) 2595 1236 w +(are) 3217 1236 w +(used) 3409 1236 w +(only) 3681 1236 w +(for) 3925 1236 w +(selection,) 4104 1236 w +(as) 4608 1236 w +(in) 4754 1236 w +(the) 4885 1236 w +10 /LucidaTypewriter f +(sam) 720 1356 w +(g) 969 1356 w +10 /LucidaSansUnicode00 f +(command,) 1074 1356 w +(never for extraction as in the) 1617 1356 w +10 /LucidaTypewriter f +(x) 3057 1356 w +10 /LucidaSansUnicode00 f +(or) 3161 1356 w +10 /LucidaTypewriter f +(y) 3295 1356 w +10 /LucidaSansUnicode00 f +(command.) 3399 1356 w +(For example, patterns) 3973 1356 w +(in) 720 1476 w +10 /LucidaTypewriter f +(awk) 850 1476 w +6 /LucidaSansUnicode00 f +(7) 1066 1426 w +10 /LucidaSansUnicode00 f +(are) 1143 1476 w +(used) 1335 1476 w +(to) 1607 1476 w +(select) 1745 1476 w +(lines) 2065 1476 w +(to) 2332 1476 w +(be) 2470 1476 w +(operated) 2629 1476 w +(on,) 3101 1476 w +(but) 3296 1476 w +(cannot) 3498 1476 w +(be) 3866 1476 w +(used) 4025 1476 w +(to) 4297 1476 w +(describe) 4435 1476 w +(the) 4885 1476 w +(format) 720 1596 w +(of) 1079 1596 w +(the) 1212 1596 w +(input) 1402 1596 w +(text,) 1690 1596 w +(or) 1948 1596 w +(to) 2085 1596 w +(handle) 2218 1596 w +(newline-free) 2580 1596 w +(text.) 3234 1596 w +(The) 3524 1596 w +(use) 3740 1596 w +(of) 3944 1596 w +(regular) 4077 1596 w +(expressions) 4458 1596 w +(to) 720 1716 w +(describe) 864 1716 w +(the) 1320 1716 w +(structure) 1521 1716 w +(of) 2005 1716 w +(a) 2149 1716 w +(piece) 2250 1716 w +(of) 2551 1716 w +(text) 2695 1716 w +(rather) 2932 1716 w +(than) 3270 1716 w +(its) 3532 1716 w +(contents,) 3695 1716 w +(as) 4190 1716 w +(in) 4343 1716 w +(the) 4481 1716 w +10 /LucidaTypewriter f +(x) 4683 1716 w +10 /LucidaSansUnicode00 f +(com\255) 4802 1716 w +(mand,) 720 1836 w +(has) 1107 1836 w +(been) 1357 1836 w +(given) 1676 1836 w +(a) 2019 1836 w +(name:) 2156 1836 w +10 /LucidaSans-Italic f +(structural) 2535 1836 w +(regular) 3101 1836 w +(expressions.) 3544 1836 w +10 /LucidaSansUnicode00 f +(When) 4253 1836 w +(they) 4600 1836 w +(are) 4888 1836 w +(composed,) 720 1956 w +(as) 1315 1956 w +(in) 1485 1956 w +(the) 1640 1956 w +(above) 1860 1956 w +(example,) 2212 1956 w +(they) 2722 1956 w +(are) 2994 1956 w +(pleasantly) 3211 1956 w +(expressive.) 3765 1956 w +(Their) 4410 1956 w +(use) 4726 1956 w +(is) 4960 1956 w +(discussed at greater length elsewhere.) 720 2076 w +6 /LucidaSansUnicode00 f +(10) 2589 2026 w +10 /LucidaSans-Demi f +(Multiple files) 720 2352 w +10 /LucidaTypewriter f +(Sam) 720 2508 w +10 /LucidaSansUnicode00 f +(has a few other commands, mostly relating to input and output.) 968 2508 w +9 /LucidaTypewriter f +(e) 920 2678 w +(discfilename) 1050 2678 w +10 /LucidaSansUnicode00 f +(replaces the contents and name of the current file with those of the named disc file;) 720 2858 w +9 /LucidaTypewriter f +(w) 920 3028 w +(discfilename) 1050 3028 w +10 /LucidaSansUnicode00 f +(writes the contents to the named disc file; and) 720 3208 w +9 /LucidaTypewriter f +(r) 920 3378 w +(discfilename) 1050 3378 w +10 /LucidaSansUnicode00 f +(replaces) 720 3558 w +(dot) 1159 3558 w +(with) 1357 3558 w +(the) 1599 3558 w +(contents) 1791 3558 w +(of) 2245 3558 w +(the) 2380 3558 w +(named) 2572 3558 w +(disc) 2938 3558 w +(file.) 3169 3558 w +(All) 3421 3558 w +(these) 3586 3558 w +(commands) 3886 3558 w +(use) 4453 3558 w +(the) 4660 3558 w +(cur\255) 4853 3558 w +(rent file) 720 3678 w +10 /LucidaSansUnicode20 f +(\031) 1099 3678 w +10 /LucidaSansUnicode00 f +(s name if none is specified.) 1131 3678 w +(Finally,) 2526 3678 w +9 /LucidaTypewriter f +(f) 920 3848 w +(discfilename) 1050 3848 w +10 /LucidaSansUnicode00 f +(changes the name associated with the file and displays the result:) 720 4028 w +9 /LucidaTypewriter f +('-.) 920 4198 w +(discfilename) 1180 4198 w +10 /LucidaSansUnicode00 f +(This) 720 4378 w +(output) 966 4378 w +(is) 1329 4378 w +(called) 1450 4378 w +(the) 1774 4378 w +(file) 1970 4378 w +10 /LucidaSansUnicode20 f +(\031) 2121 4378 w +10 /LucidaSansUnicode00 f +(s) 2153 4378 w +10 /LucidaSans-Italic f +(menu) 2245 4378 w +(line,) 2556 4378 w +10 /LucidaSansUnicode00 f +(because) 2802 4378 w +(it) 3237 4378 w +(is) 3344 4378 w +(the) 3465 4378 w +(contents) 3661 4378 w +(of) 4119 4378 w +(the) 4258 4378 w +(file) 4455 4378 w +10 /LucidaSansUnicode20 f +(\031) 4606 4378 w +10 /LucidaSansUnicode00 f +(s) 4638 4378 w +(line) 4731 4378 w +(in) 4949 4378 w +(the) 720 4498 w +(button) 930 4498 w +(3) 1307 4498 w +(menu) 1425 4498 w +(\(described) 1753 4498 w +(in) 2313 4498 w +(the) 2458 4498 w +(next) 2667 4498 w +(section\).) 2937 4498 w +(The) 3435 4498 w +(first) 3670 4498 w +(three) 3919 4498 w +(characters) 4225 4498 w +(are) 4779 4498 w +(a) 4985 4498 w +(concise) 720 4618 w +(notation) 1141 4618 w +(for) 1605 4618 w +(the) 1804 4618 w +(state) 2019 4618 w +(of) 2315 4618 w +(the) 2473 4618 w +(file.) 2688 4618 w +(The) 2963 4618 w +(apostrophe) 3204 4618 w +(signifies) 3814 4618 w +(that) 4280 4618 w +(the) 4532 4618 w +(file) 4748 4618 w +(is) 4960 4618 w +(modified.) 720 4738 w +(The) 1261 4738 w +(minus) 1488 4738 w +(sign) 1831 4738 w +(indicates) 2081 4738 w +(the) 2560 4738 w +(number) 2761 4738 w +(of) 3184 4738 w +(windows) 3328 4738 w +(open) 3793 4738 w +(on) 4080 4738 w +(the) 4248 4738 w +(file) 4448 4738 w +(\(see) 4644 4738 w +(the) 4885 4738 w +(next) 720 4858 w +(section\):) 979 4858 w +10 /LucidaTypewriter f +(-) 1434 4858 w +10 /LucidaSansUnicode00 f +(means) 1549 4858 w +(none,) 1909 4858 w +10 /LucidaTypewriter f +(+) 2225 4858 w +10 /LucidaSansUnicode00 f +(means) 2340 4858 w +(one,) 2701 4858 w +(and) 2956 4858 w +10 /LucidaTypewriter f +(*) 3180 4858 w +10 /LucidaSansUnicode00 f +(means) 3296 4858 w +(more) 3657 4858 w +(than) 3952 4858 w +(one.) 4212 4858 w +(Finally,) 4499 4858 w +(the) 4885 4858 w +(period) 720 4978 w +(indicates) 1072 4978 w +(that) 1544 4978 w +(this) 1774 4978 w +(is) 1992 4978 w +(the) 2111 4978 w +(current) 2305 4978 w +(file.) 2694 4978 w +(These) 2948 4978 w +(characters) 3275 4978 w +(are) 3814 4978 w +(useful) 4004 4978 w +(for) 4339 4978 w +(controlling) 4516 4978 w +(the) 720 5098 w +10 /LucidaTypewriter f +(X) 907 5098 w +10 /LucidaSansUnicode00 f +(command, described shortly.) 1011 5098 w +10 /LucidaTypewriter f +(Sam) 970 5254 w +10 /LucidaSansUnicode00 f +(may be started with a set of disc files \(such) 1218 5254 w +(as) 3355 5254 w +(all) 3494 5254 w +(the) 3640 5254 w +(source) 3828 5254 w +(for) 4183 5254 w +(a) 4355 5254 w +(program\)) 4443 5254 w +(by) 4925 5254 w +(invoking) 720 5374 w +(it) 1169 5374 w +(with) 1269 5374 w +(a) 1508 5374 w +(list) 1597 5374 w +(of) 1777 5374 w +(file) 1909 5374 w +(names) 2094 5374 w +(as) 2445 5374 w +(arguments,) 2585 5374 w +(and) 3170 5374 w +(more) 3384 5374 w +(may) 3669 5374 w +(be) 3903 5374 w +(added) 4056 5374 w +(or) 4389 5374 w +(deleted) 4524 5374 w +(on) 4917 5374 w +(demand.) 720 5494 w +9 /LucidaTypewriter f +(B) 920 5664 w +(discfile1) 1050 5664 w +(discfile2) 1700 5664 w +(...) 2350 5664 w +10 /LucidaSansUnicode00 f +(adds the named files to) 720 5844 w +10 /LucidaTypewriter f +(sam) 1896 5844 w +10 /LucidaSansUnicode20 f +(\031) 2112 5844 w +10 /LucidaSansUnicode00 f +(s list, and) 2144 5844 w +9 /LucidaTypewriter f +(D) 920 6014 w +(discfile1) 1050 6014 w +(discfile2) 1700 6014 w +(...) 2350 6014 w +10 /LucidaSansUnicode00 f +(removes) 720 6194 w +(them) 1168 6194 w +(from) 1454 6194 w +10 /LucidaTypewriter f +(sam) 1724 6194 w +10 /LucidaSansUnicode20 f +(\031) 1940 6194 w +10 /LucidaSansUnicode00 f +(s) 1972 6194 w +(memory) 2061 6194 w +(\(without) 2495 6194 w +(effect) 2931 6194 w +(on) 3243 6194 w +(associated) 3404 6194 w +(disc) 3951 6194 w +(files\).) 4183 6194 w +(Both) 4521 6194 w +(these) 4778 6194 w +(commands) 720 6314 w +(have) 1288 6314 w +(a) 1552 6314 w +(syntax) 1646 6314 w +(for) 2003 6314 w +(using) 2181 6314 w +(the) 2486 6314 w +(shell) 2680 6314 w +6 /LucidaSansUnicode00 f +(7) 2907 6264 w +10 /LucidaSansUnicode00 f +(\(the) 2984 6314 w +(UNIX) 3211 6314 w +(command) 3485 6314 w +(interpreter\)) 4002 6314 w +(to) 4593 6314 w +(gener\255) 4730 6314 w +(ate the lists:) 720 6434 w +9 /LucidaTypewriter f +(B) 920 6604 w +(<echo) 1050 6604 w +(*.c) 1440 6604 w +10 /LucidaSansUnicode00 f +(will add all C source files, and) 720 6784 w +9 /LucidaTypewriter f +(B) 920 6954 w +(<grep) 1050 6954 w +(-l) 1440 6954 w +(variable) 1635 6954 w +(*.c) 2220 6954 w +10 /LucidaSansUnicode00 f +(will) 720 7134 w +(add) 960 7134 w +(all) 1217 7134 w +(C) 1406 7134 w +(source) 1551 7134 w +(files) 1949 7134 w +(referencing) 2227 7134 w +(a) 2856 7134 w +(particular) 2988 7134 w +(variable) 3528 7134 w +(\(the) 3985 7134 w +(UNIX) 4250 7134 w +(command) 4562 7134 w +10 /LucidaTypewriter f +(grep -l) 720 7254 w +10 /LucidaSansUnicode00 f +(lists) 1270 7254 w +(all) 1513 7254 w +(files) 1672 7254 w +(in) 1920 7254 w +(its) 2057 7254 w +(arguments) 2219 7254 w +(that) 2783 7254 w +(contain) 3019 7254 w +(matches) 3421 7254 w +(of) 3871 7254 w +(the) 4014 7254 w +(specified) 4214 7254 w +(regular) 4694 7254 w +cleartomark +showpage +saveobj restore +%%EndPage: 10 10 +%%Page: 11 11 +/saveobj save def +mark +11 pagesetup +10 /LucidaSansUnicode00 f +(\255 11 \255) 2752 480 w +(expression\).) 720 840 w +(Finally,) 1380 840 w +10 /LucidaTypewriter f +(D) 1754 840 w +10 /LucidaSansUnicode00 f +(without arguments deletes the current file.) 1858 840 w +(There are two ways to change which file is current:) 970 996 w +9 /LucidaTypewriter f +(b) 920 1166 w +(filename) 1050 1166 w +10 /LucidaSansUnicode00 f +(makes) 720 1346 w +(the) 1073 1346 w +(named) 1268 1346 w +(file) 1637 1346 w +(current.) 1828 1346 w +(The) 2282 1346 w +10 /LucidaTypewriter f +(B) 2503 1346 w +10 /LucidaSansUnicode00 f +(command) 2615 1346 w +(does) 3133 1346 w +(the) 3404 1346 w +(same,) 3599 1346 w +(but) 3926 1346 w +(also) 4128 1346 w +(adds) 4364 1346 w +(any) 4636 1346 w +(new) 4845 1346 w +(files) 720 1466 w +(to) 967 1466 w +10 /LucidaTypewriter f +(sam) 1110 1466 w +10 /LucidaSansUnicode20 f +(\031) 1326 1466 w +10 /LucidaSansUnicode00 f +(s) 1358 1466 w +(list.) 1454 1466 w +(\(In) 1708 1466 w +(practice,) 1876 1466 w +(of) 2335 1466 w +(course,) 2477 1466 w +(the) 2875 1466 w +(current) 3074 1466 w +(file) 3468 1466 w +(is) 3663 1466 w +(usually) 3787 1466 w +(chosen) 4171 1466 w +(by) 4558 1466 w +(mouse) 4717 1466 w +(actions,) 720 1586 w +(not) 1149 1586 w +(by) 1361 1586 w +(textual) 1528 1586 w +(commands.\)) 1917 1586 w +(The) 2595 1586 w +(other) 2828 1586 w +(way) 3137 1586 w +(is) 3373 1586 w +(to) 3505 1586 w +(use) 3655 1586 w +(a) 3876 1586 w +(form) 3983 1586 w +(of) 4267 1586 w +(address) 4417 1586 w +(that) 4849 1586 w +(refers to files:) 720 1706 w +9 /LucidaTypewriter f +(") 920 1876 w +9 /LucidaSans-Italic f +(expression) 985 1876 w +9 /LucidaTypewriter f +(") 1449 1876 w +9 /LucidaSans-Italic f +(address) 1579 1876 w +10 /LucidaSansUnicode00 f +(refers) 720 2056 w +(to) 1055 2056 w +(the) 1206 2056 w +(address) 1414 2056 w +(evaluated) 1847 2056 w +(in) 2365 2056 w +(the) 2509 2056 w +(file) 2718 2056 w +(whose) 2923 2056 w +(menu) 3284 2056 w +(line) 3611 2056 w +(matches) 3841 2056 w +(the) 4300 2056 w +(expression) 4509 2056 w +(\(there must be exactly one match\).) 720 2176 w +(For example,) 2474 2176 w +9 /LucidaTypewriter f +("peter.c") 920 2346 w +(3) 1570 2346 w +10 /LucidaSansUnicode00 f +(refers to the third line of the file whose name matches) 720 2526 w +10 /LucidaTypewriter f +(peter.c) 3397 2526 w +10 /LucidaSansUnicode00 f +(.) 3901 2526 w +(This is most useful in) 3997 2526 w +(the move \() 720 2646 w +10 /LucidaTypewriter f +(m) 1234 2646 w +10 /LucidaSansUnicode00 f +(\) and copy \() 1306 2646 w +10 /LucidaTypewriter f +(t) 1875 2646 w +10 /LucidaSansUnicode00 f +(\) commands:) 1947 2646 w +9 /LucidaTypewriter f +(0,$) 920 2816 w +(t) 1180 2816 w +("peter.c") 1310 2816 w +(0) 1960 2816 w +10 /LucidaSansUnicode00 f +(makes a copy of the current file at the beginning of) 720 2996 w +10 /LucidaTypewriter f +(peter.c) 3253 2996 w +10 /LucidaSansUnicode00 f +(.) 3757 2996 w +(The) 970 3152 w +10 /LucidaTypewriter f +(X) 1183 3152 w +10 /LucidaSansUnicode00 f +(command is a looping construct, like) 1287 3152 w +10 /LucidaTypewriter f +(x) 3116 3152 w +10 /LucidaSansUnicode00 f +(, that refers to files instead of strings:) 3188 3152 w +9 /LucidaTypewriter f +(X/) 920 3322 w +9 /LucidaSans-Italic f +(expression) 1050 3322 w +9 /LucidaTypewriter f +(/) 1514 3322 w +9 /LucidaSans-Italic f +(command) 1644 3322 w +10 /LucidaSansUnicode00 f +(runs) 720 3502 w +(the) 973 3502 w +(command) 1165 3502 w +(in) 1680 3502 w +(all) 1808 3502 w +(files) 1958 3502 w +(whose) 2197 3502 w +(menu) 2541 3502 w +(lines) 2851 3502 w +(match) 3116 3502 w +(the) 3452 3502 w +(expression.) 3645 3502 w +(The) 4278 3502 w +(best) 4497 3502 w +(exam\255) 4742 3502 w +(ple is) 720 3622 w +9 /LucidaTypewriter f +(X/'/) 920 3792 w +(w) 1245 3792 w +10 /LucidaSansUnicode00 f +(which) 720 3972 w +(writes) 1039 3972 w +(to) 1368 3972 w +(disc) 1504 3972 w +(all) 1737 3972 w +(modified) 1889 3972 w +(files.) 2359 3972 w +10 /LucidaTypewriter f +(Y) 2664 3972 w +10 /LucidaSansUnicode00 f +(is) 2775 3972 w +(the) 2894 3972 w +(complement) 3088 3972 w +(of) 3728 3972 w +10 /LucidaTypewriter f +(X) 3865 3972 w +10 /LucidaSansUnicode00 f +(:) 3937 3972 w +(it) 4008 3972 w +(runs) 4113 3972 w +(the) 4368 3972 w +(command) 4562 3972 w +(on all files whose menu lines don) 720 4092 w +10 /LucidaSansUnicode20 f +(\031) 2343 4092 w +10 /LucidaSansUnicode00 f +(t match the expression:) 2375 4092 w +9 /LucidaTypewriter f +(Y/\\.c/) 920 4262 w +(D) 1375 4262 w +10 /LucidaSansUnicode00 f +(deletes) 720 4442 w +(all) 1103 4442 w +(files) 1251 4442 w +(that) 1488 4442 w +(don) 1714 4442 w +10 /LucidaSansUnicode20 f +(\031) 1900 4442 w +10 /LucidaSansUnicode00 f +(t) 1932 4442 w +(have) 2004 4442 w +10 /LucidaTypewriter f +(.c) 2264 4442 w +10 /LucidaSansUnicode00 f +(in) 2443 4442 w +(their) 2569 4442 w +(names,) 2829 4442 w +(that) 3213 4442 w +(is,) 3440 4442 w +(it) 3588 4442 w +(keeps) 3690 4442 w +(all) 4010 4442 w +(C) 4159 4442 w +(source) 4264 4442 w +(files) 4622 4442 w +(and) 4860 4442 w +(deletes the rest.) 720 4562 w +(Braces allow commands to be grouped, so) 970 4718 w +9 /LucidaTypewriter f +({) 920 4888 w +9 /LucidaSans-Italic f +(command1) 1440 4998 w +(command2) 1440 5108 w +9 /LucidaTypewriter f +(}) 920 5218 w +10 /LucidaSansUnicode00 f +(is syntactically a single command that runs two commands.) 720 5398 w +(Thus,) 3675 5398 w +9 /LucidaTypewriter f +(X/\\.c/) 920 5568 w +(,g/variable/) 1375 5568 w +({) 2220 5568 w +(f) 1440 5678 w +(,) 1440 5788 w +(x/.*\\n/) 1570 5788 w +(g/variable/) 2090 5788 w +(p) 2870 5788 w +(}) 920 5898 w +10 /LucidaSansUnicode00 f +(finds) 720 6078 w +(all) 999 6078 w +(occurrences) 1149 6078 w +(of) 1769 6078 w +10 /LucidaTypewriter f +(variable) 1904 6078 w +10 /LucidaSansUnicode00 f +(in) 2518 6078 w +(C) 2647 6078 w +(source) 2754 6078 w +(files,) 3114 6078 w +(and) 3386 6078 w +(prints) 3604 6078 w +(out) 3925 6078 w +(the) 4123 6078 w +(file) 4316 6078 w +(names) 4505 6078 w +(and) 4860 6078 w +(lines) 720 6198 w +(of) 983 6198 w +(each) 1117 6198 w +(match.) 1377 6198 w +(The) 1775 6198 w +(precise) 1992 6198 w +(semantics) 2375 6198 w +(of) 2896 6198 w +(compound) 3030 6198 w +(operations) 3581 6198 w +(is) 4132 6198 w +(discussed) 4247 6198 w +(in) 4759 6198 w +(the) 4885 6198 w +(implementation sections below.) 720 6318 w +(Finally,) 970 6474 w +(the) 1363 6474 w +(undo) 1569 6474 w +(command,) 1868 6474 w +10 /LucidaTypewriter f +(u) 2429 6474 w +10 /LucidaSansUnicode00 f +(,) 2501 6474 w +(undoes) 2584 6474 w +(the) 2990 6474 w +(last) 3196 6474 w +(command,) 3419 6474 w +(no) 3980 6474 w +(matter) 4155 6474 w +(how) 4526 6474 w +(many) 4778 6474 w +(files were affected.) 720 6594 w +(Multiple undo operations move further back in time, so) 1704 6594 w +9 /LucidaTypewriter f +(u) 920 6764 w +(u) 920 6874 w +10 /LucidaSansUnicode00 f +(\(which) 720 7054 w +(may) 1079 7054 w +(be) 1324 7054 w +(abbreviated) 1488 7054 w +10 /LucidaTypewriter f +(u2) 2103 7054 w +10 /LucidaSansUnicode00 f +(\)) 2247 7054 w +(undoes) 2325 7054 w +(the) 2725 7054 w +(last) 2925 7054 w +(two) 3142 7054 w +(commands.) 3362 7054 w +(An) 4000 7054 w +(undo) 4176 7054 w +(may) 4469 7054 w +(not) 4715 7054 w +(be) 4921 7054 w +(undone,) 720 7174 w +(however,) 1161 7174 w +(nor) 1641 7174 w +(may) 1848 7174 w +(any) 2091 7174 w +(command) 2303 7174 w +(that) 2824 7174 w +(adds) 3058 7174 w +(or) 3333 7174 w +(deletes) 3478 7174 w +(files.) 3869 7174 w +(Everything) 4177 7174 w +(else) 4726 7174 w +(is) 4960 7174 w +(undoable, though, including for example) 720 7294 w +10 /LucidaTypewriter f +(e) 2742 7294 w +10 /LucidaSansUnicode00 f +(commands:) 2846 7294 w +cleartomark +showpage +saveobj restore +%%EndPage: 11 11 +%%Page: 12 12 +/saveobj save def +mark +12 pagesetup +10 /LucidaSansUnicode00 f +(\255 12 \255) 2752 480 w +9 /LucidaTypewriter f +(e) 920 830 w +(filename) 1050 830 w +(u) 920 940 w +10 /LucidaSansUnicode00 f +(restores) 720 1120 w +(the) 1171 1120 w +(state) 1383 1120 w +(of) 1676 1120 w +(the) 1831 1120 w +(file) 2043 1120 w +(completely,) 2251 1120 w +(including) 2867 1120 w +(its) 3373 1120 w +(name,) 3547 1120 w +(dot,) 3902 1120 w +(and) 4152 1120 w +(modified) 4390 1120 w +(bit.) 4879 1120 w +(Because) 720 1240 w +(of) 1160 1240 w +(the) 1309 1240 w +(undo,) 1515 1240 w +(potentially) 1846 1240 w +(dangerous) 2407 1240 w +(commands) 2970 1240 w +(are) 3549 1240 w +(not) 3751 1240 w +(guarded) 3961 1240 w +(by) 4413 1240 w +(confirma\255) 4578 1240 w +(tions.) 720 1360 w +(Only) 1066 1360 w +10 /LucidaTypewriter f +(D) 1329 1360 w +10 /LucidaSansUnicode00 f +(,) 1401 1360 w +(which) 1475 1360 w +(destroys) 1798 1360 w +(the) 2253 1360 w +(information) 2451 1360 w +(necessary) 3061 1360 w +(to) 3579 1360 w +(restore) 3720 1360 w +(itself,) 4106 1360 w +(is) 4420 1360 w +(protected.) 4543 1360 w +(It) 720 1480 w +(will) 821 1480 w +(not) 1020 1480 w +(delete) 1215 1480 w +(a) 1546 1480 w +(modified) 1635 1480 w +(file,) 2100 1480 w +(but) 2317 1480 w +(a) 2513 1480 w +(second) 2602 1480 w +10 /LucidaTypewriter f +(D) 2980 1480 w +10 /LucidaSansUnicode00 f +(of) 3086 1480 w +(the) 3218 1480 w +(same) 3407 1480 w +(file) 3696 1480 w +(will) 3881 1480 w +(succeed) 4079 1480 w +(regardless.) 4503 1480 w +(The) 720 1600 w +10 /LucidaTypewriter f +(q) 933 1600 w +10 /LucidaSansUnicode00 f +(command, which exits) 1037 1600 w +10 /LucidaTypewriter f +(sam) 2158 1600 w +10 /LucidaSansUnicode00 f +(, is similarly guarded.) 2374 1600 w +10 /LucidaSans-Demi f +(Mouse Interface) 720 1840 w +10 /LucidaTypewriter f +(Sam) 720 1996 w +10 /LucidaSansUnicode00 f +(is) 984 1996 w +(most) 1112 1996 w +(commonly) 1402 1996 w +(run) 1953 1996 w +(connected) 2167 1996 w +(to) 2715 1996 w +(a) 2862 1996 w +(bitmap) 2966 1996 w +(display) 3355 1996 w +(and) 3746 1996 w +(mouse) 3975 1996 w +(for) 4347 1996 w +(interactive) 4535 1996 w +(editing.) 720 2116 w +(The) 1163 2116 w +(only) 1385 2116 w +(difference) 1630 2116 w +(in) 2159 2116 w +(the) 2291 2116 w +(command) 2487 2116 w +(language) 3006 2116 w +(between) 3490 2116 w +(regular,) 3938 2116 w +(mouse-driven) 4356 2116 w +10 /LucidaTypewriter f +(sam) 720 2236 w +10 /LucidaSansUnicode00 f +(and) 980 2236 w +10 /LucidaTypewriter f +(sam -d) 1204 2236 w +10 /LucidaSansUnicode00 f +(is) 1680 2236 w +(that) 1804 2236 w +(if) 2039 2236 w +(an) 2149 2236 w +(address) 2311 2236 w +(is) 2736 2236 w +(provided) 2861 2236 w +(without) 3334 2236 w +(a) 3744 2236 w +(command,) 3844 2236 w +10 /LucidaTypewriter f +(sam -d) 4399 2236 w +10 /LucidaSansUnicode00 f +(will) 4876 2236 w +(print) 720 2356 w +(the) 990 2356 w +(text) 1183 2356 w +(referenced) 1412 2356 w +(by) 1968 2356 w +(the) 2120 2356 w +(address,) 2312 2356 w +(but) 2761 2356 w +(regular) 2960 2356 w +10 /LucidaTypewriter f +(sam) 3343 2356 w +10 /LucidaSansUnicode00 f +(will) 3596 2356 w +(highlight) 3797 2356 w +(it) 4268 2356 w +(on) 4371 2356 w +(the) 4531 2356 w +(screen) 4723 2356 w +10 /LucidaSansUnicode20 f +(\024) 720 2476 w +10 /LucidaSansUnicode00 f +(in fact, dot is always highlighted \(see Figure 2\).) 852 2476 w +cleartomark +saveobj restore +%ps_include: begin +save +/ed {exch def} def +{} /showpage ed +{} /copypage ed +{} /erasepage ed +{} /letter ed +currentdict /findfont known systemdict /findfont known and { + /findfont systemdict /findfont get def +} if +36 dict dup /PS-include-dict-dw ed begin +/context ed +count array astore /o-stack ed +%ps_include: variables begin +/llx 80 def +/lly 322 def +/urx 531.44 def +/ury 468.88 def +/w 0 def +/o 0 def +/s 0 def +/cx 2880 def +/cy -3450 def +/sx 4320 def +/sy 1468 def +/ax .5 def +/ay .5 def +/rot 0 def +%ps_include: variables end +{llx lly urx ury} /bbox ed +{newpath 2 index exch 2 index exch dup 6 index exch + moveto 3 {lineto} repeat closepath} /boxpath ed +{dup mul exch dup mul add sqrt} /len ed +{2 copy gt {exch} if pop} /min ed +{2 copy lt {exch} if pop} /max ed +{transform round exch round exch A itransform} /nice ed +{6 array} /n ed +n defaultmatrix n currentmatrix n invertmatrix n concatmatrix /A ed +urx llx sub 0 A dtransform len /Sx ed +0 ury lly sub A dtransform len /Sy ed +llx urx add 2 div lly ury add 2 div A transform /Cy ed /Cx ed +rot dup sin abs /S ed cos abs /C ed +Sx S mul Sy C mul add /H ed +Sx C mul Sy S mul add /W ed +sy H div /Scaley ed +sx W div /Scalex ed +s 0 eq {Scalex Scaley min dup /Scalex ed /Scaley ed} if +sx Scalex W mul sub 0 max ax 0.5 sub mul cx add /cx ed +sy Scaley H mul sub 0 max ay 0.5 sub mul cy add /cy ed +urx llx sub 0 A dtransform exch atan rot exch sub /rot ed +n currentmatrix initgraphics setmatrix +cx cy translate +Scalex Scaley scale +rot rotate +Cx neg Cy neg translate +A concat +bbox boxpath clip newpath +w 0 ne {gsave bbox boxpath 1 setgray fill grestore} if +end +gsave +%ps_include: inclusion begin + %!PS +/picstr 79 string def +80 322 translate +451.44 146.88 scale + +627 204 1 [627 0 0 -204 0 204] +{currentfile picstr readhexstring pop} image + +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +fe00000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe00000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe00000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff3fffffff3cffffffffffffffffffffdfe7f3bff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff3fffefff3cffffffff07ffffffffff3fe7f3cff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff3fffe7ff3fffffffff33fffffffffe7fe7f3e7f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff27fff3f820fc1f0fff39c3c9f8723e7f0783e7e +3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff13fff9f33cf9ce66033999c4f3311cfe6733f3e +3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff39fffce73cf9fce603393cce67339cfce673f3e +3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff3980fc673cf8fcffff393cce67339cfce673f3f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2ffdfffffffffffffffffff3980fce73cfc1cffff393cce60339cfce673f3f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2ffdfffffffffffffffffff39fff9e73cff8cfe03393cce67f39cfce673f3f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2ffdfffffffffffffffffff39fff3e73cffccfe03393cce67f39cfce673f3e +3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2ffdfffffffffffffffffff33ffe7f23cf9ce67ff3399ccf3339cfe4723f3e +3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2ffdfffffffffffffffffff07ffeff9201c1f0fff07c3c1f8739e7f2793e7e +3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2ffdfffffffffffffffffffffffffffffffffffffffffcffffffe7fffffe7f +3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2ffdfffffffffffffffffffffffffffffffffffffffffcfffffff3fffffcff +3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2ffdfffffffffffffffffffffffffffffffffffffffffcfffffffdfffffbfe +7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2ffdffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2ffdffffffffffffffffffffffffff9fffe7ffff7ff9ffffffffffffe7fffd +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffffff7fff9fffe7fbfcf0f9ffff7fffffffe7fffe +7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffffffe7ffffffffff3f9e679ffff3fffffffe7ffff +3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff8380c641f2307c079e6793fff9fc3c1f0e47c3f +3f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff39e7e079f11e7f3f3e6f89fffcf999ce662399f +9f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff3fe7e679f39e7f3f3f1f9cfffe739fcce67339f +9f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff1fe7e7f9f39e7f3f3f499cc07e33ffccfe7339f +9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff83e7e7f9f39e7f3f3e4b9cc07e73fc0cfe7301f +9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889ffffffffffffffffffff1e7e7f9f39e7f3f3e679cfffcf3f9ccfe733ff +9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffff9e7e7f9f39e7f3f3e679cfff9f3f9ccfe733ff +9f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff39e7e7f9f39e7f3f3e2399fff3f9998e667399f +9f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff83f0c1c033900f879f1183fff7fc3c4f0e73c3f +3f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffffffffffffffffffff9ffffffffffffffffffffff +3f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffffffffffffffffffffcfffffffffffffffffffffe +7f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889ffffffffffffffffffffffffffffffffffff7ffffffffffffffffffffd +ff3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889ffffffffffffffffffffffffffffffffffe7ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffffffffbfffffffffe7ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889ffffffffffffffffffffffff3fffffffffe7ffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff19e1c06731991ffe4fc7fffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff81ccf3e738188ffe27c7fffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff999cf3e73999cffe73c7fffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff9f9cf3e739f9cffe73fffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff9f80f3e739f9cffe73fffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff9f9ff3e739f9cffe73fffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff9f9ff3e739f9cffe73c7fffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff9fccf3e239f9cffe67c7fffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff07e1f8713079cffe0fc7fffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffffffffffffffffffffffe7fffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffffffffffffffffffffffe7fffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffffffffffffffffffffffcffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fc7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fe3fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffff83ffffffffee7fbffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221f03fff3ffffffff9e7fcffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889f39fff3ffffffff3e7fe7fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221f39e1f3f0f83e1f3e4fe7fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889f39ccf3e6739cce7e27f3fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221f3b9cf3cf33f9ce7e73f3fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889f079ff3cf31f9ce7e73f3fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221f3b9ff3cf38380e7e73f3fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889f399ff3cf3f19fe7e73f3fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221f399ff3cf3f99fe7e73f3fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889f39ccf3e6739cce7e67f3fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221f03e18070f83e1f3e0fe7fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffff3fffe7fffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffff9fffcffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffefffbffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889ffffffffffffffffffffffffff9fffffffffffffffffc3e1fffffffff9 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffffffffff9ffff7fffffff81fff9fcffffffffff9 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889ffffffffffffffffffffffffffffffe7fffffff9cfff9fcffffffffff9 +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff19e1f041f8380f0e33ff9cce60301e1c67ffef9 +3f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff81cce679f39e7e6703ff9cce79fcfcce07ffab8 +9f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff999cce79f3fe7ce733ff9dce79fcf9ce67ffc79 +cf1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff9f9cce79f1fe7ce73fff83ce79fcf9ce7fff119 +cfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff9f80ce79f83e7c073fff9dce79fcf80e7fffc79 +cfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff9f9fce79ff1e7cff3fff9cce79fcf9fe7fffab9 +cfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff9f9fce79ff9e7cff3fff9cce79fcf9fe7fffef9 +cf1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffff9fcce479f39e7e673fff9cc479fcfcce7fffff9 +9f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffff07e1f240383f0f0e0fff81e260703e1c1fffff8 +3f1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889ffffffffffffffffffffffffe7ffffffffffffffffffffffffffffffff +ff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fffffffffffffffffffffffce7ffffffffffffffffffffffffffffffff +ff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fffffffffffffffffffffffe0fffffffffffffffffffffffffffffffff +ff3fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fe3fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fe3fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffc000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889ffffffffffffffffffc00007c000000001180000001860000010000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221ffffffffffffffffffcf8000c00000000618000200186000000c000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889ffffffffffffffffffccc000c00000000c180003001800000006000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221ffffffffffffffffffcc61e0c0f07c1e0c1b000180fbe07c1e06070000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889ffffffffffffffffffcc6330c198c633181d8000c19860c63303070000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221ffffffffffffffffffcc6630c30cc0631818c000631860c06303070000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889ffffffffffffffffffcc6600c30ce0631818cfe0731860e06003000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221ffffffffffffffffffcc6600c30c7c7f1818cfe06318607c6003000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889ffffffffffffffffffcc6600c30c0e601818c000c318600e6003000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221ffffffffffffffffffcc6600c30c06601818c001831860066003070000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889ffffffffffffffffffccc330c198c6331819800301b860c63303070000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221ffffffffffffffffffcf81e7f8f07c1e0c1f000200dbfc7c1e06070000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889ffffffffffffffffffc00000000000000c000000000000000006030000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221ffffffffffffffffffc00000000000000600000000000000000c030000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889ffffffffffffffffffc000000000000001000000000000000010060000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221c000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889c000000000000000000000000001f00000000040030000000000000c00 +0100000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221c000000000000000000000800000300000000187830000400000000c00 +00c0000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889c00000000000000000000180000030000000030cc30000600000000c00 +0060000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221c0000000000000000007c7f39878303c1f07830cc36000301e1f078dc1 +e060700000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889c000000000000000000c6181f8cc3066318cc60c83b0001833318ccee3 +3030700000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221c000000000000000000c0181998c30c33018c6070318000c630198cc66 +3030700000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889c000000000000000000e0181818030c33818c605b319fc0e6001980c66 +3030000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221c0000000000000000007c181818030c31f1fc60da319fc0c601f980c67 +f030000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889c0000000000000000000e181818030c30398060cc31800186031980c66 +0030000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221c00000000000000000006181818030c30198060cc31800306031980c66 +0030700000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889c000000000000000000c618180cc3066318cc60ee330006033338ccc63 +3030700000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221c0000000000000000007c0f3e079fe3c1f07830773e000401e1d878c61 +e060700000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889c000000000000000000000000000000000000300000000000000000000 +0060300000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221c000000000000000000000000000000000000180000000000000000000 +00c0300000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2889c000000000000000000000000000000000000040000000000000000000 +0100600000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe2221c00000000000000000000000000000000000000000000000000000001f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889c0000000000000000001e0000000040200000c0000000000203008001f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221c000000000000000000300000000180c00000c0000000000183006001f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889c000000000000000000300000000301800000c00000000000c3003001f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221c000000000000000000fe730f078301831878dc3e39800100c3603039f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889c000000000000000000303f198cc6030318ccee631f80054063b01839f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221c00000000000000000030333198c60303198cc6031980038063181839f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889c00000000000000000030303198c603031980c60318000ee063181801f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221c00000000000000000030303f9fc603031980c63f1800038063181801f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889c000000000000000000303030180603031980c6631800054063181801f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221c000000000000000000303030180603031980c6631800010063181839f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889c0000000000000000003030198cc60303b8ccc6671800000063301839f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221c000000000000000000fc7c0f07830181d878c63b3e000000c3e03039f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889c000000000000000000000000000301800000000000000000c0003019f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221c000000000000000000000000000180c0000000000000000180006019f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889c00000000000000000000000000004020000000000000000200008031f +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fc7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fe3fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fcffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889f8ffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2889ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2221ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe2001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffffffffffe3fff +fe00000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe00000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +fe00000000000000000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000003fff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffff +showpage + %%BoundingBox: 80 322 531.44 468.88 +%ps_include: inclusion end +grestore +PS-include-dict-dw begin +o 0 ne {gsave A defaultmatrix /A ed llx lly nice urx ury nice + initgraphics 0.1 setlinewidth boxpath stroke grestore} if +clear o-stack aload pop +context end restore +%ps_include: end +/saveobj save def +mark +8 /LucidaSans-Italic f +(Figure) 720 4284 w +(2.) 992 4284 w +(A) 1095 4284 w +8 /LucidaTypewriter f +(sam) 1177 4284 w +8 /LucidaSans-Italic f +(window.) 1378 4284 w +(The) 1749 4284 w +(scroll) 1918 4284 w +(bar) 2154 4284 w +(down) 2317 4284 w +(the) 2551 4284 w +(left) 2700 4284 w +(represents) 2852 4284 w +(the) 3288 4284 w +(file,) 3437 4284 w +(with) 3608 4284 w +(the) 3800 4284 w +(bubble) 3949 4284 w +(showing) 4238 4284 w +(the) 4584 4284 w +(fraction) 4734 4284 w +(visible) 720 4384 w +(in) 990 4384 w +(the) 1091 4384 w +(window.) 1241 4384 w +(The) 1613 4384 w +(scroll) 1783 4384 w +(bar) 2020 4384 w +(may) 2184 4384 w +(be) 2379 4384 w +(manipulated) 2498 4384 w +(by) 3014 4384 w +(the) 3135 4384 w +(mouse) 3285 4384 w +(for) 3564 4384 w +(convenient) 3705 4384 w +(browsing.) 4148 4384 w +(The) 4583 4384 w +(current) 4752 4384 w +(text,) 720 4484 w +(which) 925 4484 w +(is) 1184 4484 w +(highlighted,) 1280 4484 w +(need) 1778 4484 w +(not) 1996 4484 w +(fit) 2157 4484 w +(on) 2275 4484 w +(a) 2406 4484 w +(line.) 2490 4484 w +(Here) 2715 4484 w +(it) 2931 4484 w +(consists) 3019 4484 w +(of) 3360 4484 w +(one) 3471 4484 w +(partial) 3644 4484 w +(line,) 3940 4484 w +(one) 4139 4484 w +(complete) 4312 4484 w +(line,) 4693 4484 w +(and) 4892 4484 w +(final) 720 4584 w +(partial) 921 4584 w +(line.) 1208 4584 w +10 /LucidaSansUnicode00 f +(Each) 970 4860 w +(file) 1234 4860 w +(may) 1427 4860 w +(have) 1669 4860 w +(zero) 1936 4860 w +(or) 2193 4860 w +(more) 2337 4860 w +(windows) 2630 4860 w +(open) 3092 4860 w +(on) 3376 4860 w +(the) 3541 4860 w +(display.) 3738 4860 w +(At) 4186 4860 w +(any) 4334 4860 w +(time,) 4546 4860 w +(only) 4836 4860 w +(one) 720 4980 w +(window) 933 4980 w +(in) 1336 4980 w +(all) 1461 4980 w +(of) 1608 4980 w +10 /LucidaTypewriter f +(sam) 1740 4980 w +10 /LucidaSansUnicode00 f +(is) 1990 4980 w +(the) 2104 4980 w +10 /LucidaSans-Italic f +(current) 2293 4980 w +(window,) 2688 4980 w +10 /LucidaSansUnicode00 f +(that) 3118 4980 w +(is,) 3342 4980 w +(the) 3487 4980 w +(window) 3675 4980 w +(to) 4077 4980 w +(which) 4208 4980 w +(typing) 4522 4980 w +(and) 4860 4980 w +(mouse) 720 5100 w +(actions) 1093 5100 w +(refer;) 1489 5100 w +(this) 1802 5100 w +(may) 2031 5100 w +(be) 2281 5100 w +(the) 2450 5100 w +10 /LucidaTypewriter f +(sam) 2655 5100 w +10 /LucidaSansUnicode00 f +(window) 2921 5100 w +(\(that) 3341 5100 w +(in) 3616 5100 w +(which) 3758 5100 w +(commands) 4090 5100 w +(may) 4670 5100 w +(be) 4921 5100 w +(typed\)) 720 5220 w +(or) 1065 5220 w +(one) 1208 5220 w +(of) 1428 5220 w +(the) 1567 5220 w +(file) 1763 5220 w +(windows.) 1955 5220 w +(When) 2480 5220 w +(a) 2787 5220 w +(file) 2883 5220 w +(has) 3075 5220 w +(multiple) 3284 5220 w +(windows,) 3723 5220 w +(the) 4216 5220 w +(image) 4412 5220 w +(of) 4747 5220 w +(the) 4885 5220 w +(file) 720 5340 w +(in) 905 5340 w +(each) 1030 5340 w +(window) 1288 5340 w +(is) 1692 5340 w +(always) 1807 5340 w +(kept) 2161 5340 w +(up) 2410 5340 w +(to) 2570 5340 w +(date.) 2703 5340 w +(The) 3013 5340 w +(current) 3229 5340 w +(file) 3614 5340 w +(is) 3800 5340 w +(the) 3915 5340 w +(last) 4105 5340 w +(file) 4312 5340 w +(affected) 4498 5340 w +(by) 4925 5340 w +(a) 720 5460 w +(command,) 808 5460 w +(so) 1351 5460 w +(if) 1496 5460 w +(the) 1595 5460 w +10 /LucidaTypewriter f +(sam) 1783 5460 w +10 /LucidaSansUnicode00 f +(window) 2032 5460 w +(is) 2434 5460 w +(current,) 2547 5460 w +(the) 2962 5460 w +(current) 3150 5460 w +(window) 3533 5460 w +(is) 3935 5460 w +(not) 4048 5460 w +(a) 4241 5460 w +(window on the) 4329 5460 w +(current) 720 5580 w +(file.) 1131 5580 w +(However,) 1407 5580 w +(each) 1917 5580 w +(window) 2202 5580 w +(on) 2632 5580 w +(a) 2816 5580 w +(file) 2932 5580 w +(has) 3144 5580 w +(its) 3373 5580 w +(own) 3551 5580 w +(value) 3812 5580 w +(of) 4127 5580 w +(dot,) 4286 5580 w +(and) 4541 5580 w +(when) 4783 5580 w +(switching) 720 5700 w +(between) 1218 5700 w +(windows) 1663 5700 w +(on) 2121 5700 w +(a) 2282 5700 w +(single) 2375 5700 w +(file,) 2702 5700 w +(the) 2923 5700 w +(file) 3116 5700 w +10 /LucidaSansUnicode20 f +(\031) 3267 5700 w +10 /LucidaSansUnicode00 f +(s) 3299 5700 w +(value) 3388 5700 w +(of) 3680 5700 w +(dot) 3816 5700 w +(is) 4014 5700 w +(changed) 4131 5700 w +(to) 4579 5700 w +(that) 4714 5700 w +(of) 4942 5700 w +(the window.) 720 5820 w +(Thus, flipping between windows behaves in the obvious, convenient way.) 1372 5820 w +(The mouse on the Blit has three buttons, numbered left to right.) 970 5976 w +(Button 3 has a) 4162 5976 w +(list) 4894 5976 w +(of) 720 6096 w +(commands) 877 6096 w +(to) 1465 6096 w +(manipulate) 1622 6096 w +(windows,) 2222 6096 w +(followed) 2733 6096 w +(by) 3205 6096 w +(a) 3379 6096 w +(list) 3493 6096 w +(of) 3698 6096 w +10 /LucidaSansUnicode20 f +(\030) 3855 6096 w +10 /LucidaSansUnicode00 f +(menu) 3887 6096 w +(lines) 4218 6096 w +10 /LucidaSansUnicode20 f +(\031) 4445 6096 w +10 /LucidaSansUnicode00 f +(exactly) 4535 6096 w +(as) 4934 6096 w +(printed) 720 6216 w +(by) 1116 6216 w +(the) 1277 6216 w +10 /LucidaTypewriter f +(f) 1478 6216 w +10 /LucidaSansUnicode00 f +(command,) 1596 6216 w +(one) 2152 6216 w +(per) 2377 6216 w +(file) 2583 6216 w +(\(not) 2780 6216 w +(one) 3019 6216 w +(per) 3244 6216 w +(window\).) 3450 6216 w +(These) 3962 6216 w +(menu) 4296 6216 w +(lines) 4615 6216 w +(are) 4888 6216 w +(sorted) 720 6336 w +(by) 1063 6336 w +(file) 1212 6336 w +(name.) 1397 6336 w +(If) 1761 6336 w +(the) 1861 6336 w +(list) 2050 6336 w +(is) 2229 6336 w +(long,) 2342 6336 w +(the) 2621 6336 w +(Blit) 2809 6336 w +(menu) 2995 6336 w +(software) 3301 6336 w +(will) 3749 6336 w +(make) 3946 6336 w +(it) 4241 6336 w +(more) 4340 6336 w +(manage\255) 4624 6336 w +(able) 720 6456 w +(by) 957 6456 w +(generating) 1106 6456 w +(a) 1662 6456 w +(scrolling) 1751 6456 w +(menu) 2200 6456 w +(instead) 2507 6456 w +(of) 2894 6456 w +(an) 3026 6456 w +(unwieldy) 3177 6456 w +(long) 3642 6456 w +(list.) 3891 6456 w +(Using) 4136 6456 w +(the) 4444 6456 w +(menu) 4634 6456 w +(to) 4942 6456 w +(select) 720 6576 w +(a) 1041 6576 w +(file) 1137 6576 w +(from) 1329 6576 w +(the) 1602 6576 w +(list) 1798 6576 w +(makes) 1985 6576 w +(that) 2339 6576 w +(file) 2570 6576 w +(the) 2761 6576 w +(current) 2956 6576 w +(file,) 3346 6576 w +(and) 3569 6576 w +(the) 3789 6576 w +(most) 3984 6576 w +(recently) 4266 6576 w +(current) 4690 6576 w +(window) 720 6696 w +(in) 1127 6696 w +(that) 1256 6696 w +(file) 1485 6696 w +(the) 1674 6696 w +(current) 1867 6696 w +(window.) 2255 6696 w +(But) 2726 6696 w +(if) 2921 6696 w +(that) 3025 6696 w +(file) 3254 6696 w +(is) 3443 6696 w +(already) 3561 6696 w +(current,) 3951 6696 w +(selecting) 4372 6696 w +(it) 4844 6696 w +(in) 4949 6696 w +(the) 720 6816 w +(menu) 908 6816 w +(cycles) 1214 6816 w +(through) 1537 6816 w +(the) 1957 6816 w +(windows) 2145 6816 w +(on) 2598 6816 w +(the) 2754 6816 w +(file;) 2942 6816 w +(this) 3158 6816 w +(simple trick avoids a special menu) 3370 6816 w +(to) 720 6936 w +(choose) 859 6936 w +(windows) 1242 6936 w +(on) 1703 6936 w +(a) 1867 6936 w +(file.) 1963 6936 w +(If) 2219 6936 w +(there) 2326 6936 w +(is) 2619 6936 w +(no) 2740 6936 w +(window) 2904 6936 w +(open) 3315 6936 w +(on) 3599 6936 w +(the) 3764 6936 w +(file,) 3961 6936 w +10 /LucidaTypewriter f +(sam) 4186 6936 w +10 /LucidaSansUnicode00 f +(changes) 4444 6936 w +(the) 4885 6936 w +(mouse cursor to prompt the user to create one.) 720 7056 w +cleartomark +showpage +saveobj restore +%%EndPage: 12 12 +%%Page: 13 13 +/saveobj save def +mark +13 pagesetup +10 /LucidaSansUnicode00 f +(\255 13 \255) 2752 480 w +(The) 970 840 w +(commands) 1194 840 w +(on) 1766 840 w +(the) 1932 840 w +(button) 2130 840 w +(3) 2495 840 w +(menu) 2601 840 w +(are) 2917 840 w +(straightforward) 3112 840 w +(\(see) 3904 840 w +(Figure) 4144 840 w +(3\),) 4492 840 w +(and) 4664 840 w +(are) 4888 840 w +(like) 720 960 w +(the) 946 960 w +(commands) 1155 960 w +(to) 1738 960 w +(manipulate) 1890 960 w +(windows) 2485 960 w +(in) 2959 960 w +10 /LucidaTypewriter f +(mux) 3104 960 w +10 /LucidaSansUnicode00 f +(,) 3320 960 w +6 /LucidaSansUnicode00 f +(8) 3352 910 w +10 /LucidaSansUnicode00 f +(the) 3444 960 w +(Blit) 3653 960 w +10 /LucidaSansUnicode20 f +(\031) 3806 960 w +10 /LucidaSansUnicode00 f +(s) 3838 960 w +(window) 3943 960 w +(system.) 4366 960 w +10 /LucidaTypewriter f +(New) 4824 960 w +10 /LucidaSansUnicode00 f +(makes) 720 1080 w +(a) 1067 1080 w +(new) 1156 1080 w +(file,) 1385 1080 w +(and) 1602 1080 w +(gives) 1817 1080 w +(it) 2102 1080 w +(one) 2203 1080 w +(empty) 2417 1080 w +(window,) 2753 1080 w +(whose) 3189 1080 w +(size) 3531 1080 w +(is) 3759 1080 w +(determined) 3874 1080 w +(by) 4465 1080 w +(a) 4615 1080 w +(rectan\255) 4705 1080 w +(gle) 720 1200 w +(swept) 914 1200 w +(by) 1245 1200 w +(the) 1407 1200 w +(mouse.) 1609 1200 w +10 /LucidaTypewriter f +(Zerox) 2043 1200 w +10 /LucidaSansUnicode00 f +(prompts) 2450 1200 w +(for) 2906 1200 w +(a) 3092 1200 w +(window) 3194 1200 w +(to) 3610 1200 w +(be) 3755 1200 w +(selected,) 3921 1200 w +(and) 4399 1200 w +(makes) 4626 1200 w +(a) 4985 1200 w +(clone) 720 1320 w +(of) 1019 1320 w +(that) 1157 1320 w +(window;) 1388 1320 w +(this) 1829 1320 w +(is) 2048 1320 w +(how) 2168 1320 w +(multiple) 2408 1320 w +(windows) 2846 1320 w +(are) 3306 1320 w +(created) 3498 1320 w +(on) 3897 1320 w +(one) 4060 1320 w +(file.) 4280 1320 w +10 /LucidaTypewriter f +(Reshape) 4536 1320 w +10 /LucidaSansUnicode00 f +(changes) 720 1440 w +(the) 1156 1440 w +(size) 1348 1440 w +(of) 1578 1440 w +(the) 1713 1440 w +(indicated) 1905 1440 w +(window,) 2387 1440 w +(and) 2825 1440 w +10 /LucidaTypewriter f +(close) 3042 1440 w +10 /LucidaSansUnicode00 f +(deletes) 3439 1440 w +(it.) 3824 1440 w +(If) 3991 1440 w +(that) 4094 1440 w +(is) 4322 1440 w +(the) 4439 1440 w +(last) 4631 1440 w +(win\255) 4839 1440 w +(dow) 720 1560 w +(open) 955 1560 w +(on) 1231 1560 w +(the) 1388 1560 w +(file,) 1577 1560 w +10 /LucidaTypewriter f +(close) 1794 1560 w +10 /LucidaSansUnicode00 f +(first) 2188 1560 w +(does) 2417 1560 w +(a) 2682 1560 w +10 /LucidaTypewriter f +(D) 2771 1560 w +10 /LucidaSansUnicode00 f +(command) 2877 1560 w +(on) 3389 1560 w +(the) 3546 1560 w +(file.) 3736 1560 w +10 /LucidaTypewriter f +(Write) 3986 1560 w +10 /LucidaSansUnicode00 f +(is) 4381 1560 w +(identical) 4496 1560 w +(to) 4942 1560 w +(a) 720 1680 w +10 /LucidaTypewriter f +(w) 810 1680 w +10 /LucidaSansUnicode00 f +(command) 917 1680 w +(on) 1430 1680 w +(the) 1588 1680 w +(file;) 1778 1680 w +(it) 1996 1680 w +(is) 2097 1680 w +(in) 2212 1680 w +(the) 2338 1680 w +(menu) 2528 1680 w +(purely) 2836 1680 w +(for) 3174 1680 w +(convenience.) 3348 1680 w +(Finally,) 4045 1680 w +10 /LucidaTypewriter f +(~~sam~~) 4422 1680 w +10 /LucidaSansUnicode00 f +(is) 4960 1680 w +(a) 720 1800 w +(menu) 832 1800 w +(item) 1162 1800 w +(that) 1434 1800 w +(appears) 1682 1800 w +(between) 2123 1800 w +(the) 2587 1800 w +(commands) 2799 1800 w +(and) 3385 1800 w +(the) 3622 1800 w +(file) 3834 1800 w +(names.) 4042 1800 w +(Selecting) 4480 1800 w +(it) 4974 1800 w +(makes) 720 1920 w +(the) 1087 1920 w +10 /LucidaTypewriter f +(sam) 1296 1920 w +10 /LucidaSansUnicode00 f +(window) 1566 1920 w +(the) 1989 1920 w +(current) 2198 1920 w +(window,) 2602 1920 w +(causing) 3057 1920 w +(subsequent) 3483 1920 w +(typing) 4100 1920 w +(to) 4459 1920 w +(be) 4610 1920 w +(inter\255) 4782 1920 w +(preted as commands.) 720 2040 w +cleartomark +saveobj restore +%ps_include: begin +save +/ed {exch def} def +{} /showpage ed +{} /copypage ed +{} /erasepage ed +{} /letter ed +currentdict /findfont known systemdict /findfont known and { + /findfont systemdict /findfont get def +} if +36 dict dup /PS-include-dict-dw ed begin +/context ed +count array astore /o-stack ed +%ps_include: variables begin +/llx 239 def +/lly 297 def +/urx 371.48 def +/ury 494.28 def +/w 0 def +/o 0 def +/s 0 def +/cx 2880 def +/cy -3266 def +/sx 4320 def +/sy 1972 def +/ax .5 def +/ay .5 def +/rot 0 def +%ps_include: variables end +{llx lly urx ury} /bbox ed +{newpath 2 index exch 2 index exch dup 6 index exch + moveto 3 {lineto} repeat closepath} /boxpath ed +{dup mul exch dup mul add sqrt} /len ed +{2 copy gt {exch} if pop} /min ed +{2 copy lt {exch} if pop} /max ed +{transform round exch round exch A itransform} /nice ed +{6 array} /n ed +n defaultmatrix n currentmatrix n invertmatrix n concatmatrix /A ed +urx llx sub 0 A dtransform len /Sx ed +0 ury lly sub A dtransform len /Sy ed +llx urx add 2 div lly ury add 2 div A transform /Cy ed /Cx ed +rot dup sin abs /S ed cos abs /C ed +Sx S mul Sy C mul add /H ed +Sx C mul Sy S mul add /W ed +sy H div /Scaley ed +sx W div /Scalex ed +s 0 eq {Scalex Scaley min dup /Scalex ed /Scaley ed} if +sx Scalex W mul sub 0 max ax 0.5 sub mul cx add /cx ed +sy Scaley H mul sub 0 max ay 0.5 sub mul cy add /cy ed +urx llx sub 0 A dtransform exch atan rot exch sub /rot ed +n currentmatrix initgraphics setmatrix +cx cy translate +Scalex Scaley scale +rot rotate +Cx neg Cy neg translate +A concat +bbox boxpath clip newpath +w 0 ne {gsave bbox boxpath 1 setgray fill grestore} if +end +gsave +%ps_include: inclusion begin + %!PS-Adobe-2.0 + %%Version: 3.3.2 + %%DocumentFonts: (atend) + %%Pages: (atend) + %%EndComments + %%EndProlog + %%BeginSetup +mark + %%Patch from lp + %%EndPatch from lp + +/picstr 23 string def +239 297 translate +132.48 197.28 scale + +184 274 1 [184 0 0 -274 0 274] +{currentfile picstr readhexstring pop} image + +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffc00000000000000000000000000000000000000fffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffe47c39cfffffffffffffefffff +ffc0000fffffffffffffe23999efffffffffffffefffff +ffc0000fffffffffffffe733992fffffffffffffefffff +ffc0000fffffffffffffe733992fffffffffffffefffff +ffc0000fffffffffffffe730192fffffffffffffefffff +ffc0000fffffffffffffe733fc9fffffffffffffefffff +ffc0000fffffffffffffe733fc9fffffffffffffefffff +ffc0000fffffffffffffe7399c9fffffffffffffefffff +ffc0000fffffffffffffe73c3c9fffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffc078719c3ce7ffffffffffefffff +ffc0000ffffffffffffe7338199ce7ffffffffffefffff +ffc0000ffffffffffffce73993ce6fffffffffffefffff +ffc0000ffffffffffff9e739f3ce1fffffffffffefffff +ffc0000ffffffffffff3e039f3cfbfffffffffffefffff +ffc0000fffffffffffe7e7f9f3cf0fffffffffffefffff +ffc0000fffffffffffcfe7f9f3cecfffffffffffefffff +ffc0000fffffffffffcff339f99ce7ffffffffffefffff +ffc0000fffffffffffc078707c3ce7ffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000ffffffffffffffff3ffffffffffffffffefffff +ffc0000ffffffffffffffff3ffffffffffffffffefffff +ffc0000ffffffffffffffff3ffffffffffffffffefffff +ffc0000fffffffff8cf0f0723c1c9f87ffffffffefffff +ffc0000fffffffffc0e6673119cc4f33ffffffffefffff +ffc0000fffffffffccce67f39fcce673ffffffffefffff +ffc0000fffffffffcfce63f39fcce673ffffffffefffff +ffc0000fffffffffcfc070739c0ce603ffffffffefffff +ffc0000fffffffffcfcffe3399cce67fffffffffefffff +ffc0000fffffffffcfcfff3399cce67fffffffffefffff +ffc0000fffffffffcfe66733998ccf33ffffffffefffff +ffc0000fffffffff83f0f0739c4c1f87ffffffffefffff +ffc0000ffffffffffffffffffffcffffffffffffefffff +ffc0000ffffffffffffffffffffcffffffffffffefffff +ffc0000ffffffffffffffffffffcffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffc1ffffffffffffffffffefffff +ffc0000ffffffffffffff9ffffffffffffffffffefffff +ffc0000ffffffffffffff9ffffffffffffffffffefffff +ffc0000ffffffffffff0f9f87c1f0fffffffffffefffff +ffc0000fffffffffffe679f339ce67ffffffffffefffff +ffc0000fffffffffffce79e799fce7ffffffffffefffff +ffc0000fffffffffffcff9e798fce7ffffffffffefffff +ffc0000fffffffffffcff9e79c1c07ffffffffffefffff +ffc0000fffffffffffcff9e79f8cffffffffffffefffff +ffc0000fffffffffffcff9e79fccffffffffffffefffff +ffc0000fffffffffffe679f339ce67ffffffffffefffff +ffc0000ffffffffffff0c0387c1f0fffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc00008000000000000000000000000000000000fffff +ffc00008000000000000000000000000000000000fffff +ffc00008000000000000000300000000000000000fffff +ffc00008000000000000000300800000000000000fffff +ffc00008000000000000000001800000000000000fffff +ffc000080000000000319cdf07f0f000000000000fffff +ffc000080000000000308fc301819800000000000fffff +ffc000080000000000368cc30183180000ff80000fffff +ffc000080000000000368c030183180000fe00000fffff +ffc000080000000000368c030183f80000f800000fffff +ffc0000800000000001b0c030183000000fc00000fffff +ffc0000800000000001b0c030183000000fe00000fffff +ffc0000800000000001b0c030181980000df00000fffff +ffc0000800000000001b1f1fe0f0f00000cf80000fffff +ffc000080000000000000000000000000087c0000fffff +ffc000080000000000000000000000000083e0000fffff +ffc0000ffffffffffffffffffffffffffffe0fffefffff +ffc0000fffffffffffffffffffffffffffff07ffefffff +ffc0000fffffffffffffffffffffffffffff83ffefffff +ffc0000fffffffffffffffffffffffffffffc1ffefffff +ffc0000fffffffffffffffffffffffffffffe0ffefffff +ffc0000ffffffffffffff07832dffffffffff1ffefffff +ffc0000fffffffffeef76733900f77bbfffffbffefffff +ffc0000fffffffffc6e367ff924e371bffffffffefffff +ffc0000fffffffff80c063ff924c0603ffffffffefffff +ffc0000fffffffffb1d8f078124d8ec7ffffffffefffff +ffc0000fffffffffbbddfe33924ddeefffffffffefffff +ffc0000fffffffffffffff33924fffffffffffffefffff +ffc0000fffffffffffffe733124fffffffffffffefffff +ffc0000ffffffffffffff078924fffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000ffffffffffffff3f9ffffffffffffffffefffff +ffc0000ffffffffffffff3f9ffffffffffffffffefffff +ffc0000ffffffffffffff3f9ffffffffffffffffefffff +ffc0000ffff9fffffe0f83c18cf0f0783fff0fffefffff +ffc0000ffff9fffffce73399c0e667339ffe67ffefffff +ffc0000ffff9ffffffe67339ccce67f3fffce7ffefffff +ffc0000fffc03fffffe67339cfce63f1fffcffffefffff +ffc0000fffc03ffffe067339cfc070783ffcffffefffff +ffc0000ffff9fffffce67339cfcffe3f1ffcffffefffff +ffc0000ffff9fc7ffce67339cfcfff3f9e3cffffefffff +ffc0000ffff9fc7ffcc72391cfe667339e3e67ffefffff +ffc0000ffffffc7ffe2793c983f0f0783e3f0fffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000fffffffffffffffffffffffffffffffffefffff +ffc0000ffffffffffffc1e0fffffffffffffffffefffff +ffc0000fffffffffffff9fcfffffffffffffffffefffff +ffc0000fffffffffffff9fcfffffffffffffffffefffff +ffc0000ffffffffffe0f9fcfc3f0fffc3fffffffefffff +ffc0000ffffffffffce79fcf99e67ff99fffffffefffff +ffc0000fffffffffffe79fcf3cce7ff39fffffffefffff +ffc0000fffe03fffffe79fcf3ccffff3ffffffffefffff +ffc0000fffe03ffffe079fcf3ccffff3ffffffffefffff +ffc0000ffffffffffce79fcf3ccffff3ffffffffefffff +ffc0000ffffffffffce79fcf3ccff8f3ffffffffefffff +ffdffffffffffffffcc79fcf99e678f99fffffffefffff +ffdffffffffffffffe240201c3f0f8fc3fffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdffffffffffffffcffffe1f0ffffffffffffffefffff +ffdffffffffffffffcffffcfe7ffffffffffffffefffff +ffdffffffffffffffcffffcfe7ffffffffffffffefffff +ffdffffffffdfffffc9e730180f0e33ffe1fffffefffff +ffdffffffff57ffffc4e73cfe7e6703ffccfffffefffff +ffdffffffff8fffffce673cfe7ce733ff9cfffffefffff +ffdfffffffe23ffffce673cfe7ce73fff9ffffffefffff +ffdffffffff8fffffce673cfe7c073fff9ffffffefffff +ffdffffffff57ffffce673cfe7cff3fff9ffffffefffff +ffdffffffffdfffffce673cfe7cff3fc79ffffffefffff +ffdffffffffffffffcce23cfe7e673fc7ccfffffefffff +ffdffffffffffffffc1f130381f0e0fc7e1fffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdffffffffffffffffffff9ffffffffffffffffefffff +ffdffffffffffffffffffff9ffffffffffffffffefffff +ffdffffffffffffffffffff9ffffffffffffffffefffff +ffdfffffffffffffff0cb7c1fff0ffffffffffffefffff +ffdffffffffffffffe640399ffe67fffffffffffefffff +ffdffffffffffffffce49339ffce7fffffffffffefffff +ffdfffffffe03ffffcfc9339ffcfffffffffffffefffff +ffdfffffffe03ffffcfc9339ffcfffffffffffffefffff +ffdffffffffffffffcfc9339ffcfffffffffffffefffff +ffdffffffffffffffcfc9339e3cfffffffffffffefffff +ffdffffffffffffffe649391e3e67fffffffffffefffff +ffdfffffffffffffff0c93c9e3f0ffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdffffff1ffffffffe79fffffffffffffffffffefffff +ffdffffff1ffffffffe79fffffffffffffffffffefffff +ffdffffff1ffffffffe7ffffffffffffffffffffefffff +ffdffffff9f9ffffff041f83e1fff87fffffffffefffff +ffdffffff9f9fffffe679f39ccfff33fffffffffefffff +ffdffffff3f9fffffce79f3f9cffe73fffffffffefffff +ffdfffffffc03ffffce79f1f9fffe7ffffffffffefffff +ffdfffffffc03ffffce79f839fffe7ffffffffffefffff +ffdffffffff9fffffce79ff19fffe7ffffffffffefffff +ffdffffffff9fffffce79ff99ff1e7ffffffffffefffff +ffdffffffff9fffffe479f39ccf1f33fffffffffefffff +ffdfffffffffffffff240383e1f1f87fffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffff0e3319c3c67ffc3fffffffefffff +ffdffffffffffffffe67038199e07ff99fffffffefffff +ffdffffffffffffffce733993ce67ff39fffffffefffff +ffdfffffffe03ffffce73f9f3ce7fff3ffffffffefffff +ffdfffffffe03ffffc073f9f3ce7fff3ffffffffefffff +ffdffffffffffffffcff3f9f3ce7fff3ffffffffefffff +ffdffffffffffffffcff3f9f3ce7f8f3ffffffffefffff +ffdffffffffffffffe673f9f99e7f8f99fffffffefffff +ffdfffffffffffffff0e0f07c3c1f8fc3fffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdffffffffffffffffffffffffffffff9ffffffefffff +ffdffffffffffffffffffffffffffffff9ffffffefffff +ffdffffffffffffffffffffffffffffff9ffffffefffff +ffdfffffffffffffff0e3319c3c6707ff91fffffefffff +ffdffffffffffffffe67038199e0673ff88fffffefffff +ffdffffffffffffffce733993ce667fff9cfffffefffff +ffdfffffffe03ffffce73f9f3ce7e3fff9cfffffefffff +ffdfffffffe03ffffc073f9f3ce7f07ff9cfffffefffff +ffdffffffffffffffcff3f9f3ce7fe3ff9cfffffefffff +ffdffffffffffffffcff3f9f3ce7ff3c79cfffffefffff +ffdffffffffffffffe673f9f99e7e73c79cfffffefffff +ffdfffffffffffffff0e0f07c3c1f07c79cfffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffff879e0fffffffffffffffffefffff +ffdfffffffffffffff3f9fcfffffffffffffffffefffff +ffdfffffffffffffff3fffcfffffffffffffffffefffff +ffdffffffffffffffc041fcfe1fff87fffffffffefffff +ffdfffffffffffffff3f9fcfccfff33fffffffffefffff +ffdfffffffffffffff3f9fcf9cffe73fffffffffefffff +ffdfffffffe03fffff3f9fcf9cffe7ffffffffffefffff +ffdfffffffe03fffff3f9fcf80ffe7ffffffffffefffff +ffdfffffffffffffff3f9fcf9fffe7ffffffffffefffff +ffdfffffffffffffff3f9fcf9ff1e7ffffffffffefffff +ffdfffffffffffffff3f9fcfccf1f33fffffffffefffff +ffdffffffffffffffc0c0201e1f1f87fffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffff0783ffffffffffffefffff +ffdfffffffffffffffffffffe7f3ffffffffffffefffff +ffdfffffffffffffffffffffe7f3ffffffffffffefffff +ffdfffffffffffffff078783e7f3f0fc3fff0fffefffff +ffdffffffffffffffe673339e7f3e6799ffe67ffefffff +ffdffffffffffffffce673f9e7f3cf339ffce7ffefffff +ffdfffffffe03ffffce67ff9e7f3cf33fffcffffefffff +ffdfffffffe03ffffce67f81e7f3cf33fffcffffefffff +ffdffffffffffffffce67f39e7f3cf33fffcffffefffff +ffdffffffffffffffce67f39e7f3cf33fe3cffffefffff +ffdffffffffffffffe473331e7f3e6799e3e67ffefffff +ffdfffffffffffffff278789008070fc3e3f0fffefffff +ffdfffffffffffffffe7ffffffffffffffffffffefffff +ffdffffffffffffffce7ffffffffffffffffffffefffff +ffdffffffffffffffe0fffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffff3fffffffffffffffffffffefffff +ffdfffffffffffffff3fffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdffffffffffffff83f0fffe1ffffffffffffffefffff +ffdfffffffffffffff3e67ffccffffffffffffffefffff +ffdfffffffffffffff3cf3ff9cffffffffffffffefffff +ffdfffffffe03fffff3cf3ff9fffffffffffffffefffff +ffdfffffffe03fffff3cf3ff9fffffffffffffffefffff +ffdfffffffffffffff3cf3ff9fffffffffffffffefffff +ffdfffffffffffffff3cf3c79fffffffffffffffefffff +ffdfffffffffffffff3e67c7ccffffffffffffffefffff +ffdffffffffffffff8070fc7e1ffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffdfffffffffffffffffffffffffffffffffffffefffff +ffc00000000000000000000000000000000000000fffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffff +showpage + %%BoundingBox: 239 297 371.48 494.28 +%ps_include: inclusion end +grestore +PS-include-dict-dw begin +o 0 ne {gsave A defaultmatrix /A ed llx lly nice urx ury nice + initgraphics 0.1 setlinewidth boxpath stroke grestore} if +clear o-stack aload pop +context end restore +%ps_include: end +/saveobj save def +mark +8 /LucidaSans-Italic f +(Figure) 720 4352 w +(3.) 1000 4352 w +(The) 1111 4352 w +(menu) 1288 4352 w +(on) 1540 4352 w +(button) 1672 4352 w +(3.) 1963 4352 w +(The) 2101 4352 w +(black) 2279 4352 w +(rectangle) 2522 4352 w +(on) 2921 4352 w +(the) 3053 4352 w +(left) 3211 4352 w +(is) 3372 4352 w +(a) 3470 4352 w +(scroll) 3555 4352 w +(bar;) 3800 4352 w +(the) 3998 4352 w +(menu) 4156 4352 w +(is) 4408 4352 w +(limited) 4506 4352 w +(to) 4806 4352 w +(the) 4918 4352 w +(length) 720 4452 w +(shown) 993 4452 w +(to) 1269 4452 w +(prevent) 1374 4452 w +(its) 1697 4452 w +(becoming) 1818 4452 w +(unwieldy.) 2220 4452 w +(Above) 2644 4452 w +(the) 2908 4452 w +8 /LucidaTypewriter f +(~~sam~~) 3059 4452 w +8 /LucidaSans-Italic f +(line) 3494 4452 w +(is) 3661 4452 w +(a) 3752 4452 w +(list) 3830 4452 w +(of) 3974 4452 w +(commands;) 4079 4452 w +(beneath) 4555 4452 w +(it) 4896 4452 w +(is) 4978 4452 w +(a) 720 4552 w +(list) 795 4552 w +(of) 936 4552 w +(files,) 1038 4552 w +(presented) 1247 4552 w +(exactly) 1654 4552 w +(as) 1951 4552 w +(with) 2065 4552 w +(the) 2256 4552 w +8 /LucidaTypewriter f +(f) 2404 4552 w +8 /LucidaSans-Italic f +(command.) 2488 4552 w +10 /LucidaSansUnicode00 f +(When) 970 4828 w +10 /LucidaTypewriter f +(sam) 1296 4828 w +10 /LucidaSansUnicode00 f +(requests) 1572 4828 w +(that) 2049 4828 w +(a) 2300 4828 w +(window) 2415 4828 w +(be) 2844 4828 w +(swept,) 3023 4828 w +(in) 3399 4828 w +(response) 3550 4828 w +(to) 4051 4828 w +10 /LucidaTypewriter f +(new) 4209 4828 w +10 /LucidaSansUnicode00 f +(,) 4425 4828 w +10 /LucidaTypewriter f +(zerox) 4517 4828 w +10 /LucidaSansUnicode00 f +(or) 4938 4828 w +10 /LucidaTypewriter f +(reshape) 720 4948 w +10 /LucidaSansUnicode00 f +(,) 1224 4948 w +(it) 1307 4948 w +(changes) 1424 4948 w +(the) 1874 4948 w +(mouse) 2080 4948 w +(cursor) 2454 4948 w +(from) 2812 4948 w +(the) 3095 4948 w +(usual) 3301 4948 w +(arrow) 3610 4948 w +(to) 3935 4948 w +(a) 4083 4948 w +(box) 4188 4948 w +(with) 4423 4948 w +(a) 4678 4948 w +(small) 4783 4948 w +(arrow.) 720 5068 w +(In) 1095 5068 w +(this) 1222 5068 w +(state,) 1437 5068 w +(the) 1741 5068 w +(mouse) 1932 5068 w +(may) 2291 5068 w +(be) 2527 5068 w +(used) 2682 5068 w +(to) 2950 5068 w +(indicate) 3084 5068 w +(an) 3502 5068 w +(arbitrary) 3656 5068 w +(rectangle) 4107 5068 w +(by) 4593 5068 w +(press\255) 4745 5068 w +(ing) 720 5188 w +(button) 915 5188 w +(3) 1279 5188 w +(at) 1384 5188 w +(one) 1518 5188 w +(corner) 1739 5188 w +(and) 2093 5188 w +(releasing) 2315 5188 w +(it) 2798 5188 w +(at) 2906 5188 w +(the) 3039 5188 w +(opposite) 3235 5188 w +(corner.) 3697 5188 w +(More) 4114 5188 w +(conveniently,) 4399 5188 w +(button) 720 5308 w +(3) 1093 5308 w +(may) 1207 5308 w +(simply) 1458 5308 w +(be) 1826 5308 w +(clicked,) 1996 5308 w +(whereupon) 2416 5308 w +10 /LucidaTypewriter f +(sam) 3007 5308 w +10 /LucidaSansUnicode00 f +(creates) 3275 5308 w +(the) 3674 5308 w +(maximal) 3881 5308 w +(rectangle) 4348 5308 w +(that) 4849 5308 w +(contains) 720 5428 w +(the) 1164 5428 w +(cursor) 1355 5428 w +(and) 1698 5428 w +(abuts) 1914 5428 w +(the) 2218 5428 w +10 /LucidaTypewriter f +(sam) 2409 5428 w +10 /LucidaSansUnicode00 f +(window.) 2661 5428 w +(By) 3130 5428 w +(placing) 3275 5428 w +(the) 3661 5428 w +10 /LucidaTypewriter f +(sam) 3851 5428 w +10 /LucidaSansUnicode00 f +(window) 4102 5428 w +(in) 4506 5428 w +(the) 4632 5428 w +(mid\255) 4822 5428 w +(dle) 720 5548 w +(of) 921 5548 w +(the) 1072 5548 w +(screen,) 1280 5548 w +(the) 1682 5548 w +(user) 1890 5548 w +(can) 2153 5548 w +(define) 2374 5548 w +(two) 2730 5548 w +(regions) 2958 5548 w +(\(one) 3373 5548 w +(above,) 3638 5548 w +(one) 4010 5548 w +(below\)) 4242 5548 w +(in) 4614 5548 w +(which) 4759 5548 w +(stacked) 720 5668 w +(fully-overlapping) 1148 5668 w +(windows) 2045 5668 w +(can) 2522 5668 w +(be) 2746 5668 w +(created) 2921 5668 w +(with) 3336 5668 w +(minimal) 3597 5668 w +(fuss) 4043 5668 w +(\(see) 4300 5668 w +(Figure) 4552 5668 w +(1\).) 4912 5668 w +(This simple user interface trick makes window creation noticeably easier.) 720 5788 w +(The) 970 5944 w +(cut-and-paste) 1184 5944 w +(editor) 1925 5944 w +(is) 2246 5944 w +(essentially) 2360 5944 w +(the) 2901 5944 w +(same) 3090 5944 w +(as) 3379 5944 w +(that) 3519 5944 w +(in) 3744 5944 w +(Smalltalk-80.) 3869 5944 w +6 /LucidaSansUnicode00 f +(11) 4524 5894 w +10 /LucidaSansUnicode00 f +(The) 4634 5944 w +(text) 4849 5944 w +(in) 720 6064 w +(dot) 856 6064 w +(is) 1062 6064 w +(always) 1187 6064 w +(highlighted) 1551 6064 w +(on) 2149 6064 w +(the) 2317 6064 w +(screen.) 2517 6064 w +(When) 2943 6064 w +(a) 3254 6064 w +(character) 3354 6064 w +(is) 3848 6064 w +(typed) 3973 6064 w +(it) 4289 6064 w +(replaces) 4400 6064 w +(dot,) 4847 6064 w +(and) 720 6184 w +(sets) 946 6184 w +(dot) 1187 6184 w +(to) 1394 6184 w +(the) 1538 6184 w +(null) 1739 6184 w +(string) 1967 6184 w +(after) 2295 6184 w +(the) 2567 6184 w +(character.) 2768 6184 w +(Thus,) 3327 6184 w +(ordinary) 3643 6184 w +(typing) 4093 6184 w +(inserts) 4444 6184 w +(text.) 4817 6184 w +(Button) 720 6304 w +(1) 1081 6304 w +(is) 1188 6304 w +(used) 1312 6304 w +(for) 1588 6304 w +(selection:) 1771 6304 w +(pressing) 2279 6304 w +(the) 2738 6304 w +(button,) 2937 6304 w +(moving) 3335 6304 w +(the) 3738 6304 w +(mouse,) 3936 6304 w +(and) 4334 6304 w +(lifting) 4557 6304 w +(the) 4885 6304 w +(button) 720 6424 w +(selects) 1085 6424 w +(\(sets) 1459 6424 w +(dot) 1730 6424 w +(to\)) 1934 6424 w +(the) 2108 6424 w +(text) 2306 6424 w +(between) 2540 6424 w +(the) 2990 6424 w +(points) 3188 6424 w +(where) 3534 6424 w +(the) 3869 6424 w +(button) 4067 6424 w +(was) 4432 6424 w +(pressed) 4659 6424 w +(and) 720 6544 w +(released.) 954 6544 w +(Pressing) 1479 6544 w +(and) 1940 6544 w +(releasing) 2174 6544 w +(at) 2668 6544 w +(the) 2813 6544 w +(same) 3021 6544 w +(point) 3329 6544 w +(selects) 3634 6544 w +(a) 4018 6544 w +(null) 4126 6544 w +(string;) 4361 6544 w +(this) 4728 6544 w +(is) 4960 6544 w +(called) 720 6664 w +(clicking.) 1060 6664 w +(Clicking) 1552 6664 w +(twice) 1998 6664 w +(quickly,) 2305 6664 w +(or) 2738 6664 w +10 /LucidaSans-Italic f +(double) 2897 6664 w +(clicking,) 3277 6664 w +10 /LucidaSansUnicode00 f +(selects) 3734 6664 w +(larger) 4122 6664 w +(objects;) 4463 6664 w +(for) 4901 6664 w +(example,) 720 6784 w +(double) 1222 6784 w +(clicking) 1613 6784 w +(in) 2040 6784 w +(a) 2187 6784 w +(word) 2298 6784 w +(selects) 2596 6784 w +(the) 2983 6784 w +(word,) 3194 6784 w +(double) 3524 6784 w +(clicking) 3914 6784 w +(just) 4341 6784 w +(inside) 4577 6784 w +(an) 4923 6784 w +(opening) 720 6904 w +(bracket) 1165 6904 w +(selects) 1576 6904 w +(the) 1958 6904 w +(text) 2164 6904 w +(contained) 2406 6904 w +(in) 2933 6904 w +(the) 3075 6904 w +(brackets) 3281 6904 w +(\(handling) 3744 6904 w +(nested) 4252 6904 w +(brackets) 4628 6904 w +(correctly\),) 720 7024 w +(and) 1247 7024 w +(similarly) 1469 7024 w +(for) 1919 7024 w +(parentheses,) 2100 7024 w +(quotes,) 2764 7024 w +(and) 3168 7024 w +(so) 3390 7024 w +(on.) 3544 7024 w +(The) 3773 7024 w +(double-clicking) 3996 7024 w +(rules) 4801 7024 w +(reflect) 720 7144 w +(a) 1074 7144 w +(bias) 1176 7144 w +(toward) 1422 7144 w +(programmers.) 1804 7144 w +(If) 2573 7144 w +10 /LucidaTypewriter f +(sam) 2687 7144 w +10 /LucidaSansUnicode00 f +(were) 2951 7144 w +(intended) 3229 7144 w +(more) 3705 7144 w +(for) 4004 7144 w +(word) 4191 7144 w +(processing,) 4481 7144 w +(double-clicks would probably select linguistic structures such as sentences.) 720 7264 w +cleartomark +showpage +saveobj restore +%%EndPage: 13 13 +%%Page: 14 14 +/saveobj save def +mark +14 pagesetup +10 /LucidaSansUnicode00 f +(\255 14 \255) 2752 480 w +(If) 970 840 w +(button) 1077 840 w +(1) 1441 840 w +(is) 1546 840 w +(pressed) 1668 840 w +(outside) 2091 840 w +(the) 2492 840 w +(current) 2689 840 w +(window,) 3081 840 w +(it) 3524 840 w +(makes) 3632 840 w +(the) 3987 840 w +(indicated) 4184 840 w +(window) 4671 840 w +(current.) 720 960 w +(This is the easiest way to switch between windows and files.) 1166 960 w +(Pressing) 970 1116 w +(button) 1429 1116 w +(2) 1803 1116 w +(brings) 1918 1116 w +(up) 2278 1116 w +(a) 2455 1116 w +(menu) 2562 1116 w +(of) 2887 1116 w +(editing) 3037 1116 w +(functions) 3428 1116 w +(\(see) 3933 1116 w +(Figure) 4182 1116 w +(4\).) 4539 1116 w +(These) 4752 1116 w +(mostly) 720 1236 w +(apply) 1082 1236 w +(to) 1383 1236 w +(the) 1520 1236 w +(selected) 1714 1236 w +(text:) 2152 1236 w +10 /LucidaTypewriter f +(cut) 2414 1236 w +10 /LucidaSansUnicode00 f +(deletes) 2669 1236 w +(the) 3055 1236 w +(selected) 3248 1236 w +(text,) 3685 1236 w +(and) 3946 1236 w +(remembers) 4164 1236 w +(it) 4752 1236 w +(in) 4856 1236 w +(a) 4985 1236 w +(hidden) 720 1356 w +(buffer) 1090 1356 w +(called) 1422 1356 w +(the) 1741 1356 w +10 /LucidaSans-Italic f +(snarf) 1932 1356 w +(buffer,) 2226 1356 w +10 /LucidaTypewriter f +(paste) 2594 1356 w +10 /LucidaSansUnicode00 f +(replaces) 2990 1356 w +(the) 3428 1356 w +(selected) 3619 1356 w +(text) 4054 1356 w +(by) 4281 1356 w +(the) 4432 1356 w +(contents) 4623 1356 w +(of) 720 1476 w +(the) 874 1476 w +(snarf) 1085 1476 w +(buffer,) 1387 1476 w +10 /LucidaTypewriter f +(snarf) 1771 1476 w +10 /LucidaSansUnicode00 f +(just) 2187 1476 w +(copies) 2423 1476 w +(the) 2790 1476 w +(selected) 3001 1476 w +(text) 3456 1476 w +(to) 3703 1476 w +(the) 3857 1476 w +(snarf) 4068 1476 w +(buffer,) 4369 1476 w +10 /LucidaTypewriter f +(look) 4752 1476 w +10 /LucidaSansUnicode00 f +(searches) 720 1596 w +(forward) 1208 1596 w +(for) 1648 1596 w +(the) 1852 1596 w +(next) 2073 1596 w +(literal) 2355 1596 w +(occurrence) 2697 1596 w +(of) 3295 1596 w +(the) 3459 1596 w +(selected) 3680 1596 w +(text,) 4145 1596 w +(and) 4434 1596 w +10 /LucidaTypewriter f +(<mux>) 4680 1596 w +10 /LucidaSansUnicode00 f +(exchanges) 720 1716 w +(snarf) 1277 1716 w +(buffers) 1564 1716 w +(with) 1952 1716 w +(the) 2198 1716 w +(window) 2394 1716 w +(system) 2804 1716 w +(in) 3185 1716 w +(which) 3317 1716 w +10 /LucidaTypewriter f +(sam) 3639 1716 w +10 /LucidaSansUnicode00 f +(is) 3896 1716 w +(running.) 4017 1716 w +(Finally,) 4502 1716 w +(the) 4885 1716 w +(last) 720 1836 w +(regular) 940 1836 w +(expression) 1334 1836 w +(used) 1913 1836 w +(appears) 2193 1836 w +(as) 2625 1836 w +(a) 2779 1836 w +(menu) 2882 1836 w +(entry) 3203 1836 w +(to) 3499 1836 w +(search) 3645 1836 w +(forward) 4009 1836 w +(for) 4432 1836 w +(the) 4620 1836 w +(next) 4824 1836 w +(occurrence of a match for the expression.) 720 1956 w +cleartomark +saveobj restore +%ps_include: begin +save +/ed {exch def} def +{} /showpage ed +{} /copypage ed +{} /erasepage ed +{} /letter ed +currentdict /findfont known systemdict /findfont known and { + /findfont systemdict /findfont get def +} if +36 dict dup /PS-include-dict-dw ed begin +/context ed +count array astore /o-stack ed +%ps_include: variables begin +/llx 268 def +/lly 352 def +/urx 342.16 def +/ury 438.4 def +/w 0 def +/o 0 def +/s 0 def +/cx 2880 def +/cy -2628 def +/sx 4320 def +/sy 864 def +/ax .5 def +/ay .5 def +/rot 0 def +%ps_include: variables end +{llx lly urx ury} /bbox ed +{newpath 2 index exch 2 index exch dup 6 index exch + moveto 3 {lineto} repeat closepath} /boxpath ed +{dup mul exch dup mul add sqrt} /len ed +{2 copy gt {exch} if pop} /min ed +{2 copy lt {exch} if pop} /max ed +{transform round exch round exch A itransform} /nice ed +{6 array} /n ed +n defaultmatrix n currentmatrix n invertmatrix n concatmatrix /A ed +urx llx sub 0 A dtransform len /Sx ed +0 ury lly sub A dtransform len /Sy ed +llx urx add 2 div lly ury add 2 div A transform /Cy ed /Cx ed +rot dup sin abs /S ed cos abs /C ed +Sx S mul Sy C mul add /H ed +Sx C mul Sy S mul add /W ed +sy H div /Scaley ed +sx W div /Scalex ed +s 0 eq {Scalex Scaley min dup /Scalex ed /Scaley ed} if +sx Scalex W mul sub 0 max ax 0.5 sub mul cx add /cx ed +sy Scaley H mul sub 0 max ay 0.5 sub mul cy add /cy ed +urx llx sub 0 A dtransform exch atan rot exch sub /rot ed +n currentmatrix initgraphics setmatrix +cx cy translate +Scalex Scaley scale +rot rotate +Cx neg Cy neg translate +A concat +bbox boxpath clip newpath +w 0 ne {gsave bbox boxpath 1 setgray fill grestore} if +end +gsave +%ps_include: inclusion begin + %!PS +/picstr 13 string def +268 352 translate + 74.16 86.40 scale + +103 120 1 [103 0 0 -120 0 120] +{currentfile picstr readhexstring pop} image + +ffffffffffffffffffffffffff +ffffffffffffffffffffffffff +ffffffffffffffffffffffffff +ffffffffffffffffffffffffff +ffffffffffffffffffffffffff +f800000000000000000001ffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffdfffffffdffff +fbfffffffffff9fffffffdffff +fbffffffe1ce603ffffffdffff +fbffffffccce79fffffffdffff +fbffffff9cce79fffffffdffff +fbffffff9fce79fffffffdffff +fbffffff9fce79fffffffdffff +fbffffff9fce79fffffffdffff +fbffffff9fce79fffffffdffff +fbffffffccc479fffffffdffff +fbffffffe1e27c3ffffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffdfffffffdffff +fbfffffffffff9fffffffdffff +fbffff27c1e0e03c3ffffdffff +fbffff139cce79f99ffffdffff +fbffff39fccff9f39ffffdffff +fbffff39fcc7f9f39ffffdffff +fbffff39c0e0f9f01ffffdffff +fbffff399cfc79f3fffffdffff +fbffff399cfe79f3fffffdffff +fbffff3398ce79f99ffffdffff +fbffff07c4e0fc3c3ffffdffff +fbffff3ffffffffffffffdffff +fbffff3ffffffffffffffdffff +fbffff3ffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffe1ffffdffff +fbfffffffffffffcfffffdffff +fbfffffffffffffcfffffdffff +fbffff8391e0e3301ffffdffff +fbffff3988ce703cfffffdffff +fbffff3f9cfe733cfffffdffff +fbffff1f9cfe73fcfffffdffff +fbffff839ce073fcfffffdffff +fbfffff19cce73fcfffffdffff +fbfffff99cce73fcfffffdffff +fbffff399ccc73fcfffffdffff +fbffff839ce260f03ffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffff07fffff3ffffffdffff +fbfffffe7fffff3ffffffdffff +fbfffffe7fffff3ffffffdffff +fbfffffe7e1f0f39fffffdffff +fbfffffe7cce673bfffffdffff +fbfffffe79e4f337fffffdffff +fbfffffe79e4f32ffffffdffff +fbfffffe79e4f30ffffffdffff +fbfffffe79e4f327fffffdffff +fbfffffe79e4f333fffffdffff +fbfffffe7cce6739fffffdffff +fbfffff00e1f0f39fffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +fbfffffbfffffffbfffffdffff +fbfffff3fffffff9fffffdffff +fbffffe72dce673cfffffdffff +fbffffcf00ce673e7ffffdffff +fbffff9f24ce737f3ffffdffff +fbffff1f24ce70ff1ffffdffff +fbffff9f24ce7dff3ffffdffff +fbffffcf24ce787e7ffffdffff +fbffffe724ce767cfffffdffff +fbfffff324c46739fffffdffff +fbfffffb24e2673bfffffdffff +fbfffffffffffffffffffdffff +fbfffffffffffffffffffdffff +f800000000000000000001ffff +f800000000000000000001ffff +f800c04000030000200001ffff +f800c18000030000180001ffff +f8018300000180000c0001ffff +f801830000c180dc0c0c01ffff +f803060000c0c0ee060c01ffff +f803060000c0c0c6060c01ffff +f806060007f860c6067f81ffff +f806060007f860c6067f81ffff +f80c060000c030c6060c01ffff +f80c0601c0c030c6060c01ffff +f8180601c0c018c6060c01ffff +f8180301c00018c60c001e0fff +f830030000000c000c001e3fff +f830018000000c0018001effff +f80000400000000020001e7fff +ffffffffffffffffffffe03fff +ffffffffffffffffffffe41fff +ffffffffffffffffffffe60fff +ffffffffffffffffffffef07ff +ffffffffffffffffffffef83ff +ffffffffffffffffffffffc1ff +ffffffffffffffffffffffe0ff +fffffffffffffffffffffff07f +fffffffffffffffffffffff83f +fffffffffffffffffffffffc1f +fffffffffffffffffffffffe3f +ffffffffffffffffffffffff7f +ffffffffffffffffffffffffff +ffffffffffffffffffffffffff +ffffffffffffffffffffffffff +ffffffffffffffffffffffffff +ffffffffffffffffffffffffff +showpage + %%BoundingBox: 268 352 342.16 438.40 +%ps_include: inclusion end +grestore +PS-include-dict-dw begin +o 0 ne {gsave A defaultmatrix /A ed llx lly nice urx ury nice + initgraphics 0.1 setlinewidth boxpath stroke grestore} if +clear o-stack aload pop +context end restore +%ps_include: end +/saveobj save def +mark +8 /LucidaSans-Italic f +(Figure) 720 3160 w +(4.) 998 3160 w +(The) 1107 3160 w +(menu) 1282 3160 w +(on) 1531 3160 w +(button) 1661 3160 w +(2.) 1950 3160 w +(The) 2086 3160 w +(bottom) 2262 3160 w +(entry) 2571 3160 w +(tracks) 2809 3160 w +(the) 3085 3160 w +(most) 3241 3160 w +(recently) 3464 3160 w +(used) 3807 3160 w +(regular) 4021 3160 w +(expression,) 4344 3160 w +(which) 4815 3160 w +(may) 720 3260 w +(be) 913 3260 w +(literal) 1030 3260 w +(text.) 1284 3260 w +10 /LucidaSansUnicode00 f +(The) 970 3536 w +(relationship) 1216 3536 w +(between) 1856 3536 w +(the) 2328 3536 w +(command) 2548 3536 w +(language) 3091 3536 w +(and) 3599 3536 w +(the) 3844 3536 w +(mouse) 4064 3536 w +(language) 4452 3536 w +(is) 4960 3536 w +(entirely) 720 3656 w +(due) 1129 3656 w +(to) 1357 3656 w +(the) 1502 3656 w +(equality) 1704 3656 w +(of) 2134 3656 w +(dot) 2279 3656 w +(and) 2487 3656 w +(the) 2714 3656 w +(selected) 2916 3656 w +(text) 3362 3656 w +(chosen) 3599 3656 w +(with) 3988 3656 w +(button) 4239 3656 w +(1) 4607 3656 w +(on) 4716 3656 w +(the) 4885 3656 w +(mouse.) 720 3776 w +(For example, to make a set of changes in a C subroutine, dot can be) 1139 3776 w +(set) 4496 3776 w +(by) 4673 3776 w +(dou\255) 4821 3776 w +(ble) 720 3896 w +(clicking) 915 3896 w +(on) 1333 3896 w +(the) 1503 3896 w +(left) 1705 3896 w +(brace) 1911 3896 w +(that) 2224 3896 w +(begins) 2462 3896 w +(the) 2832 3896 w +(subroutine,) 3034 3896 w +(which) 3637 3896 w +(sets) 3965 3896 w +(dot) 4207 3896 w +(for) 4415 3896 w +(the) 4601 3896 w +(com\255) 4802 3896 w +(mand) 720 4016 w +(language.) 1039 4016 w +(An) 1592 4016 w +(address-free) 1769 4016 w +(command) 2443 4016 w +(then) 2967 4016 w +(typed) 3230 4016 w +(in) 3548 4016 w +(the) 3686 4016 w +10 /LucidaTypewriter f +(sam) 3888 4016 w +10 /LucidaSansUnicode00 f +(window) 4151 4016 w +(will) 4567 4016 w +(apply) 4778 4016 w +(only) 720 4136 w +(to) 962 4136 w +(the) 1097 4136 w +(text) 1289 4136 w +(between) 1517 4136 w +(the) 1961 4136 w +(opening) 2153 4136 w +(and) 2585 4136 w +(closing) 2802 4136 w +(braces) 3184 4136 w +(of) 3538 4136 w +(the) 3673 4136 w +(function.) 3865 4136 w +(The) 4367 4136 w +(idea) 4585 4136 w +(is) 4825 4136 w +(to) 4942 4136 w +(select) 720 4256 w +(what) 1041 4256 w +(you) 1313 4256 w +(want,) 1530 4256 w +(and) 1835 4256 w +(then) 2057 4256 w +(say) 2316 4256 w +(what) 2516 4256 w +(you) 2789 4256 w +(want) 3006 4256 w +(to) 3279 4256 w +(do) 3419 4256 w +(with) 3585 4256 w +(it,) 3832 4256 w +(whether) 3972 4256 w +(invoked) 4405 4256 w +(by) 4828 4256 w +(a) 4985 4256 w +(menu) 720 4376 w +(selection) 1032 4376 w +(or) 1503 4376 w +(by) 1644 4376 w +(a) 1798 4376 w +(typed) 1892 4376 w +(command.) 2202 4376 w +(And) 2783 4376 w +(of) 3016 4376 w +(course,) 3153 4376 w +(the) 3546 4376 w +(value) 3740 4376 w +(of) 4033 4376 w +(dot) 4170 4376 w +(is) 4369 4376 w +(highlighted) 4487 4376 w +(on) 720 4496 w +(the) 889 4496 w +(display) 1090 4496 w +(after) 1478 4496 w +(the) 1750 4496 w +(command) 1951 4496 w +(completes.) 2476 4496 w +(This) 3084 4496 w +(relationship) 3336 4496 w +(between) 3958 4496 w +(mouse) 4412 4496 w +(inter\255) 4782 4496 w +(face) 720 4616 w +(and) 974 4616 w +(command) 1208 4616 w +(language) 1740 4616 w +(is) 2237 4616 w +(clumsy) 2371 4616 w +(to) 2763 4616 w +(explain,) 2915 4616 w +(but) 3356 4616 w +(comfortable,) 3572 4616 w +(even) 4242 4616 w +(natural,) 4522 4616 w +(in) 4949 4616 w +(practice.) 720 4736 w +10 /LucidaSans-Demi f +(The Implementation) 720 4976 w +10 /LucidaSansUnicode00 f +(The) 720 5132 w +(next) 946 5132 w +(few) 1207 5132 w +(sections) 1422 5132 w +(describe) 1865 5132 w +(how) 2320 5132 w +10 /LucidaTypewriter f +(sam) 2565 5132 w +10 /LucidaSansUnicode00 f +(is) 2826 5132 w +(put) 2951 5132 w +(together,) 3159 5132 w +(first) 3649 5132 w +(the) 3890 5132 w +(host) 4091 5132 w +(part,) 4348 5132 w +(then) 4622 5132 w +(the) 4885 5132 w +(inter-component) 720 5252 w +(communication,) 1583 5252 w +(then) 2395 5252 w +(the) 2646 5252 w +(terminal) 2835 5252 w +(part.) 3271 5252 w +(After) 3565 5252 w +(explaining) 3839 5252 w +(how) 4381 5252 w +(the) 4614 5252 w +(com\255) 4802 5252 w +(mand) 720 5372 w +(language) 1029 5372 w +(is) 1508 5372 w +(implemented,) 1624 5372 w +(the) 2329 5372 w +(discussion) 2520 5372 w +(follows) 3066 5372 w +(\(roughly\)) 3447 5372 w +(the) 3918 5372 w +(path) 4110 5372 w +(of) 4364 5372 w +(a) 4499 5372 w +(character) 4591 5372 w +(from) 720 5492 w +(the) 1002 5492 w +(temporary) 1207 5492 w +(file) 1756 5492 w +(on) 1957 5492 w +(disc) 2130 5492 w +(to) 2374 5492 w +(the) 2522 5492 w +(screen.) 2727 5492 w +(The) 3158 5492 w +(presentation) 3389 5492 w +(centers) 4049 5492 w +(on) 4453 5492 w +(the) 4626 5492 w +(data) 4830 5492 w +(structures,) 720 5612 w +(because) 1281 5612 w +(that) 1715 5612 w +(is) 1946 5612 w +(how) 2067 5612 w +(the) 2308 5612 w +(program) 2504 5612 w +(was) 2961 5612 w +(designed) 3185 5612 w +(and) 3668 5612 w +(because) 3889 5612 w +(the) 4324 5612 w +(algorithms) 4520 5612 w +(are easy to provide, given the right data structures.) 720 5732 w +10 /LucidaSans-Demi f +(Parsing and execution) 720 5972 w +10 /LucidaSansUnicode00 f +(The) 720 6128 w +(command) 951 6128 w +(language) 1479 6128 w +(is) 1972 6128 w +(interpreted) 2102 6128 w +(by) 2693 6128 w +(parsing) 2859 6128 w +(each) 3273 6128 w +(command) 3548 6128 w +(with) 4077 6128 w +(a) 4333 6128 w +(table-driven) 4439 6128 w +(recursive) 720 6248 w +(descent) 1195 6248 w +(parser,) 1607 6248 w +(and) 1982 6248 w +(when) 2198 6248 w +(a) 2491 6248 w +(complete) 2582 6248 w +(command) 3064 6248 w +(is) 3578 6248 w +(assembled,) 3694 6248 w +(invoking) 4279 6248 w +(a) 4730 6248 w +(top-) 4821 6248 w +(down) 720 6368 w +(executor.) 1019 6368 w +(Most) 1544 6368 w +(editors) 1815 6368 w +(instead) 2189 6368 w +(employ) 2578 6368 w +(a) 2969 6368 w +(simple) 3061 6368 w +(character-at-a-time) 3419 6368 w +(lexical) 4441 6368 w +(scan\255) 4788 6368 w +(ner.) 720 6488 w +(Use) 976 6488 w +(of) 1185 6488 w +(a) 1316 6488 w +(parser) 1404 6488 w +(makes) 1744 6488 w +(it) 2090 6488 w +(easy) 2189 6488 w +(and unambiguous to detect when a command is com\255) 2436 6488 w +(plete,) 720 6608 w +(which) 1051 6608 w +(has) 1390 6608 w +(two) 1616 6608 w +(advantages.) 1849 6608 w +(First,) 2519 6608 w +(escape) 2821 6608 w +(conventions) 3211 6608 w +(such) 3853 6608 w +(as) 4137 6608 w +(backslashes) 4301 6608 w +(to) 4942 6608 w +(quote) 720 6728 w +(multiple-line) 1057 6728 w +(commands) 1747 6728 w +(are) 2334 6728 w +(unnecessary;) 2544 6728 w +(if) 3265 6728 w +(the) 3389 6728 w +(command) 3602 6728 w +(isn) 4138 6728 w +10 /LucidaSansUnicode20 f +(\031) 4280 6728 w +10 /LucidaSansUnicode00 f +(t) 4312 6728 w +(finished,) 4407 6728 w +(the) 4885 6728 w +(parser) 720 6848 w +(keeps) 1064 6848 w +(reading.) 1385 6848 w +(For) 1854 6848 w +(example,) 2047 6848 w +(a) 2529 6848 w +(multiple-line) 2621 6848 w +(append) 3290 6848 w +(driven) 3689 6848 w +(by) 4029 6848 w +(an) 4181 6848 w +10 /LucidaTypewriter f +(x) 4335 6848 w +10 /LucidaSansUnicode00 f +(command) 4444 6848 w +(is) 4960 6848 w +(straightforward:) 720 6968 w +cleartomark +showpage +saveobj restore +%%EndPage: 14 14 +%%Page: 15 15 +/saveobj save def +mark +15 pagesetup +10 /LucidaSansUnicode00 f +(\255 15 \255) 2752 480 w +9 /LucidaTypewriter f +(x/.*\\n/) 920 830 w +(g/Peter/) 1440 830 w +(a) 2025 830 w +(one) 920 940 w +(line) 1180 940 w +(about) 1505 940 w +(Peter) 1895 940 w +(another) 920 1050 w +(line) 1440 1050 w +(about) 1765 1050 w +(Peter) 2155 1050 w +(.) 920 1160 w +10 /LucidaSansUnicode00 f +(Other UNIX editors would require a backslash after all but the last line.) 720 1340 w +(The other advantage is specific to the two-process) 970 1496 w +(structure) 3469 1496 w +(of) 3940 1496 w +10 /LucidaTypewriter f +(sam) 4071 1496 w +10 /LucidaSansUnicode00 f +(.) 4287 1496 w +(The) 4384 1496 w +(host) 4598 1496 w +(pro\255) 4842 1496 w +(cess) 720 1616 w +(must) 977 1616 w +(decide) 1268 1616 w +(when) 1634 1616 w +(a) 1939 1616 w +(command) 2042 1616 w +(is) 2568 1616 w +(completed) 2696 1616 w +(so) 3253 1616 w +(the) 3413 1616 w +(command) 3615 1616 w +(interpreter) 4140 1616 w +(can) 4706 1616 w +(be) 4921 1616 w +(called.) 720 1736 w +(This) 1115 1736 w +(problem) 1368 1736 w +(is) 1822 1736 w +(easily) 1950 1736 w +(resolved) 2271 1736 w +(by) 2729 1736 w +(having) 2893 1736 w +(the) 3264 1736 w +(lexical) 3468 1736 w +(analyzer) 3827 1736 w +(read) 4283 1736 w +(the) 4547 1736 w +(single) 4751 1736 w +(stream) 720 1856 w +(of) 1090 1856 w +(events) 1225 1856 w +(from) 1576 1856 w +(the) 1845 1856 w +(terminal,) 2037 1856 w +(directly) 2508 1856 w +(executing) 2902 1856 w +(all) 3414 1856 w +(typing) 3563 1856 w +(and) 3904 1856 w +(mouse) 4120 1856 w +(commands,) 4479 1856 w +(but) 720 1976 w +(passing) 920 1976 w +(to) 1331 1976 w +(the) 1467 1976 w +(parser) 1660 1976 w +(characters) 2005 1976 w +(typed) 2543 1976 w +(to) 2852 1976 w +(the) 2989 1976 w +10 /LucidaTypewriter f +(sam) 3183 1976 w +10 /LucidaSansUnicode00 f +(command) 3438 1976 w +(window.) 3955 1976 w +(This) 4427 1976 w +(scheme) 4671 1976 w +(is) 720 2096 w +(slightly) 843 2096 w +(complicated) 1237 2096 w +(by) 1868 2096 w +(the) 2026 2096 w +(availability) 2224 2096 w +(of) 2781 2096 w +(cut-and-paste) 2921 2096 w +(editing) 3671 2096 w +(in) 4051 2096 w +(the) 4184 2096 w +10 /LucidaTypewriter f +(sam) 4381 2096 w +10 /LucidaSansUnicode00 f +(window,) 4639 2096 w +(but that difficulty is resolved by) 720 2216 w +(applying) 2296 2216 w +(the) 2744 2216 w +(rules) 2932 2216 w +(used) 3204 2216 w +(in) 3469 2216 w +10 /LucidaTypewriter f +(mux) 3593 2216 w +10 /LucidaSansUnicode00 f +(:) 3809 2216 w +(when) 3874 2216 w +(a) 4164 2216 w +(newline) 4252 2216 w +(is) 4656 2216 w +(typed) 4769 2216 w +(to) 720 2336 w +(the) 866 2336 w +10 /LucidaTypewriter f +(sam) 1069 2336 w +10 /LucidaSansUnicode00 f +(window,) 1332 2336 w +(all) 1780 2336 w +(text) 1940 2336 w +(between) 2178 2336 w +(the) 2632 2336 w +(newline) 2834 2336 w +(and) 3252 2336 w +(the) 3479 2336 w +(previously) 3681 2336 w +(typed) 4224 2336 w +(newline) 4542 2336 w +(is) 4960 2336 w +(made) 720 2456 w +(available) 1029 2456 w +(to) 1494 2456 w +(the) 1634 2456 w +(parser.) 1831 2456 w +(This) 2244 2456 w +(permits) 2491 2456 w +(arbitrary) 2903 2456 w +(editing) 3359 2456 w +(to) 3739 2456 w +(be) 3879 2456 w +(done) 4040 2456 w +(to) 4324 2456 w +(a) 4464 2456 w +(command) 4562 2456 w +(before typing newline and thereby requesting execution.) 720 2576 w +(The) 970 2732 w +(parser) 1190 2732 w +(is) 1536 2732 w +(driven) 1655 2732 w +(by) 1997 2732 w +(a) 2151 2732 w +(table) 2245 2732 w +(because) 2524 2732 w +(the) 2957 2732 w +(syntax) 3151 2732 w +(of) 3508 2732 w +(addresses) 3645 2732 w +(and) 4171 2732 w +(commands) 4391 2732 w +(is) 4960 2732 w +(regular) 720 2852 w +(enough) 1121 2852 w +(to) 1541 2852 w +(be) 1694 2852 w +(encoded) 1868 2852 w +(compactly.) 2335 2852 w +(There) 2945 2852 w +(are) 3277 2852 w +(few) 3483 2852 w +(special) 3707 2852 w +(cases,) 4095 2852 w +(such) 4445 2852 w +(as) 4725 2852 w +(the) 4885 2852 w +(replacement) 720 2972 w +(text) 1383 2972 w +(in) 1638 2972 w +(a) 1793 2972 w +(substitution,) 1912 2972 w +(so) 2589 2972 w +(the) 2765 2972 w +(syntax) 2984 2972 w +(of) 3366 2972 w +(almost) 3528 2972 w +(all) 3918 2972 w +(commands) 4095 2972 w +(can) 4688 2972 w +(be) 4921 2972 w +(encoded) 720 3092 w +(with) 1174 3092 w +(a) 1421 3092 w +(few) 1518 3092 w +(flags.) 1730 3092 w +(These) 2070 3092 w +(include) 2400 3092 w +(whether) 2794 3092 w +(the) 3227 3092 w +(command) 3424 3092 w +(allows) 3944 3092 w +(an) 4288 3092 w +(address) 4447 3092 w +(\(for) 4868 3092 w +(example,) 720 3212 w +10 /LucidaTypewriter f +(e) 1204 3212 w +10 /LucidaSansUnicode00 f +(does) 1315 3212 w +(not\),) 1585 3212 w +(whether) 1849 3212 w +(it) 2279 3212 w +(takes) 2384 3212 w +(a) 2680 3212 w +(regular) 2774 3212 w +(expression) 3159 3212 w +(\(as) 3729 3212 w +(in) 3907 3212 w +10 /LucidaTypewriter f +(x) 4037 3212 w +10 /LucidaSansUnicode00 f +(and) 4148 3212 w +10 /LucidaTypewriter f +(s) 4367 3212 w +10 /LucidaSansUnicode00 f +(\),) 4439 3212 w +(whether) 4543 3212 w +(it) 4974 3212 w +(takes) 720 3332 w +(replacement) 1014 3332 w +(text) 1650 3332 w +(\(as) 1878 3332 w +(in) 2054 3332 w +10 /LucidaTypewriter f +(c) 2182 3332 w +10 /LucidaSansUnicode00 f +(or) 2291 3332 w +10 /LucidaTypewriter f +(i) 2430 3332 w +10 /LucidaSansUnicode00 f +(\),) 2502 3332 w +(which) 2604 3332 w +(may) 2922 3332 w +(be) 3158 3332 w +(multi-line,) 3313 3332 w +(and) 3865 3332 w +(so) 4081 3332 w +(on.) 4229 3332 w +(The) 4452 3332 w +(internal) 4669 3332 w +(syntax) 720 3452 w +(of) 1074 3452 w +(regular) 1208 3452 w +(expressions) 1591 3452 w +(is) 2210 3452 w +(handled) 2327 3452 w +(by) 2754 3452 w +(a) 2906 3452 w +(separate) 2998 3452 w +(parser;) 3449 3452 w +(a) 3825 3452 w +(regular) 3917 3452 w +(expression) 4300 3452 w +(is) 4868 3452 w +(a) 4985 3452 w +(leaf) 720 3572 w +(of) 930 3572 w +(the) 1061 3572 w +(command parse tree.) 1249 3572 w +(Regular expressions are discussed fully in the next sec\255) 2343 3572 w +(tion.) 720 3692 w +(The) 970 3848 w +(parser) 1194 3848 w +(table) 1544 3848 w +(also) 1828 3848 w +(has) 2068 3848 w +(information) 2280 3848 w +(about) 2891 3848 w +(defaults,) 3213 3848 w +(so) 3679 3848 w +(the) 3835 3848 w +(interpreter) 4034 3848 w +(is) 4597 3848 w +(always) 4721 3848 w +(called) 720 3968 w +(with) 1042 3968 w +(a) 1286 3968 w +(complete) 1380 3968 w +(tree.) 1865 3968 w +(For) 2158 3968 w +(example,) 2353 3968 w +(the) 2837 3968 w +(parser) 3031 3968 w +(fills) 3377 3968 w +(in) 3591 3968 w +(the) 3721 3968 w +(implicit) 3915 3968 w +10 /LucidaTypewriter f +(0) 4314 3968 w +10 /LucidaSansUnicode00 f +(and) 4425 3968 w +10 /LucidaTypewriter f +($) 4644 3968 w +10 /LucidaSansUnicode00 f +(in) 4755 3968 w +(the) 4885 3968 w +(abbreviated) 720 4088 w +(address) 1328 4088 w +10 /LucidaTypewriter f +(,) 1746 4088 w +10 /LucidaSansUnicode00 f +(\(comma\),) 1856 4088 w +(inserts) 2345 4088 w +(a) 2710 4088 w +10 /LucidaTypewriter f +(+) 2803 4088 w +10 /LucidaSansUnicode00 f +(to) 2913 4088 w +(the) 3049 4088 w +(left) 3242 4088 w +(of) 3439 4088 w +(an) 3575 4088 w +(unadorned) 3730 4088 w +(regular) 4294 4088 w +(expres\255) 4679 4088 w +(sion) 720 4208 w +(in) 967 4208 w +(an) 1102 4208 w +(address,) 1263 4208 w +(and) 1719 4208 w +(provides) 1943 4208 w +(the) 2403 4208 w +(usual) 2602 4208 w +(default) 2905 4208 w +(address) 3287 4208 w +10 /LucidaTypewriter f +(.) 3710 4208 w +10 /LucidaSansUnicode00 f +(\(dot\)) 3825 4208 w +(for) 4095 4208 w +(commands) 4277 4208 w +(that) 4849 4208 w +(expect an address but are not given one.) 720 4328 w +(Once) 970 4484 w +(a) 1252 4484 w +(complete) 1342 4484 w +(command) 1823 4484 w +(is) 2336 4484 w +(parsed,) 2452 4484 w +(the) 2849 4484 w +(evaluation) 3040 4484 w +(is) 3574 4484 w +(easy.) 3690 4484 w +(The) 4004 4484 w +(address) 4221 4484 w +(is) 4637 4484 w +(evalu\255) 4753 4484 w +(ated) 720 4604 w +(left-to-right) 967 4604 w +(starting) 1606 4604 w +(from) 2015 4604 w +(the) 2282 4604 w +(value) 2472 4604 w +(of) 2761 4604 w +(dot,) 2894 4604 w +(with) 3122 4604 w +(a) 3362 4604 w +(mostly) 3452 4604 w +(ordinary) 3810 4604 w +(expression) 4249 4604 w +(eval\255) 4815 4604 w +(uator.) 720 4724 w +(Addresses,) 1074 4724 w +(like) 1641 4724 w +(many) 1847 4724 w +(of) 2143 4724 w +(the) 2275 4724 w +(data) 2464 4724 w +(structures) 2708 4724 w +(in) 3231 4724 w +10 /LucidaTypewriter f +(sam) 3356 4724 w +10 /LucidaSansUnicode00 f +(,) 3572 4724 w +(are) 3638 4724 w +(held) 3824 4724 w +(in) 4068 4724 w +(a) 4193 4724 w +(C) 4283 4724 w +(structure) 4387 4724 w +(and) 4860 4724 w +(passed around by value:) 720 4844 w +9 /LucidaTypewriter f +(typedef) 920 5014 w +(long) 1440 5014 w +(Posn;) 1765 5014 w +(/*) 2350 5014 w +(Position) 2545 5014 w +(in) 3130 5014 w +(a) 3325 5014 w +(file) 3455 5014 w +(*/) 3780 5014 w +(typedef) 920 5124 w +(struct) 1440 5124 w +(Range{) 1895 5124 w +(Posn) 1440 5234 w +(p1,) 1960 5234 w +(p2;) 2220 5234 w +(}Range;) 920 5344 w +(typedef) 920 5454 w +(struct) 1440 5454 w +(Address{) 1895 5454 w +(Range) 1440 5564 w +(r;) 1960 5564 w +(File) 1440 5674 w +(*f;) 1960 5674 w +(}Address;) 920 5784 w +10 /LucidaSansUnicode00 f +(An) 720 5964 w +(address) 895 5964 w +(is) 1319 5964 w +(encoded) 1443 5964 w +(as) 1899 5964 w +(a) 2049 5964 w +(substring) 2148 5964 w +(\(character) 2650 5964 w +(positions) 3176 5964 w +10 /LucidaTypewriter f +(p1) 3664 5964 w +10 /LucidaSansUnicode00 f +(to) 3852 5964 w +10 /LucidaTypewriter f +(p2) 3994 5964 w +10 /LucidaSansUnicode00 f +(\)) 4138 5964 w +(in) 4215 5964 w +(a) 4350 5964 w +(file) 4449 5964 w +10 /LucidaTypewriter f +(f) 4645 5964 w +10 /LucidaSansUnicode00 f +(.) 4717 5964 w +(\(The) 4826 5964 w +(data type) 720 6084 w +10 /LucidaTypewriter f +(File) 1202 6084 w +10 /LucidaSansUnicode00 f +(is described in detail below.\)) 1522 6084 w +(The) 970 6240 w +(address) 1197 6240 w +(interpreter) 1623 6240 w +(is) 2188 6240 w +(an) 2314 6240 w +10 /LucidaTypewriter f +(Address) 2477 6240 w +10 /LucidaSansUnicode00 f +(-valued) 2981 6240 w +(function) 3402 6240 w +(that) 3849 6240 w +(traverses) 4086 6240 w +(the) 4572 6240 w +(parse) 4774 6240 w +(tree describing an address \(the parse tree for the address has type) 720 6360 w +10 /LucidaTypewriter f +(Addrtree) 3992 6360 w +10 /LucidaSansUnicode00 f +(\):) 4568 6360 w +cleartomark +showpage +saveobj restore +%%EndPage: 15 15 +%%Page: 16 16 +/saveobj save def +mark +16 pagesetup +10 /LucidaSansUnicode00 f +(\255 16 \255) 2752 480 w +9 /LucidaTypewriter f +(Address) 920 830 w +(address\(ap,) 920 940 w +(a,) 1700 940 w +(sign\)) 1895 940 w +(Addrtree) 1440 1050 w +(*ap;) 2025 1050 w +(Address) 1440 1160 w +(a;) 1960 1160 w +(int) 1440 1270 w +(sign;) 1700 1270 w +({) 920 1380 w +(Address) 1440 1490 w +(a2;) 1960 1490 w +(do) 1440 1600 w +(switch\(ap->type\){) 1960 1710 w +(case) 1960 1820 w +('.':) 2285 1820 w +(a=a.f->dot;) 2480 1930 w +(break;) 2480 2040 w +(case) 1960 2150 w +('$':) 2285 2150 w +(a.r.p1=a.r.p2=a.f->nbytes;) 2480 2260 w +(break;) 2480 2370 w +(case) 1960 2480 w +('"':) 2285 2480 w +(a=matchfile\(a,) 2480 2590 w +(ap->aregexp\)->dot;) 3455 2590 w +(break;) 2480 2700 w +(case) 1960 2810 w +(',':) 2285 2810 w +(a2=address\(ap->right,) 2480 2920 w +(a,) 3910 2920 w +(0\);) 4105 2920 w +(a=address\(ap->left,) 2480 3030 w +(a,) 3780 3030 w +(0\);) 3975 3030 w +(if\(a.f!=a2.f) 2480 3140 w +(||) 3325 3140 w +(a2.r.p2<a.r.p1\)) 3520 3140 w +(error\(Eorder\);) 3000 3250 w +(a.r.p2=a2.r.p2;) 2480 3360 w +(return) 2480 3470 w +(a;) 2935 3470 w +(/*) 1960 3580 w +(and) 2155 3580 w +(so) 2415 3580 w +(on) 2610 3580 w +(*/) 2805 3580 w +(}) 1960 3690 w +(while\(\(ap=ap->right\)!=0\);) 1440 3800 w +(return) 1440 3910 w +(a;) 1895 3910 w +(}) 920 4020 w +10 /LucidaSansUnicode00 f +(Throughout,) 970 4236 w +(errors) 1615 4236 w +(are) 1947 4236 w +(handled) 2140 4236 w +(by) 2571 4236 w +(a) 2727 4236 w +(non-local) 2823 4236 w +10 /LucidaTypewriter f +(goto) 3332 4236 w +10 /LucidaSansUnicode00 f +(\(a) 3661 4236 w +10 /LucidaTypewriter f +(setjmp/longjmp) 3790 4236 w +10 /LucidaSansUnicode00 f +(in) 4839 4236 w +(C) 4971 4236 w +(terminology\)) 720 4356 w +(hidden) 1380 4356 w +(in) 1759 4356 w +(a) 1894 4356 w +(routine) 1993 4356 w +(called) 2385 4356 w +10 /LucidaTypewriter f +(error) 2712 4356 w +10 /LucidaSansUnicode00 f +(that) 3115 4356 w +(immediately) 3349 4356 w +(aborts) 3984 4356 w +(the) 4335 4356 w +(execution,) 4533 4356 w +(retracts) 720 4476 w +(any) 1124 4476 w +(partially) 1328 4476 w +(made) 1753 4476 w +(changes) 2055 4476 w +(\(see) 2489 4476 w +(the) 2720 4476 w +(section) 2910 4476 w +(below) 3293 4476 w +(on) 3615 4476 w +10 /LucidaSansUnicode20 f +(\030) 3774 4476 w +10 /LucidaSansUnicode00 f +(undoing) 3806 4476 w +10 /LucidaSansUnicode20 f +(\031) 4207 4476 w +10 /LucidaSansUnicode00 f +(\),) 4239 4476 w +(and) 4340 4476 w +(returns) 4556 4476 w +(to) 4942 4476 w +(the) 720 4596 w +(top) 926 4596 w +(level) 1138 4596 w +(of) 1411 4596 w +(the) 1560 4596 w +(parser.) 1766 4596 w +(The) 2188 4596 w +(argument) 2420 4596 w +(to) 2939 4596 w +10 /LucidaTypewriter f +(error) 3088 4596 w +10 /LucidaSansUnicode00 f +(is) 3499 4596 w +(an) 3630 4596 w +(enumeration) 3797 4596 w +(type) 4461 4596 w +(that) 4719 4596 w +(is) 4960 4596 w +(translated) 720 4716 w +(to) 1255 4716 w +(a) 1402 4716 w +(terse) 1506 4716 w +(but) 1796 4716 w +(possibly) 2007 4716 w +(helpful) 2455 4716 w +(message) 2842 4716 w +(such) 3315 4716 w +(as) 3590 4716 w +10 /LucidaSansUnicode20 f +(\030) 3745 4716 w +10 /LucidaSansUnicode00 f +(?addresses) 3777 4716 w +(out) 4356 4716 w +(of) 4566 4716 w +(order.) 4714 4716 w +10 /LucidaSansUnicode20 f +(\031) 5008 4716 w +10 /LucidaSansUnicode00 f +(Very) 720 4836 w +(common) 982 4836 w +(messages) 1451 4836 w +(are) 1974 4836 w +(kept) 2174 4836 w +(short;) 2436 4836 w +(for) 2768 4836 w +(example) 2955 4836 w +(the) 3416 4836 w +(message) 3619 4836 w +(for) 4090 4836 w +(a) 4276 4836 w +(failed) 4378 4836 w +(regular) 4694 4836 w +(expression search is ) 720 4956 w +10 /LucidaSansUnicode20 f +(\030) 1743 4956 w +10 /LucidaSansUnicode00 f +(?search.) 1775 4956 w +10 /LucidaSansUnicode20 f +(\031) 2165 4956 w +10 /LucidaSansUnicode00 f +(Character) 970 5112 w +(addresses) 1478 5112 w +(such) 2006 5112 w +(as) 2273 5112 w +10 /LucidaTypewriter f +(#3) 2420 5112 w +10 /LucidaSansUnicode00 f +(are) 2605 5112 w +(trivial) 2798 5112 w +(to) 3111 5112 w +(implement,) 3250 5112 w +(as) 3841 5112 w +(the) 3988 5112 w +10 /LucidaTypewriter f +(File) 4184 5112 w +10 /LucidaSansUnicode00 f +(data) 4513 5112 w +(struc\255) 4765 5112 w +(ture) 720 5232 w +(is) 956 5232 w +(accessible) 1076 5232 w +(by) 1608 5232 w +(character) 1763 5232 w +(number.) 2252 5232 w +(However,) 2733 5232 w +10 /LucidaTypewriter f +(sam) 3222 5232 w +10 /LucidaSansUnicode00 f +(keeps) 3477 5232 w +(no) 3800 5232 w +(information) 3962 5232 w +(about) 4568 5232 w +(the) 4885 5232 w +(position) 720 5352 w +(of) 1151 5352 w +(newlines) 1287 5352 w +10 /LucidaSansUnicode20 f +(\024) 1747 5352 w +10 /LucidaSansUnicode00 f +(it) 1885 5352 w +(is) 1989 5352 w +(too) 2107 5352 w +(expensive) 2305 5352 w +(to) 2830 5352 w +(track) 2967 5352 w +(dynamically) 3248 5352 w +10 /LucidaSansUnicode20 f +(\024) 3857 5352 w +10 /LucidaSansUnicode00 f +(so) 3996 5352 w +(line) 4147 5352 w +(addresses) 4362 5352 w +(are) 4888 5352 w +(computed) 720 5472 w +(by) 1240 5472 w +(reading) 1389 5472 w +(the) 1791 5472 w +(file,) 1979 5472 w +(counting) 2195 5472 w +(newlines.) 2654 5472 w +(Except) 3173 5472 w +(in) 3528 5472 w +(very) 3652 5472 w +(large) 3886 5472 w +(files,) 4162 5472 w +(this) 4429 5472 w +(has) 4641 5472 w +(pro\255) 4842 5472 w +(ven) 720 5592 w +(acceptable:) 926 5592 w +(file) 1510 5592 w +(access) 1698 5592 w +(is) 2050 5592 w +(fast) 2167 5592 w +(enough) 2384 5592 w +(to) 2786 5592 w +(make) 2921 5592 w +(the) 3220 5592 w +(technique) 3412 5592 w +(practical,) 3927 5592 w +(and) 4407 5592 w +(lines) 4624 5592 w +(are) 4888 5592 w +(not central to the structure of the command language.) 720 5712 w +(The) 970 5868 w +(command) 1207 5868 w +(interpreter,) 1741 5868 w +(called) 2348 5868 w +10 /LucidaTypewriter f +(cmdexec) 2687 5868 w +10 /LucidaSansUnicode00 f +(,) 3191 5868 w +(is) 3279 5868 w +(also) 3415 5868 w +(straightforward.) 3667 5868 w +(The) 4536 5868 w +(parse) 4774 5868 w +(table) 720 5988 w +(includes) 1024 5988 w +(a) 1491 5988 w +(function) 1610 5988 w +(to) 2075 5988 w +(call) 2237 5988 w +(to) 2464 5988 w +(interpret) 2625 5988 w +(a) 3110 5988 w +(particular) 3228 5988 w +(command.) 3754 5988 w +(That) 4359 5988 w +(function) 4639 5988 w +(receives) 720 6108 w +(as) 1154 6108 w +(arguments) 1302 6108 w +(the) 1863 6108 w +(calculated) 2060 6108 w +(address) 2590 6108 w +(for) 3012 6108 w +(the) 3193 6108 w +(command) 3390 6108 w +(and) 3910 6108 w +(the) 4132 6108 w +(command) 4329 6108 w +(tree) 4850 6108 w +(\(of) 720 6228 w +(type) 893 6228 w +10 /LucidaTypewriter f +(Cmdtree) 1143 6228 w +10 /LucidaSansUnicode00 f +(\),) 1647 6228 w +(which) 1754 6228 w +(may) 2077 6228 w +(contain) 2319 6228 w +(information) 2718 6228 w +(such) 3327 6228 w +(as) 3594 6228 w +(the) 3741 6228 w +(subtree) 3937 6228 w +(for) 4344 6228 w +(compound) 4524 6228 w +(commands.) 720 6348 w +(Here, for example, is the function for the) 1345 6348 w +10 /LucidaTypewriter f +(g) 3374 6348 w +10 /LucidaSansUnicode00 f +(and) 3478 6348 w +10 /LucidaTypewriter f +(v) 3690 6348 w +10 /LucidaSansUnicode00 f +(commands:) 3794 6348 w +cleartomark +showpage +saveobj restore +%%EndPage: 16 16 +%%Page: 17 17 +/saveobj save def +mark +17 pagesetup +10 /LucidaSansUnicode00 f +(\255 17 \255) 2752 480 w +9 /LucidaTypewriter f +(int) 920 830 w +(g_cmd\(a,) 920 940 w +(cp\)) 1505 940 w +(Address) 1440 1050 w +(a;) 1960 1050 w +(Cmdtree) 1440 1160 w +(*cp;) 1960 1160 w +({) 920 1270 w +(compile\(cp->regexp\);) 1440 1380 w +(if\(execute\(a.f,) 1440 1490 w +(a.r.p1,) 2480 1490 w +(a.r.p2\)!=\(cp->cmdchar=='v'\)\){) 3000 1490 w +(a.f->dot=a;) 1960 1600 w +(return) 1960 1710 w +(cmdexec\(a,) 2415 1710 w +(cp->subcmd\);) 3130 1710 w +(}) 1440 1820 w +(return) 1440 1930 w +(TRUE;) 1895 1930 w +(/*) 2480 1930 w +(cause) 2675 1930 w +(execution) 3065 1930 w +(to) 3715 1930 w +(continue) 3910 1930 w +(*/) 4495 1930 w +(}) 920 2040 w +10 /LucidaSansUnicode00 f +(\() 720 2220 w +10 /LucidaTypewriter f +(Compile) 753 2220 w +10 /LucidaSansUnicode00 f +(and) 1289 2220 w +10 /LucidaTypewriter f +(execute) 1501 2220 w +10 /LucidaSansUnicode00 f +(are part of the) 2037 2220 w +(regular) 2767 2220 w +(expression) 3146 2220 w +(code,) 3710 2220 w +(described) 4006 2220 w +(in) 4512 2220 w +(the) 4636 2220 w +(next) 4824 2220 w +(section.\)) 720 2340 w +(Because) 1209 2340 w +(the) 1643 2340 w +(parser) 1843 2340 w +(and) 2195 2340 w +(the) 2420 2340 w +10 /LucidaTypewriter f +(File) 2620 2340 w +10 /LucidaSansUnicode00 f +(data) 2953 2340 w +(structure) 3208 2340 w +(do) 3690 2340 w +(most) 3858 2340 w +(of) 4144 2340 w +(the) 4286 2340 w +(work,) 4485 2340 w +(most) 4798 2340 w +(commands are similarly brief.) 720 2460 w +10 /LucidaSans-Demi f +(Regular expressions) 720 2700 w +10 /LucidaSansUnicode00 f +(The) 720 2856 w +(regular) 939 2856 w +(expression) 1323 2856 w +(code) 1892 2856 w +(in) 2161 2856 w +10 /LucidaTypewriter f +(sam) 2290 2856 w +10 /LucidaSansUnicode00 f +(is) 2544 2856 w +(an) 2662 2856 w +(interpreted,) 2817 2856 w +(rather) 3428 2856 w +(than) 3758 2856 w +(compiled) 4012 2856 w +(on-the-fly,) 4496 2856 w +(implementation) 720 2976 w +(of) 1547 2976 w +(Thompson) 1710 2976 w +10 /LucidaSansUnicode20 f +(\031) 2226 2976 w +10 /LucidaSansUnicode00 f +(s) 2258 2976 w +(non-deterministic) 2374 2976 w +(finite) 3316 2976 w +(automaton) 3631 2976 w +(algorithm.) 4218 2976 w +6 /LucidaSansUnicode00 f +(12) 4719 2926 w +10 /LucidaSansUnicode00 f +(The) 4859 2976 w +(syntax) 720 3096 w +(and) 1076 3096 w +(semantics) 1295 3096 w +(of) 1819 3096 w +(the) 1956 3096 w +(expressions) 2150 3096 w +(are) 2771 3096 w +(as) 2962 3096 w +(in) 3107 3096 w +(the) 3237 3096 w +(UNIX) 3431 3096 w +(program) 3705 3096 w +10 /LucidaTypewriter f +(egrep) 4160 3096 w +10 /LucidaSansUnicode00 f +(,) 4520 3096 w +(including) 4591 3096 w +(alternation,) 720 3216 w +(closures,) 1310 3216 w +(character) 1778 3216 w +(classes,) 2261 3216 w +(and) 2671 3216 w +(so) 2885 3216 w +(on.) 3031 3216 w +(The) 3252 3216 w +(only) 3467 3216 w +(changes) 3705 3216 w +(in) 4138 3216 w +(the) 4263 3216 w +(notation) 4451 3216 w +(are) 4888 3216 w +(two) 720 3336 w +(additions:) 928 3336 w +10 /LucidaTypewriter f +(\\n) 1443 3336 w +10 /LucidaSansUnicode00 f +(is) 1620 3336 w +(translated) 1734 3336 w +(to,) 2254 3336 w +(and) 2418 3336 w +(matches,) 2632 3336 w +(a) 3103 3336 w +(newline) 3192 3336 w +(character,) 3597 3336 w +(and) 4112 3336 w +10 /LucidaTypewriter f +(@) 4326 3336 w +10 /LucidaSansUnicode00 f +(matches) 4432 3336 w +(any) 4871 3336 w +(character.) 720 3456 w +(In) 1286 3456 w +10 /LucidaTypewriter f +(egrep) 1430 3456 w +10 /LucidaSansUnicode00 f +(,) 1790 3456 w +(the) 1875 3456 w +(character) 2082 3456 w +10 /LucidaTypewriter f +(.) 2583 3456 w +10 /LucidaSansUnicode00 f +(matches) 2707 3456 w +(any) 3164 3456 w +(character) 3385 3456 w +(except) 3886 3456 w +(newline,) 4262 3456 w +(and) 4717 3456 w +(in) 4949 3456 w +10 /LucidaTypewriter f +(sam) 720 3576 w +10 /LucidaSansUnicode00 f +(the) 980 3576 w +(same) 1179 3576 w +(rule) 1478 3576 w +(seemed) 1710 3576 w +(safest,) 2129 3576 w +(to) 2492 3576 w +(prevent) 2634 3576 w +(idioms) 3045 3576 w +(like) 3415 3576 w +10 /LucidaTypewriter f +(.*) 3631 3576 w +10 /LucidaSansUnicode00 f +(from) 3819 3576 w +(spanning) 4095 3576 w +(newlines.) 4586 3576 w +10 /LucidaTypewriter f +(Egrep) 720 3696 w +10 /LucidaSansUnicode00 f +(expressions) 1117 3696 w +(are) 1736 3696 w +(arguably) 1924 3696 w +(too) 2379 3696 w +(complicated) 2574 3696 w +(for) 3198 3696 w +(an) 3373 3696 w +(interactive) 3526 3696 w +(editor) 4067 3696 w +10 /LucidaSansUnicode20 f +(\024) 4390 3696 w +10 /LucidaSansUnicode00 f +(certainly) 4526 3696 w +(it) 4974 3696 w +(would) 720 3816 w +(make) 1059 3816 w +(sense) 1368 3816 w +(if) 1691 3816 w +(all) 1804 3816 w +(the) 1964 3816 w +(special) 2166 3816 w +(characters) 2547 3816 w +(were) 3094 3816 w +(two-character) 3371 3816 w +(sequences,) 4101 3816 w +(so) 4689 3816 w +(that) 4849 3816 w +(most) 720 3936 w +(of) 998 3936 w +(the) 1132 3936 w +(punctuation) 1323 3936 w +(characters) 1940 3936 w +(wouldn) 2476 3936 w +10 /LucidaSansUnicode20 f +(\031) 2830 3936 w +10 /LucidaSansUnicode00 f +(t) 2862 3936 w +(have) 2935 3936 w +(peculiar) 3196 3936 w +(meanings) 3618 3936 w +10 /LucidaSansUnicode20 f +(\024) 4124 3936 w +10 /LucidaSansUnicode00 f +(but) 4259 3936 w +(for) 4456 3936 w +(an) 4630 3936 w +(inter\255) 4782 3936 w +(esting) 720 4056 w +(command) 1060 4056 w +(language,) 1581 4056 w +(full) 2099 4056 w +(regular) 2299 4056 w +(expressions) 2688 4056 w +(are) 3313 4056 w +(necessary,) 3508 4056 w +(and) 4058 4056 w +10 /LucidaTypewriter f +(egrep) 4282 4056 w +10 /LucidaSansUnicode00 f +(defines) 4686 4056 w +(the) 720 4176 w +(full) 921 4176 w +(regular) 1124 4176 w +(expression) 1516 4176 w +(syntax) 2093 4176 w +(for) 2457 4176 w +(UNIX) 2642 4176 w +(programs.) 2923 4176 w +(Also,) 3500 4176 w +(it) 3788 4176 w +(seemed) 3900 4176 w +(superfluous) 4321 4176 w +(to) 4942 4176 w +(define) 720 4296 w +(a) 1056 4296 w +(new) 1144 4296 w +(syntax,) 1372 4296 w +(since) 1755 4296 w +(various) 2037 4296 w +(UNIX) 2421 4296 w +(programs) 2689 4296 w +(\() 3189 4296 w +10 /LucidaTypewriter f +(ed) 3222 4296 w +10 /LucidaSansUnicode00 f +(,) 3366 4296 w +10 /LucidaTypewriter f +(egrep) 3431 4296 w +10 /LucidaSansUnicode00 f +(and) 3824 4296 w +10 /LucidaTypewriter f +(vi) 4037 4296 w +10 /LucidaSansUnicode00 f +(\)) 4181 4296 w +(define) 4248 4296 w +(too) 4585 4296 w +(many) 4778 4296 w +(already.) 720 4416 w +(The) 970 4572 w +(expressions) 1188 4572 w +(are) 1807 4572 w +(compiled) 1996 4572 w +(by) 2479 4572 w +(a) 2632 4572 w +(routine,) 2725 4572 w +10 /LucidaTypewriter f +(compile) 3143 4572 w +10 /LucidaSansUnicode00 f +(,) 3647 4572 w +(that) 3717 4572 w +(generates) 3946 4572 w +(the) 4460 4572 w +(descrip\255) 4653 4572 w +(tion) 720 4692 w +(of) 951 4692 w +(the) 1091 4692 w +(non-deterministic) 1288 4692 w +(finite) 2207 4692 w +(state) 2499 4692 w +(machine.) 2776 4692 w +(A) 3289 4692 w +(second) 3399 4692 w +(routine,) 3784 4692 w +10 /LucidaTypewriter f +(execute) 4205 4692 w +10 /LucidaSansUnicode00 f +(,) 4709 4692 w +(inter\255) 4782 4692 w +(prets) 720 4812 w +(the) 1012 4812 w +(machine) 1211 4812 w +(to) 1663 4812 w +(generate) 1805 4812 w +(the) 2274 4812 w +(leftmost-longest) 2473 4812 w +(match) 3334 4812 w +(of) 3676 4812 w +(the) 3819 4812 w +(expression) 4019 4812 w +(in) 4595 4812 w +(a) 4731 4812 w +(sub\255) 4831 4812 w +(string) 720 4932 w +(of) 1042 4932 w +(the) 1180 4932 w +(file.) 1375 4932 w +(The) 1630 4932 w +(algorithm) 1851 4932 w +(is) 2360 4932 w +(described) 2479 4932 w +(elsewhere.) 2991 4932 w +6 /LucidaSansUnicode00 f +(12,13) 3507 4882 w +10 /LucidaTypewriter f +(Execute) 3717 4932 w +10 /LucidaSansUnicode00 f +(reports) 4260 4932 w +(whether) 4649 4932 w +(a) 720 5052 w +(match) 840 5052 w +(was) 1203 5052 w +(found,) 1451 5052 w +(and) 1833 5052 w +(sets) 2078 5052 w +(a) 2338 5052 w +(global) 2458 5052 w +(variable,) 2823 5052 w +(of) 3301 5052 w +(type) 3465 5052 w +10 /LucidaTypewriter f +(Range) 3739 5052 w +10 /LucidaSansUnicode00 f +(,) 4099 5052 w +(to) 4197 5052 w +(the) 4361 5052 w +(substring) 4582 5052 w +(matched.) 720 5172 w +(A) 970 5328 w +(trick) 1083 5328 w +(is) 1343 5328 w +(required) 1467 5328 w +(to) 1922 5328 w +(evaluate) 2064 5328 w +(the) 2510 5328 w +(expression) 2709 5328 w +(in) 3284 5328 w +(reverse,) 3419 5328 w +(such) 3848 5328 w +(as) 4118 5328 w +(when) 4269 5328 w +(searching) 4571 5328 w +(backwards for an expression.) 720 5448 w +(For example,) 2213 5448 w +9 /LucidaTypewriter f +(-/P.*r/) 920 5618 w +10 /LucidaSansUnicode00 f +(looks) 720 5798 w +(backwards) 1021 5798 w +(through) 1576 5798 w +(the) 2004 5798 w +(file) 2200 5798 w +(for) 2392 5798 w +(a) 2572 5798 w +(match) 2668 5798 w +(of) 3007 5798 w +(the) 3146 5798 w +(expression.) 3342 5798 w +(The) 3979 5798 w +(expression,) 4202 5798 w +(how\255) 4807 5798 w +(ever,) 720 5918 w +(is) 992 5918 w +(defined) 1107 5918 w +(for) 1507 5918 w +(a) 1680 5918 w +(forward) 1769 5918 w +(search.) 2178 5918 w +(The) 2592 5918 w +(solution) 2807 5918 w +(is) 3233 5918 w +(to) 3347 5918 w +(construct) 3479 5918 w +(a) 3966 5918 w +(machine) 4055 5918 w +(identical) 4497 5918 w +(to) 4942 5918 w +(the) 720 6038 w +(machine) 908 6038 w +(for) 1349 6038 w +(a) 1521 6038 w +(forward) 1609 6038 w +(search) 2017 6038 w +(except) 2366 6038 w +(for) 2723 6038 w +(a) 2895 6038 w +(reversal) 2983 6038 w +(of) 3397 6038 w +(all) 3528 6038 w +(the) 3674 6038 w +(concatenation) 3862 6038 w +(operators) 4574 6038 w +(\(the) 720 6158 w +(other) 950 6158 w +(operators) 1249 6158 w +(are) 1757 6158 w +(symmetric) 1951 6158 w +(under) 2496 6158 w +(direction) 2822 6158 w +(reversal\),) 3293 6158 w +(to) 3780 6158 w +(exchange) 3919 6158 w +(the) 4425 6158 w +(meaning) 4621 6158 w +(of) 720 6278 w +(the) 852 6278 w +(operators) 1041 6278 w +10 /LucidaTypewriter f +(^) 1541 6278 w +10 /LucidaSansUnicode00 f +(and) 1647 6278 w +10 /LucidaTypewriter f +($) 1861 6278 w +10 /LucidaSansUnicode00 f +(,) 1933 6278 w +(and) 1999 6278 w +(then) 2213 6278 w +(to) 2464 6278 w +(read) 2596 6278 w +(the) 2845 6278 w +(file) 3034 6278 w +(backwards,) 3219 6278 w +(looking) 3800 6278 w +(for) 4197 6278 w +(the) 4371 6278 w +(usual) 4561 6278 w +(ear\255) 4855 6278 w +(liest longest match.) 720 6398 w +10 /LucidaTypewriter f +(Execute) 970 6554 w +10 /LucidaSansUnicode00 f +(generates) 1521 6554 w +(only) 2044 6554 w +(one) 2295 6554 w +(match) 2521 6554 w +(each) 2866 6554 w +(time) 3137 6554 w +(it) 3399 6554 w +(is) 3512 6554 w +(called.) 3639 6554 w +(To) 4033 6554 w +(interpret) 4204 6554 w +(looping) 4673 6554 w +(constructs) 720 6674 w +(such) 1269 6674 w +(as) 1540 6674 w +(the) 1691 6674 w +10 /LucidaTypewriter f +(x) 1891 6674 w +10 /LucidaSansUnicode00 f +(command,) 2008 6674 w +10 /LucidaTypewriter f +(sam) 2563 6674 w +10 /LucidaSansUnicode00 f +(must) 2824 6674 w +(therefore) 3112 6674 w +(synchronize) 3604 6674 w +(between) 4232 6674 w +(calls) 4683 6674 w +(of) 4942 6674 w +10 /LucidaTypewriter f +(execute) 720 6794 w +10 /LucidaSansUnicode00 f +(to) 1260 6794 w +(avoid) 1395 6794 w +(problems) 1692 6794 w +(with) 2186 6794 w +(null) 2428 6794 w +(matches.) 2647 6794 w +(For) 3153 6794 w +(example,) 3346 6794 w +(even) 3828 6794 w +(given) 4091 6794 w +(the) 4389 6794 w +(leftmost-) 4581 6794 w +(longest) 720 6914 w +(rule,) 1120 6914 w +(the) 1382 6914 w +(expression) 1578 6914 w +10 /LucidaTypewriter f +(a*) 2150 6914 w +10 /LucidaSansUnicode00 f +(matches) 2335 6914 w +(three) 2781 6914 w +(times) 3074 6914 w +(in) 3381 6914 w +(the) 3513 6914 w +(string) 3709 6914 w +10 /LucidaTypewriter f +(ab) 4032 6914 w +10 /LucidaSansUnicode00 f +(\(the) 4217 6914 w +(character) 4446 6914 w +10 /LucidaTypewriter f +(a) 4936 6914 w +10 /LucidaSansUnicode00 f +(,) 5008 6914 w +(the) 720 7034 w +(null) 914 7034 w +(string) 1135 7034 w +(between) 1456 7034 w +(the) 1902 7034 w +10 /LucidaTypewriter f +(a) 2096 7034 w +10 /LucidaSansUnicode00 f +(and) 2207 7034 w +10 /LucidaTypewriter f +(b) 2426 7034 w +10 /LucidaSansUnicode00 f +(,) 2498 7034 w +(and) 2569 7034 w +(the) 2788 7034 w +(final) 2982 7034 w +(null) 3234 7034 w +(string\).) 3456 7034 w +(After) 3875 7034 w +(returning) 4155 7034 w +(a) 4647 7034 w +(match) 4742 7034 w +(for) 720 7154 w +(the) 917 7154 w +10 /LucidaTypewriter f +(a) 1130 7154 w +10 /LucidaSansUnicode00 f +(,) 1202 7154 w +10 /LucidaTypewriter f +(sam) 1292 7154 w +10 /LucidaSansUnicode00 f +(must) 1566 7154 w +(not) 1866 7154 w +(match) 2083 7154 w +(the) 2438 7154 w +(null) 2650 7154 w +(string) 2889 7154 w +(before) 3228 7154 w +(the) 3599 7154 w +10 /LucidaTypewriter f +(b) 3811 7154 w +10 /LucidaSansUnicode00 f +(.) 3883 7154 w +(The) 4004 7154 w +(algorithm) 4242 7154 w +(starts) 4768 7154 w +10 /LucidaTypewriter f +(execute) 720 7274 w +10 /LucidaSansUnicode00 f +(at) 1259 7274 w +(the) 1386 7274 w +(end) 1576 7274 w +(of) 1792 7274 w +(its) 1925 7274 w +(previous) 2077 7274 w +(match,) 2527 7274 w +(and) 2892 7274 w +(if) 3107 7274 w +(the) 3209 7274 w +(match) 3400 7274 w +(it) 3734 7274 w +(returns) 3836 7274 w +(is) 4222 7274 w +(null) 4338 7274 w +(and) 4556 7274 w +(abuts) 4772 7274 w +cleartomark +showpage +saveobj restore +%%EndPage: 17 17 +%%Page: 18 18 +/saveobj save def +mark +18 pagesetup +10 /LucidaSansUnicode00 f +(\255 18 \255) 2752 480 w +(the previous match, rejects the match and advances the initial position one character.) 720 840 w +10 /LucidaSans-Demi f +(Memory allocation) 720 1080 w +10 /LucidaSansUnicode00 f +(The) 720 1236 w +(C) 946 1236 w +(language) 1060 1236 w +(has) 1548 1236 w +(no) 1761 1236 w +(memory) 1929 1236 w +(allocation) 2370 1236 w +(primitives,) 2884 1236 w +(although) 3441 1236 w +(a) 3916 1236 w +(standard) 4016 1236 w +(library) 4488 1236 w +(rou\255) 4843 1236 w +(tine,) 720 1356 w +10 /LucidaTypewriter f +(malloc) 977 1356 w +10 /LucidaSansUnicode00 f +(,) 1409 1356 w +(provides) 1482 1356 w +(adequate) 1938 1356 w +(service) 2425 1356 w +(for) 2801 1356 w +(simple) 2980 1356 w +(programs.) 3341 1356 w +(For) 3912 1356 w +(specific) 4108 1356 w +(uses,) 4515 1356 w +(how\255) 4807 1356 w +(ever,) 720 1476 w +(it) 991 1476 w +(can) 1091 1476 w +(be) 1293 1476 w +(better) 1446 1476 w +(to) 1770 1476 w +(write) 1902 1476 w +(a) 2176 1476 w +(custom) 2265 1476 w +(allocator.) 2654 1476 w +(The) 3172 1476 w +(allocator) 3388 1476 w +(\(or) 3842 1476 w +(rather,) 4012 1476 w +(pair) 4371 1476 w +(of) 4594 1476 w +(alloca\255) 4727 1476 w +(tors\)) 720 1596 w +(described) 1008 1596 w +(here) 1546 1596 w +(work) 1826 1596 w +(in) 2128 1596 w +(both) 2283 1596 w +(the) 2570 1596 w +(terminal) 2789 1596 w +(and) 3255 1596 w +(host) 3499 1596 w +(parts) 3774 1596 w +(of) 4085 1596 w +10 /LucidaTypewriter f +(sam) 4247 1596 w +10 /LucidaSansUnicode00 f +(.) 4463 1596 w +(They) 4591 1596 w +(are) 4888 1596 w +(designed) 720 1716 w +(for) 1202 1716 w +(efficient) 1381 1716 w +(manipulation) 1815 1716 w +(of) 2493 1716 w +(strings,) 2632 1716 w +(which) 3038 1716 w +(are) 3360 1716 w +(allocated) 3553 1716 w +(and) 4030 1716 w +(freed) 4251 1716 w +(frequently) 4545 1716 w +(and) 720 1836 w +(vary) 943 1836 w +(in) 1186 1836 w +(length) 1320 1836 w +(from) 1671 1836 w +(essentially) 1946 1836 w +(zero) 2496 1836 w +(to) 2754 1836 w +(32) 2895 1836 w +(Kbytes) 3064 1836 w +(\(very) 3431 1836 w +(large) 3707 1836 w +(strings) 3992 1836 w +(are) 4367 1836 w +(written) 4561 1836 w +(to) 4942 1836 w +(disc\).) 720 1956 w +(More) 1066 1956 w +(important,) 1365 1956 w +(strings) 1930 1956 w +(may) 2318 1956 w +(be) 2573 1956 w +(large) 2747 1956 w +(and) 3045 1956 w +(change) 3280 1956 w +(size) 3683 1956 w +(often,) 3931 1956 w +(so) 4271 1956 w +(to) 4438 1956 w +(minimize) 4592 1956 w +(memory) 720 2076 w +(usage) 1164 2076 w +(it) 1498 2076 w +(is) 1612 2076 w +(helpful) 1740 2076 w +(to) 2126 2076 w +(reclaim) 2272 2076 w +(and) 2674 2076 w +(to) 2902 2076 w +(coalesce) 3048 2076 w +(the) 3505 2076 w +(unused) 3707 2076 w +(portions) 4110 2076 w +(of) 4562 2076 w +(strings) 4707 2076 w +(when they are truncated.) 720 2196 w +(Objects) 970 2352 w +(to) 1379 2352 w +(be) 1520 2352 w +(allocated) 1682 2352 w +(in) 2161 2352 w +10 /LucidaTypewriter f +(sam) 2295 2352 w +10 /LucidaSansUnicode00 f +(are) 2554 2352 w +(of) 2749 2352 w +(two) 2890 2352 w +(flavors:) 3108 2352 w +(the) 3509 2352 w +(first) 3707 2352 w +(is) 3945 2352 w +(C) 4068 2352 w +10 /LucidaTypewriter f +(structs) 4180 2352 w +10 /LucidaSansUnicode00 f +(,) 4684 2352 w +(which) 4759 2352 w +(are) 720 2472 w +(small) 913 2472 w +(and) 1211 2472 w +(often) 1432 2472 w +(addressed) 1726 2472 w +(by) 2265 2472 w +(pointer) 2420 2472 w +(variables;) 2809 2472 w +(the) 3312 2472 w +(second) 3507 2472 w +(is) 3891 2472 w +(variable-sized) 4011 2472 w +(arrays) 4745 2472 w +(of) 720 2592 w +(characters) 856 2592 w +(or) 1394 2592 w +(integers) 1534 2592 w +(whose) 1966 2592 w +(base) 2311 2592 w +(pointer) 2574 2592 w +(is) 2961 2592 w +(always) 3079 2592 w +(used) 3436 2592 w +(to) 3706 2592 w +(access) 3842 2592 w +(them.) 4195 2592 w +(The) 4545 2592 w +(mem\255) 4765 2592 w +(ory) 720 2712 w +(allocator) 919 2712 w +(in) 1383 2712 w +10 /LucidaTypewriter f +(sam) 1519 2712 w +10 /LucidaSansUnicode00 f +(is) 1780 2712 w +(therefore) 1905 2712 w +(in) 2397 2712 w +(two) 2532 2712 w +(parts:) 2751 2712 w +(first,) 3074 2712 w +(a) 3345 2712 w +(traditional) 3444 2712 w +(first-fit) 3986 2712 w +(allocator) 4386 2712 w +(that) 4849 2712 w +(provides) 720 2832 w +(fixed) 1174 2832 w +(storage) 1458 2832 w +(for) 1859 2832 w +10 /LucidaTypewriter f +(structs) 2036 2832 w +10 /LucidaSansUnicode00 f +(;) 2540 2832 w +(and) 2610 2832 w +(second,) 2828 2832 w +(a) 3242 2832 w +(garbage-compacting) 3336 2832 w +(allocator) 4391 2832 w +(that) 4849 2832 w +(reduces) 720 2952 w +(storage) 1141 2952 w +(overhead) 1545 2952 w +(for) 2032 2952 w +(variable-sized) 2212 2952 w +(objects,) 2947 2952 w +(at) 3369 2952 w +(the) 3502 2952 w +(cost) 3698 2952 w +(of) 3939 2952 w +(some) 4078 2952 w +(bookkeeping.) 4379 2952 w +(The) 720 3072 w +(two) 969 3072 w +(types) 1212 3072 w +(of) 1539 3072 w +(objects) 1705 3072 w +(are) 2122 3072 w +(allocated) 2342 3072 w +(from) 2846 3072 w +(adjoining) 3147 3072 w +(arenas,) 3669 3072 w +(with) 4090 3072 w +(the) 4364 3072 w +(garbage-) 4588 3072 w +(compacting) 720 3192 w +(allocator) 1329 3192 w +(controlling) 1793 3192 w +(the) 2362 3192 w +(arena) 2561 3192 w +(with) 2874 3192 w +(higher) 3123 3192 w +(addresses.) 3479 3192 w +(Separating) 4074 3192 w +(into) 4632 3192 w +(two) 4865 3192 w +(arenas) 720 3312 w +(simplifies) 1094 3312 w +(compaction) 1616 3312 w +(and) 2234 3312 w +(prevents) 2469 3312 w +(fragmentation) 2942 3312 w +(due) 3684 3312 w +(to) 3920 3312 w +(immovable) 4073 3312 w +(objects.) 4659 3312 w +(The) 720 3432 w +(access) 954 3432 w +(rules) 1322 3432 w +(for) 1614 3432 w +(garbage-compactable) 1806 3432 w +(objects) 2925 3432 w +(\(discussed) 3327 3432 w +(in) 3890 3432 w +(the) 4034 3432 w +(next) 4242 3432 w +(paragraph\)) 4510 3432 w +(allow) 720 3552 w +(them) 1031 3552 w +(to) 1339 3552 w +(be) 1497 3552 w +(relocated,) 1676 3552 w +(so) 2217 3552 w +(when) 2389 3552 w +(the) 2706 3552 w +(first-fit) 2921 3552 w +(arena) 3337 3552 w +(needs) 3666 3552 w +(space,) 4015 3552 w +(it) 4384 3552 w +(moves) 4511 3552 w +(the) 4885 3552 w +(garbage-compacted) 720 3672 w +(arena) 1740 3672 w +(to) 2047 3672 w +(higher) 2183 3672 w +(addresses) 2533 3672 w +(to) 3058 3672 w +(make) 3194 3672 w +(room.) 3494 3672 w +(Storage) 3852 3672 w +(is) 4256 3672 w +(therefore) 4374 3672 w +(cre\255) 4859 3672 w +(ated) 720 3792 w +(only) 965 3792 w +(at) 1203 3792 w +(successively) 1329 3792 w +(higher) 1954 3792 w +(addresses,) 2300 3792 w +(either) 2853 3792 w +(when) 3169 3792 w +(more) 3461 3792 w +(garbage-compacted) 3747 3792 w +(space) 4764 3792 w +(is needed or when the first-fit arena pushes up the other arena.) 720 3912 w +(Objects) 970 4068 w +(that) 1371 4068 w +(may) 1598 4068 w +(be) 1834 4068 w +(compacted) 1989 4068 w +(declare) 2555 4068 w +(to) 2942 4068 w +(the) 3076 4068 w +(allocator) 3267 4068 w +(a) 3722 4068 w +(cell) 3813 4068 w +(that) 4014 4068 w +(is) 4241 4068 w +(guaranteed) 4357 4068 w +(to) 4942 4068 w +(be) 720 4188 w +(the) 884 4188 w +(sole) 1084 4188 w +(repository) 1326 4188 w +(of) 1863 4188 w +(the) 2006 4188 w +(address) 2206 4188 w +(of) 2631 4188 w +(the) 2774 4188 w +(object) 2974 4188 w +(whenever) 3317 4188 w +(a) 3824 4188 w +(compaction) 3923 4188 w +(can) 4530 4188 w +(occur.) 4742 4188 w +(The) 720 4308 w +(compactor) 946 4308 w +(can) 1504 4308 w +(then) 1717 4308 w +(update) 1979 4308 w +(the) 2360 4308 w +(address) 2560 4308 w +(when) 2985 4308 w +(the) 3287 4308 w +(object) 3488 4308 w +(is) 3832 4308 w +(moved.) 3958 4308 w +(For) 4393 4308 w +(example,) 4595 4308 w +(the implementation of type) 720 4428 w +10 /LucidaTypewriter f +(List) 2071 4428 w +10 /LucidaSansUnicode00 f +(\(really a variable-length array\) is:) 2391 4428 w +9 /LucidaTypewriter f +(typedef) 920 4598 w +(struct) 1440 4598 w +(List{) 1895 4598 w +(int) 1440 4708 w +(nused;) 1960 4708 w +(long) 1440 4818 w +(*ptr;) 1960 4818 w +(}List;) 920 4928 w +10 /LucidaSansUnicode00 f +(The) 720 5108 w +10 /LucidaTypewriter f +(ptr) 945 5108 w +10 /LucidaSansUnicode00 f +(cell) 1205 5108 w +(must) 1414 5108 w +(always) 1701 5108 w +(be) 2064 5108 w +(used) 2228 5108 w +(directly,) 2505 5108 w +(and) 2940 5108 w +(never) 3165 5108 w +(copied.) 3477 5108 w +(When) 3909 5108 w +(a) 4220 5108 w +10 /LucidaTypewriter f +(List) 4320 5108 w +10 /LucidaSansUnicode00 f +(is) 4653 5108 w +(to) 4778 5108 w +(be) 4921 5108 w +(created) 720 5228 w +(the) 1112 5228 w +10 /LucidaTypewriter f +(List) 1300 5228 w +10 /LucidaSansUnicode00 f +(structure) 1621 5228 w +(is) 2092 5228 w +(allocated) 2205 5228 w +(in) 2674 5228 w +(the) 2798 5228 w +(ordinary) 2986 5228 w +(first-fit arena and its) 3423 5228 w +10 /LucidaTypewriter f +(ptr) 4473 5228 w +10 /LucidaSansUnicode00 f +(is allo\255) 4721 5228 w +(cated) 720 5348 w +(in) 1018 5348 w +(the) 1145 5348 w +(garbage-compacted) 1336 5348 w +(arena.) 2354 5348 w +(A) 2723 5348 w +(similar) 2828 5348 w +(data) 3191 5348 w +(type) 3437 5348 w +(for) 3681 5348 w +(strings,) 3856 5348 w +(called) 4257 5348 w +10 /LucidaTypewriter f +(String) 4576 5348 w +10 /LucidaSansUnicode00 f +(,) 5008 5348 w +(stores variable-length character arrays of up to 32767 elements.) 720 5468 w +(A) 970 5624 w +(related) 1075 5624 w +(matter) 1448 5624 w +(of) 1803 5624 w +(programming) 1937 5624 w +(style:) 2635 5624 w +10 /LucidaTypewriter f +(sam) 2928 5624 w +10 /LucidaSansUnicode00 f +(frequently) 3180 5624 w +(passes) 3712 5624 w +(structures) 4076 5624 w +(by) 4602 5624 w +(value,) 4754 5624 w +(which) 720 5744 w +(simplifies) 1048 5744 w +(the) 1562 5744 w +(code.) 1764 5744 w +(Traditionally,) 2106 5744 w +(C) 2790 5744 w +(programs) 2906 5744 w +(have) 3420 5744 w +(passed) 3692 5744 w +(structures) 4078 5744 w +(by) 4614 5744 w +(refer\255) 4776 5744 w +(ence,) 720 5864 w +(but) 1022 5864 w +(implicit) 1229 5864 w +(allocation) 1634 5864 w +(on) 2148 5864 w +(the) 2316 5864 w +(stack) 2516 5864 w +(is) 2813 5864 w +(easier) 2938 5864 w +(to) 3271 5864 w +(use.) 3414 5864 w +(Structure) 3693 5864 w +(passing) 4180 5864 w +(is) 4599 5864 w +(a) 4725 5864 w +(rela\255) 4826 5864 w +(tively) 720 5984 w +(new) 1012 5984 w +(feature) 1244 5984 w +(of) 1625 5984 w +(C) 1760 5984 w +(\(it) 1866 5984 w +(is) 2002 5984 w +(not) 2119 5984 w +(in) 2315 5984 w +(the) 2442 5984 w +(standard) 2633 5984 w +(reference) 3096 5984 w +(manual) 3588 5984 w +(for) 3980 5984 w +(C) 4155 5984 w +6 /LucidaSansUnicode00 f +(14) 4224 5934 w +10 /LucidaSansUnicode00 f +(\),) 4300 5984 w +(and) 4401 5984 w +(is) 4617 5984 w +(poorly) 4733 5984 w +(supported in most) 720 6104 w +(commercial) 1647 6104 w +(C) 2239 6104 w +(compilers.) 2341 6104 w +(It) 2912 6104 w +10 /LucidaSansUnicode20 f +(\031) 2978 6104 w +10 /LucidaSansUnicode00 f +(s) 3010 6104 w +(convenient) 3094 6104 w +(and) 3655 6104 w +(expressive,) 3868 6104 w +(though,) 4449 6104 w +(and) 4860 6104 w +(simplifies) 720 6224 w +(memory) 1244 6224 w +(management) 1696 6224 w +(by) 2383 6224 w +(avoiding) 2554 6224 w +(the) 3023 6224 w +(allocator) 3234 6224 w +(altogether) 3709 6224 w +(and) 4261 6224 w +(eliminating) 4497 6224 w +(pointer aliases.) 720 6344 w +10 /LucidaSans-Demi f +(Data structures for manipulating files) 720 6584 w +10 /LucidaSansUnicode00 f +(Experience) 720 6740 w +(with) 1289 6740 w +10 /LucidaTypewriter f +(jim) 1534 6740 w +10 /LucidaSansUnicode00 f +(showed) 1790 6740 w +(that) 2200 6740 w +(the) 2431 6740 w +(requirements) 2626 6740 w +(of) 3313 6740 w +(the) 3451 6740 w +(file) 3646 6740 w +(data) 3837 6740 w +(structure) 4088 6740 w +(were) 4567 6740 w +(few,) 4838 6740 w +(but) 720 6860 w +(strict.) 926 6860 w +(First,) 1279 6860 w +(files) 1566 6860 w +(need) 1811 6860 w +(to) 2091 6860 w +(be) 2232 6860 w +(read) 2394 6860 w +(and) 2652 6860 w +(written) 2875 6860 w +(quickly;) 3257 6860 w +(adding) 3676 6860 w +(a) 4053 6860 w +(fresh) 4151 6860 w +(file) 4441 6860 w +(must) 4635 6860 w +(be) 4921 6860 w +(painless.) 720 6980 w +(Second,) 1221 6980 w +(the) 1641 6980 w +(implementation) 1837 6980 w +(must) 2640 6980 w +(place) 2925 6980 w +(no) 3221 6980 w +(arbitrary) 3386 6980 w +(upper) 3842 6980 w +(limit) 4169 6980 w +(on) 4428 6980 w +(the) 4593 6980 w +(num\255) 4790 6980 w +(ber) 720 7100 w +(or) 915 7100 w +(sizes) 1052 7100 w +(of) 1331 7100 w +(files.) 1464 7100 w +(\(It) 1765 7100 w +(should) 1899 7100 w +(be) 2261 7100 w +(practical) 2414 7100 w +(to) 2859 7100 w +(edit) 2991 7100 w +(many) 3210 7100 w +(files,) 3506 7100 w +(and) 3774 7100 w +(files) 3988 7100 w +(up) 4224 7100 w +(to) 4383 7100 w +(megabytes) 4515 7100 w +(in) 720 7220 w +(length) 846 7220 w +(should) 1189 7220 w +(be) 1552 7220 w +(handled) 1707 7220 w +(gracefully.\)) 2133 7220 w +(This) 2740 7220 w +(implies) 2981 7220 w +(that) 3367 7220 w +(files) 3594 7220 w +(be) 3832 7220 w +(stored) 3987 7220 w +(on) 4332 7220 w +(disc,) 4491 7220 w +(not) 4753 7220 w +(in) 4949 7220 w +cleartomark +showpage +saveobj restore +%%EndPage: 18 18 +%%Page: 19 19 +/saveobj save def +mark +19 pagesetup +10 /LucidaSansUnicode00 f +(\255 19 \255) 2752 480 w +(main) 720 840 w +(memory.) 997 840 w +(\(Aficionados) 1495 840 w +(of) 2134 840 w +(virtual) 2270 840 w +(memory) 2613 840 w +(may) 3046 840 w +(argue) 3283 840 w +(otherwise,) 3596 840 w +(but) 4135 840 w +(the) 4334 840 w +(implemen\255) 4526 840 w +(tation) 720 960 w +(of) 1040 960 w +(virtual) 1177 960 w +(memory) 1521 960 w +(in) 1956 960 w +(our) 2086 960 w +(system) 2289 960 w +(is) 2668 960 w +(not) 2787 960 w +(something) 2986 960 w +(to) 3538 960 w +(depend) 3676 960 w +(on) 4079 960 w +(for) 4242 960 w +(good) 4421 960 w +(perfor\255) 4708 960 w +(mance.\)) 720 1080 w +(Third,) 1189 1080 w +(changes) 1534 1080 w +(to) 1988 1080 w +(files) 2141 1080 w +(need) 2398 1080 w +(be) 2690 1080 w +(made) 2864 1080 w +(by) 3186 1080 w +(only) 3356 1080 w +(two) 3615 1080 w +(primitives:) 3845 1080 w +(deletion) 4412 1080 w +(and) 4860 1080 w +(insertion.) 720 1200 w +(These) 1250 1200 w +(are) 1576 1200 w +(inverses) 1766 1200 w +(of) 2202 1200 w +(each) 2338 1200 w +(other,) 2600 1200 w +(which) 2927 1200 w +(simplifies) 3247 1200 w +(the) 3753 1200 w +(implementation) 3947 1200 w +(of) 4748 1200 w +(the) 4885 1200 w +(undo) 720 1320 w +(operation.) 1006 1320 w +(Finally,) 1573 1320 w +(it) 1953 1320 w +(must) 2057 1320 w +(be) 2338 1320 w +(easy) 2495 1320 w +(and) 2747 1320 w +(efficient) 2965 1320 w +(to) 3397 1320 w +(access) 3532 1320 w +(the) 3884 1320 w +(file,) 4076 1320 w +(either) 4296 1320 w +(forwards) 4614 1320 w +(or backwards, a byte at a time.) 720 1440 w +(The) 970 1596 w +10 /LucidaTypewriter f +(File) 1199 1596 w +10 /LucidaSansUnicode00 f +(data) 1535 1596 w +(type) 1793 1596 w +(is) 2049 1596 w +(constructed) 2177 1596 w +(from) 2797 1596 w +(three) 3077 1596 w +(simpler) 3377 1596 w +(data) 3788 1596 w +(structures) 4047 1596 w +(that) 4585 1596 w +(hold) 4825 1596 w +(arrays) 720 1716 w +(of) 1048 1716 w +(characters.) 1179 1716 w +(Each) 1776 1716 w +(of) 2031 1716 w +(these) 2162 1716 w +(types has an insertion and deletion operator, and the) 2457 1716 w +(insertion and deletion operators of the) 720 1836 w +10 /LucidaTypewriter f +(File) 2632 1836 w +10 /LucidaSansUnicode00 f +(type itself are constructed from them.) 2952 1836 w +(The) 970 1992 w +(simplest) 1192 1992 w +(type) 1642 1992 w +(is) 1891 1992 w +(the) 2012 1992 w +10 /LucidaTypewriter f +(String) 2208 1992 w +10 /LucidaSansUnicode00 f +(,) 2640 1992 w +(which) 2713 1992 w +(is) 3035 1992 w +(used) 3156 1992 w +(to) 3429 1992 w +(hold) 3568 1992 w +(strings) 3824 1992 w +(in) 4198 1992 w +(main) 4331 1992 w +(memory.) 4612 1992 w +(The) 720 2112 w +(code) 940 2112 w +(that) 1210 2112 w +(manages) 1440 2112 w +10 /LucidaTypewriter f +(Strings) 1913 2112 w +10 /LucidaSansUnicode00 f +(guarantees) 2456 2112 w +(that) 3032 2112 w +(they) 3262 2112 w +(will) 3508 2112 w +(never) 3711 2112 w +(be) 4017 2112 w +(longer) 4175 2112 w +(than) 4525 2112 w +(some) 4779 2112 w +(moderate) 720 2232 w +(size,) 1217 2232 w +(and) 1477 2232 w +(in) 1692 2232 w +(practice) 1818 2232 w +(they) 2236 2232 w +(are) 2478 2232 w +(rarely) 2665 2232 w +(larger) 2974 2232 w +(than) 3293 2232 w +(8) 3544 2232 w +(Kbytes.) 3642 2232 w +10 /LucidaTypewriter f +(Strings) 4065 2232 w +10 /LucidaSansUnicode00 f +(have) 4604 2232 w +(two) 4865 2232 w +(purposes:) 720 2352 w +(they) 1240 2352 w +(hold) 1487 2352 w +(short) 1742 2352 w +(strings) 2034 2352 w +(like) 2407 2352 w +(file) 2618 2352 w +(names) 2808 2352 w +(with) 3164 2352 w +(little) 3408 2352 w +(overhead,) 3664 2352 w +(and) 4181 2352 w +(because) 4400 2352 w +(they) 4833 2352 w +(are) 720 2472 w +(deliberately) 909 2472 w +(small,) 1512 2472 w +(they) 1838 2472 w +(are) 2082 2472 w +(efficient) 2272 2472 w +(to) 2704 2472 w +(modify.) 2840 2472 w +(They) 3277 2472 w +(are) 3548 2472 w +(therefore) 3738 2472 w +(used) 4223 2472 w +(as) 4493 2472 w +(the) 4637 2472 w +(data) 4830 2472 w +(structure for in-memory caches.) 720 2592 w +(The) 970 2748 w +(disc) 1188 2748 w +(copy) 1419 2748 w +(of) 1683 2748 w +(the) 1818 2748 w +(file) 2010 2748 w +(is) 2198 2748 w +(managed) 2315 2748 w +(by) 2798 2748 w +(a) 2950 2748 w +(data) 3042 2748 w +(structure) 3289 2748 w +(called) 3764 2748 w +(a) 4084 2748 w +10 /LucidaTypewriter f +(Disc) 4177 2748 w +10 /LucidaSansUnicode00 f +(,) 4465 2748 w +(which) 4535 2748 w +(cor\255) 4854 2748 w +(responds) 720 2868 w +(to) 1203 2868 w +(a) 1336 2868 w +(temporary) 1426 2868 w +(file.) 1960 2868 w +(A) 2210 2868 w +10 /LucidaTypewriter f +(Disc) 2314 2868 w +10 /LucidaSansUnicode00 f +(has) 2637 2868 w +(no) 2840 2868 w +(storage) 2998 2868 w +(in) 3395 2868 w +(main) 3520 2868 w +(memory) 3793 2868 w +(other) 4223 2868 w +(than) 4514 2868 w +(book\255) 4764 2868 w +(keeping information; the actual data being held is all on the) 720 2988 w +(disc.) 3665 2988 w +(To) 3956 2988 w +(reduce) 4113 2988 w +(the) 4475 2988 w +(number) 4663 2988 w +(of) 720 3108 w +(open) 872 3108 w +(files) 1167 3108 w +(needed,) 1422 3108 w +10 /LucidaTypewriter f +(sam) 1863 3108 w +10 /LucidaSansUnicode00 f +(opens) 2132 3108 w +(a) 2478 3108 w +(dozen) 2586 3108 w +(temporary) 2938 3108 w +(UNIX) 3490 3108 w +(files) 3778 3108 w +(and) 4033 3108 w +(multiplexes) 4266 3108 w +(the) 4885 3108 w +10 /LucidaTypewriter f +(Discs) 720 3228 w +10 /LucidaSansUnicode00 f +(upon) 1128 3228 w +(them.) 1424 3228 w +(This) 1784 3228 w +(permits) 2037 3228 w +(many) 2455 3228 w +(files) 2765 3228 w +(to) 3015 3228 w +(be) 3161 3228 w +(edited;) 3328 3228 w +(the) 3712 3228 w +(entire) 3915 3228 w +10 /LucidaTypewriter f +(sam) 4245 3228 w +10 /LucidaSansUnicode00 f +(source) 4510 3228 w +(\(48) 4881 3228 w +(files\)) 720 3348 w +(may) 997 3348 w +(be) 1239 3348 w +(edited) 1400 3348 w +(comfortably) 1746 3348 w +(with) 2368 3348 w +(a) 2615 3348 w +(single) 2712 3348 w +(instance) 3043 3348 w +(of) 3488 3348 w +10 /LucidaTypewriter f +(sam) 3628 3348 w +10 /LucidaSansUnicode00 f +(.) 3844 3348 w +(Allocating) 3950 3348 w +(one) 4476 3348 w +(tempo\255) 4697 3348 w +(rary) 720 3468 w +(file) 959 3468 w +(per) 1160 3468 w +10 /LucidaTypewriter f +(Disc) 1370 3468 w +10 /LucidaSansUnicode00 f +(would) 1708 3468 w +(strain) 2050 3468 w +(the) 2376 3468 w +(operating) 2582 3468 w +(system) 3099 3468 w +10 /LucidaSansUnicode20 f +(\031) 3439 3468 w +10 /LucidaSansUnicode00 f +(s) 3471 3468 w +(limit) 3573 3468 w +(on) 3841 3468 w +(the) 4015 3468 w +(number) 4221 3468 w +(of) 4649 3468 w +(open) 4798 3468 w +(files.) 720 3588 w +(Also,) 1041 3588 w +(spreading) 1338 3588 w +(the) 1875 3588 w +(traffic) 2085 3588 w +(among) 2426 3588 w +(temporary) 2813 3588 w +(files) 3366 3588 w +(keeps) 3622 3588 w +(the) 3960 3588 w +(files) 4169 3588 w +(shorter,) 4425 3588 w +(and) 4860 3588 w +(shorter files are more efficiently implemented by the UNIX I/O subsystem.) 720 3708 w +(A) 970 3864 w +10 /LucidaTypewriter f +(Disc) 1078 3864 w +10 /LucidaSansUnicode00 f +(is) 1405 3864 w +(an) 1524 3864 w +(array) 1680 3864 w +(of) 1964 3864 w +(fixed-length) 2102 3864 w +(blocks,) 2754 3864 w +(each) 3139 3864 w +(of) 3403 3864 w +(which) 3541 3864 w +(contains) 3862 3864 w +(between) 4310 3864 w +(1) 4757 3864 w +(and) 4860 3864 w +(4096) 720 3984 w +(characters) 1013 3984 w +(of) 1554 3984 w +(active) 1693 3984 w +(data.) 2013 3984 w +(\(The) 2327 3984 w +(block) 2581 3984 w +(size) 2883 3984 w +(of) 3116 3984 w +(our) 3254 3984 w +(UNIX) 3458 3984 w +(file) 3733 3984 w +(system) 3924 3984 w +(is) 4304 3984 w +(4096) 4424 3984 w +(bytes.\)) 4716 3984 w +(The) 720 4104 w +(block) 935 4104 w +(addresses) 1231 4104 w +(within) 1752 4104 w +(the) 2082 4104 w +(temporary) 2271 4104 w +(file) 2804 4104 w +(and) 2989 4104 w +(the) 3203 4104 w +(length) 3392 4104 w +(of) 3734 4104 w +(each) 3866 4104 w +(block) 4124 4104 w +(are) 4420 4104 w +(stored) 4606 4104 w +(in) 4949 4104 w +(a) 720 4224 w +10 /LucidaTypewriter f +(List) 818 4224 w +10 /LucidaSansUnicode00 f +(.) 1106 4224 w +(When) 1213 4224 w +(changes) 1522 4224 w +(are) 1964 4224 w +(made) 2159 4224 w +(the) 2469 4224 w +(live) 2666 4224 w +(part) 2874 4224 w +(of) 3112 4224 w +(blocks) 3252 4224 w +(may) 3607 4224 w +(change) 3849 4224 w +(size.) 4239 4224 w +(Blocks) 4538 4224 w +(are) 4888 4224 w +(created) 720 4344 w +(and) 1116 4344 w +(coalesced) 1333 4344 w +(when) 1843 4344 w +(necessary) 2137 4344 w +(to) 2649 4344 w +(try) 2785 4344 w +(to) 2953 4344 w +(keep) 3089 4344 w +(the) 3360 4344 w +(sizes) 3553 4344 w +(between) 3835 4344 w +(2048) 4280 4344 w +(and) 4570 4344 w +(4096) 4788 4344 w +(bytes.) 720 4464 w +(An) 1079 4464 w +(actively) 1246 4464 w +(changing) 1643 4464 w +(part) 2124 4464 w +(of) 2356 4464 w +(the) 2489 4464 w +10 /LucidaTypewriter f +(Disc) 2679 4464 w +10 /LucidaSansUnicode00 f +(therefore) 3002 4464 w +(typically) 3484 4464 w +(has) 3916 4464 w +(about) 4119 4464 w +(a) 4432 4464 w +(kilobyte) 4522 4464 w +(of) 4942 4464 w +(slop) 720 4584 w +(that) 962 4584 w +(can) 1191 4584 w +(be) 1397 4584 w +(inserted) 1554 4584 w +(or) 1987 4584 w +(deleted) 2127 4584 w +(without) 2525 4584 w +(changing) 2928 4584 w +(more) 3411 4584 w +(than) 3700 4584 w +(one) 3954 4584 w +(block) 4172 4584 w +(or) 4473 4584 w +(affecting) 4614 4584 w +(the) 720 4704 w +(block) 909 4704 w +(order.) 1205 4704 w +(When) 1565 4704 w +(an) 1865 4704 w +(insertion) 2016 4704 w +(would) 2478 4704 w +(overflow) 2804 4704 w +(a) 3252 4704 w +(block,) 3341 4704 w +(the) 3669 4704 w +(block) 3858 4704 w +(is) 4154 4704 w +(split,) 4268 4704 w +(a) 4543 4704 w +(new) 4632 4704 w +(one) 4861 4704 w +(is) 720 4824 w +(allocated) 855 4824 w +(to) 1346 4824 w +(receive) 1499 4824 w +(the) 1895 4824 w +(overflow,) 2105 4824 w +(and) 2606 4824 w +(the) 2841 4824 w +(memory-resident) 3051 4824 w +(list) 3955 4824 w +(of) 4156 4824 w +(blocks) 4309 4824 w +(is) 4678 4824 w +(rear\255) 4814 4824 w +(ranged to reflect the insertion of the new block.) 720 4944 w +(Obviously, going to the disc for every modification to the file is prohibitively) 970 5100 w +(expen\255) 4709 5100 w +(sive.) 720 5220 w +(The) 1014 5220 w +(data) 1237 5220 w +(type) 1489 5220 w +10 /LucidaTypewriter f +(Buffer) 1739 5220 w +10 /LucidaSansUnicode00 f +(consists) 2213 5220 w +(of) 2648 5220 w +(a) 2788 5220 w +10 /LucidaTypewriter f +(Disc) 2885 5220 w +10 /LucidaSansUnicode00 f +(to) 3215 5220 w +(hold) 3355 5220 w +(the) 3612 5220 w +(data) 3808 5220 w +(and) 4059 5220 w +(a) 4280 5220 w +10 /LucidaTypewriter f +(String) 4376 5220 w +10 /LucidaSansUnicode00 f +(that) 4849 5220 w +(acts) 720 5340 w +(as) 951 5340 w +(a) 1094 5340 w +(cache.) 1186 5340 w +(This) 1562 5340 w +(is) 1804 5340 w +(the) 1921 5340 w +(first) 2113 5340 w +(of) 2345 5340 w +(a) 2481 5340 w +(series) 2574 5340 w +(of) 2896 5340 w +(caches) 3032 5340 w +(throughout) 3396 5340 w +(the) 3981 5340 w +(data) 4174 5340 w +(structures) 4422 5340 w +(in) 4949 5340 w +10 /LucidaTypewriter f +(sam.) 720 5460 w +10 /LucidaSansUnicode00 f +(The) 1057 5460 w +(caches) 1287 5460 w +(not) 1662 5460 w +(only) 1871 5460 w +(improve) 2124 5460 w +(performance,) 2568 5460 w +(they) 3265 5460 w +(provide) 3520 5460 w +(a) 3933 5460 w +(way) 4036 5460 w +(to) 4268 5460 w +(organize) 4414 5460 w +(the) 4885 5460 w +(flow) 720 5580 w +(of) 975 5580 w +(data,) 1124 5580 w +(particularly) 1417 5580 w +(in) 2012 5580 w +(the) 2154 5580 w +(communication) 2360 5580 w +(between) 3157 5580 w +(the) 3615 5580 w +(host) 3822 5580 w +(and) 4085 5580 w +(terminal.) 4317 5580 w +(This) 4835 5580 w +(idea is developed below, in the section on communications.) 720 5700 w +(To) 970 5856 w +(reduce) 1144 5856 w +(disc) 1523 5856 w +(traffic,) 1767 5856 w +(changes) 2136 5856 w +(to) 2585 5856 w +(a) 2733 5856 w +10 /LucidaTypewriter f +(Buffer) 2838 5856 w +10 /LucidaSansUnicode00 f +(are) 3320 5856 w +(mediated) 3522 5856 w +(by) 4024 5856 w +(a) 4189 5856 w +(variable-length) 4294 5856 w +(string,) 720 5976 w +(in) 1084 5976 w +(memory,) 1225 5976 w +(that) 1703 5976 w +(acts) 1944 5976 w +(as) 2188 5976 w +(a) 2344 5976 w +(cache.) 2449 5976 w +(When) 2838 5976 w +(an) 3154 5976 w +(insertion) 3321 5976 w +(or) 3799 5976 w +(deletion) 3951 5976 w +(is) 4393 5976 w +(made) 4522 5976 w +(to) 4838 5976 w +(a) 4985 5976 w +10 /LucidaTypewriter f +(Buffer) 720 6096 w +10 /LucidaSansUnicode00 f +(,) 1152 6096 w +(if) 1234 6096 w +(the) 1350 6096 w +(change) 1555 6096 w +(can) 1953 6096 w +(be) 2171 6096 w +(accommodated) 2340 6096 w +(by) 3130 6096 w +(the) 3296 6096 w +(cache,) 3502 6096 w +(it) 3860 6096 w +(is) 3977 6096 w +(done) 4108 6096 w +(there.) 4401 6096 w +(If) 4768 6096 w +(the) 4885 6096 w +(cache) 720 6216 w +(becomes) 1033 6216 w +(bigger) 1502 6216 w +(than) 1853 6216 w +(a) 2107 6216 w +(block) 2200 6216 w +(because) 2500 6216 w +(of) 2932 6216 w +(an) 3068 6216 w +(insertion,) 3223 6216 w +(some) 3721 6216 w +(of) 4019 6216 w +(it) 4154 6216 w +(is) 4257 6216 w +(written) 4374 6216 w +(to) 4750 6216 w +(the) 4885 6216 w +10 /LucidaTypewriter f +(Disc) 720 6336 w +10 /LucidaSansUnicode00 f +(and) 1040 6336 w +(deleted) 1253 6336 w +(from) 1646 6336 w +(the) 1911 6336 w +(cache.) 2099 6336 w +(If) 2471 6336 w +(the) 2570 6336 w +(change) 2758 6336 w +(does) 3139 6336 w +(not) 3403 6336 w +(intersect) 3596 6336 w +(the) 4049 6336 w +(cache,) 4237 6336 w +(the) 4577 6336 w +(cache) 4765 6336 w +(is) 720 6456 w +(flushed.) 838 6456 w +(The) 1300 6456 w +(cache) 1519 6456 w +(is) 1832 6456 w +(only) 1950 6456 w +(loaded) 2192 6456 w +(at) 2557 6456 w +(the) 2687 6456 w +(new) 2880 6456 w +(position) 3113 6456 w +(if) 3544 6456 w +(the) 3647 6456 w +(change) 3839 6456 w +(is) 4224 6456 w +(smaller) 4341 6456 w +(than) 4732 6456 w +(a) 4985 6456 w +(block;) 720 6576 w +(otherwise,) 1048 6576 w +(it) 1584 6576 w +(is) 1684 6576 w +(sent) 1799 6576 w +(directly) 2040 6576 w +(to) 2433 6576 w +(the) 2566 6576 w +10 /LucidaTypewriter f +(Disc) 2756 6576 w +10 /LucidaSansUnicode00 f +(.) 3044 6576 w +(This) 3143 6576 w +(is) 3383 6576 w +(because) 3498 6576 w +(large) 3927 6576 w +(changes) 4205 6576 w +(are) 4639 6576 w +(typi\255) 4826 6576 w +(cally sequential, whereupon the next change is unlikely to overlap the current one.) 720 6696 w +(A) 970 6852 w +10 /LucidaTypewriter f +(File) 1079 6852 w +10 /LucidaSansUnicode00 f +(comprises) 1407 6852 w +(a) 1943 6852 w +10 /LucidaTypewriter f +(String) 2038 6852 w +10 /LucidaSansUnicode00 f +(to) 2510 6852 w +(hold) 2648 6852 w +(the) 2903 6852 w +(file) 3098 6852 w +(name) 3289 6852 w +(and) 3596 6852 w +(some) 3817 6852 w +(ancillary) 4119 6852 w +(data) 4563 6852 w +(such) 4814 6852 w +(as) 720 6972 w +(dot) 876 6972 w +(and) 1087 6972 w +(the) 1317 6972 w +(modified) 1522 6972 w +(bit.) 2003 6972 w +(The) 2246 6972 w +(most) 2477 6972 w +(important) 2768 6972 w +(components,) 3295 6972 w +(though,) 3973 6972 w +(are) 4400 6972 w +(a) 4601 6972 w +(pair) 4705 6972 w +(of) 4942 6972 w +10 /LucidaTypewriter f +(Buffers) 720 7092 w +10 /LucidaSansUnicode00 f +(,) 1224 7092 w +(one) 1294 7092 w +(called) 1511 7092 w +(the) 1832 7092 w +(transcript) 2025 7092 w +(and) 2530 7092 w +(the) 2748 7092 w +(other) 2941 7092 w +(the) 3236 7092 w +(contents.) 3430 7092 w +(Their) 3950 7092 w +(use) 4240 7092 w +(is) 4448 7092 w +(described) 4567 7092 w +(in the next section.) 720 7212 w +cleartomark +showpage +saveobj restore +%%EndPage: 19 19 +%%Page: 20 20 +/saveobj save def +mark +20 pagesetup +10 /LucidaSansUnicode00 f +(\255 20 \255) 2752 480 w +(The) 970 840 w +(overall) 1191 840 w +(structure) 1554 840 w +(is) 2032 840 w +(shown) 2152 840 w +(in) 2506 840 w +(Figure) 2638 840 w +(5.) 2983 840 w +(Although) 3151 840 w +(it) 3636 840 w +(may) 3743 840 w +(seem) 3984 840 w +(that) 4281 840 w +(the) 4513 840 w +(data) 4709 840 w +(is) 4960 840 w +(touched) 720 960 w +(many) 1163 960 w +(times) 1476 960 w +(on) 1793 960 w +(its) 1967 960 w +(way) 2135 960 w +(from) 2370 960 w +(the) 2653 960 w +10 /LucidaTypewriter f +(Disc) 2859 960 w +10 /LucidaSansUnicode00 f +(,) 3147 960 w +(it) 3230 960 w +(is) 3346 960 w +(read) 3476 960 w +(\(by) 3741 960 w +(one) 3939 960 w +(UNIX) 4168 960 w +(system) 4453 960 w +(call\)) 4843 960 w +(directly) 720 1080 w +(into) 1130 1080 w +(the) 1372 1080 w +(cache) 1580 1080 w +(of) 1908 1080 w +(the) 2059 1080 w +(associated) 2267 1080 w +10 /LucidaTypewriter f +(Buffer) 2829 1080 w +10 /LucidaSansUnicode00 f +(;) 3261 1080 w +(no) 3346 1080 w +(extra) 3522 1080 w +(copy) 3825 1080 w +(is) 4105 1080 w +(done.) 4238 1080 w +(Similarly,) 4597 1080 w +(when) 720 1200 w +(flushing) 1012 1200 w +(the) 1441 1200 w +(cache,) 1631 1200 w +(the) 1973 1200 w +(text) 2163 1200 w +(is) 2389 1200 w +(written) 2504 1200 w +(directly) 2878 1200 w +(from) 3271 1200 w +(the) 3538 1200 w +(cache) 3728 1200 w +(to) 4038 1200 w +(disc.) 4170 1200 w +(Most) 4462 1200 w +(opera\255) 4731 1200 w +(tions) 720 1320 w +(act) 1002 1320 w +(directly) 1187 1320 w +(on) 1587 1320 w +(the) 1752 1320 w +(text) 1950 1320 w +(in) 2184 1320 w +(the) 2318 1320 w +(cache.) 2516 1320 w +(A) 2898 1320 w +(principle) 3010 1320 w +(applied) 3476 1320 w +(throughout) 3877 1320 w +10 /LucidaTypewriter f +(sam) 4467 1320 w +10 /LucidaSansUnicode00 f +(is) 4726 1320 w +(that) 4849 1320 w +(the) 720 1440 w +(fewer) 908 1440 w +(times) 1208 1440 w +(the) 1507 1440 w +(data) 1695 1440 w +(is) 1938 1440 w +(copied,) 2051 1440 w +(the) 2439 1440 w +(faster) 2627 1440 w +(the) 2937 1440 w +(program) 3125 1440 w +(will) 3574 1440 w +(run) 3771 1440 w +(\(see) 3969 1440 w +(also) 4198 1440 w +(the) 4427 1440 w +(paper by) 4615 1440 w +(Waite) 720 1560 w +6 /LucidaSansUnicode00 f +(15) 983 1510 w +10 /LucidaSansUnicode00 f +(\).) 1059 1560 w +2908 2931 2908 2643 Dl +2908 2643 3541 2643 Dl +3542 2643 3542 2931 Dl +3542 2931 2909 2931 Dl +10 /LucidaTypewriter f +(Disc) 3081 2807 w +2908 3334 2908 3046 Dl +2908 3046 3541 3046 Dl +3542 3046 3542 3334 Dl +3542 3334 2909 3334 Dl +10 /LucidaSansUnicode00 f +(temp. file) 2993 3210 w +3225 3046 3225 2931 Dl +1584 2931 1584 2643 Dl +1584 2643 2217 2643 Dl +2217 2643 2217 2931 Dl +2217 2931 1584 2931 Dl +10 /LucidaTypewriter f +(Disc) 1756 2807 w +1584 3334 1584 3046 Dl +1584 3046 2217 3046 Dl +2217 3046 2217 3334 Dl +2217 3334 1584 3334 Dl +10 /LucidaSansUnicode00 f +(temp. file) 1668 3210 w +1900 3046 1900 2931 Dl +1584 2470 1584 2182 Dl +1584 2182 2217 2182 Dl +2217 2182 2217 2470 Dl +2217 2470 1584 2470 Dl +10 /LucidaTypewriter f +(Buffer) 1684 2286 w +10 /LucidaSansUnicode00 f +(\(transcript\)) 1634 2406 w +2332 2470 2332 2182 Dl +2332 2182 2850 2182 Dl +2851 2182 2851 2470 Dl +2851 2470 2333 2470 Dl +10 /LucidaTypewriter f +(String) 2376 2286 w +10 /LucidaSansUnicode00 f +(\(cache\)) 2422 2406 w +2332 2326 2217 2326 Dl +2908 2470 2908 2182 Dl +2908 2182 3541 2182 Dl +3542 2182 3542 2470 Dl +3542 2470 2909 2470 Dl +10 /LucidaTypewriter f +(Buffer) 3009 2286 w +10 /LucidaSansUnicode00 f +(\(contents\)) 2984 2406 w +3657 2470 3657 2182 Dl +3657 2182 4175 2182 Dl +4176 2182 4176 2470 Dl +4176 2470 3658 2470 Dl +10 /LucidaTypewriter f +(String) 3700 2286 w +10 /LucidaSansUnicode00 f +(\(cache\)) 3746 2406 w +3657 2326 3542 2326 Dl +2124 2010 2124 1722 Dl +2124 1722 2930 1722 Dl +2930 1722 2930 2010 Dl +2930 2010 2124 2010 Dl +10 /LucidaTypewriter f +(File) 2383 1886 w +1900 2643 1900 2471 Dl +3225 2643 3225 2471 Dl +1900 2182 1900 2096 Dl +1900 2096 2260 2096 Dl +2260 2096 2260 2010 Dl +3225 2182 3225 2096 Dl +3225 2096 2793 2096 Dl +2793 2096 2793 2010 Dl +8 /LucidaSans-Italic f +(Figure) 720 3512 w +(5.) 995 3512 w +(File) 1101 3512 w +(data) 1262 3512 w +(structures.) 1469 3512 w +(The) 1947 3512 w +(temporary) 2119 3512 w +(files) 2559 3512 w +(are) 2746 3512 w +(stored) 2906 3512 w +(in) 3181 3512 w +(the) 3285 3512 w +(standard) 3438 3512 w +(repository) 3822 3512 w +(for) 4248 3512 w +(such) 4393 3512 w +(files) 4603 3512 w +(on) 4791 3512 w +(the) 4918 3512 w +(host) 720 3612 w +(system.) 911 3612 w +10 /LucidaSansUnicode00 f +(The) 970 3888 w +(contents) 1195 3888 w +(of) 1656 3888 w +(a) 1798 3888 w +10 /LucidaTypewriter f +(File) 1897 3888 w +10 /LucidaSansUnicode00 f +(are) 2229 3888 w +(accessed) 2425 3888 w +(by) 2903 3888 w +(a) 3062 3888 w +(routine) 3162 3888 w +(that) 3555 3888 w +(copies) 3791 3888 w +(to) 4147 3888 w +(a) 4290 3888 w +(buffer) 4390 3888 w +(a) 4731 3888 w +(sub\255) 4831 3888 w +(string) 720 4008 w +(of) 1038 4008 w +(a) 1172 4008 w +(file) 1263 4008 w +(starting) 1450 4008 w +(at) 1859 4008 w +(a) 1986 4008 w +(specified) 2076 4008 w +(offset.) 2546 4008 w +(To) 2924 4008 w +(read) 3083 4008 w +(a) 3333 4008 w +(byte) 3423 4008 w +(at) 3666 4008 w +(a) 3793 4008 w +(time,) 3883 4008 w +(a) 4165 4008 w +(per-) 4255 4008 w +10 /LucidaTypewriter f +(File) 4473 4008 w +10 /LucidaSansUnicode00 f +(array) 4796 4008 w +(is) 720 4128 w +(loaded) 836 4128 w +(starting) 1199 4128 w +(from) 1609 4128 w +(a) 1877 4128 w +(specified) 1968 4128 w +(initial) 2439 4128 w +(position,) 2745 4128 w +(and) 3206 4128 w +(bytes) 3422 4128 w +(may) 3717 4128 w +(then) 3954 4128 w +(be) 4208 4128 w +(read) 4364 4128 w +(from) 4616 4128 w +(the) 4885 4128 w +(array.) 720 4248 w +(The) 1082 4248 w +(implementation) 1317 4248 w +(is) 2133 4248 w +(done) 2267 4248 w +(by) 2563 4248 w +(a) 2732 4248 w +(macro) 2841 4248 w +(similar) 3196 4248 w +(to) 3577 4248 w +(the) 3729 4248 w +(C) 3937 4248 w +(standard) 4059 4248 w +(I/O) 4539 4248 w +10 /LucidaTypewriter f +(getc) 4752 4248 w +10 /LucidaSansUnicode00 f +(macro.) 720 4368 w +6 /LucidaSansUnicode00 f +(14) 1053 4318 w +10 /LucidaSansUnicode00 f +(Because) 1163 4368 w +(the) 1586 4368 w +(reading) 1775 4368 w +(may) 2178 4368 w +(be) 2413 4368 w +(done) 2567 4368 w +(at) 2844 4368 w +(any) 2971 4368 w +(address,) 3175 4368 w +(a) 3622 4368 w +(minor) 3712 4368 w +(change) 4033 4368 w +(to) 4416 4368 w +(the) 4549 4368 w +(macro) 4739 4368 w +(allows the file to be read backwards.) 720 4488 w +(This array is read-only; there is no) 2562 4488 w +10 /LucidaTypewriter f +(putc) 4279 4488 w +10 /LucidaSansUnicode00 f +(.) 4567 4488 w +10 /LucidaSans-Demi f +(Doing and undoing) 720 4728 w +10 /LucidaTypewriter f +(Sam) 720 4884 w +10 /LucidaSansUnicode00 f +(has) 984 4884 w +(an) 1200 4884 w +(unusual) 1365 4884 w +(method) 1796 4884 w +(for) 2216 4884 w +(managing) 2403 4884 w +(changes) 2931 4884 w +(to) 3378 4884 w +(files.) 3525 4884 w +(The) 3840 4884 w +(command) 4070 4884 w +(language) 4597 4884 w +(makes) 720 5004 w +(it) 1066 5004 w +(easy) 1165 5004 w +(to) 1412 5004 w +(specify) 1543 5004 w +(multiple) 1915 5004 w +(variable-length) 2346 5004 w +(changes) 3125 5004 w +(to) 3557 5004 w +(a file millions of bytes long,) 3688 5004 w +(and) 720 5124 w +(such) 946 5124 w +(changes) 1218 5124 w +(must) 1663 5124 w +(be) 1952 5124 w +(made) 2117 5124 w +(efficiently) 2430 5124 w +(if) 2951 5124 w +(the) 3063 5124 w +(editor) 3264 5124 w +(is) 3597 5124 w +(to) 3723 5124 w +(be) 3867 5124 w +(practical.) 4032 5124 w +(The) 4553 5124 w +(usual) 4781 5124 w +(techniques) 720 5244 w +(for) 1304 5244 w +(inserting) 1498 5244 w +(and) 1981 5244 w +(deleting) 2215 5244 w +(strings) 2663 5244 w +(are) 3050 5244 w +(inadequate) 3256 5244 w +(under) 3848 5244 w +(these) 4186 5244 w +(conditions.) 4502 5244 w +(The) 720 5364 w +10 /LucidaTypewriter f +(Buffer) 953 5364 w +10 /LucidaSansUnicode00 f +(and) 1437 5364 w +10 /LucidaTypewriter f +(Disc) 1669 5364 w +10 /LucidaSansUnicode00 f +(data) 2009 5364 w +(structures) 2271 5364 w +(are) 2812 5364 w +(designed) 3016 5364 w +(for) 3510 5364 w +(efficient) 3701 5364 w +(random) 4147 5364 w +(access) 4574 5364 w +(to) 4942 5364 w +(long) 720 5484 w +(strings,) 972 5484 w +(but) 1375 5484 w +(care) 1575 5484 w +(must) 1816 5484 w +(be) 2097 5484 w +(taken) 2254 5484 w +(to) 2560 5484 w +(avoid) 2695 5484 w +(super-linear) 2992 5484 w +(behavior) 3632 5484 w +(when) 4088 5484 w +(making) 4382 5484 w +(many) 4778 5484 w +(changes simultaneously.) 720 5604 w +10 /LucidaTypewriter f +(Sam) 970 5760 w +10 /LucidaSansUnicode00 f +(uses) 1221 5760 w +(a) 1476 5760 w +(two-pass) 1566 5760 w +(algorithm) 2054 5760 w +(for) 2558 5760 w +(making) 2732 5760 w +(changes,) 3126 5760 w +(and) 3592 5760 w +(treats) 3807 5760 w +(each) 4119 5760 w +(file) 4378 5760 w +(as) 4564 5760 w +(a) 4706 5760 w +(data\255) 4797 5760 w +(base) 720 5880 w +(against) 992 5880 w +(which) 1390 5880 w +(transactions) 1718 5880 w +(are) 2357 5880 w +(registered.) 2555 5880 w +(Changes) 3157 5880 w +(are) 3620 5880 w +(not) 3818 5880 w +(made) 4024 5880 w +(directly) 4337 5880 w +(to) 4741 5880 w +(the) 4885 5880 w +(contents.) 720 6000 w +(Instead,) 1238 6000 w +(when) 1660 6000 w +(a) 1954 6000 w +(command) 2046 6000 w +(is) 2561 6000 w +(started,) 2678 6000 w +(a) 3087 6000 w +10 /LucidaSansUnicode20 f +(\030) 3179 6000 w +10 /LucidaSansUnicode00 f +(mark) 3211 6000 w +10 /LucidaSansUnicode20 f +(\031) 3458 6000 w +10 /LucidaSansUnicode00 f +(containing) 3527 6000 w +(a) 4075 6000 w +(sequence) 4168 6000 w +(number) 4663 6000 w +(is) 720 6120 w +(placed) 842 6120 w +(in) 1201 6120 w +(the) 1334 6120 w +(transcript) 1531 6120 w +10 /LucidaTypewriter f +(Buffer) 2040 6120 w +10 /LucidaSansUnicode00 f +(,) 2472 6120 w +(and) 2546 6120 w +(each) 2767 6120 w +(change) 3032 6120 w +(made) 3421 6120 w +(to) 3729 6120 w +(the) 3868 6120 w +(file,) 4064 6120 w +(either) 4288 6120 w +(an) 4610 6120 w +(inser\255) 4768 6120 w +(tion) 720 6240 w +(or) 949 6240 w +(deletion) 1091 6240 w +(or) 1524 6240 w +(a) 1666 6240 w +(change) 1761 6240 w +(to) 2149 6240 w +(the) 2287 6240 w +(file) 2482 6240 w +(name,) 2673 6240 w +(is) 3011 6240 w +(appended) 3131 6240 w +(to) 3652 6240 w +(the) 3790 6240 w +(end) 3985 6240 w +(of) 4206 6240 w +(the) 4345 6240 w +(transcript.) 4541 6240 w +(When) 720 6360 w +(the) 1030 6360 w +(command) 1228 6360 w +(is) 1749 6360 w +(complete,) 1872 6360 w +(the) 2393 6360 w +(transcript) 2591 6360 w +(is) 3101 6360 w +(rewound) 3224 6360 w +(to) 3689 6360 w +(the) 3830 6360 w +(mark) 4028 6360 w +(and) 4318 6360 w +(applied) 4541 6360 w +(to) 4942 6360 w +(the contents.) 720 6480 w +(One) 970 6636 w +(reason) 1217 6636 w +(for) 1594 6636 w +(separating) 1784 6636 w +(evaluation) 2346 6636 w +(from) 2895 6636 w +(application) 3179 6636 w +(in) 3765 6636 w +(this) 3908 6636 w +(way) 4139 6636 w +(is) 4375 6636 w +(to) 4507 6636 w +(simplify) 4657 6636 w +(tracking) 720 6756 w +(the) 1161 6756 w +(addresses) 1362 6756 w +(of) 1895 6756 w +(changes) 2039 6756 w +(made) 2484 6756 w +(in) 2797 6756 w +(the) 2934 6756 w +(middle) 3135 6756 w +(of) 3513 6756 w +(a) 3656 6756 w +(long) 3756 6756 w +(sequence.) 4015 6756 w +(The) 4581 6756 w +(two-) 4807 6756 w +(pass) 720 6876 w +(algorithm) 993 6876 w +(also) 1515 6876 w +(allows) 1764 6876 w +(all) 2119 6876 w +(changes) 2285 6876 w +(to) 2738 6876 w +(apply) 2890 6876 w +(to) 3206 6876 w +(the) 3358 6876 w +10 /LucidaSans-Italic f +(original) 3567 6876 w +10 /LucidaSansUnicode00 f +(data:) 3997 6876 w +(no) 4293 6876 w +(change) 4470 6876 w +(can) 4872 6876 w +(affect) 720 6996 w +(another) 1031 6996 w +(change) 1443 6996 w +(made) 1829 6996 w +(in) 2134 6996 w +(the) 2263 6996 w +(same) 2456 6996 w +(command.) 2749 6996 w +(This) 3328 6996 w +(is) 3570 6996 w +(particularly) 3687 6996 w +(important) 4268 6996 w +(when) 4783 6996 w +(evaluating) 720 7116 w +(an) 1263 7116 w +10 /LucidaTypewriter f +(x) 1424 7116 w +10 /LucidaSansUnicode00 f +(command) 1540 7116 w +(because) 2062 7116 w +(it) 2500 7116 w +(prevents) 2610 7116 w +(regular) 3072 7116 w +(expression) 3462 7116 w +(matches) 4037 7116 w +(from) 4487 7116 w +(stum\255) 4764 7116 w +(bling) 720 7236 w +(over) 1024 7236 w +(changes) 1293 7236 w +(made) 1751 7236 w +(earlier) 2077 7236 w +(in) 2443 7236 w +(the) 2593 7236 w +(execution.) 2807 7236 w +(Also,) 3405 7236 w +(the) 3706 7236 w +(two-pass) 3920 7236 w +(algorithm) 4432 7236 w +(is) 4960 7236 w +cleartomark +showpage +saveobj restore +%%EndPage: 20 20 +%%Page: 21 21 +/saveobj save def +mark +21 pagesetup +10 /LucidaSansUnicode00 f +(\255 21 \255) 2752 480 w +(cleaner) 720 840 w +(than) 1103 840 w +(the) 1352 840 w +(way) 1540 840 w +(other) 1757 840 w +(UNIX) 2047 840 w +(editors) 2315 840 w +(allow) 2686 840 w +(changes) 2970 840 w +(to) 3402 840 w +(affect) 3534 840 w +(each) 3841 840 w +(other;) 4099 840 w +(for) 4422 840 w +(example,) 4595 840 w +10 /LucidaTypewriter f +(ed) 720 960 w +10 /LucidaSansUnicode20 f +(\031) 864 960 w +10 /LucidaSansUnicode00 f +(s) 896 960 w +(idioms) 985 960 w +(to) 1349 960 w +(do) 1485 960 w +(things) 1647 960 w +(like) 1988 960 w +(delete) 2198 960 w +(every) 2533 960 w +(other) 2827 960 w +(line) 3121 960 w +(depend) 3334 960 w +(critically) 3734 960 w +(on) 4174 960 w +(the) 4334 960 w +(implemen\255) 4526 960 w +(tation.) 720 1080 w +(Instead,) 1110 1080 w +10 /LucidaTypewriter f +(sam) 1540 1080 w +10 /LucidaSansUnicode20 f +(\031) 1756 1080 w +10 /LucidaSansUnicode00 f +(s) 1788 1080 w +(simple) 1884 1080 w +(model,) 2250 1080 w +(in) 2629 1080 w +(which) 2765 1080 w +(all) 3092 1080 w +(changes) 3251 1080 w +(in) 3696 1080 w +(a) 3833 1080 w +(command) 3934 1080 w +(occur) 4458 1080 w +(effec\255) 4770 1080 w +(tively simultaneously, is easy to explain and to understand.) 720 1200 w +(The) 970 1356 w +(records) 1189 1356 w +(in) 1591 1356 w +(the) 1720 1356 w +(transcript) 1913 1356 w +(are) 2418 1356 w +(of) 2608 1356 w +(the) 2744 1356 w +(form) 2937 1356 w +10 /LucidaSansUnicode20 f +(\030\030) 3208 1356 w +10 /LucidaSansUnicode00 f +(delete) 3272 1356 w +(substring) 3608 1356 w +(from) 4105 1356 w +(locations) 4376 1356 w +(123) 4851 1356 w +(to) 720 1476 w +(456) 863 1476 w +10 /LucidaSansUnicode20 f +(\031\031) 1052 1476 w +10 /LucidaSansUnicode00 f +(and) 1161 1476 w +10 /LucidaSansUnicode20 f +(\030\030) 1386 1476 w +10 /LucidaSansUnicode00 f +(insert) 1450 1476 w +(11) 1771 1476 w +(characters) 1942 1476 w +10 /LucidaSansUnicode20 f +(\030) 2487 1476 w +10 /LucidaSansUnicode00 f +(hello) 2519 1476 w +(there) 2801 1476 w +10 /LucidaSansUnicode20 f +(\031) 3053 1476 w +10 /LucidaSansUnicode00 f +(at) 3130 1476 w +(location) 3267 1476 w +(789.) 3697 1476 w +10 /LucidaSansUnicode20 f +(\031\031) 3918 1476 w +10 /LucidaSansUnicode00 f +(\(It) 4059 1476 w +(is) 4203 1476 w +(an) 4328 1476 w +(error) 4490 1476 w +(if) 4775 1476 w +(the) 4885 1476 w +(changes are not at monotonically greater positions through the file.\)) 720 1596 w +(While) 4108 1596 w +(the) 4403 1596 w +(update) 4591 1596 w +(is) 4960 1596 w +(occurring,) 720 1716 w +(these) 1251 1716 w +(numbers) 1552 1716 w +(must) 2019 1716 w +(be) 2301 1716 w +(offset) 2459 1716 w +(by) 2777 1716 w +(earlier) 2930 1716 w +(changes,) 3275 1716 w +(but) 3744 1716 w +(that) 3944 1716 w +(is) 4173 1716 w +(straightforward) 4291 1716 w +(and) 720 1836 w +(local) 938 1836 w +(to) 1201 1836 w +(the) 1337 1836 w +(update) 1530 1836 w +(routine;) 1904 1836 w +(moreover,) 2322 1836 w +(all) 2853 1836 w +(the) 3004 1836 w +(numbers) 3197 1836 w +(have) 3663 1836 w +(been) 3926 1836 w +(computed) 4201 1836 w +(before) 4726 1836 w +(the first is examined.) 720 1956 w +(Treating) 970 2112 w +(the) 1410 2112 w +(file) 1600 2112 w +(as) 1786 2112 w +(a) 1927 2112 w +(transaction) 2017 2112 w +(system) 2593 2112 w +(has) 2968 2112 w +(another) 3171 2112 w +(advantage:) 3580 2112 w +(undo) 4144 2112 w +(is) 4427 2112 w +(trivial.) 4542 2112 w +(All) 4913 2112 w +(it) 720 2232 w +(takes) 830 2232 w +(is) 1131 2232 w +(to) 1255 2232 w +(invert) 1396 2232 w +(the) 1716 2232 w +(transcript) 1914 2232 w +(after) 2424 2232 w +(it) 2693 2232 w +(has) 2802 2232 w +(been) 3013 2232 w +(implemented,) 3293 2232 w +(converting) 4005 2232 w +(insertions) 4561 2232 w +(into) 720 2352 w +(deletions) 958 2352 w +(and) 1451 2352 w +(vice) 1680 2352 w +(versa,) 1917 2352 w +(and) 2253 2352 w +(saving) 2482 2352 w +(them) 2842 2352 w +(in) 3139 2352 w +(a) 3279 2352 w +(holding) 3383 2352 w +10 /LucidaTypewriter f +(Buffer) 3800 2352 w +10 /LucidaSansUnicode00 f +(.) 4232 2352 w +(The) 4345 2352 w +10 /LucidaSansUnicode20 f +(\030) 4575 2352 w +10 /LucidaSansUnicode00 f +(do) 4607 2352 w +10 /LucidaSansUnicode20 f +(\031) 4731 2352 w +10 /LucidaSansUnicode00 f +(tran\255) 4812 2352 w +(script) 720 2472 w +(can) 1028 2472 w +(then) 1232 2472 w +(be) 1485 2472 w +(deleted) 1640 2472 w +(from) 2035 2472 w +(the) 2302 2472 w +(transcript) 2492 2472 w +10 /LucidaTypewriter f +(Buffer) 2994 2472 w +10 /LucidaSansUnicode00 f +(and) 3461 2472 w +(replaced) 3676 2472 w +(by) 4125 2472 w +(the) 4275 2472 w +10 /LucidaSansUnicode20 f +(\030) 4465 2472 w +10 /LucidaSansUnicode00 f +(undo) 4497 2472 w +10 /LucidaSansUnicode20 f +(\031) 4745 2472 w +10 /LucidaSansUnicode00 f +(tran\255) 4812 2472 w +(script.) 720 2592 w +(If) 1097 2592 w +(an) 1204 2592 w +(undo) 1362 2592 w +(is) 1651 2592 w +(requested,) 1772 2592 w +(the) 2330 2592 w +(transcript) 2526 2592 w +(is) 3034 2592 w +(rewound) 3155 2592 w +(and) 3618 2592 w +(the) 3839 2592 w +(undo) 4035 2592 w +(transcript) 4325 2592 w +(exe\255) 4834 2592 w +(cuted.) 720 2712 w +(Because) 1087 2712 w +(the) 1510 2712 w +(transcript) 1699 2712 w +10 /LucidaTypewriter f +(Buffer) 2200 2712 w +10 /LucidaSansUnicode00 f +(is) 2666 2712 w +(not) 2780 2712 w +(truncated) 2974 2712 w +(after) 3472 2712 w +(each) 3732 2712 w +(command,) 3990 2712 w +(it) 4534 2712 w +(accumu\255) 4633 2712 w +(lates) 720 2832 w +(successive) 982 2832 w +(changes.) 1526 2832 w +(A) 2023 2832 w +(sequence) 2126 2832 w +(of) 2617 2832 w +(undo) 2749 2832 w +(commands) 3031 2832 w +(can) 3594 2832 w +(therefore) 3796 2832 w +(back) 4277 2832 w +(up) 4539 2832 w +(the) 4699 2832 w +(file) 4889 2832 w +(arbitrarily,) 720 2952 w +(which) 1277 2952 w +(is) 1611 2952 w +(more) 1744 2952 w +(helpful) 2048 2952 w +(than) 2439 2952 w +(the) 2708 2952 w +(more) 2916 2952 w +(commonly) 3219 2952 w +(implemented) 3773 2952 w +(self-inverse) 4462 2952 w +(form) 720 3072 w +(of) 992 3072 w +(undo.) 1130 3072 w +(\() 1482 3072 w +10 /LucidaTypewriter f +(Sam) 1515 3072 w +10 /LucidaSansUnicode00 f +(provides) 1771 3072 w +(no) 2227 3072 w +(way) 2390 3072 w +(to) 2614 3072 w +(undo) 2753 3072 w +(an) 3042 3072 w +(undo,) 3200 3072 w +(but) 3521 3072 w +(if) 3724 3072 w +(it) 3831 3072 w +(were) 3938 3072 w +(desired,) 4209 3072 w +(it) 4641 3072 w +(would) 4748 3072 w +(be) 720 3192 w +(easy) 885 3192 w +(to) 1145 3192 w +(provide) 1289 3192 w +(by) 1700 3192 w +(re-interpreting) 1861 3192 w +(the) 2636 3192 w +10 /LucidaSansUnicode20 f +(\030) 2836 3192 w +10 /LucidaSansUnicode00 f +(do) 2868 3192 w +10 /LucidaSansUnicode20 f +(\031) 2992 3192 w +10 /LucidaSansUnicode00 f +(transcript.\)) 3069 3192 w +(Each) 3678 3192 w +(mark) 3945 3192 w +(in) 4237 3192 w +(the) 4373 3192 w +(transcript) 4573 3192 w +(contains) 720 3312 w +(a) 1167 3312 w +(sequence) 1261 3312 w +(number) 1757 3312 w +(and) 2173 3312 w +(the) 2392 3312 w +(offset) 2586 3312 w +(into) 2904 3312 w +(the) 3133 3312 w +(transcript) 3328 3312 w +(of) 3835 3312 w +(the) 3973 3312 w +(previous) 4168 3312 w +(mark,) 4623 3312 w +(to) 4942 3312 w +(aid) 720 3432 w +(in unwinding the transcript.) 900 3432 w +(Marks also contain the value of dot and the modified bit) 2313 3432 w +(so) 720 3552 w +(these) 865 3552 w +(can) 1160 3552 w +(be) 1361 3552 w +(restored) 1513 3552 w +(easily.) 1952 3552 w +(Undoing) 2321 3552 w +(multiple) 2762 3552 w +(files) 3193 3552 w +(is) 3428 3552 w +(easy;) 3541 3552 w +(it) 3821 3552 w +(merely) 3921 3552 w +(demands) 4282 3552 w +(undo\255) 4759 3552 w +(ing all files whose latest change has the same sequence number as the current file.) 720 3672 w +(Another) 970 3828 w +(benefit) 1393 3828 w +(of) 1768 3828 w +(having) 1901 3828 w +(a) 2258 3828 w +(transcript) 2348 3828 w +(is) 2851 3828 w +(that) 2967 3828 w +(errors) 3194 3828 w +(encountered) 3521 3828 w +(in) 4164 3828 w +(the) 4291 3828 w +(middle) 4482 3828 w +(of) 4851 3828 w +(a) 4985 3828 w +(complicated) 720 3948 w +(command) 1353 3948 w +(need) 1876 3948 w +(not) 2158 3948 w +(leave) 2363 3948 w +(the) 2656 3948 w +(files) 2856 3948 w +(in) 3103 3948 w +(an) 3239 3948 w +(intermediate) 3401 3948 w +(state.) 4060 3948 w +(By) 4405 3948 w +(rewinding) 4559 3948 w +(the) 720 4068 w +(transcript) 910 4068 w +(to) 1412 4068 w +(the) 1545 4068 w +(mark) 1735 4068 w +(beginning) 2018 4068 w +(the) 2541 4068 w +(command,) 2732 4068 w +(the) 3278 4068 w +(partial) 3469 4068 w +(command) 3814 4068 w +(can) 4328 4068 w +(be) 4532 4068 w +(trivially) 4687 4068 w +(undone.) 720 4188 w +(When) 970 4344 w +(the) 1277 4344 w +(update) 1473 4344 w +(algorithm) 1850 4344 w +(was) 2360 4344 w +(first) 2584 4344 w +(implemented,) 2820 4344 w +(it) 3530 4344 w +(was) 3637 4344 w +(unacceptably) 3861 4344 w +(slow,) 4539 4344 w +(so) 4831 4344 w +(a) 4985 4344 w +(cache) 720 4464 w +(was) 1030 4464 w +(added) 1248 4464 w +(to) 1583 4464 w +(coalesce) 1716 4464 w +(nearby) 2161 4464 w +(changes,) 2524 4464 w +(replacing) 2989 4464 w +(multiple) 3471 4464 w +(small) 3903 4464 w +(changes) 4194 4464 w +(by) 4627 4464 w +(a) 4776 4464 w +(sin\255) 4865 4464 w +(gle) 720 4584 w +(larger) 916 4584 w +(one.) 1249 4584 w +(This) 1541 4584 w +(reduced) 1795 4584 w +(the) 2236 4584 w +(number) 2440 4584 w +(of) 2866 4584 w +(insertions) 3013 4584 w +(into) 3541 4584 w +(the) 3780 4584 w +(transaction) 3985 4584 w +10 /LucidaTypewriter f +(Buffer) 4576 4584 w +10 /LucidaSansUnicode00 f +(,) 5008 4584 w +(and) 720 4704 w +(made) 948 4704 w +(a) 1263 4704 w +(dramatic) 1366 4704 w +(improvement) 1837 4704 w +(in) 2527 4704 w +(performance,) 2665 4704 w +(but) 3360 4704 w +(made) 3569 4704 w +(it) 3883 4704 w +(impossible) 3996 4704 w +(to) 4568 4704 w +(handle) 4713 4704 w +(changes) 720 4824 w +(in) 1159 4824 w +(non-monotonic) 1290 4824 w +(order) 2090 4824 w +(in) 2392 4824 w +(the) 2523 4824 w +(file;) 2718 4824 w +(the) 2941 4824 w +(caching) 3136 4824 w +(method) 3548 4824 w +(only) 3960 4824 w +(works) 4205 4824 w +(if) 4534 4824 w +(changes) 4641 4824 w +(don) 720 4944 w +10 /LucidaSansUnicode20 f +(\031) 906 4944 w +10 /LucidaSansUnicode00 f +(t) 938 4944 w +(overlap.) 1013 4944 w +(Before) 1472 4944 w +(the) 1819 4944 w +(cache) 2012 4944 w +(was) 2325 4944 w +(added,) 2545 4944 w +(the) 2914 4944 w +(transaction) 3106 4944 w +(could) 3684 4944 w +(in) 3987 4944 w +(principle) 4115 4944 w +(be) 4575 4944 w +(sorted) 4731 4944 w +(if) 720 5064 w +(the) 829 5064 w +(changes) 1027 5064 w +(were) 1469 5064 w +(out) 1742 5064 w +(of) 1945 5064 w +(order,) 2086 5064 w +(although) 2423 5064 w +(this) 2896 5064 w +(was) 3118 5064 w +(never) 3344 5064 w +(done.) 3654 5064 w +(The) 4004 5064 w +(current) 4229 5064 w +(status) 4623 5064 w +(is) 4960 5064 w +(therefore) 720 5184 w +(acceptable) 1212 5184 w +(performance) 1773 5184 w +(with) 2433 5184 w +(a) 2682 5184 w +(minor) 2781 5184 w +(restriction) 3111 5184 w +(on) 3650 5184 w +(global) 3817 5184 w +(changes,) 4160 5184 w +(which) 4635 5184 w +(is) 4960 5184 w +(sometimes, but rarely, an annoyance.) 720 5304 w +(The) 970 5460 w +(update) 1184 5460 w +(algorithm) 1553 5460 w +(obviously) 2055 5460 w +(paws) 2548 5460 w +(the) 2828 5460 w +(data) 3017 5460 w +(more) 3261 5460 w +(than) 3546 5460 w +(simpler) 3796 5460 w +(algorithms,) 4192 5460 w +(but) 4778 5460 w +(it) 4974 5460 w +(is) 720 5580 w +(not) 844 5580 w +(prohibitively) 1048 5580 w +(expensive;) 1695 5580 w +(the) 2257 5580 w +(caches) 2456 5580 w +(help.) 2825 5580 w +(\(The) 3142 5580 w +(principle) 3399 5580 w +(of) 3865 5580 w +(avoiding) 4006 5580 w +(copying) 4462 5580 w +(the) 4885 5580 w +(data) 720 5700 w +(is) 978 5700 w +(still) 1106 5700 w +(honored) 1329 5700 w +(here,) 1783 5700 w +(although) 2078 5700 w +(not) 2556 5700 w +(as) 2764 5700 w +(piously:) 2918 5700 w +(the) 3345 5700 w +(data) 3548 5700 w +(is) 3807 5700 w +(moved) 3936 5700 w +(from) 4310 5700 w +(contents) 4591 5700 w +10 /LucidaSansUnicode20 f +(\031) 5008 5700 w +10 /LucidaSansUnicode00 f +(cache) 720 5820 w +(to) 1033 5820 w +(the) 1169 5820 w +(transcript) 1362 5820 w +10 /LucidaSansUnicode20 f +(\031) 1829 5820 w +10 /LucidaSansUnicode00 f +(s) 1861 5820 w +(all) 1950 5820 w +(at) 2100 5820 w +(once) 2229 5820 w +(and) 2496 5820 w +(through) 2713 5820 w +(only) 3137 5820 w +(one) 3378 5820 w +(internal) 3594 5820 w +(buffer.\)) 4002 5820 w +(Performance) 4432 5820 w +(figures) 720 5940 w +(confirm) 1102 5940 w +(the) 1520 5940 w +(efficiency.) 1719 5940 w +(To) 2287 5940 w +(read) 2455 5940 w +(from) 2714 5940 w +(a) 2990 5940 w +(dead) 3089 5940 w +(start) 3371 5940 w +(a) 3637 5940 w +(hundred) 3737 5940 w +(kilobyte) 4191 5940 w +(file) 4621 5940 w +(on) 4817 5940 w +(a) 4985 5940 w +(VAX-11/750) 720 6060 w +(takes) 1376 6060 w +(1.4) 1666 6060 w +(seconds) 1857 6060 w +(of) 2285 6060 w +(user) 2416 6060 w +(time,) 2659 6060 w +(2.5) 2939 6060 w +(seconds of system time, and 5 seconds) 3130 6060 w +(of real) 720 6180 w +(time.) 1064 6180 w +(Reading) 1376 6180 w +(the) 1799 6180 w +(same) 1987 6180 w +(file) 2275 6180 w +(in) 2459 6180 w +10 /LucidaTypewriter f +(ed) 2583 6180 w +10 /LucidaSansUnicode00 f +(takes) 2760 6180 w +(6.0) 3050 6180 w +(seconds) 3241 6180 w +(of) 3669 6180 w +(user) 3800 6180 w +(time,) 4043 6180 w +(1.7) 4323 6180 w +(seconds) 4514 6180 w +(of) 4942 6180 w +(system) 720 6300 w +(time,) 1104 6300 w +(and) 1395 6300 w +(8) 1619 6300 w +(seconds) 1726 6300 w +(of) 2165 6300 w +(real) 2306 6300 w +(time.) 2530 6300 w +10 /LucidaTypewriter f +(Sam) 2852 6300 w +10 /LucidaSansUnicode00 f +(uses) 3111 6300 w +(about) 3374 6300 w +(half) 3695 6300 w +(the) 3921 6300 w +(CPU) 4119 6300 w +(time.) 4355 6300 w +(A) 4677 6300 w +(more) 4789 6300 w +(interesting) 720 6420 w +(example) 1278 6420 w +(is) 1727 6420 w +(the) 1843 6420 w +(one) 2034 6420 w +(stated) 2249 6420 w +(above:) 2584 6420 w +(inserting) 2939 6420 w +(a) 3404 6420 w +(character) 3495 6420 w +(between) 3980 6420 w +(every) 4423 6420 w +(pair) 4717 6420 w +(of) 4942 6420 w +(characters in the file.) 720 6540 w +(The) 1809 6540 w +10 /LucidaTypewriter f +(sam) 2022 6540 w +10 /LucidaSansUnicode00 f +(command is) 2270 6540 w +9 /LucidaTypewriter f +(,y/@/) 920 6710 w +(a/x/) 1310 6710 w +10 /LucidaSansUnicode00 f +(and) 720 6890 w +(takes) 934 6890 w +(3) 1225 6890 w +(CPU) 1322 6890 w +(seconds) 1549 6890 w +(per) 1978 6890 w +(kilobyte) 2172 6890 w +(of) 2591 6890 w +(input) 2723 6890 w +(file,) 3010 6890 w +(of) 3227 6890 w +(which) 3359 6890 w +(about) 3674 6890 w +(a) 3986 6890 w +(third) 4075 6890 w +(is) 4341 6890 w +(spent) 4455 6890 w +(in) 4759 6890 w +(the) 4885 6890 w +(regular) 720 7010 w +(expression) 1111 7010 w +(code.) 1687 7010 w +(This) 2027 7010 w +(translates) 2277 7010 w +(to) 2796 7010 w +(about) 2939 7010 w +(500) 3262 7010 w +(changes) 3496 7010 w +(per) 3939 7010 w +(second.) 4143 7010 w +10 /LucidaTypewriter f +(Ed) 4595 7010 w +10 /LucidaSansUnicode00 f +(takes) 4783 7010 w +(1.5) 720 7130 w +(seconds) 913 7130 w +(per) 1343 7130 w +(kilobyte) 1539 7130 w +(to) 1960 7130 w +(make) 2094 7130 w +(a) 2392 7130 w +(similar) 2483 7130 w +(change) 2846 7130 w +(\(ignoring) 3230 7130 w +(newlines\),) 3707 7130 w +(but) 4230 7130 w +(cannot) 4428 7130 w +(undo) 4792 7130 w +(it.) 720 7250 w +(The) 899 7250 w +(same) 1129 7250 w +(example) 1433 7250 w +(in) 1895 7250 w +10 /LucidaTypewriter f +(ex) 2035 7250 w +10 /LucidaSansUnicode00 f +(,) 2179 7250 w +6 /LucidaSansUnicode00 f +(9) 2211 7200 w +10 /LucidaSansUnicode00 f +(a) 2298 7250 w +(variant) 2402 7250 w +(of) 2782 7250 w +10 /LucidaTypewriter f +(ed) 2929 7250 w +10 /LucidaSansUnicode00 f +(done) 3122 7250 w +(at) 3413 7250 w +(the) 3554 7250 w +(University) 3758 7250 w +(of) 4285 7250 w +(California) 4432 7250 w +(at) 4948 7250 w +cleartomark +showpage +saveobj restore +%%EndPage: 21 21 +%%Page: 22 22 +/saveobj save def +mark +22 pagesetup +10 /LucidaSansUnicode00 f +(\255 22 \255) 2752 480 w +(Berkeley,) 720 840 w +(which) 1193 840 w +(allows) 1509 840 w +(one) 1846 840 w +(level) 2060 840 w +(of) 2317 840 w +(undoing,) 2450 840 w +(again) 2918 840 w +(takes) 3216 840 w +(3) 3508 840 w +(seconds.) 3606 840 w +(In) 4100 840 w +(summary,) 4226 840 w +10 /LucidaTypewriter f +(sam) 4741 840 w +10 /LucidaSansUnicode20 f +(\031) 4957 840 w +10 /LucidaSansUnicode00 f +(s) 4989 840 w +(performance) 720 960 w +(is) 1386 960 w +(comparable) 1516 960 w +(to) 2132 960 w +(that) 2279 960 w +(of) 2519 960 w +(other) 2666 960 w +(UNIX) 2972 960 w +(editors,) 3256 960 w +(although) 3675 960 w +(it) 4154 960 w +(solves) 4269 960 w +(a) 4618 960 w +(harder) 4722 960 w +(problem.) 720 1080 w +10 /LucidaSans-Demi f +(Communications) 720 1320 w +10 /LucidaSansUnicode00 f +(The) 720 1476 w +(discussion) 948 1476 w +(so) 1505 1476 w +(far) 1664 1476 w +(has) 1844 1476 w +(described) 2059 1476 w +(the) 2579 1476 w +(implementation) 2781 1476 w +(of) 3591 1476 w +(the) 3737 1476 w +(host) 3940 1476 w +(part) 4199 1476 w +(of) 4443 1476 w +10 /LucidaTypewriter f +(sam) 4589 1476 w +10 /LucidaSansUnicode00 f +(;) 4805 1476 w +(the) 4885 1476 w +(next) 720 1596 w +(few) 1001 1596 w +(sections) 1236 1596 w +(explain) 1699 1596 w +(how) 2119 1596 w +(a) 2384 1596 w +(machine) 2504 1596 w +(with) 2977 1596 w +(mouse) 3247 1596 w +(and) 3635 1596 w +(bitmap) 3879 1596 w +(display) 4283 1596 w +(can) 4689 1596 w +(be) 4921 1596 w +(engaged) 720 1716 w +(to) 1182 1716 w +(improve) 1326 1716 w +(interaction.) 1767 1716 w +10 /LucidaTypewriter f +(Sam) 2397 1716 w +10 /LucidaSansUnicode00 f +(is) 2659 1716 w +(not) 2785 1716 w +(the) 2992 1716 w +(first) 3194 1716 w +(editor) 3436 1716 w +(to) 3770 1716 w +(be) 3915 1716 w +(written) 4081 1716 w +(as) 4467 1716 w +(two) 4620 1716 w +(pro\255) 4842 1716 w +(cesses,) 720 1836 w +6 /LucidaSansUnicode00 f +(16) 1068 1786 w +10 /LucidaSansUnicode00 f +(but its implementation has some unusual aspects.) 1176 1836 w +(There) 970 1992 w +(are) 1284 1992 w +(several) 1472 1992 w +(ways) 1848 1992 w +10 /LucidaTypewriter f +(sam) 2119 1992 w +10 /LucidaSansUnicode20 f +(\031) 2335 1992 w +10 /LucidaSansUnicode00 f +(s) 2367 1992 w +(host) 2454 1992 w +(and) 2701 1992 w +(terminal) 2917 1992 w +(parts) 3355 1992 w +(may) 3638 1992 w +(be) 3874 1992 w +(connected.) 4029 1992 w +(The) 4628 1992 w +(first) 4845 1992 w +(and) 720 2112 w +(simplest) 935 2112 w +(is) 1379 2112 w +(to) 1494 2112 w +(forgo) 1627 2112 w +(the) 1924 2112 w +(terminal) 2114 2112 w +(part) 2551 2112 w +(and) 2782 2112 w +(use) 2997 2112 w +(the) 3201 2112 w +(host) 3391 2112 w +(part) 3637 2112 w +10 /LucidaSansUnicode20 f +(\031) 3833 2112 w +10 /LucidaSansUnicode00 f +(s) 3865 2112 w +(command) 3951 2112 w +(language) 4464 2112 w +(to) 4942 2112 w +(edit) 720 2232 w +(text) 950 2232 w +(on) 1186 2232 w +(an) 1354 2232 w +(ordinary) 1516 2232 w +(terminal.) 1966 2232 w +(This) 2478 2232 w +(mode) 2729 2232 w +(is) 3048 2232 w +(invoked) 3174 2232 w +(by) 3601 2232 w +(starting) 3762 2232 w +10 /LucidaTypewriter f +(sam) 4182 2232 w +10 /LucidaSansUnicode00 f +(with) 4444 2232 w +(the) 4695 2232 w +10 /LucidaTypewriter f +(-d) 4896 2232 w +10 /LucidaSansUnicode00 f +(option.) 720 2352 w +(With) 1138 2352 w +(no) 1393 2352 w +(options,) 1557 2352 w +10 /LucidaTypewriter f +(sam) 1994 2352 w +10 /LucidaSansUnicode00 f +(runs) 2251 2352 w +(separate) 2507 2352 w +(host) 2961 2352 w +(and) 3212 2352 w +(terminal) 3432 2352 w +(programs,) 3874 2352 w +(communicat\255) 4413 2352 w +(ing) 720 2472 w +(with) 907 2472 w +(a) 1146 2472 w +(message) 1235 2472 w +(protocol) 1693 2472 w +(over) 2131 2472 w +(the) 2375 2472 w +(physical) 2564 2472 w +(connection) 2990 2472 w +(that) 3556 2472 w +(joins) 3781 2472 w +(them.) 4048 2472 w +(Typically,) 4395 2472 w +(the) 4885 2472 w +(connection) 720 2592 w +(is) 1285 2592 w +(an) 1398 2592 w +(RS-232) 1548 2592 w +(link) 1945 2592 w +(between) 2156 2592 w +(a) 2596 2592 w +(Blit) 2684 2592 w +(\(the) 2870 2592 w +(prototypical) 3091 2592 w +(display) 3703 2592 w +(for) 4078 2592 w +10 /LucidaTypewriter f +(sam) 4249 2592 w +10 /LucidaSansUnicode00 f +(\) and a host) 4465 2592 w +(running) 720 2712 w +(the) 1137 2712 w +(Ninth) 1329 2712 w +(Edition) 1630 2712 w +(of) 2002 2712 w +(the) 2137 2712 w +(UNIX) 2329 2712 w +(operating) 2601 2712 w +(system.) 3104 2712 w +6 /LucidaSansUnicode00 f +(8) 3476 2662 w +10 /LucidaSansUnicode00 f +(\(This) 3551 2712 w +(is) 3826 2712 w +(the) 3943 2712 w +(version) 4135 2712 w +(of) 4524 2712 w +(the) 4660 2712 w +(sys\255) 4853 2712 w +(tem) 720 2832 w +(used) 955 2832 w +(in) 1236 2832 w +(the) 1376 2832 w +(Computing) 1580 2832 w +(Sciences) 2167 2832 w +(Research) 2626 2832 w +(Center) 3110 2832 w +(at) 3480 2832 w +(AT&T) 3621 2832 w +(Bell) 3935 2832 w +(Laboratories) 4156 2832 w +([now) 4807 2832 w +(Lucent) 720 2952 w +(Technologies,) 1079 2952 w +(Bell) 1792 2952 w +(Labs],) 2002 2952 w +(where) 2327 2952 w +(I) 2657 2952 w +(work.) 2724 2952 w +(Its) 3063 2952 w +(relevant) 3218 2952 w +(aspects) 3645 2952 w +(are) 4048 2952 w +(discussed) 4239 2952 w +(in) 4755 2952 w +(the) 4885 2952 w +(Blit) 720 3072 w +(paper.) 914 3072 w +6 /LucidaSansUnicode00 f +(1) 1224 3022 w +10 /LucidaSansUnicode00 f +(\)) 1262 3072 w +(The) 1336 3072 w +(implementation) 1558 3072 w +(of) 2361 3072 w +10 /LucidaTypewriter f +(sam) 2500 3072 w +10 /LucidaSansUnicode00 f +(for) 2757 3072 w +(the) 2937 3072 w +(SUN) 3133 3072 w +(computer) 3371 3072 w +(runs) 3876 3072 w +(both) 4133 3072 w +(processes) 4396 3072 w +(on) 4917 3072 w +(the same machine and connects them by a pipe.) 720 3192 w +(The) 970 3348 w +(low) 1193 3348 w +(bandwidth) 1402 3348 w +(of) 1955 3348 w +(an) 2095 3348 w +(RS-232) 2254 3348 w +(link) 2660 3348 w +(necessitated) 2880 3348 w +(the) 3526 3348 w +(split) 3724 3348 w +(between) 3976 3348 w +(the) 4426 3348 w +(two) 4624 3348 w +(pro\255) 4842 3348 w +(grams.) 720 3468 w +(The) 1120 3468 w +(division) 1335 3468 w +(is) 1745 3468 w +(a) 1859 3468 w +(mixed) 1948 3468 w +(blessing:) 2284 3468 w +(a) 2753 3468 w +(program) 2842 3468 w +(in) 3292 3468 w +(two) 3416 3468 w +(parts) 3624 3468 w +(is) 3904 3468 w +(much) 4017 3468 w +(harder) 4318 3468 w +(to) 4669 3468 w +(write) 4800 3468 w +(and) 720 3588 w +(to) 937 3588 w +(debug) 1072 3588 w +(than) 1416 3588 w +(a) 1670 3588 w +(self-contained) 1763 3588 w +(one,) 2508 3588 w +(but) 2757 3588 w +(the) 2957 3588 w +(split) 3150 3588 w +(makes) 3397 3588 w +(several) 3748 3588 w +(unusual) 4126 3588 w +(configura\255) 4547 3588 w +(tions) 720 3708 w +(possible.) 1008 3708 w +(The) 1523 3708 w +(terminal) 1752 3708 w +(may) 2202 3708 w +(be) 2450 3708 w +(physically) 2617 3708 w +(separated) 3138 3708 w +(from) 3663 3708 w +(the) 3942 3708 w +(host,) 4144 3708 w +(allowing) 4434 3708 w +(the) 4885 3708 w +(conveniences) 720 3828 w +(of) 1404 3828 w +(a) 1537 3828 w +(mouse) 1627 3828 w +(and) 1985 3828 w +(bitmap) 2200 3828 w +(display) 2575 3828 w +(to) 2952 3828 w +(be) 3085 3828 w +(taken) 3239 3828 w +(home) 3542 3828 w +(while) 3849 3828 w +(leaving) 4138 3828 w +(the) 4519 3828 w +(files) 4710 3828 w +(at) 4948 3828 w +(work.) 720 3948 w +(It is also possible to run the host part on a remote machine:) 1053 3948 w +9 /LucidaTypewriter f +(sam) 920 4118 w +(-r) 1180 4118 w +(host) 1375 4118 w +10 /LucidaSansUnicode00 f +(connects) 720 4298 w +(to) 1190 4298 w +(the) 1327 4298 w +(terminal) 1521 4298 w +(in) 1962 4298 w +(the) 2092 4298 w +(usual) 2286 4298 w +(way,) 2584 4298 w +(and) 2839 4298 w +(then) 3058 4298 w +(makes) 3314 4298 w +(a) 3666 4298 w +(call) 3761 4298 w +(across) 3965 4298 w +(the) 4315 4298 w +(network) 4510 4298 w +(to) 4942 4298 w +(establish) 720 4418 w +(the) 1187 4418 w +(host) 1376 4418 w +(part) 1621 4418 w +(of) 1850 4418 w +10 /LucidaTypewriter f +(sam) 1981 4418 w +10 /LucidaSansUnicode00 f +(on) 2230 4418 w +(the) 2386 4418 w +(named) 2574 4418 w +(machine.) 2936 4418 w +(Finally,) 3441 4418 w +(it) 3816 4418 w +(cross-connects) 3915 4418 w +(the) 4692 4418 w +(I/O) 4880 4418 w +(to) 720 4538 w +(join) 859 4538 w +(the) 1082 4538 w +(two) 1278 4538 w +(parts.) 1494 4538 w +(This) 1846 4538 w +(allows) 2092 4538 w +10 /LucidaTypewriter f +(sam) 2435 4538 w +10 /LucidaSansUnicode00 f +(to) 2692 4538 w +(be) 2831 4538 w +(run) 2991 4538 w +(on) 3197 4538 w +(machines) 3361 4538 w +(that) 3861 4538 w +(do) 4093 4538 w +(not) 4258 4538 w +(support) 4459 4538 w +(bit\255) 4878 4538 w +(map) 720 4658 w +(displays;) 970 4658 w +(for) 1434 4658 w +(example,) 1612 4658 w +10 /LucidaTypewriter f +(sam) 2096 4658 w +10 /LucidaSansUnicode00 f +(is) 2351 4658 w +(the) 2470 4658 w +(editor) 2664 4658 w +(of) 2990 4658 w +(choice) 3127 4658 w +(on) 3476 4658 w +(our) 3638 4658 w +(Cray) 3841 4658 w +(X-MP/24.) 4097 4658 w +10 /LucidaTypewriter f +(Sam) 4641 4658 w +(-r) 4896 4658 w +10 /LucidaSansUnicode00 f +(involves) 720 4778 w +10 /LucidaSans-Italic f +(three) 1159 4778 w +10 /LucidaSansUnicode00 f +(machines:) 1460 4778 w +(the) 1998 4778 w +(remote) 2200 4778 w +(host,) 2591 4778 w +(the) 2881 4778 w +(terminal,) 3083 4778 w +(and) 3564 4778 w +(the) 3791 4778 w +(local) 3993 4778 w +(host.) 4265 4778 w +(The) 4587 4778 w +(local) 4815 4778 w +(host) 720 4898 w +10 /LucidaSansUnicode20 f +(\031) 931 4898 w +10 /LucidaSansUnicode00 f +(s job is simple but vital: it passes the data between the remote host and terminal.) 963 4898 w +(The) 970 5054 w +(host) 1204 5054 w +(and) 1468 5054 w +(terminal) 1701 5054 w +(exchange) 2156 5054 w +(messages) 2674 5054 w +(asynchronously) 3203 5054 w +(\(rather) 4009 5054 w +(than,) 4388 5054 w +(say,) 4690 5054 w +(as) 4934 5054 w +(remote) 720 5174 w +(procedure) 1104 5174 w +(calls\)) 1638 5174 w +(but) 1926 5174 w +(there) 2127 5174 w +(is) 2418 5174 w +(no) 2537 5174 w +(error) 2699 5174 w +(detection) 2978 5174 w +(or) 3469 5174 w +(correction) 3610 5174 w +(because,) 4139 5174 w +(whatever) 4604 5174 w +(the) 720 5294 w +(configuration,) 926 5294 w +(the) 1658 5294 w +(connection) 1865 5294 w +(is) 2449 5294 w +(reliable.) 2581 5294 w +(Because) 3055 5294 w +(the) 3496 5294 w +(terminal) 3703 5294 w +(handles) 4157 5294 w +(mundane) 4587 5294 w +(interaction) 720 5414 w +(tasks) 1286 5414 w +(such) 1584 5414 w +(as) 1855 5414 w +(popping) 2006 5414 w +(up) 2454 5414 w +(menus) 2624 5414 w +(and) 2993 5414 w +(interpreting) 3218 5414 w +(the) 3838 5414 w +(responses,) 4038 5414 w +(the) 4607 5414 w +(mes\255) 4807 5414 w +(sages) 720 5534 w +(are) 1035 5534 w +(about) 1227 5534 w +(data,) 1545 5534 w +(not) 1827 5534 w +(actions.) 2027 5534 w +(For) 2477 5534 w +(example,) 2673 5534 w +(the) 3158 5534 w +(host) 3353 5534 w +(knows) 3604 5534 w +(nothing) 3953 5534 w +(about) 4369 5534 w +(what) 4688 5534 w +(is) 4960 5534 w +(displayed) 720 5654 w +(on) 1221 5654 w +(the) 1384 5654 w +(screen,) 1579 5654 w +(and) 1968 5654 w +(when) 2188 5654 w +(the) 2485 5654 w +(user) 2680 5654 w +(types) 2930 5654 w +(a) 3229 5654 w +(character,) 3324 5654 w +(the) 3845 5654 w +(message) 4040 5654 w +(sent) 4503 5654 w +(to) 4748 5654 w +(the) 4885 5654 w +(host) 720 5774 w +(says) 964 5774 w +10 /LucidaSansUnicode20 f +(\030\030) 1206 5774 w +10 /LucidaSansUnicode00 f +(insert) 1270 5774 w +(a) 1579 5774 w +(one-byte) 1667 5774 w +(string) 2145 5774 w +(at) 2460 5774 w +(location) 2585 5774 w +(123) 3003 5774 w +(in) 3225 5774 w +(file) 3349 5774 w +(7,) 3533 5774 w +10 /LucidaSansUnicode20 f +(\031\031) 3628 5774 w +10 /LucidaSansUnicode00 f +(not) 3725 5774 w +10 /LucidaSansUnicode20 f +(\030\030) 3918 5774 w +10 /LucidaSansUnicode00 f +(a) 3982 5774 w +(character) 4070 5774 w +(was) 4552 5774 w +(typed) 4769 5774 w +(at) 720 5894 w +(the) 865 5894 w +(current) 1073 5894 w +(position) 1476 5894 w +(in) 1922 5894 w +(the) 2066 5894 w +(current) 2274 5894 w +(file.) 2677 5894 w +10 /LucidaSansUnicode20 f +(\031\031) 2860 5894 w +10 /LucidaSansUnicode00 f +(In) 3009 5894 w +(other) 3153 5894 w +(words,) 3463 5894 w +(the) 3841 5894 w +(messages) 4049 5894 w +(look) 4577 5894 w +(very) 4839 5894 w +(much like the transaction records in the transcripts.) 720 6014 w +(Either) 970 6170 w +(the) 1291 6170 w +(host) 1489 6170 w +(or) 1743 6170 w +(terminal) 1888 6170 w +(part) 2333 6170 w +(of) 2572 6170 w +10 /LucidaTypewriter f +(sam) 2713 6170 w +10 /LucidaSansUnicode00 f +(may) 2972 6170 w +(initiate) 3215 6170 w +(a) 3592 6170 w +(change) 3690 6170 w +(to) 4081 6170 w +(a) 4222 6170 w +(file.) 4320 6170 w +(The) 4578 6170 w +(com\255) 4802 6170 w +(mand) 720 6290 w +(language) 1029 6290 w +(operates) 1508 6290 w +(on) 1964 6290 w +(the) 2123 6290 w +(host,) 2314 6290 w +(while) 2593 6290 w +(typing) 2882 6290 w +(and) 3223 6290 w +(some) 3439 6290 w +(mouse) 3736 6290 w +(operations) 4095 6290 w +(are) 4647 6290 w +(exe\255) 4834 6290 w +(cuted) 720 6410 w +(directly) 1029 6410 w +(in) 1427 6410 w +(the) 1558 6410 w +(terminal) 1753 6410 w +(to) 2195 6410 w +(optimize) 2333 6410 w +(response.) 2798 6410 w +(Changes) 3343 6410 w +(initiated) 3800 6410 w +(by) 4238 6410 w +(the) 4394 6410 w +(host) 4590 6410 w +(pro\255) 4842 6410 w +(gram) 720 6530 w +(must) 1021 6530 w +(be) 1314 6530 w +(transmitted) 1483 6530 w +(to) 2094 6530 w +(the) 2241 6530 w +(terminal,) 2445 6530 w +(and) 2928 6530 w +(vice) 3157 6530 w +(versa.) 3394 6530 w +(\(A) 3762 6530 w +(token) 3913 6530 w +(is) 4236 6530 w +(exchanged) 4365 6530 w +(to) 4942 6530 w +(determine) 720 6650 w +(which) 1265 6650 w +(end) 1598 6650 w +(is) 1831 6650 w +(in) 1963 6650 w +(control,) 2106 6650 w +(which) 2532 6650 w +(means) 2865 6650 w +(that) 3234 6650 w +(characters) 3477 6650 w +(typed) 4029 6650 w +(while) 4353 6650 w +(a) 4659 6650 w +(time-) 4767 6650 w +(consuming) 720 6770 w +(command) 1299 6770 w +(runs) 1823 6770 w +(must) 2084 6770 w +(be) 2372 6770 w +(buffered) 2536 6770 w +(and) 2996 6770 w +(do) 3221 6770 w +(not) 3390 6770 w +(appear) 3595 6770 w +(until) 3973 6770 w +(the) 4237 6770 w +(command) 4437 6770 w +(is) 4960 6770 w +(complete.\)) 720 6890 w +(To) 1317 6890 w +(maintain) 1495 6890 w +(consistent) 1971 6890 w +(information,) 2522 6890 w +(the) 3176 6890 w +(host) 3386 6890 w +(and) 3652 6890 w +(terminal) 3887 6890 w +(track) 4344 6890 w +(changes) 4641 6890 w +(through) 720 7010 w +(a) 1146 7010 w +(per-file) 1240 7010 w +(data) 1648 7010 w +(structure) 1897 7010 w +(that) 2374 7010 w +(records) 2604 7010 w +(what) 3007 7010 w +(portions) 3277 7010 w +(of) 3721 7010 w +(the) 3857 7010 w +(file) 4050 7010 w +(the) 4239 7010 w +(terminal) 4432 7010 w +(has) 4872 7010 w +(received.) 720 7130 w +(The) 1229 7130 w +(data) 1451 7130 w +(structure,) 1703 7130 w +(called) 2215 7130 w +(a) 2540 7130 w +10 /LucidaTypewriter f +(Rasp) 2637 7130 w +10 /LucidaSansUnicode00 f +(\(a) 2967 7130 w +(weak) 3097 7130 w +(pun:) 3385 7130 w +(it) 3646 7130 w +10 /LucidaSansUnicode20 f +(\031) 3712 7130 w +10 /LucidaSansUnicode00 f +(s) 3744 7130 w +(a) 3837 7130 w +(file) 3934 7130 w +(with) 4127 7130 w +(holes\)) 4374 7130 w +(is) 4708 7130 w +(held) 4830 7130 w +(and) 720 7250 w +(updated) 933 7250 w +(by) 1365 7250 w +(both) 1513 7250 w +(the host and terminal.) 1769 7250 w +(A) 2909 7250 w +10 /LucidaTypewriter f +(Rasp) 3010 7250 w +10 /LucidaSansUnicode00 f +(is a list of) 3330 7250 w +10 /LucidaTypewriter f +(Strings) 3837 7250 w +10 /LucidaSansUnicode00 f +(holding those) 4373 7250 w +cleartomark +showpage +saveobj restore +%%EndPage: 22 22 +%%Page: 23 23 +/saveobj save def +mark +23 pagesetup +10 /LucidaSansUnicode00 f +(\255 23 \255) 2752 480 w +(parts) 720 840 w +(of) 1008 840 w +(the) 1147 840 w +(file) 1343 840 w +(known) 1535 840 w +(to) 1897 840 w +(the) 2037 840 w +(terminal,) 2234 840 w +(separated) 2710 840 w +(by) 3229 840 w +(counts) 3386 840 w +(of) 3752 840 w +(the) 3892 840 w +(number) 4089 840 w +(of) 4508 840 w +(bytes) 4648 840 w +(in) 4949 840 w +(the) 720 960 w +(interstices.) 923 960 w +(Of) 1535 960 w +(course,) 1698 960 w +(the) 2100 960 w +(host) 2302 960 w +(doesn) 2560 960 w +10 /LucidaSansUnicode20 f +(\031) 2853 960 w +10 /LucidaSansUnicode00 f +(t) 2885 960 w +(keep) 2969 960 w +(a) 3249 960 w +(separate) 3351 960 w +(copy) 3812 960 w +(of) 4086 960 w +(the) 4231 960 w +(data) 4433 960 w +(\(it) 4690 960 w +(only) 4836 960 w +(needs the lengths of the various pieces\), but the structure is the same on both ends.) 720 1080 w +(The) 970 1236 w +10 /LucidaTypewriter f +(Rasp) 1183 1236 w +10 /LucidaSansUnicode00 f +(in the terminal doubles) 1503 1236 w +(as) 2665 1236 w +(a) 2804 1236 w +(cache.) 2892 1236 w +(Since) 3264 1236 w +(the) 3549 1236 w +(terminal) 3737 1236 w +(keeps) 4172 1236 w +(the) 4489 1236 w +(text) 4677 1236 w +(for) 4901 1236 w +(portions) 720 1356 w +(of) 1161 1356 w +(the) 1295 1356 w +(file) 1485 1356 w +(it) 1671 1356 w +(has) 1772 1356 w +(displayed,) 1975 1356 w +(it) 2503 1356 w +(need) 2604 1356 w +(not) 2876 1356 w +(request) 3071 1356 w +(data) 3472 1356 w +(from) 3717 1356 w +(the) 3984 1356 w +(host) 4174 1356 w +(when) 4420 1356 w +(revisit\255) 4712 1356 w +(ing) 720 1476 w +(old) 907 1476 w +(parts) 1094 1476 w +(of) 1375 1476 w +(the) 1507 1476 w +(file) 1696 1476 w +(or) 1881 1476 w +(redrawing) 2017 1476 w +(obscured) 2537 1476 w +(windows,) 3019 1476 w +(which) 3505 1476 w +(speeds) 3820 1476 w +(things) 4194 1476 w +(up) 4531 1476 w +(consid\255) 4690 1476 w +(erably over low-speed links.) 720 1596 w +(It) 970 1752 w +10 /LucidaSansUnicode20 f +(\031) 1036 1752 w +10 /LucidaSansUnicode00 f +(s) 1068 1752 w +(trivial) 1157 1752 w +(for) 1468 1752 w +(the) 1646 1752 w +(terminal) 1840 1752 w +(to) 2281 1752 w +(maintain) 2418 1752 w +(its) 2879 1752 w +10 /LucidaTypewriter f +(Rasp) 3035 1752 w +10 /LucidaSansUnicode00 f +(,) 3323 1752 w +(because) 3394 1752 w +(all) 3827 1752 w +(changes) 3979 1752 w +(made) 4417 1752 w +(on) 4723 1752 w +(the) 4885 1752 w +(terminal) 720 1872 w +(apply) 1162 1872 w +(to) 1464 1872 w +(parts) 1602 1872 w +(of) 1889 1872 w +(the) 2027 1872 w +(file) 2222 1872 w +(already) 2413 1872 w +(loaded) 2804 1872 w +(there.) 3171 1872 w +(Changes) 3527 1872 w +(made) 3984 1872 w +(by) 4290 1872 w +(the) 4444 1872 w +(host) 4638 1872 w +(are) 4888 1872 w +(compared) 720 1992 w +(against) 1250 1992 w +(the) 1648 1992 w +10 /LucidaTypewriter f +(Rasp) 1850 1992 w +10 /LucidaSansUnicode00 f +(during) 2185 1992 w +(the) 2552 1992 w +(update) 2755 1992 w +(sequence) 3139 1992 w +(after) 3644 1992 w +(each) 3918 1992 w +(command.) 4190 1992 w +(Small) 4780 1992 w +(changes) 720 2112 w +(to) 1168 2112 w +(pieces) 1315 2112 w +(of) 1669 2112 w +(the) 1815 2112 w +(file) 2018 2112 w +(loaded) 2217 2112 w +(in) 2592 2112 w +(the) 2731 2112 w +(terminal) 2934 2112 w +(are) 3384 2112 w +(sent) 3584 2112 w +(in) 3838 2112 w +(their) 3977 2112 w +(entirety.) 4250 2112 w +(Larger) 4732 2112 w +(changes,) 720 2232 w +(and) 1192 2232 w +(changes) 1413 2232 w +(that) 1853 2232 w +(fall) 2085 2232 w +(entirely) 2276 2232 w +(in) 2679 2232 w +(the) 2811 2232 w +(holes,) 3007 2232 w +(are) 3340 2232 w +(transmitted) 3534 2232 w +(as) 4137 2232 w +(messages) 4285 2232 w +(with\255) 4802 2232 w +(out) 720 2352 w +(literal) 931 2352 w +(data:) 1258 2352 w +(only) 1551 2352 w +(the) 1806 2352 w +(lengths) 2012 2352 w +(of) 2422 2352 w +(the) 2571 2352 w +(deleted) 2777 2352 w +(and) 3187 2352 w +(inserted) 3417 2352 w +(strings) 3862 2352 w +(are) 4245 2352 w +(transmitted.) 4447 2352 w +(When) 720 2472 w +(a) 1024 2472 w +(command) 1117 2472 w +(is) 1633 2472 w +(completed,) 1751 2472 w +(the) 2330 2472 w +(terminal) 2523 2472 w +(examines) 2963 2472 w +(its) 3464 2472 w +(visible) 3620 2472 w +(windows) 3968 2472 w +(to) 4427 2472 w +(see) 4564 2472 w +(if) 4766 2472 w +(any) 4871 2472 w +(holes) 720 2592 w +(in) 1017 2592 w +(their) 1146 2592 w +10 /LucidaTypewriter f +(Rasps) 1409 2592 w +10 /LucidaSansUnicode00 f +(intersect) 1807 2592 w +(the) 2265 2592 w +(visible) 2458 2592 w +(portion) 2805 2592 w +(of) 3197 2592 w +(the) 3333 2592 w +(file.) 3526 2592 w +(It) 3779 2592 w +(then) 3883 2592 w +(requests) 4137 2592 w +(the) 4591 2592 w +(miss\255) 4783 2592 w +(ing) 720 2712 w +(data) 907 2712 w +(from) 1151 2712 w +(the) 1417 2712 w +(host,) 1606 2712 w +(along) 1883 2712 w +(with) 2186 2712 w +(up) 2425 2712 w +(to) 2584 2712 w +(512) 2716 2712 w +(bytes) 2939 2712 w +(of) 3232 2712 w +(surrounding) 3364 2712 w +(data,) 3994 2712 w +(to) 4270 2712 w +(minimize) 4402 2712 w +(the) 4885 2712 w +(number) 720 2832 w +(of) 1136 2832 w +(messages) 1273 2832 w +(when) 1787 2832 w +(visiting) 2083 2832 w +(a) 2472 2832 w +(new) 2565 2832 w +(portion) 2798 2832 w +(of) 3190 2832 w +(the) 3326 2832 w +(file.) 3519 2832 w +(This) 3772 2832 w +(technique) 4015 2832 w +(provides) 4531 2832 w +(a) 4985 2832 w +(kind) 720 2952 w +(of) 975 2952 w +(two-level) 1116 2952 w +(lazy) 1614 2952 w +(evaluation) 1850 2952 w +(for) 2391 2952 w +(the) 2573 2952 w +(terminal.) 2771 2952 w +(The) 3281 2952 w +(first) 3506 2952 w +(level) 3745 2952 w +(sends) 4011 2952 w +(a) 4338 2952 w +(minimum) 4437 2952 w +(of) 4942 2952 w +(information) 720 3072 w +(about) 1326 3072 w +(parts) 1643 3072 w +(of) 1929 3072 w +(the) 2066 3072 w +(file) 2260 3072 w +(not) 2450 3072 w +(being) 2648 3072 w +(edited) 2958 3072 w +(interactively;) 3300 3072 w +(the) 3956 3072 w +(second) 4149 3072 w +(level) 4531 3072 w +(waits) 4791 3072 w +(until) 720 3192 w +(a) 974 3192 w +(change) 1064 3192 w +(is) 1447 3192 w +(displayed) 1562 3192 w +(before) 2058 3192 w +(transmitting) 2407 3192 w +(the) 3037 3192 w +(new) 3227 3192 w +(data.) 3457 3192 w +(Of) 3767 3192 w +(course,) 3918 3192 w +(performance) 4308 3192 w +(is) 4960 3192 w +(also) 720 3312 w +(helped) 965 3312 w +(by) 1343 3312 w +(having) 1507 3312 w +(the) 1878 3312 w +(terminal) 2082 3312 w +(respond) 2533 3312 w +(immediately) 2979 3312 w +(to) 3620 3312 w +(typing) 3767 3312 w +(and) 4120 3312 w +(simple) 4348 3312 w +(mouse) 4717 3312 w +(requests.) 720 3432 w +(Except) 1237 3432 w +(for) 1595 3432 w +(small) 1770 3432 w +(changes) 2063 3432 w +(to) 2498 3432 w +(active) 2632 3432 w +(pieces) 2948 3432 w +(of) 3290 3432 w +(the) 3425 3432 w +(file,) 3617 3432 w +(which) 3837 3432 w +(are) 4155 3432 w +(transmitted) 4344 3432 w +(to) 4942 3432 w +(the) 720 3552 w +(terminal) 912 3552 w +(without) 1351 3552 w +(negotiation,) 1753 3552 w +(the) 2373 3552 w +(terminal) 2565 3552 w +(is) 3004 3552 w +(wholly) 3121 3552 w +(responsible) 3468 3552 w +(for) 4067 3552 w +(deciding) 4242 3552 w +(what) 4693 3552 w +(is) 4960 3552 w +(displayed; the host uses the) 720 3672 w +10 /LucidaTypewriter f +(Rasp) 2114 3672 w +10 /LucidaSansUnicode00 f +(only to tell the terminal what might be relevant.) 2434 3672 w +(When) 970 3828 w +(a) 1269 3828 w +(change) 1357 3828 w +(is) 1738 3828 w +(initiated) 1851 3828 w +(by) 2281 3828 w +(the) 2429 3828 w +(host,) 2617 3828 w +(the) 2893 3828 w +(messages) 3081 3828 w +(to) 3589 3828 w +(the) 3720 3828 w +(terminal) 3908 3828 w +(describing) 4344 3828 w +(the) 4885 3828 w +(change) 720 3948 w +(are) 1115 3948 w +(generated) 1314 3948 w +(by) 1849 3948 w +(the) 2011 3948 w +(routine) 2213 3948 w +(that) 2608 3948 w +(applies) 2845 3948 w +(the) 3237 3948 w +(transcript) 3438 3948 w +(of) 3951 3948 w +(the) 4095 3948 w +(changes) 4296 3948 w +(to) 4741 3948 w +(the) 4885 3948 w +(contents) 720 4068 w +(of) 1174 4068 w +(the) 1309 4068 w +10 /LucidaTypewriter f +(File) 1501 4068 w +10 /LucidaSansUnicode00 f +(.) 1789 4068 w +(Since) 1890 4068 w +(changes) 2179 4068 w +(are) 2615 4068 w +(undone) 2804 4068 w +(by) 3208 4068 w +(the) 3361 4068 w +(same) 3554 4068 w +(update) 3847 4068 w +(routine,) 4221 4068 w +(undoing) 4639 4068 w +(requires) 720 4188 w +(no) 1160 4188 w +(extra) 1324 4188 w +(code) 1615 4188 w +(in) 1887 4188 w +(the) 2019 4188 w +(communications;) 2215 4188 w +(the) 3085 4188 w +(usual) 3280 4188 w +(messages) 3579 4188 w +(describing) 4094 4188 w +(changes) 4641 4188 w +(to the file are sufficient to back up the screen image.) 720 4308 w +(The) 970 4464 w +10 /LucidaTypewriter f +(Rasp) 1184 4464 w +10 /LucidaSansUnicode00 f +(is) 1505 4464 w +(a) 1618 4464 w +(particularly) 1706 4464 w +(good) 2283 4464 w +(example) 2563 4464 w +(of) 3009 4464 w +(the) 3140 4464 w +(way) 3328 4464 w +(caches) 3545 4464 w +(are) 3905 4464 w +(used) 4091 4464 w +(in) 4357 4464 w +10 /LucidaTypewriter f +(sam) 4482 4464 w +10 /LucidaSansUnicode00 f +(.) 4698 4464 w +(First,) 4796 4464 w +(it) 720 4584 w +(facilitates) 835 4584 w +(access) 1350 4584 w +(to) 1714 4584 w +(the) 1861 4584 w +(active) 2064 4584 w +(portion) 2392 4584 w +(of) 2794 4584 w +(the) 2940 4584 w +(text) 3143 4584 w +(by) 3382 4584 w +(placing) 3545 4584 w +(the) 3944 4584 w +(busy) 4147 4584 w +(text) 4423 4584 w +(in) 4662 4584 w +(main) 4801 4584 w +(memory.) 720 4704 w +(In) 1215 4704 w +(so) 1341 4704 w +(doing,) 1488 4704 w +(it) 1832 4704 w +(provides) 1933 4704 w +(efficient) 2384 4704 w +(access) 2813 4704 w +(to) 3163 4704 w +(a) 3296 4704 w +(large) 3387 4704 w +(data) 3666 4704 w +(structure) 3912 4704 w +(that) 4386 4704 w +(does) 4613 4704 w +(not) 4880 4704 w +(fit) 720 4824 w +(in) 858 4824 w +(memory.) 984 4824 w +(Since) 1479 4824 w +(the) 1766 4824 w +(form) 1955 4824 w +(of) 2221 4824 w +(data) 2353 4824 w +(is) 2597 4824 w +(to) 2711 4824 w +(be) 2843 4824 w +(imposed) 2996 4824 w +(by) 3446 4824 w +(the) 3595 4824 w +(user,) 3784 4824 w +(not) 4060 4824 w +(by) 4254 4824 w +(the) 4403 4824 w +(program,) 4592 4824 w +(and) 720 4944 w +(because) 944 4944 w +(characters) 1382 4944 w +(will) 1926 4944 w +(frequently) 2134 4944 w +(be) 2673 4944 w +(scanned) 2836 4944 w +(sequentially,) 3280 4944 w +(files) 3937 4944 w +(are) 4183 4944 w +(stored) 4379 4944 w +(as) 4732 4944 w +(flat) 4882 4944 w +(objects.) 720 5064 w +(Caches help keep performance good and linear when working with such data.) 1165 5064 w +(Second,) 970 5220 w +(the) 1386 5220 w +10 /LucidaTypewriter f +(Rasp) 1578 5220 w +10 /LucidaSansUnicode00 f +(and) 1903 5220 w +(several) 2120 5220 w +(of) 2497 5220 w +(the) 2632 5220 w +(other) 2824 5220 w +(caches) 3119 5220 w +(have) 3483 5220 w +(some) 3746 5220 w +10 /LucidaSans-Italic f +(read-ahead;) 4045 5220 w +10 /LucidaSansUnicode00 f +(that) 4699 5220 w +(is,) 4928 5220 w +(the) 720 5340 w +(cache) 924 5340 w +(is) 1248 5340 w +(loaded) 1377 5340 w +(with) 1753 5340 w +(more) 2006 5340 w +(information) 2305 5340 w +(than) 2920 5340 w +(is) 3184 5340 w +(needed) 3312 5340 w +(for) 3716 5340 w +(the) 3903 5340 w +(job) 4106 5340 w +(immediately) 4308 5340 w +(at) 4948 5340 w +(hand.) 720 5460 w +(When) 1079 5460 w +(manipulating) 1398 5460 w +(linear) 2089 5460 w +(structures,) 2414 5460 w +(the) 2989 5460 w +(accesses) 3198 5460 w +(are) 3674 5460 w +(usually) 3880 5460 w +(sequential,) 4274 5460 w +(and) 4860 5460 w +(read-ahead) 720 5580 w +(can) 1323 5580 w +(significantly) 1530 5580 w +(reduce) 2154 5580 w +(the) 2522 5580 w +(average) 2716 5580 w +(time) 3132 5580 w +(to) 3386 5580 w +(access) 3522 5580 w +(the) 3875 5580 w +(next) 4068 5580 w +(element) 4322 5580 w +(of) 4749 5580 w +(the) 4885 5580 w +(object.) 720 5700 w +(Sequential) 1122 5700 w +(access) 1665 5700 w +(is) 2020 5700 w +(a) 2140 5700 w +(common) 2235 5700 w +(mode) 2697 5700 w +(for) 3011 5700 w +(people) 3191 5700 w +(as) 3560 5700 w +(well) 3707 5700 w +(as) 3939 5700 w +(programs;) 4086 5700 w +(consider) 4626 5700 w +(scrolling through a document while looking for something.) 720 5820 w +(Finally,) 970 5976 w +(like) 1345 5976 w +(any) 1550 5976 w +(good) 1753 5976 w +(data) 2034 5976 w +(structure,) 2278 5976 w +(the) 2782 5976 w +(cache) 2971 5976 w +(guides) 3280 5976 w +(the) 3637 5976 w +(algorithm,) 3826 5976 w +(or) 4361 5976 w +(at) 4497 5976 w +(least) 4623 5976 w +(the) 4885 5976 w +(implementation.) 720 6096 w +(The) 1620 6096 w +10 /LucidaTypewriter f +(Rasp) 1875 6096 w +10 /LucidaSansUnicode00 f +(was) 2237 6096 w +(actually) 2494 6096 w +(invented) 2938 6096 w +(to) 3429 6096 w +(control) 3600 6096 w +(the) 4015 6096 w +(communications) 4243 6096 w +(between) 720 6216 w +(the) 1165 6216 w +(host) 1358 6216 w +(and) 1607 6216 w +(terminal) 1825 6216 w +(parts,) 2265 6216 w +(but) 2582 6216 w +(I) 2782 6216 w +(realized) 2849 6216 w +(very) 3273 6216 w +(early) 3513 6216 w +(that) 3785 6216 w +(it) 4015 6216 w +(was) 4120 6216 w +(also) 4342 6216 w +(a) 4577 6216 w +(form) 4671 6216 w +(of) 4942 6216 w +(cache.) 720 6336 w +(Other) 1092 6336 w +(caches) 1399 6336 w +(were) 1758 6336 w +(more) 2021 6336 w +(explicitly) 2305 6336 w +(intended) 2774 6336 w +(to) 3235 6336 w +(serve) 3366 6336 w +(a) 3655 6336 w +(double) 3743 6336 w +(purpose: for exam\255) 4110 6336 w +(ple,) 720 6456 w +(the) 937 6456 w +(caches) 1129 6456 w +(in) 1492 6456 w +10 /LucidaTypewriter f +(Files) 1620 6456 w +10 /LucidaSansUnicode00 f +(that) 2017 6456 w +(coalesce) 2245 6456 w +(updates) 2692 6456 w +(not) 3116 6456 w +(only) 3313 6456 w +(reduce) 3554 6456 w +(traffic) 3920 6456 w +(to) 4244 6456 w +(the) 4380 6456 w +(transcript) 4573 6456 w +(and) 720 6576 w +(contents) 933 6576 w +10 /LucidaTypewriter f +(Buffers) 1383 6576 w +10 /LucidaSansUnicode00 f +(,) 1887 6576 w +(they) 1952 6576 w +(also) 2192 6576 w +(clump) 2421 6576 w +(screen) 2752 6576 w +(updates) 3102 6576 w +(so) 3522 6576 w +(that) 3667 6576 w +(complicated changes to) 3891 6576 w +(the) 720 6696 w +(screen) 908 6696 w +(are) 1258 6696 w +(achieved) 1443 6696 w +(in) 1900 6696 w +(just) 2024 6696 w +(a) 2237 6696 w +(few) 2326 6696 w +(messages) 2530 6696 w +(to) 3039 6696 w +(the) 3171 6696 w +(terminal.) 3360 6696 w +(This) 3860 6696 w +(saved) 4099 6696 w +(me) 4410 6696 w +(consider\255) 4593 6696 w +(able) 720 6816 w +(work:) 956 6816 w +(I) 1258 6816 w +(did) 1320 6816 w +(not) 1508 6816 w +(need) 1701 6816 w +(to) 1971 6816 w +(write) 2102 6816 w +(special) 2375 6816 w +(code) 2742 6816 w +(to) 3006 6816 w +(optimize the message traffic to the ter\255) 3137 6816 w +(minal.) 720 6936 w +(Caches) 1094 6936 w +(pay) 1480 6936 w +(off) 1692 6936 w +(in) 1869 6936 w +(surprising) 2002 6936 w +(ways.) 2535 6936 w +(Also,) 2877 6936 w +(they) 3162 6936 w +(tend) 3412 6936 w +(to) 3673 6936 w +(be) 3814 6936 w +(independent,) 3976 6936 w +(so) 4660 6936 w +(their) 4815 6936 w +(performance improvements are multiplicative.) 720 7056 w +cleartomark +showpage +saveobj restore +%%EndPage: 23 23 +%%Page: 24 24 +/saveobj save def +mark +24 pagesetup +10 /LucidaSansUnicode00 f +(\255 24 \255) 2752 480 w +10 /LucidaSans-Demi f +(Data structures in the terminal) 720 840 w +10 /LucidaSansUnicode00 f +(The) 720 996 w +(terminal) 936 996 w +10 /LucidaSansUnicode20 f +(\031) 1338 996 w +10 /LucidaSansUnicode00 f +(s) 1370 996 w +(job) 1456 996 w +(is) 1646 996 w +(to) 1762 996 w +(display) 1896 996 w +(and) 2274 996 w +(to) 2490 996 w +(maintain) 2624 996 w +(a) 3082 996 w +(consistent) 3173 996 w +(image) 3706 996 w +(of) 4037 996 w +(pieces) 4171 996 w +(of) 4513 996 w +(the) 4647 996 w +(files) 4838 996 w +(being) 720 1116 w +(edited.) 1037 1116 w +(Because) 1450 1116 w +(the) 1883 1116 w +(text) 2082 1116 w +(is) 2317 1116 w +(always) 2441 1116 w +(in) 2804 1116 w +(memory,) 2939 1116 w +(the) 3411 1116 w +(data) 3610 1116 w +(structures) 3864 1116 w +(are) 4397 1116 w +(consider\255) 4593 1116 w +(ably simpler than those in the host part.) 720 1236 w +10 /LucidaTypewriter f +(Sam) 970 1392 w +10 /LucidaSansUnicode00 f +(typically) 1238 1392 w +(has) 1687 1392 w +(far) 1907 1392 w +(more) 2092 1392 w +(windows) 2395 1392 w +(than) 2867 1392 w +(does) 3136 1392 w +10 /LucidaTypewriter f +(mux) 3420 1392 w +10 /LucidaSansUnicode00 f +(,) 3636 1392 w +(the) 3721 1392 w +(window) 3929 1392 w +(system) 4351 1392 w +(within) 4744 1392 w +(which) 720 1512 w +(its) 1048 1512 w +(Blit) 1212 1512 w +(implementation) 1412 1512 w +(runs.) 2221 1512 w +10 /LucidaTypewriter f +(Mux) 2548 1512 w +10 /LucidaSansUnicode00 f +(has) 2811 1512 w +(a) 3026 1512 w +(fairly) 3128 1512 w +(small) 3418 1512 w +(number) 3721 1512 w +(of) 4144 1512 w +(asynchronously) 4288 1512 w +(updated) 720 1632 w +(windows;) 1163 1632 w +10 /LucidaTypewriter f +(sam) 1659 1632 w +10 /LucidaSansUnicode00 f +(needs) 1919 1632 w +(a) 2251 1632 w +(large) 2350 1632 w +(number) 2637 1632 w +(of) 3058 1632 w +(synchronously) 3200 1632 w +(updated) 3941 1632 w +(windows) 4384 1632 w +(that) 4849 1632 w +(are) 720 1752 w +(usually) 921 1752 w +(static) 1310 1752 w +(and) 1619 1752 w +(often) 1848 1752 w +(fully) 2150 1752 w +(obscured.) 2408 1752 w +(The) 2969 1752 w +(different) 3199 1752 w +(tradeoffs) 3666 1752 w +(guided) 4153 1752 w +10 /LucidaTypewriter f +(sam) 4537 1752 w +10 /LucidaSansUnicode00 f +(away) 4801 1752 w +(from) 720 1872 w +(the) 1017 1872 w +(memory-intensive) 1237 1872 w +(implementation) 2190 1872 w +(of) 3017 1872 w +(windows,) 3180 1872 w +(called) 3697 1872 w +10 /LucidaTypewriter f +(Layers) 4045 1872 w +10 /LucidaSansUnicode00 f +(,) 4477 1872 w +6 /LucidaSansUnicode00 f +(17) 4509 1822 w +10 /LucidaSansUnicode00 f +(used) 4651 1872 w +(in) 4949 1872 w +10 /LucidaTypewriter f +(mux.) 720 1992 w +10 /LucidaSansUnicode00 f +(Rather) 1049 1992 w +(than) 1404 1992 w +(depending) 1661 1992 w +(on) 2218 1992 w +(a) 2382 1992 w +(complete) 2478 1992 w +(bitmap) 2965 1992 w +(image) 3346 1992 w +(of) 3681 1992 w +(the) 3819 1992 w +(display) 4014 1992 w +(for) 4396 1992 w +(each) 4575 1992 w +(win\255) 4839 1992 w +(dow,) 720 2112 w +10 /LucidaTypewriter f +(sam) 998 2112 w +10 /LucidaSansUnicode00 f +(regenerates) 1260 2112 w +(the) 1879 2112 w +(image) 2080 2112 w +(from) 2421 2112 w +(its) 2699 2112 w +(in-memory) 2862 2112 w +(text) 3453 2112 w +(\(stored) 3690 2112 w +(in) 4078 2112 w +(the) 4215 2112 w +10 /LucidaTypewriter f +(Rasp) 4416 2112 w +10 /LucidaSansUnicode00 f +(\)) 4704 2112 w +(when) 4783 2112 w +(necessary,) 720 2232 w +(although) 1271 2232 w +(it) 1745 2232 w +(will) 1855 2232 w +(use) 2063 2232 w +(such) 2276 2232 w +(an) 2546 2232 w +(image) 2707 2232 w +(if) 3045 2232 w +(it) 3154 2232 w +(is) 3263 2232 w +(available.) 3386 2232 w +(Like) 3916 2232 w +10 /LucidaTypewriter f +(Layers) 4155 2232 w +10 /LucidaSansUnicode00 f +(,) 4587 2232 w +(though,) 4662 2232 w +10 /LucidaTypewriter f +(sam) 720 2352 w +10 /LucidaSansUnicode00 f +(uses) 993 2352 w +(the) 1270 2352 w +(screen) 1482 2352 w +(bitmap) 1856 2352 w +(as) 2253 2352 w +(active) 2416 2352 w +(storage) 2753 2352 w +(in) 3173 2352 w +(which) 3321 2352 w +(to) 3659 2352 w +(update) 3814 2352 w +(the) 4208 2352 w +(image) 4421 2352 w +(using) 4774 2352 w +10 /LucidaTypewriter f +(bitblt) 720 2472 w +10 /LucidaSansUnicode00 f +(.) 1152 2472 w +6 /LucidaSansUnicode00 f +(18,19) 1184 2422 w +10 /LucidaSansUnicode00 f +(The) 1392 2472 w +(resulting) 1610 2472 w +(organization,) 2076 2472 w +(pictured) 2756 2472 w +(in) 3195 2472 w +(Figure) 3323 2472 w +(6,) 3664 2472 w +(has) 3795 2472 w +(a) 3999 2472 w +(global) 4090 2472 w +(array) 4425 2472 w +(of) 4705 2472 w +(win\255) 4839 2472 w +(dows,) 720 2592 w +(called) 1043 2592 w +10 /LucidaTypewriter f +(Flayers) 1365 2592 w +10 /LucidaSansUnicode00 f +(,) 1869 2592 w +(each) 1940 2592 w +(of) 2203 2592 w +(which) 2340 2592 w +(holds) 2660 2592 w +(an) 2965 2592 w +(image) 3122 2592 w +(of) 3457 2592 w +(a) 3595 2592 w +(piece) 3690 2592 w +(of) 3985 2592 w +(text) 4123 2592 w +(held) 4354 2592 w +(in) 4604 2592 w +(a) 4735 2592 w +(data) 4830 2592 w +(structure) 720 2712 w +(called) 1192 2712 w +(a) 1509 2712 w +10 /LucidaTypewriter f +(Frame) 1598 2712 w +10 /LucidaSansUnicode00 f +(,) 1958 2712 w +(which) 2024 2712 w +(in) 2339 2712 w +(turn) 2463 2712 w +(represents) 2698 2712 w +(a) 3245 2712 w +(rectangular) 3333 2712 w +(window) 3917 2712 w +(full) 4319 2712 w +(of) 4509 2712 w +(text) 4640 2712 w +(dis\255) 4864 2712 w +(played) 720 2832 w +(in) 1085 2832 w +(some) 1223 2832 w +10 /LucidaTypewriter f +(Bitmap) 1531 2832 w +10 /LucidaSansUnicode00 f +(.) 1963 2832 w +(Each) 2074 2832 w +10 /LucidaTypewriter f +(Flayer) 2343 2832 w +10 /LucidaSansUnicode00 f +(appears) 2822 2832 w +(in) 3253 2832 w +(a) 3391 2832 w +(global) 3493 2832 w +(list) 3839 2832 w +(that) 4032 2832 w +(orders) 4270 2832 w +(them) 4631 2832 w +(all) 4927 2832 w +(front-to-back) 720 2952 w +(on) 1439 2952 w +(the) 1602 2952 w +(display,) 1797 2952 w +(and) 2211 2952 w +(simultaneously) 2430 2952 w +(as) 3198 2952 w +(an) 3343 2952 w +(element) 3499 2952 w +(of) 3927 2952 w +(a) 4064 2952 w +(per-file) 4158 2952 w +(array) 4566 2952 w +(that) 4849 2952 w +(holds) 720 3072 w +(all) 1026 3072 w +(the) 1179 3072 w +(open) 1374 3072 w +(windows) 1656 3072 w +(for) 2116 3072 w +(that) 2295 3072 w +(file.) 2526 3072 w +(The) 2782 3072 w +(complement) 3004 3072 w +(in) 3646 3072 w +(the) 3778 3072 w +(terminal) 3974 3072 w +(of) 4417 3072 w +(the) 4556 3072 w +10 /LucidaTypewriter f +(File) 4752 3072 w +10 /LucidaSansUnicode00 f +(on the host is called a) 720 3192 w +10 /LucidaTypewriter f +(Text) 1819 3192 w +10 /LucidaSansUnicode00 f +(; each connects its) 2107 3192 w +10 /LucidaTypewriter f +(Flayers) 3039 3192 w +10 /LucidaSansUnicode00 f +(to the associated) 3575 3192 w +10 /LucidaTypewriter f +(Rasp) 4433 3192 w +10 /LucidaSansUnicode00 f +(.) 4721 3192 w +1842 3678 1842 3390 Dl +1842 3390 2648 3390 Dl +2649 3390 2649 3678 Dl +2649 3678 1843 3678 Dl +10 /LucidaTypewriter f +(Text) 2102 3554 w +2764 3678 2764 3390 Dl +2764 3390 3412 3390 Dl +3412 3390 3412 3678 Dl +3412 3678 2764 3678 Dl +(Rasp) 2944 3554 w +2649 3534 2764 3534 Dl +3412 3534 3584 3534 Dl +3513 3552 3585 3534 Dl +3513 3516 3585 3534 Dl +10 /LucidaSansUnicode00 f +(to host) 3685 3554 w +2246 3678 2246 3793 Dl +2246 3793 2030 3793 Dl +2030 3793 2030 4009 Dl +2030 4009 2145 4009 Dl +2145 4153 2145 3865 Dl +2145 3865 2685 3865 Dl +2685 3865 2685 4153 Dl +2685 4153 2145 4153 Dl +10 /LucidaTypewriter f +(Flayer) 2199 4029 w +2685 4153 2685 3865 Dl +2685 3865 3225 3865 Dl +3225 3865 3225 4153 Dl +3225 4153 2685 4153 Dl +3225 4153 3225 3865 Dl +3225 3865 3765 3865 Dl +3765 3865 3765 4153 Dl +3765 4153 3225 4153 Dl +3765 4153 3765 3865 Dl +3765 3865 4305 3865 Dl +4305 3865 4305 4153 Dl +4305 4153 3765 4153 Dl +(...) 3927 4029 w +(...) 2847 4490 w +2145 4614 2145 4326 Dl +2145 4326 2685 4326 Dl +2685 4326 2685 4614 Dl +2685 4614 2145 4614 Dl +(Frame) 2235 4490 w +2415 4153 2415 4325 Dl +2955 4153 2955 4325 Dl +3495 4153 3495 4325 Dl +4035 4153 4035 4325 Dl +1454 4614 1454 4326 Dl +1454 4326 1943 4326 Dl +1943 4326 1943 4614 Dl +1943 4614 1454 4614 Dl +(Bitmap) 1482 4430 w +10 /LucidaSansUnicode00 f +(\(cache\)) 1528 4550 w +1943 4470 2144 4470 Dl +2415 4614 2415 4729 Dl +2415 4729 2055 4729 Dl +2055 4729 2055 4945 Dl +2055 4945 2170 4945 Dl +2170 5089 2170 4801 Dl +2170 4801 2494 4801 Dl +2494 4801 2494 5089 Dl +2494 5089 2170 5089 Dl +10 /LucidaTypewriter f +(Box) 2224 4965 w +2494 5089 2494 4801 Dl +2494 4801 2818 4801 Dl +2818 4801 2818 5089 Dl +2818 5089 2494 5089 Dl +2818 5089 2818 4801 Dl +2818 4801 3142 4801 Dl +3142 4801 3142 5089 Dl +3142 5089 2818 5089 Dl +3142 5089 3142 4801 Dl +3142 4801 3466 4801 Dl +3466 4801 3466 5089 Dl +3466 5089 3142 5089 Dl +(...) 3196 4965 w +8 /LucidaSans-Italic f +(Figure) 720 5267 w +(6.) 1011 5267 w +(Data) 1133 5267 w +(structures) 1366 5267 w +(in) 1808 5267 w +(the) 1927 5267 w +(terminal.) 2095 5267 w +8 /LucidaTypewriter f +(Flayers) 2522 5267 w +8 /LucidaSans-Italic f +(are) 2974 5267 w +(also) 3149 5267 w +(linked) 3352 5267 w +(together) 3632 5267 w +(into) 4006 5267 w +(a) 4202 5267 w +(front-to-back) 4298 5267 w +(list.) 4899 5267 w +8 /LucidaTypewriter f +(Boxes) 720 5367 w +8 /LucidaSans-Italic f +(are) 1036 5367 w +(discussed) 1191 5367 w +(in) 1587 5367 w +(the) 1686 5367 w +(next) 1834 5367 w +(section.) 2025 5367 w +10 /LucidaSansUnicode00 f +(The) 970 5643 w +10 /LucidaTypewriter f +(Bitmap) 1191 5643 w +10 /LucidaSansUnicode00 f +(for) 1663 5643 w +(a) 1842 5643 w +10 /LucidaTypewriter f +(Frame) 1937 5643 w +10 /LucidaSansUnicode00 f +(contains) 2337 5643 w +(the) 2785 5643 w +(image) 2980 5643 w +(of) 3315 5643 w +(the) 3454 5643 w +(text.) 3650 5643 w +(For) 3946 5643 w +(a) 4143 5643 w +(fully) 4239 5643 w +(visible) 4489 5643 w +(win\255) 4839 5643 w +(dow,) 720 5763 w +(the) 989 5763 w +10 /LucidaTypewriter f +(Bitmap) 1180 5763 w +10 /LucidaSansUnicode00 f +(will) 1648 5763 w +(be) 1848 5763 w +(the) 2003 5763 w +(screen) 2194 5763 w +(\(or) 2547 5763 w +(at) 2718 5763 w +(least) 2846 5763 w +(the) 3110 5763 w +10 /LucidaTypewriter f +(Layer) 3300 5763 w +10 /LucidaSansUnicode00 f +(in) 3695 5763 w +(which) 3821 5763 w +10 /LucidaTypewriter f +(sam) 4137 5763 w +10 /LucidaSansUnicode00 f +(is) 4388 5763 w +(being) 4503 5763 w +(run\),) 4810 5763 w +(while) 720 5883 w +(for) 1015 5883 w +(partially) 1196 5883 w +(obscured) 1628 5883 w +(windows) 2119 5883 w +(the) 2582 5883 w +10 /LucidaTypewriter f +(Bitmap) 2780 5883 w +10 /LucidaSansUnicode00 f +(will) 3255 5883 w +(be) 3462 5883 w +(off-screen.) 3624 5883 w +(If) 4241 5883 w +(the) 4350 5883 w +(window) 4548 5883 w +(is) 4960 5883 w +(fully obscured, the) 720 6003 w +10 /LucidaTypewriter f +(Bitmap) 1660 6003 w +10 /LucidaSansUnicode00 f +(will be null.) 2124 6003 w +(The) 970 6159 w +10 /LucidaTypewriter f +(Bitmap) 1186 6159 w +10 /LucidaSansUnicode00 f +(is) 1653 6159 w +(a) 1768 6159 w +(kind) 1858 6159 w +(of) 2105 6159 w +(cache.) 2238 6159 w +(When) 2612 6159 w +(making) 2913 6159 w +(changes) 3307 6159 w +(to) 3741 6159 w +(the) 3874 6159 w +(display,) 4064 6159 w +(most) 4473 6159 w +(of) 4751 6159 w +(the) 4885 6159 w +(original) 720 6279 w +(image) 1129 6279 w +(will) 1465 6279 w +(look) 1669 6279 w +(the) 1918 6279 w +(same) 2113 6279 w +(in) 2408 6279 w +(the) 2539 6279 w +(final) 2734 6279 w +(image,) 2986 6279 w +(and) 3353 6279 w +(the) 3573 6279 w +(update) 3768 6279 w +(algorithms) 4144 6279 w +(exploit) 4704 6279 w +(this.) 720 6399 w +(The) 1032 6399 w +10 /LucidaTypewriter f +(Frame) 1282 6399 w +10 /LucidaSansUnicode00 f +(software) 1711 6399 w +(updates) 2196 6399 w +(the) 2653 6399 w +(image) 2878 6399 w +(in) 3243 6399 w +(the) 3404 6399 w +10 /LucidaTypewriter f +(Bitmap) 3629 6399 w +10 /LucidaSansUnicode00 f +(incrementally;) 4131 6399 w +(the) 4885 6399 w +10 /LucidaTypewriter f +(Bitmap) 720 6519 w +10 /LucidaSansUnicode00 f +(is) 1201 6519 w +(not) 1330 6519 w +(just) 1539 6519 w +(an) 1768 6519 w +(image,) 1934 6519 w +(it) 2310 6519 w +(is) 2425 6519 w +(a) 2554 6519 w +(data) 2658 6519 w +(structure.) 2917 6519 w +6 /LucidaSansUnicode00 f +(18,19) 3387 6469 w +10 /LucidaSansUnicode00 f +(The) 3606 6519 w +(job) 3835 6519 w +(of) 4037 6519 w +(the) 4183 6519 w +(software) 4386 6519 w +(that) 4849 6519 w +(updates) 720 6639 w +(the) 1145 6639 w +(display) 1339 6639 w +(is) 1720 6639 w +(therefore) 1839 6639 w +(to) 2325 6639 w +(use) 2462 6639 w +(as) 2670 6639 w +(much) 2815 6639 w +(as) 3122 6639 w +(possible) 3267 6639 w +(of) 3709 6639 w +(the) 3846 6639 w +(existing) 4040 6639 w +(image) 4466 6639 w +(\(con\255) 4800 6639 w +(verting) 720 6759 w +(the) 1131 6759 w +(text) 1358 6759 w +(from) 1621 6759 w +(ASCII) 1925 6759 w +(characters) 2247 6759 w +(to) 2819 6759 w +(pixels) 2988 6759 w +(is) 3348 6759 w +(expensive\)) 3499 6759 w +(in) 4089 6759 w +(a) 4251 6759 w +(sort) 4377 6759 w +(of) 4638 6759 w +(two-) 4807 6759 w +(dimensional) 720 6879 w +(string) 1348 6879 w +(insertion) 1668 6879 w +(algorithm.) 2134 6879 w +(The) 2705 6879 w +(details) 2925 6879 w +(of) 3284 6879 w +(this) 3421 6879 w +(process) 3639 6879 w +(are) 4052 6879 w +(described) 4243 6879 w +(in) 4755 6879 w +(the) 4885 6879 w +(next section.) 720 6999 w +cleartomark +showpage +saveobj restore +%%EndPage: 24 24 +%%Page: 25 25 +/saveobj save def +mark +25 pagesetup +10 /LucidaSansUnicode00 f +(\255 25 \255) 2752 480 w +(The) 970 840 w +10 /LucidaTypewriter f +(Frame) 1200 840 w +10 /LucidaSansUnicode00 f +(software) 1609 840 w +(has) 2073 840 w +(no) 2290 840 w +(code) 2462 840 w +(to) 2742 840 w +(support) 2889 840 w +(overlapping) 3316 840 w +(windows;) 3939 840 w +(its) 4441 840 w +(job) 4608 840 w +(is) 4812 840 w +(to) 4942 840 w +(keep) 720 960 w +(a) 986 960 w +(single) 1074 960 w +10 /LucidaTypewriter f +(Bitmap) 1396 960 w +10 /LucidaSansUnicode00 f +(up) 1861 960 w +(to) 2019 960 w +(date.) 2150 960 w +(It) 2458 960 w +(falls) 2557 960 w +(to) 2791 960 w +(the) 2922 960 w +10 /LucidaTypewriter f +(Flayer) 3110 960 w +10 /LucidaSansUnicode00 f +(software to multiplex the vari\255) 3575 960 w +(ous) 720 1080 w +10 /LucidaTypewriter f +(Bitmaps) 936 1080 w +10 /LucidaSansUnicode00 f +(onto) 1482 1080 w +(the) 1745 1080 w +(screen.) 1942 1080 w +(The) 2365 1080 w +(problem) 2589 1080 w +(of) 3038 1080 w +(maintaining) 3179 1080 w +(overlapping) 3797 1080 w +10 /LucidaTypewriter f +(Flayers) 4413 1080 w +10 /LucidaSansUnicode00 f +(is) 4960 1080 w +(easier) 720 1200 w +(than) 1057 1200 w +(for) 1322 1200 w +10 /LucidaTypewriter f +(Layers) 1510 1200 w +6 /LucidaSansUnicode00 f +(17) 1942 1150 w +10 /LucidaSansUnicode00 f +(because) 2066 1200 w +(changes) 2508 1200 w +(are) 2955 1200 w +(made) 3155 1200 w +(synchronously) 3470 1200 w +(and) 4215 1200 w +(because) 4443 1200 w +(the) 4885 1200 w +(contents) 720 1320 w +(of) 1181 1320 w +(the) 1323 1320 w +(window) 1522 1320 w +(can) 1935 1320 w +(be) 2148 1320 w +(reconstructed) 2312 1320 w +(from) 3026 1320 w +(the) 3303 1320 w +(data) 3503 1320 w +(stored) 3758 1320 w +(in) 4112 1320 w +(the) 4248 1320 w +10 /LucidaTypewriter f +(Frame) 4448 1320 w +10 /LucidaSansUnicode00 f +(;) 4808 1320 w +(the) 4885 1320 w +10 /LucidaTypewriter f +(Layers) 720 1440 w +10 /LucidaSansUnicode00 f +(software) 1195 1440 w +(makes) 1653 1440 w +(no) 2008 1440 w +(such) 2173 1440 w +(assumptions.) 2441 1440 w +(In) 3162 1440 w +10 /LucidaTypewriter f +(sam) 3295 1440 w +10 /LucidaSansUnicode00 f +(,) 3511 1440 w +(the) 3585 1440 w +(window) 3782 1440 w +(being) 4193 1440 w +(changed) 4507 1440 w +(is) 4960 1440 w +(almost) 720 1560 w +(always) 1091 1560 w +(fully) 1455 1560 w +(visible,) 1709 1560 w +(because) 2095 1560 w +(the) 2534 1560 w +(current) 2734 1560 w +(window) 3129 1560 w +(is) 3543 1560 w +(always) 3668 1560 w +(fully) 4032 1560 w +(visible,) 4286 1560 w +(by) 4672 1560 w +(con\255) 4833 1560 w +(struction.) 720 1680 w +(However,) 1260 1680 w +(when) 1754 1680 w +(multi-file) 2056 1680 w +(changes) 2560 1680 w +(are) 3004 1680 w +(being) 3200 1680 w +(made,) 3516 1680 w +(or) 3859 1680 w +(when) 4005 1680 w +(more) 4306 1680 w +(than) 4601 1680 w +(one) 4861 1680 w +(window is open on a file, it may be necessary to update partially obscured windows.) 720 1800 w +(There) 970 1956 w +(are) 1285 1956 w +(three) 1474 1956 w +(cases:) 1763 1956 w +(the) 2096 1956 w +(window) 2288 1956 w +(is) 2695 1956 w +(fully) 2813 1956 w +(visible,) 3060 1956 w +(invisible) 3439 1956 w +(\(fully) 3877 1956 w +(obscured\),) 4157 1956 w +(or) 4708 1956 w +(par\255) 4848 1956 w +(tially) 720 2076 w +(visible.) 997 2076 w +(If) 1416 2076 w +(fully) 1528 2076 w +(visible,) 1783 2076 w +(the) 2169 2076 w +10 /LucidaTypewriter f +(Bitmap) 2369 2076 w +10 /LucidaSansUnicode00 f +(is) 2846 2076 w +(part) 2971 2076 w +(of) 3212 2076 w +(the) 3355 2076 w +(screen,) 3555 2076 w +(so) 3949 2076 w +(when) 4106 2076 w +(the) 4408 2076 w +10 /LucidaTypewriter f +(Flayer) 4608 2076 w +10 /LucidaSansUnicode00 f +(update) 720 2196 w +(routine) 1098 2196 w +(calls) 1488 2196 w +(the) 1745 2196 w +10 /LucidaTypewriter f +(Frame) 1942 2196 w +10 /LucidaSansUnicode00 f +(update) 2344 2196 w +(routine,) 2722 2196 w +(the) 3144 2196 w +(screen) 3341 2196 w +(will) 3700 2196 w +(be) 3906 2196 w +(updated) 4067 2196 w +(directly.) 4509 2196 w +(If) 4974 2196 w +(the) 720 2316 w +(window) 918 2316 w +(is) 1330 2316 w +(invisible,) 1453 2316 w +(there) 1928 2316 w +(is) 2223 2316 w +(no) 2346 2316 w +(associated) 2512 2316 w +10 /LucidaTypewriter f +(Bitmap) 3064 2316 w +10 /LucidaSansUnicode00 f +(,) 3496 2316 w +(and) 3571 2316 w +(all) 3793 2316 w +(that) 3948 2316 w +(is) 4181 2316 w +(necessary) 4303 2316 w +(is) 4820 2316 w +(to) 4942 2316 w +(update) 720 2436 w +(the) 1095 2436 w +10 /LucidaTypewriter f +(Frame) 1290 2436 w +10 /LucidaSansUnicode00 f +(data) 1690 2436 w +(structure,) 1940 2436 w +(not) 2450 2436 w +(the) 2650 2436 w +(image.) 2845 2436 w +(If) 3244 2436 w +(the) 3350 2436 w +(window) 3545 2436 w +(is) 3954 2436 w +(partially) 4074 2436 w +(visible,) 4504 2436 w +(the) 4885 2436 w +10 /LucidaTypewriter f +(Frame) 720 2556 w +10 /LucidaSansUnicode00 f +(routine) 1132 2556 w +(is) 1531 2556 w +(called) 1662 2556 w +(to) 1996 2556 w +(update) 2145 2556 w +(the) 2532 2556 w +(image) 2738 2556 w +(in) 3084 2556 w +(the) 3226 2556 w +(off-screen) 3432 2556 w +10 /LucidaTypewriter f +(Bitmap) 3993 2556 w +10 /LucidaSansUnicode00 f +(,) 4425 2556 w +(which) 4508 2556 w +(may) 4840 2556 w +(require) 720 2676 w +(regenerating) 1108 2676 w +(it) 1767 2676 w +(from) 1873 2676 w +(the) 2145 2676 w +(text) 2340 2676 w +(of) 2571 2676 w +(the) 2709 2676 w +(window.) 2904 2676 w +(The) 3377 2676 w +10 /LucidaTypewriter f +(Flayer) 3598 2676 w +10 /LucidaSansUnicode00 f +(code) 4070 2676 w +(then) 4341 2676 w +(clips) 4598 2676 w +(this) 4861 2676 w +10 /LucidaTypewriter f +(Bitmap) 720 2796 w +10 /LucidaSansUnicode00 f +(against) 1195 2796 w +(the) 1589 2796 w +10 /LucidaTypewriter f +(Bitmaps) 1787 2796 w +10 /LucidaSansUnicode00 f +(of) 2334 2796 w +(all) 2475 2796 w +10 /LucidaTypewriter f +(Frames) 2631 2796 w +10 /LucidaSansUnicode00 f +(in) 3106 2796 w +(front) 3240 2796 w +(of) 3521 2796 w +(the) 3662 2796 w +10 /LucidaTypewriter f +(Frame) 3860 2796 w +10 /LucidaSansUnicode00 f +(being) 4263 2796 w +(modified,) 4577 2796 w +(and the remainder is copied to the display.) 720 2916 w +(This) 970 3072 w +(is) 1212 3072 w +(much) 1329 3072 w +(faster) 1634 3072 w +(than) 1949 3072 w +(recreating) 2203 3072 w +(the) 2731 3072 w +(image) 2924 3072 w +(off-screen) 3257 3072 w +(for) 3805 3072 w +(every) 3982 3072 w +(change,) 4277 3072 w +(or) 4695 3072 w +(clip\255) 4835 3072 w +(ping) 720 3192 w +(all) 975 3192 w +(the) 1127 3192 w +(changes) 1321 3192 w +(made) 1759 3192 w +(to) 2065 3192 w +(the) 2202 3192 w +(image) 2396 3192 w +(during) 2730 3192 w +(its) 3088 3192 w +(update.) 3244 3192 w +(Unfortunately,) 3683 3192 w +(these) 4414 3192 w +(caches) 4714 3192 w +(can) 720 3312 w +(also) 934 3312 w +(consume) 1176 3312 w +(prohibitive) 1658 3312 w +(amounts) 2226 3312 w +(of) 2693 3312 w +(memory,) 2837 3312 w +(so) 3311 3312 w +(they) 3469 3312 w +(are) 3722 3312 w +(freed) 3920 3312 w +(fairly) 4220 3312 w +(liberally) 4510 3312 w +10 /LucidaSansUnicode20 f +(\024) 4940 3312 w +10 /LucidaSansUnicode00 f +(after) 720 3432 w +(every) 989 3432 w +(change) 1289 3432 w +(to) 1680 3432 w +(the) 1820 3432 w +(front-to-back) 2017 3432 w +(order) 2738 3432 w +(of) 3042 3432 w +(the) 3182 3432 w +10 /LucidaTypewriter f +(Flayers) 3379 3432 w +10 /LucidaSansUnicode00 f +(.) 3883 3432 w +(The) 3989 3432 w +(result) 4212 3432 w +(is) 4530 3432 w +(that) 4652 3432 w +(the) 4885 3432 w +(off-screen) 720 3552 w +10 /LucidaTypewriter f +(Bitmaps) 1264 3552 w +10 /LucidaSansUnicode00 f +(exist) 1802 3552 w +(only) 2070 3552 w +(while) 2308 3552 w +(multi-window) 2595 3552 w +(changes) 3306 3552 w +(are) 3740 3552 w +(occurring,) 3927 3552 w +(which) 4454 3552 w +(is) 4770 3552 w +(the) 4885 3552 w +(only time the performance improvement they provide is needed.) 720 3672 w +(Also, the user interface) 3913 3672 w +(causes) 720 3792 w +(fully-obscured) 1080 3792 w +(windows) 1829 3792 w +(to) 2283 3792 w +(be) 2416 3792 w +(the) 2570 3792 w +(easiest) 2760 3792 w +(to) 3130 3792 w +(make) 3263 3792 w +10 /LucidaSansUnicode20 f +(\024) 3560 3792 w +10 /LucidaSansUnicode00 f +(creating) 3695 3792 w +(a) 4123 3792 w +(canonically) 4213 3792 w +(sized) 4784 3792 w +(and) 720 3912 w +(placed) 943 3912 w +(window) 1303 3912 w +(requires) 1715 3912 w +(only) 2157 3912 w +(a) 2403 3912 w +(button) 2500 3912 w +(click) 2864 3912 w +10 /LucidaSansUnicode20 f +(\024) 3124 3912 w +10 /LucidaSansUnicode00 f +(which) 3266 3912 w +(reduces) 3589 3912 w +(the) 4011 3912 w +(need) 4208 3912 w +(for) 4487 3912 w +(caching) 4668 3912 w +(still further.) 720 4032 w +10 /LucidaSans-Demi f +(Screen update) 720 4308 w +10 /LucidaSansUnicode00 f +(Only two low-level primitives are needed for incremental update:) 720 4464 w +10 /LucidaTypewriter f +(bitblt) 3918 4464 w +10 /LucidaSansUnicode00 f +(,) 4350 4464 w +(which) 4415 4464 w +(copies) 4729 4464 w +(rectangles) 720 4584 w +(of) 1267 4584 w +(pixels,) 1412 4584 w +(and) 1780 4584 w +10 /LucidaTypewriter f +(string) 2007 4584 w +10 /LucidaSansUnicode00 f +(\(which) 2486 4584 w +(in) 2847 4584 w +(turn) 2985 4584 w +(calls) 3234 4584 w +10 /LucidaTypewriter f +(bitblt) 3496 4584 w +10 /LucidaSansUnicode00 f +(\),) 3928 4584 w +(which) 4039 4584 w +(draws) 4366 4584 w +(a) 4699 4584 w +(null-) 4800 4584 w +(terminated) 720 4704 w +(character) 1289 4704 w +(string) 1778 4704 w +(in) 2100 4704 w +(a) 2231 4704 w +10 /LucidaTypewriter f +(Bitmap) 2326 4704 w +10 /LucidaSansUnicode00 f +(.) 2758 4704 w +(A) 2862 4704 w +10 /LucidaTypewriter f +(Frame) 2972 4704 w +10 /LucidaSansUnicode00 f +(contains) 3373 4704 w +(a) 3822 4704 w +(list) 3918 4704 w +(of) 4105 4704 w +10 /LucidaTypewriter f +(Boxes) 4244 4704 w +10 /LucidaSansUnicode00 f +(,) 4604 4704 w +(each) 4677 4704 w +(of) 4942 4704 w +(which) 720 4824 w +(defines) 1037 4824 w +(a) 1427 4824 w +(horizontal) 1518 4824 w +(strip) 2048 4824 w +(of) 2305 4824 w +(text) 2439 4824 w +(in) 2665 4824 w +(the) 2791 4824 w +(window) 2981 4824 w +(\(see) 3385 4824 w +(Figure) 3616 4824 w +(7\).) 3955 4824 w +(A) 4150 4824 w +10 /LucidaTypewriter f +(Box) 4254 4824 w +10 /LucidaSansUnicode00 f +(has) 4505 4824 w +(a) 4708 4824 w +(char\255) 4798 4824 w +(acter) 720 4944 w +(string) 998 4944 w +10 /LucidaTypewriter f +(str) 1318 4944 w +10 /LucidaSansUnicode00 f +(,) 1534 4944 w +(and) 1604 4944 w +(a) 1822 4944 w +10 /LucidaTypewriter f +(Rectangle) 1915 4944 w +(rect) 2601 4944 w +10 /LucidaSansUnicode00 f +(that) 2927 4944 w +(defines) 3156 4944 w +(the) 3548 4944 w +(location) 3741 4944 w +(of) 4164 4944 w +(the) 4301 4944 w +(strip) 4495 4944 w +(in) 4755 4944 w +(the) 4885 4944 w +(window.) 720 5064 w +(\(The) 1200 5064 w +(text) 1460 5064 w +(in) 1697 5064 w +10 /LucidaTypewriter f +(str) 1834 5064 w +10 /LucidaSansUnicode00 f +(is) 2096 5064 w +(stored) 2222 5064 w +(in) 2577 5064 w +(the) 2714 5064 w +10 /LucidaTypewriter f +(Box) 2915 5064 w +10 /LucidaSansUnicode00 f +(separately) 3177 5064 w +(from) 3718 5064 w +(the) 3996 5064 w +10 /LucidaTypewriter f +(Rasp) 4197 5064 w +10 /LucidaSansUnicode00 f +(associated) 4531 5064 w +(with) 720 5184 w +(the) 958 5184 w +(window) 1147 5184 w +10 /LucidaSansUnicode20 f +(\031) 1516 5184 w +10 /LucidaSansUnicode00 f +(s) 1548 5184 w +(file,) 1633 5184 w +(so) 1850 5184 w +10 /LucidaTypewriter f +(Boxes) 1996 5184 w +10 /LucidaSansUnicode00 f +(are) 2390 5184 w +(self-contained.\)) 2576 5184 w +(The) 3414 5184 w +(invariant) 3629 5184 w +(is) 4085 5184 w +(that) 4199 5184 w +(the) 4424 5184 w +(image) 4613 5184 w +(of) 4942 5184 w +(the) 720 5304 w +10 /LucidaTypewriter f +(Box) 908 5304 w +10 /LucidaSansUnicode00 f +(can) 1157 5304 w +(be) 1358 5304 w +(reproduced) 1510 5304 w +(by) 2100 5304 w +(calling) 2248 5304 w +10 /LucidaTypewriter f +(string) 2598 5304 w +10 /LucidaSansUnicode00 f +(with) 3063 5304 w +(argument) 3301 5304 w +10 /LucidaTypewriter f +(str) 3802 5304 w +10 /LucidaSansUnicode00 f +(to draw the string in) 4050 5304 w +10 /LucidaTypewriter f +(rect) 720 5424 w +10 /LucidaSansUnicode00 f +(,) 1008 5424 w +(and) 1077 5424 w +(the) 1294 5424 w +(resulting) 1486 5424 w +(picture) 1952 5424 w +(fits) 2328 5424 w +(perfectly) 2519 5424 w +(within) 2978 5424 w +10 /LucidaTypewriter f +(rect) 3311 5424 w +10 /LucidaSansUnicode00 f +(.) 3599 5424 w +(In) 3700 5424 w +(other) 3829 5424 w +(words,) 4124 5424 w +(the) 4487 5424 w +10 /LucidaTypewriter f +(Boxes) 4680 5424 w +10 /LucidaSansUnicode00 f +(define) 720 5544 w +(the) 1071 5544 w +(tiling) 1274 5544 w +(of) 1570 5544 w +(the) 1716 5544 w +(window.) 1919 5544 w +(The) 2400 5544 w +(tiling) 2629 5544 w +(may) 2925 5544 w +(be) 3173 5544 w +(complicated) 3340 5544 w +(by) 3975 5544 w +(long) 4137 5544 w +(lines) 4398 5544 w +(of) 4672 5544 w +(text,) 4817 5544 w +(which) 720 5664 w +(are) 1038 5664 w +(folded) 1227 5664 w +(onto) 1573 5664 w +(the) 1832 5664 w +(next) 2025 5664 w +(line.) 2279 5664 w +(Some) 2557 5664 w +(editors) 2859 5664 w +(use) 3235 5664 w +(horizontal) 3442 5664 w +(scrolling) 3974 5664 w +(to) 4427 5664 w +(avoid) 4563 5664 w +(this) 4861 5664 w +(complication,) 720 5784 w +(but) 1416 5784 w +(to) 1621 5784 w +(be) 1762 5784 w +(comfortable) 1924 5784 w +(this) 2551 5784 w +(technique) 2773 5784 w +(requires) 3294 5784 w +(that) 3735 5784 w +(lines) 3968 5784 w +(not) 4237 5784 w +(be) 4439 5784 w +10 /LucidaSans-Italic f +(too) 4600 5784 w +10 /LucidaSansUnicode00 f +(long;) 4794 5784 w +10 /LucidaTypewriter f +(sam) 720 5904 w +10 /LucidaSansUnicode00 f +(has) 976 5904 w +(no) 1185 5904 w +(such) 1349 5904 w +(restriction.) 1616 5904 w +(Also,) 2216 5904 w +(and) 2499 5904 w +(perhaps) 2720 5904 w +(more) 3152 5904 w +(importantly,) 3444 5904 w +(UNIX) 4076 5904 w +(programs) 4352 5904 w +(and) 4860 5904 w +(terminals traditionally fold long lines to make their contents fully visible.) 720 6024 w +(Two) 970 6180 w +(special) 1212 6180 w +(kinds) 1587 6180 w +(of) 1891 6180 w +10 /LucidaTypewriter f +(Boxes) 2030 6180 w +10 /LucidaSansUnicode00 f +(contain) 2431 6180 w +(a) 2829 6180 w +(single) 2925 6180 w +(character:) 3256 6180 w +(either) 3779 6180 w +(a) 4102 6180 w +(newline) 4199 6180 w +(or) 4612 6180 w +(a) 4756 6180 w +(tab.) 4853 6180 w +(Newlines) 720 6300 w +(and) 1192 6300 w +(tabs) 1410 6300 w +(are) 1654 6300 w +(white) 1844 6300 w +(space.) 2143 6300 w +(A) 2521 6300 w +(newline) 2628 6300 w +10 /LucidaTypewriter f +(Box) 3037 6300 w +10 /LucidaSansUnicode00 f +(always) 3291 6300 w +(extends) 3648 6300 w +(to) 4072 6300 w +(the) 4208 6300 w +(right) 4400 6300 w +(edge) 4668 6300 w +(of) 4942 6300 w +(the) 720 6420 w +(window,) 912 6420 w +(forcing) 1350 6420 w +(the) 1730 6420 w +(following) 1922 6420 w +10 /LucidaTypewriter f +(Box) 2406 6420 w +10 /LucidaSansUnicode00 f +(to) 2659 6420 w +(the) 2794 6420 w +(next) 2986 6420 w +(line.) 3240 6420 w +(The) 3518 6420 w +(width) 3737 6420 w +(of) 4043 6420 w +(a) 4179 6420 w +(tab) 4272 6420 w +(depends) 4465 6420 w +(on) 4917 6420 w +(where) 720 6540 w +(it) 1052 6540 w +(is) 1158 6540 w +(located:) 1278 6540 w +(it) 1702 6540 w +(forces) 1808 6540 w +(the) 2145 6540 w +(next) 2340 6540 w +10 /LucidaTypewriter f +(Box) 2596 6540 w +10 /LucidaSansUnicode00 f +(to) 2852 6540 w +(begin) 2990 6540 w +(at) 3302 6540 w +(a) 3434 6540 w +(tab) 3529 6540 w +(location.) 3724 6540 w +(Tabs) 4213 6540 w +(also) 4485 6540 w +(have) 4721 6540 w +(a) 4985 6540 w +(minimum) 720 6660 w +(width) 1215 6660 w +(equivalent) 1517 6660 w +(to) 2052 6660 w +(a) 2184 6660 w +(blank) 2273 6660 w +(\(blanks) 2575 6660 w +(are) 2961 6660 w +(drawn) 3148 6660 w +(by) 3481 6660 w +10 /LucidaTypewriter f +(string) 3631 6660 w +10 /LucidaSansUnicode00 f +(and) 4098 6660 w +(are) 4313 6660 w +(not) 4500 6660 w +(treated) 4695 6660 w +(specially\); newlines have a minimum width of zero.) 720 6780 w +(The) 970 6936 w +(update) 1195 6936 w +(algorithms) 1575 6936 w +(always) 2139 6936 w +(use) 2502 6936 w +(the) 2715 6936 w +10 /LucidaTypewriter f +(Bitmap) 2914 6936 w +10 /LucidaSansUnicode00 f +(image) 3390 6936 w +(of) 3729 6936 w +(the) 3871 6936 w +(text) 4070 6936 w +(\(either) 4305 6936 w +(the) 4664 6936 w +(dis\255) 4864 6936 w +(play) 720 7056 w +(or) 962 7056 w +(cache) 1107 7056 w +10 /LucidaTypewriter f +(Bitmap) 1425 7056 w +10 /LucidaSansUnicode00 f +(\);) 1857 7056 w +(they) 1965 7056 w +(never) 2215 7056 w +(examine) 2525 7056 w +(the) 2980 7056 w +(characters) 3178 7056 w +(within) 3721 7056 w +(a) 4060 7056 w +10 /LucidaTypewriter f +(Box) 4158 7056 w +10 /LucidaSansUnicode00 f +(except) 4417 7056 w +(when) 4783 7056 w +(the) 720 7176 w +10 /LucidaTypewriter f +(Box) 918 7176 w +10 /LucidaSansUnicode00 f +(needs) 1177 7176 w +(to) 1508 7176 w +(be) 1650 7176 w +(split) 1813 7176 w +(in) 2066 7176 w +(two.) 2201 7176 w +(Before) 2484 7176 w +(a) 2837 7176 w +(change,) 2936 7176 w +(the) 3360 7176 w +(window) 3559 7176 w +(consists) 3972 7176 w +(of) 4409 7176 w +(a) 4551 7176 w +(tiling) 4650 7176 w +(of) 4942 7176 w +10 /LucidaTypewriter f +(Boxes) 720 7296 w +10 /LucidaSansUnicode00 f +(;) 1080 7296 w +(after) 1183 7296 w +(the) 1480 7296 w +(change) 1706 7296 w +(the) 2125 7296 w +(window) 2351 7296 w +(is) 2791 7296 w +(tiled) 2942 7296 w +(differently.) 3227 7296 w +(The) 3861 7296 w +(update) 4113 7296 w +(algorithms) 4520 7296 w +cleartomark +showpage +saveobj restore +%%EndPage: 25 25 +%%Page: 26 26 +/saveobj save def +mark +26 pagesetup +10 /LucidaSansUnicode00 f +(\255 26 \255) 2752 480 w +929 990 929 882 Dl +929 882 1505 882 Dl +1505 882 1505 990 Dl +1505 990 929 990 Dl +1505 990 1505 882 Dl +1505 882 2700 882 Dl +2700 882 2700 990 Dl +2700 990 1505 990 Dl +8 /LucidaTypewriter f +(for\(i=0;) 1522 956 w +(i<NL;) 2044 956 w +(i++\){) 2392 956 w +2700 990 2700 882 Dl +2700 882 3132 882 Dl +3132 882 3132 990 Dl +3132 990 2700 990 Dl +3132 990 3132 882 Dl +3132 882 4471 882 Dl +4471 882 4471 990 Dl +4471 990 3132 990 Dl +(/*) 3163 956 w +(for) 3337 956 w +(each) 3569 956 w +(element) 3859 956 w +(*/) 4323 956 w +4471 990 4471 882 Dl +4471 882 4831 882 Dl +4831 882 4831 990 Dl +4831 990 4471 990 Dl +8 /LucidaSans-Italic f +(Figure) 720 1228 w +(7.) 994 1228 w +(A) 1099 1228 w +(line) 1183 1228 w +(of) 1350 1228 w +(text) 1455 1228 w +(showing) 1629 1228 w +(its) 1977 1228 w +8 /LucidaTypewriter f +(Boxes) 2098 1228 w +8 /LucidaSans-Italic f +(.) 2388 1228 w +(The) 2469 1228 w +(first) 2640 1228 w +(two) 2829 1228 w +(blank) 2996 1228 w +8 /LucidaTypewriter f +(Boxes) 3242 1228 w +8 /LucidaSans-Italic f +(contain) 3561 1228 w +(tabs;) 3879 1228 w +(the) 4102 1228 w +(last) 4254 1228 w +(contains) 4425 1228 w +(a) 4782 1228 w +(new\255) 4861 1228 w +(line.) 720 1328 w +(Spaces) 936 1328 w +(are) 1225 1328 w +(handled) 1380 1328 w +(as) 1718 1328 w +(ordinary) 1832 1328 w +(characters.) 2195 1328 w +10 /LucidaSansUnicode00 f +(rearrange) 720 1568 w +(the) 1241 1568 w +(tiles) 1448 1568 w +(in) 1702 1568 w +(place,) 1846 1568 w +(without) 2185 1568 w +(backup) 2603 1568 w +(storage.) 3008 1568 w +(The) 3488 1568 w +(algorithms) 3722 1568 w +(are) 4295 1568 w +(not) 4500 1568 w +(strictly) 4713 1568 w +(optimal) 720 1688 w +10 /LucidaSansUnicode20 f +(\024) 1129 1688 w +10 /LucidaSansUnicode00 f +(for) 1271 1688 w +(example,) 1452 1688 w +(they) 1938 1688 w +(can) 2186 1688 w +(clear) 2395 1688 w +(a) 2668 1688 w +(pixel) 2764 1688 w +(that) 3043 1688 w +(is) 3275 1688 w +(later) 3396 1688 w +(going) 3655 1688 w +(to) 3972 1688 w +(be) 4111 1688 w +(written) 4271 1688 w +(upon) 4651 1688 w +10 /LucidaSansUnicode20 f +(\024) 4940 1688 w +10 /LucidaSansUnicode00 f +(but) 720 1808 w +(they) 925 1808 w +(never) 1175 1808 w +(move) 1485 1808 w +(a) 1790 1808 w +(tile) 1888 1808 w +(that) 2082 1808 w +(doesn) 2316 1808 w +10 /LucidaSansUnicode20 f +(\031) 2609 1808 w +10 /LucidaSansUnicode00 f +(t) 2641 1808 w +(need) 2721 1808 w +(to) 3001 1808 w +(be) 3142 1808 w +(moved,) 3304 1808 w +(and) 3704 1808 w +(they) 3928 1808 w +(move) 4179 1808 w +(each) 4485 1808 w +(tile) 4753 1808 w +(at) 4948 1808 w +(most) 720 1928 w +(once.) 998 1928 w +10 /LucidaTypewriter f +(Frinsert) 1328 1928 w +10 /LucidaSansUnicode00 f +(on) 1940 1928 w +(a) 2099 1928 w +(Blit) 2190 1928 w +(can) 2379 1928 w +(absorb) 2583 1928 w +(over) 2953 1928 w +(a) 3199 1928 w +(thousand) 3290 1928 w +(characters) 3779 1928 w +(a) 4315 1928 w +(second) 4405 1928 w +(if) 4784 1928 w +(the) 4885 1928 w +(strings being inserted are a few tens of characters long.) 720 2048 w +(Consider) 970 2204 w +10 /LucidaTypewriter f +(frdelete) 1445 2204 w +10 /LucidaSansUnicode00 f +(.) 2021 2204 w +(Its) 2128 2204 w +(job) 2288 2204 w +(is) 2486 2204 w +(to) 2610 2204 w +(delete) 2752 2204 w +(a) 3093 2204 w +(substring) 3192 2204 w +(from) 3694 2204 w +(a) 3970 2204 w +10 /LucidaTypewriter f +(Frame) 4069 2204 w +10 /LucidaSansUnicode00 f +(and) 4473 2204 w +(restore) 4697 2204 w +(the) 720 2324 w +(image) 914 2324 w +(of) 1248 2324 w +(the) 1385 2324 w +10 /LucidaTypewriter f +(Frame) 1579 2324 w +10 /LucidaSansUnicode00 f +(.) 1939 2324 w +(The) 2042 2324 w +(image) 2262 2324 w +(of) 2595 2324 w +(a) 2731 2324 w +(substring) 2824 2324 w +(has) 3320 2324 w +(a) 3526 2324 w +(peculiar) 3619 2324 w +(shape) 4043 2324 w +(\(see) 4368 2324 w +(Figure) 4602 2324 w +(2\)) 4944 2324 w +(comprising) 720 2444 w +(possibly) 1309 2444 w +(a) 1755 2444 w +(partial) 1857 2444 w +(line,) 2213 2444 w +(zero) 2469 2444 w +(or) 2732 2444 w +(more) 2882 2444 w +(full) 3181 2444 w +(lines,) 3386 2444 w +(and) 3693 2444 w +(possibly) 3921 2444 w +(a) 4368 2444 w +(final) 4471 2444 w +(partial) 4731 2444 w +(line.) 720 2564 w +(For) 998 2564 w +(reference,) 1192 2564 w +(call) 1718 2564 w +(this) 1920 2564 w +(the) 2137 2564 w +10 /LucidaSans-Italic f +(Z-shape.) 2329 2564 w +10 /LucidaTypewriter f +(Frdelete) 2837 2564 w +10 /LucidaSansUnicode00 f +(begins) 3450 2564 w +(by) 3810 2564 w +(splitting,) 3962 2564 w +(if) 4430 2564 w +(necessary,) 4533 2564 w +(the) 720 2684 w +10 /LucidaTypewriter f +(Boxes) 918 2684 w +10 /LucidaSansUnicode00 f +(containing) 1321 2684 w +(the) 1875 2684 w +(ends) 2074 2684 w +(of) 2350 2684 w +(the) 2492 2684 w +(substring) 2691 2684 w +(so) 3193 2684 w +(the) 3349 2684 w +(substring) 3548 2684 w +(begins) 4050 2684 w +(and) 4417 2684 w +(ends) 4641 2684 w +(on) 4917 2684 w +10 /LucidaTypewriter f +(Box) 720 2804 w +10 /LucidaSansUnicode00 f +(boundaries.) 983 2804 w +(Because) 1636 2804 w +(the) 2071 2804 w +(substring) 2272 2804 w +(is) 2776 2804 w +(being) 2902 2804 w +(deleted,) 3220 2804 w +(its) 3658 2804 w +(image) 3821 2804 w +(is) 4162 2804 w +(not) 4288 2804 w +(needed,) 4494 2804 w +(so) 4928 2804 w +(the) 720 2924 w +(Z-shape) 927 2924 w +(is) 1385 2924 w +(then) 1517 2924 w +(cleared.) 1786 2924 w +(Then,) 2253 2924 w +(tiles) 2580 2924 w +(\(that) 2834 2924 w +(is,) 3111 2924 w +(the) 3276 2924 w +(images) 3484 2924 w +(of) 3883 2924 w +10 /LucidaTypewriter f +(Boxes) 4034 2924 w +10 /LucidaSansUnicode00 f +(\)) 4394 2924 w +(are) 4480 2924 w +(copied,) 4685 2924 w +(using) 720 3044 w +10 /LucidaTypewriter f +(bitblt) 1032 3044 w +10 /LucidaSansUnicode00 f +(,) 1464 3044 w +(from) 1542 3044 w +(immediately) 1820 3044 w +(after) 2458 3044 w +(the) 2730 3044 w +(Z-shape) 2931 3044 w +(to) 3383 3044 w +(the) 3527 3044 w +(beginning) 3727 3044 w +(of) 4259 3044 w +(the) 4402 3044 w +(Z-shape,) 4602 3044 w +(resulting) 720 3164 w +(in) 1191 3164 w +(a) 1324 3164 w +(new) 1421 3164 w +(Z-shape.) 1658 3164 w +(\() 2170 3164 w +10 /LucidaTypewriter f +(Boxes) 2203 3164 w +10 /LucidaSansUnicode00 f +(whose) 2606 3164 w +(contents) 2956 3164 w +(would) 3416 3164 w +(span) 3751 3164 w +(two) 4025 3164 w +(lines) 4243 3164 w +(in) 4513 3164 w +(the) 4647 3164 w +(new) 4845 3164 w +(position must first be split.\)) 720 3284 w +(Copying the remainder of the) 970 3440 w +10 /LucidaTypewriter f +(Frame) 2432 3440 w +10 /LucidaSansUnicode00 f +(tile by tile this way will) 2824 3440 w +(clearly) 3961 3440 w +(accomplish) 4307 3440 w +(the) 4885 3440 w +(deletion) 720 3560 w +(but) 1156 3560 w +(eventually,) 1361 3560 w +(typically) 1925 3560 w +(when) 2364 3560 w +(the) 2663 3560 w +(copying) 2860 3560 w +(algorithm) 3282 3560 w +(encounters) 3793 3560 w +(a) 4374 3560 w +(tab) 4471 3560 w +(or) 4668 3560 w +(new\255) 4812 3560 w +(line,) 720 3680 w +(the) 971 3680 w +(old) 1169 3680 w +(and) 1365 3680 w +(new) 1588 3680 w +10 /LucidaTypewriter f +(x) 1826 3680 w +10 /LucidaSansUnicode00 f +(coordinates) 1941 3680 w +(of) 2551 3680 w +(the) 2692 3680 w +(tile) 2890 3680 w +(to) 3084 3680 w +(be) 3225 3680 w +(copied) 3387 3680 w +(are) 3753 3680 w +(the) 3948 3680 w +(same.) 4146 3680 w +(This) 4508 3680 w +(corre\255) 4757 3680 w +(spondence) 720 3800 w +(implies) 1288 3800 w +(that) 1681 3800 w +(the) 1915 3800 w +(Z-shape) 2113 3800 w +(has) 2562 3800 w +(its) 2773 3800 w +(beginning) 2933 3800 w +(and) 3463 3800 w +(ending) 3686 3800 w +(edges) 4063 3800 w +(aligned) 4394 3800 w +(verti\255) 4792 3800 w +(cally,) 720 3920 w +(and) 1002 3920 w +(a) 1216 3920 w +(sequence) 1305 3920 w +(of) 1796 3920 w +(at) 1928 3920 w +(most) 2054 3920 w +(two) 2330 3920 w +10 /LucidaTypewriter f +(bitblts) 2539 3920 w +10 /LucidaSansUnicode00 f +(can) 3077 3920 w +(be) 3279 3920 w +(used) 3432 3920 w +(to) 3698 3920 w +(copy) 3830 3920 w +(the) 4092 3920 w +(remaining) 4282 3920 w +(tiles.) 4806 3920 w +(The) 720 4040 w +(last) 938 4040 w +(step) 1147 4040 w +(is) 1391 4040 w +(to) 1508 4040 w +(clear) 1643 4040 w +(out) 1912 4040 w +(the) 2109 4040 w +(resulting) 2301 4040 w +(empty) 2767 4040 w +(space) 3104 4040 w +(at) 3416 4040 w +(the) 3544 4040 w +(bottom) 3735 4040 w +(of) 4123 4040 w +(the) 4257 4040 w +(window;) 4448 4040 w +(the) 4885 4040 w +(number) 720 4160 w +(of) 1133 4160 w +(lines) 1267 4160 w +(to) 1530 4160 w +(be) 1665 4160 w +(cleared) 1821 4160 w +(is) 2209 4160 w +(the) 2326 4160 w +(number) 2518 4160 w +(of) 2932 4160 w +(complete) 3067 4160 w +(lines) 3550 4160 w +(in) 3814 4160 w +(the) 3942 4160 w +(Z-shape) 4134 4160 w +(closed) 4577 4160 w +(by) 4925 4160 w +(the) 720 4280 w +(final) 922 4280 w +10 /LucidaTypewriter f +(bitblts.) 1181 4280 w +10 /LucidaSansUnicode00 f +(The) 1804 4280 w +(final) 2032 4280 w +(step) 2291 4280 w +(is) 2545 4280 w +(to) 2672 4280 w +(merge) 2817 4280 w +(horizontally) 3172 4280 w +(adjacent) 3794 4280 w +10 /LucidaTypewriter f +(Boxes) 4250 4280 w +10 /LucidaSansUnicode00 f +(of) 4657 4280 w +(plain) 4802 4280 w +(text.) 720 4400 w +(The complete source to) 1007 4400 w +10 /LucidaTypewriter f +(frdelete) 2182 4400 w +10 /LucidaSansUnicode00 f +(is less than 100 lines of C.) 2790 4400 w +10 /LucidaTypewriter f +(frinsert) 970 4556 w +10 /LucidaSansUnicode00 f +(is) 1584 4556 w +(more) 1702 4556 w +(complicated) 1991 4556 w +(because) 2617 4556 w +(it) 3049 4556 w +(must) 3153 4556 w +(do) 3434 4556 w +(four) 3596 4556 w +(passes:) 3835 4556 w +(one) 4232 4556 w +(to) 4450 4556 w +(construct) 4587 4556 w +(the) 720 4676 w +10 /LucidaTypewriter f +(Box) 908 4676 w +10 /LucidaSansUnicode00 f +(list) 1157 4676 w +(for) 1336 4676 w +(the) 1508 4676 w +(inserted) 1696 4676 w +(string,) 2124 4676 w +(one) 2471 4676 w +(to) 2683 4676 w +(reconnoitre,) 2814 4676 w +(one) 3436 4676 w +(to) 3648 4676 w +(copy) 3779 4676 w +(\(in opposite order to) 4039 4676 w +10 /LucidaTypewriter f +(frdelete) 720 4796 w +10 /LucidaSansUnicode00 f +(\)) 1296 4796 w +(the) 1368 4796 w +10 /LucidaTypewriter f +(Boxes) 1562 4796 w +10 /LucidaSansUnicode00 f +(to) 1961 4796 w +(make) 2098 4796 w +(the) 2399 4796 w +(hole) 2593 4796 w +(for) 2840 4796 w +(the) 3018 4796 w +(new) 3212 4796 w +(text,) 3446 4796 w +(and) 3708 4796 w +(finally) 3928 4796 w +(one) 4261 4796 w +(to) 4480 4796 w +(copy) 4618 4796 w +(the) 4885 4796 w +(new) 720 4916 w +(text) 963 4916 w +(into) 1202 4916 w +(place.) 1439 4916 w +(Overall,) 1805 4916 w +(though,) 2225 4916 w +10 /LucidaTypewriter f +(frinsert) 2651 4916 w +10 /LucidaSansUnicode00 f +(has) 3274 4916 w +(a) 3489 4916 w +(similar) 3591 4916 w +(flavor) 3965 4916 w +(to) 4287 4916 w +10 /LucidaTypewriter f +(frdelete) 4432 4916 w +10 /LucidaSansUnicode00 f +(,) 5008 4916 w +(and) 720 5036 w +(needn) 934 5036 w +10 /LucidaSansUnicode20 f +(\031) 1233 5036 w +10 /LucidaSansUnicode00 f +(t) 1265 5036 w +(be) 1336 5036 w +(described) 1489 5036 w +(further.) 1996 5036 w +10 /LucidaTypewriter f +(Frinsert) 2430 5036 w +10 /LucidaSansUnicode00 f +(and) 3040 5036 w +(its) 3254 5036 w +(subsidiary) 3406 5036 w +(routines) 3937 5036 w +(comprise) 4371 5036 w +(211) 4851 5036 w +(lines of C.) 720 5156 w +(The terminal source code is 3024 lines of C, and the host source is 5797 lines.) 970 5312 w +10 /LucidaSans-Demi f +(Discussion) 720 5552 w +(History) 720 5792 w +10 /LucidaSansUnicode00 f +(The) 720 5948 w +(immediate) 951 5948 w +(ancestor) 1512 5948 w +(of) 1976 5948 w +10 /LucidaTypewriter f +(sam) 2124 5948 w +10 /LucidaSansUnicode00 f +(was) 2390 5948 w +(the) 2623 5948 w +(original) 2828 5948 w +(text) 3246 5948 w +(editor) 3488 5948 w +(for) 3826 5948 w +(the) 4016 5948 w +(Blit,) 4222 5948 w +(called) 4458 5948 w +10 /LucidaTypewriter f +(jim) 4792 5948 w +10 /LucidaSansUnicode00 f +(.) 5008 5948 w +10 /LucidaTypewriter f +(Sam) 720 6068 w +10 /LucidaSansUnicode00 f +(inherited) 969 6068 w +10 /LucidaTypewriter f +(jim) 1437 6068 w +10 /LucidaSansUnicode20 f +(\031) 1653 6068 w +10 /LucidaSansUnicode00 f +(s) 1685 6068 w +(two-process) 1769 6068 w +(structure and mouse language almost unchanged, but) 2409 6068 w +10 /LucidaTypewriter f +(jim) 720 6188 w +10 /LucidaSansUnicode00 f +(suffered) 979 6188 w +(from) 1425 6188 w +(several) 1700 6188 w +(drawbacks) 2083 6188 w +(that) 2640 6188 w +(were) 2875 6188 w +(addressed) 3149 6188 w +(in) 3692 6188 w +(the) 3827 6188 w +(design) 4026 6188 w +(of) 4393 6188 w +10 /LucidaTypewriter f +(sam) 4535 6188 w +10 /LucidaSansUnicode00 f +(.) 4751 6188 w +(The) 4859 6188 w +(most) 720 6308 w +(important) 999 6308 w +(of) 1514 6308 w +(these) 1649 6308 w +(was) 1948 6308 w +(the) 2168 6308 w +(lack) 2360 6308 w +(of) 2590 6308 w +(a) 2725 6308 w +(command) 2817 6308 w +(language.) 3332 6308 w +(Although) 3875 6308 w +10 /LucidaTypewriter f +(jim) 4355 6308 w +10 /LucidaSansUnicode00 f +(was) 4607 6308 w +(easy) 4826 6308 w +(to use for simple editing,) 720 6428 w +(it) 1978 6428 w +(provided) 2077 6428 w +(no) 2538 6428 w +(direct) 2694 6428 w +(help) 3004 6428 w +(with) 3247 6428 w +(large) 3485 6428 w +(or) 3761 6428 w +(repetitive) 3896 6428 w +(editing) 4385 6428 w +(tasks.) 4756 6428 w +(Instead,) 720 6548 w +(it) 1146 6548 w +(provided) 1253 6548 w +(a) 1722 6548 w +(command) 1818 6548 w +(to) 2337 6548 w +(pass) 2476 6548 w +(selected) 2737 6548 w +(text) 3177 6548 w +(through) 3409 6548 w +(a) 3837 6548 w +(shell) 3933 6548 w +(pipeline,) 4200 6548 w +(but) 4659 6548 w +(this) 4861 6548 w +(was no more satisfactory than could be expected of a stopgap measure.) 720 6668 w +10 /LucidaTypewriter f +(Jim) 970 6824 w +10 /LucidaSansUnicode00 f +(was) 1243 6824 w +(written) 1483 6824 w +(primarily) 1879 6824 w +(as) 2368 6824 w +(a) 2531 6824 w +(vehicle) 2643 6824 w +(for) 3035 6824 w +(experimenting) 3231 6824 w +(with) 3995 6824 w +(a) 4258 6824 w +(mouse-based) 4371 6824 w +(interface) 720 6944 w +(to) 1190 6944 w +(text,) 1334 6944 w +(and) 1603 6944 w +(the) 1829 6944 w +(experiment) 2030 6944 w +(was) 2630 6944 w +(successful.) 2859 6944 w +10 /LucidaTypewriter f +(Jim) 3470 6944 w +10 /LucidaSansUnicode00 f +(had) 3732 6944 w +(some) 3958 6944 w +(spin-offs:) 4265 6944 w +10 /LucidaTypewriter f +(mux) 4792 6944 w +10 /LucidaSansUnicode00 f +(,) 5008 6944 w +(the) 720 7064 w +(second) 912 7064 w +(window) 1293 7064 w +(system) 1699 7064 w +(for) 2076 7064 w +(the) 2252 7064 w +(Blit,) 2444 7064 w +(is) 2666 7064 w +(essentially) 2783 7064 w +(a) 3327 7064 w +(multiplexed) 3419 7064 w +(version) 4034 7064 w +(of) 4423 7064 w +(the) 4558 7064 w +(termi\255) 4751 7064 w +(nal) 720 7184 w +(part) 903 7184 w +(of) 1136 7184 w +10 /LucidaTypewriter f +(jim) 1271 7184 w +10 /LucidaSansUnicode00 f +(;) 1487 7184 w +(and) 1556 7184 w +(the) 1772 7184 w +(debugger) 1963 7184 w +10 /LucidaTypewriter f +(pi) 2464 7184 w +10 /LucidaSansUnicode20 f +(\031) 2608 7184 w +10 /LucidaSansUnicode00 f +(s) 2640 7184 w +(user) 2727 7184 w +(interface) 2973 7184 w +6 /LucidaSansUnicode00 f +(20) 3397 7134 w +10 /LucidaSansUnicode00 f +(was) 3509 7184 w +(closely) 3728 7184 w +(modeled) 4093 7184 w +(on) 4550 7184 w +10 /LucidaTypewriter f +(jim) 4709 7184 w +10 /LucidaSansUnicode20 f +(\031) 4925 7184 w +10 /LucidaSansUnicode00 f +(s.) 4957 7184 w +(But) 720 7304 w +(after) 920 7304 w +(a) 1189 7304 w +(couple) 1287 7304 w +(of) 1652 7304 w +(years,) 1794 7304 w +10 /LucidaTypewriter f +(jim) 2125 7304 w +10 /LucidaSansUnicode00 f +(had) 2385 7304 w +(become) 2609 7304 w +(difficult) 3033 7304 w +(to) 3451 7304 w +(maintain) 3593 7304 w +(and) 4059 7304 w +(limiting) 4283 7304 w +(to) 4697 7304 w +(use,) 4839 7304 w +cleartomark +showpage +saveobj restore +%%EndPage: 26 26 +%%Page: 27 27 +/saveobj save def +mark +27 pagesetup +10 /LucidaSansUnicode00 f +(\255 27 \255) 2752 480 w +(and its replacement was overdue.) 720 840 w +(I) 970 996 w +(began) 1039 996 w +(the) 1377 996 w +(design) 1572 996 w +(of) 1935 996 w +10 /LucidaTypewriter f +(sam) 2073 996 w +10 /LucidaSansUnicode00 f +(by) 2329 996 w +(asking) 2484 996 w +10 /LucidaTypewriter f +(jim) 2841 996 w +10 /LucidaSansUnicode00 f +(customers) 3097 996 w +(what) 3640 996 w +(they) 3911 996 w +(wanted.) 4158 996 w +(This) 4612 996 w +(was) 4857 996 w +(probably) 720 1116 w +(a) 1187 1116 w +(mistake;) 1282 1116 w +(the) 1733 1116 w +(answers) 1928 1116 w +(were) 2361 1116 w +(essentially) 2631 1116 w +(a) 3178 1116 w +(list) 3273 1116 w +(of) 3459 1116 w +(features) 3597 1116 w +(to) 4032 1116 w +(be) 4170 1116 w +(found) 4329 1116 w +(in) 4653 1116 w +(other) 4783 1116 w +(editors,) 720 1236 w +(which) 1124 1236 w +(did) 1439 1236 w +(not) 1628 1236 w +(provide) 1822 1236 w +(any) 2221 1236 w +(of) 2424 1236 w +(the) 2556 1236 w +(guiding) 2746 1236 w +(principles) 3150 1236 w +(I) 3659 1236 w +(was) 3723 1236 w +(seeking.) 3941 1236 w +(For) 4414 1236 w +(instance,) 4605 1236 w +(one) 720 1356 w +(common) 940 1356 w +(request) 1402 1356 w +(was) 1809 1356 w +(for) 2033 1356 w +(a) 2213 1356 w +10 /LucidaSansUnicode20 f +(\030\030) 2309 1356 w +10 /LucidaSansUnicode00 f +(global) 2373 1356 w +(substitute,) 2713 1356 w +10 /LucidaSansUnicode20 f +(\031\031) 3230 1356 w +10 /LucidaSansUnicode00 f +(but) 3335 1356 w +(no) 3538 1356 w +(one) 3702 1356 w +(suggested) 3922 1356 w +(how) 4463 1356 w +(to) 4704 1356 w +(pro\255) 4842 1356 w +(vide) 720 1476 w +(it) 966 1476 w +(within) 1078 1476 w +(a) 1420 1476 w +(cut-and-paste) 1521 1476 w +(editor.) 2275 1476 w +(I) 2672 1476 w +(was) 2747 1476 w +(looking) 2976 1476 w +(for) 3384 1476 w +(a) 3569 1476 w +(scheme) 3670 1476 w +(that) 4085 1476 w +(would) 4323 1476 w +(support) 4662 1476 w +(such) 720 1596 w +(specialized) 1000 1596 w +(features) 1593 1596 w +(comfortably) 2042 1596 w +(in) 2676 1596 w +(the) 2821 1596 w +(context) 3030 1596 w +(of) 3449 1596 w +(some) 3601 1596 w +(general) 3916 1596 w +(command) 4330 1596 w +(lan\255) 4861 1596 w +(guage.) 720 1716 w +(Ideas) 1118 1716 w +(were) 1409 1716 w +(not) 1677 1716 w +(forthcoming,) 1875 1716 w +(though,) 2541 1716 w +(particularly) 2957 1716 w +(given) 3539 1716 w +(my) 3838 1716 w +(insistence) 4021 1716 w +(on) 4543 1716 w +(remov\255) 4704 1716 w +(ing) 720 1836 w +(all) 914 1836 w +(limits) 1067 1836 w +(on) 1375 1836 w +(file) 1538 1836 w +(sizes,) 1729 1836 w +(line) 2045 1836 w +(lengths) 2261 1836 w +(and) 2660 1836 w +(so) 2880 1836 w +(on.) 3032 1836 w +(Even) 3259 1836 w +(worse,) 3523 1836 w +(I) 3881 1836 w +(recognized) 3950 1836 w +(that,) 4528 1836 w +(since) 4791 1836 w +(the) 720 1956 w +(mouse) 914 1956 w +(could) 1276 1956 w +(easily) 1581 1956 w +(indicate) 1892 1956 w +(a) 2313 1956 w +(region) 2407 1956 w +(of) 2757 1956 w +(the) 2894 1956 w +(screen) 3088 1956 w +(that) 3444 1956 w +(was) 3674 1956 w +(not) 3896 1956 w +(an) 4095 1956 w +(integral) 4252 1956 w +(number) 4663 1956 w +(of) 720 2076 w +(lines,) 860 2076 w +(the) 1161 2076 w +(command) 1358 2076 w +(language) 1877 2076 w +(would) 2361 2076 w +(best) 2694 2076 w +(forget) 2942 2076 w +(about) 3277 2076 w +(newlines) 3596 2076 w +(altogether,) 4059 2076 w +(and) 4628 2076 w +(that) 4849 2076 w +(meant) 720 2196 w +(the) 1069 2196 w +(command) 1270 2196 w +(language) 1794 2196 w +(had) 2283 2196 w +(to) 2510 2196 w +(treat) 2655 2196 w +(the) 2928 2196 w +(file) 3130 2196 w +(as) 3328 2196 w +(a) 3481 2196 w +(single) 3583 2196 w +(string,) 3919 2196 w +(not) 4280 2196 w +(an) 4487 2196 w +(array) 4651 2196 w +(of) 4942 2196 w +(lines.) 720 2316 w +(Eventually,) 970 2472 w +(I) 1532 2472 w +(decided) 1603 2472 w +(that) 2026 2472 w +(thinking) 2259 2472 w +(was) 2702 2472 w +(not) 2927 2472 w +(getting) 3129 2472 w +(me) 3516 2472 w +(very) 3707 2472 w +(far) 3950 2472 w +(and) 4126 2472 w +(it) 4349 2472 w +(was) 4458 2472 w +(time) 4684 2472 w +(to) 4942 2472 w +(try) 720 2592 w +(building.) 902 2592 w +(I) 1417 2592 w +(knew) 1498 2592 w +(that) 1803 2592 w +(the) 2046 2592 w +(terminal) 2253 2592 w +(part) 2707 2592 w +(could) 2954 2592 w +(be) 3271 2592 w +(built) 3441 2592 w +(easily) 3712 2592 w +10 /LucidaSansUnicode20 f +(\024) 4035 2592 w +10 /LucidaSansUnicode00 f +(that) 4186 2592 w +(part) 4428 2592 w +(of) 4675 2592 w +10 /LucidaTypewriter f +(jim) 4824 2592 w +10 /LucidaSansUnicode00 f +(behaved) 720 2712 w +(acceptably) 1165 2712 w +(well) 1715 2712 w +10 /LucidaSansUnicode20 f +(\024) 1944 2712 w +10 /LucidaSansUnicode00 f +(and) 2082 2712 w +(that) 2300 2712 w +(most) 2529 2712 w +(of) 2809 2712 w +(the) 2945 2712 w +(hard) 3138 2712 w +(work) 3397 2712 w +(was) 3673 2712 w +(going) 3895 2712 w +(to) 4210 2712 w +(be) 4347 2712 w +(in) 4505 2712 w +(the) 4635 2712 w +(host) 4829 2712 w +(part:) 720 2832 w +(the) 998 2832 w +(file) 1203 2832 w +(interface,) 1404 2832 w +(command) 1910 2832 w +(interpreter) 2438 2832 w +(and) 3007 2832 w +(so) 3237 2832 w +(on.) 3398 2832 w +(Moreover,) 3634 2832 w +(I) 4169 2832 w +(had) 4247 2832 w +(some) 4476 2832 w +(ideas) 4786 2832 w +(about) 720 2952 w +(how) 1031 2952 w +(the) 1264 2952 w +(architecture) 1452 2952 w +(of) 2063 2952 w +10 /LucidaTypewriter f +(jim) 2194 2952 w +10 /LucidaSansUnicode00 f +(could) 2443 2952 w +(be) 2742 2952 w +(improved) 2894 2952 w +(without) 3385 2952 w +(destroying) 3783 2952 w +(its) 4331 2952 w +(basic) 4482 2952 w +(struc\255) 4765 2952 w +(ture,) 720 3072 w +(which) 984 3072 w +(I) 1301 3072 w +(liked) 1366 3072 w +(in) 1637 3072 w +(principle) 1764 3072 w +(but) 2223 3072 w +(which) 2421 3072 w +(hadn) 2738 3072 w +10 /LucidaSansUnicode20 f +(\031) 2980 3072 w +10 /LucidaSansUnicode00 f +(t) 3012 3072 w +(worked) 3084 3072 w +(out) 3475 3072 w +(as) 3670 3072 w +(well) 3811 3072 w +(as) 4037 3072 w +(I) 4178 3072 w +(had) 4242 3072 w +(hoped.) 4457 3072 w +(So) 4861 3072 w +(I) 5011 3072 w +(began) 720 3192 w +(by) 1053 3192 w +(designing) 1203 3192 w +(the) 1714 3192 w +(file) 1904 3192 w +(data) 2090 3192 w +(structure,) 2336 3192 w +(starting) 2842 3192 w +(with) 3252 3192 w +(the) 3493 3192 w +(way) 3684 3192 w +10 /LucidaTypewriter f +(jim) 3904 3192 w +10 /LucidaSansUnicode00 f +(worked) 4156 3192 w +10 /LucidaSansUnicode20 f +(\024) 4548 3192 w +10 /LucidaSansUnicode00 f +(compa\255) 4684 3192 w +(rable) 720 3312 w +(to) 1001 3312 w +(a) 1136 3312 w +(single) 1228 3312 w +(structure) 1554 3312 w +(merging) 2029 3312 w +10 /LucidaTypewriter f +(Disc) 2471 3312 w +10 /LucidaSansUnicode00 f +(and) 2796 3312 w +10 /LucidaTypewriter f +(Buffer) 3013 3312 w +10 /LucidaSansUnicode00 f +(,) 3445 3312 w +(which) 3514 3312 w +(I) 3832 3312 w +(split) 3897 3312 w +(to) 4142 3312 w +(make) 4276 3312 w +(the) 4574 3312 w +(cache) 4765 3312 w +(more) 720 3432 w +(general) 1012 3432 w +10 /LucidaSansUnicode20 f +(\024) 1414 3432 w +10 /LucidaSansUnicode00 f +(and) 1555 3432 w +(thinking) 1776 3432 w +(about) 2218 3432 w +(how) 2537 3432 w +(global) 2779 3432 w +(substitute) 3120 3432 w +(could) 3647 3432 w +(be) 3955 3432 w +(implemented.) 4116 3432 w +(The) 4859 3432 w +(answer) 720 3552 w +(was) 1112 3552 w +(clearly) 1345 3552 w +(that) 1708 3552 w +(it) 1949 3552 w +(had) 2065 3552 w +(to) 2295 3552 w +(be) 2443 3552 w +(done) 2612 3552 w +(in) 2904 3552 w +(two) 3045 3552 w +(passes,) 3269 3552 w +(and) 3677 3552 w +(the) 3906 3552 w +(transcript-oriented) 4110 3552 w +(implementation fell out naturally.) 720 3672 w +10 /LucidaTypewriter f +(Sam) 970 3828 w +10 /LucidaSansUnicode00 f +(was) 1228 3828 w +(written) 1453 3828 w +(bottom-up,) 1834 3828 w +(starting) 2443 3828 w +(from) 2859 3828 w +(the) 3133 3828 w +(data) 3330 3828 w +(structures) 3583 3828 w +(and) 4115 3828 w +(algorithms) 4338 3828 w +(for) 4901 3828 w +(manipulating) 720 3948 w +(text,) 1400 3948 w +(through) 1664 3948 w +(the) 2092 3948 w +(command) 2288 3948 w +(language) 2807 3948 w +(and) 3291 3948 w +(up) 3512 3948 w +(to) 3678 3948 w +(the) 3817 3948 w +(code) 4013 3948 w +(for) 4285 3948 w +(maintaining) 4465 3948 w +(the) 720 4068 w +(display.) 909 4068 w +(In) 1349 4068 w +(retrospect,) 1474 4068 w +(it) 2034 4068 w +(turned) 2134 4068 w +(out) 2489 4068 w +(well,) 2683 4068 w +(but) 2940 4068 w +(this) 3136 4068 w +(implementation) 3349 4068 w +(method) 4145 4068 w +(is) 4551 4068 w +(not) 4665 4068 w +(rec\255) 4859 4068 w +(ommended) 720 4188 w +(in) 1305 4188 w +(general.) 1434 4188 w +(There) 1896 4188 w +(were) 2211 4188 w +(several) 2478 4188 w +(times) 2855 4188 w +(when) 3158 4188 w +(I) 3452 4188 w +(had) 3518 4188 w +(a) 3735 4188 w +(large) 3827 4188 w +(body) 4107 4188 w +(of) 4383 4188 w +(interesting) 4518 4188 w +(code assembled and no clue how to proceed with it.) 720 4308 w +(The command) 3313 4308 w +(language,) 4037 4308 w +(in) 4545 4308 w +(particu\255) 4669 4308 w +(lar,) 720 4428 w +(took) 918 4428 w +(almost) 1176 4428 w +(a) 1543 4428 w +(year) 1639 4428 w +(to) 1884 4428 w +(figure) 2023 4428 w +(out,) 2350 4428 w +(but) 2582 4428 w +(can) 2784 4428 w +(be) 2992 4428 w +(implemented) 3151 4428 w +(\(given) 3828 4428 w +(what) 4162 4428 w +(was) 4433 4428 w +(there) 4656 4428 w +(at) 4948 4428 w +(the) 720 4548 w +(beginning) 909 4548 w +(of) 1430 4548 w +(that) 1562 4548 w +(year\)) 1787 4548 w +(in) 2058 4548 w +(a) 2183 4548 w +(day) 2272 4548 w +(or) 2476 4548 w +(two.) 2612 4548 w +(Similarly,) 2885 4548 w +(inventing) 3362 4548 w +(the) 3847 4548 w +10 /LucidaTypewriter f +(Rasp) 4036 4548 w +10 /LucidaSansUnicode00 f +(data) 4358 4548 w +(structure) 4602 4548 w +(delayed) 720 4668 w +(the) 1141 4668 w +(connection) 1343 4668 w +(of) 1922 4668 w +(the) 2067 4668 w +(host) 2268 4668 w +(and) 2525 4668 w +(terminal) 2751 4668 w +(pieces) 3199 4668 w +(by) 3551 4668 w +(another) 3712 4668 w +(few) 4132 4668 w +(months.) 4348 4668 w +10 /LucidaTypewriter f +(Sam) 4824 4668 w +10 /LucidaSansUnicode00 f +(took) 720 4788 w +(about) 989 4788 w +(two) 1319 4788 w +(years) 1546 4788 w +(to) 1853 4788 w +(write,) 2003 4788 w +(although) 2327 4788 w +(only) 2809 4788 w +(about) 3065 4788 w +(four) 3395 4788 w +(months) 3648 4788 w +(were) 4066 4788 w +(spent) 4348 4788 w +(actually) 4670 4788 w +(working on it.) 720 4908 w +(Part) 970 5064 w +(of) 1199 5064 w +(the) 1338 5064 w +(design) 1534 5064 w +(process) 1898 5064 w +(was) 2313 5064 w +(unusual:) 2537 5064 w +(the) 2993 5064 w +(subset) 3189 5064 w +(of) 3551 5064 w +(the) 3691 5064 w +(protocol) 3888 5064 w +(that) 4334 5064 w +(maintains) 4567 5064 w +(the) 720 5184 w +10 /LucidaTypewriter f +(Rasp) 923 5184 w +10 /LucidaSansUnicode00 f +(was) 1259 5184 w +(simulated,) 1490 5184 w +(debugged) 2045 5184 w +(and) 2580 5184 w +(verified) 2808 5184 w +(by) 3219 5184 w +(an) 3382 5184 w +(automatic) 3547 5184 w +(protocol) 4074 5184 w +(analyzer,) 4525 5184 w +6 /LucidaSansUnicode00 f +(21) 4964 5134 w +10 /LucidaSansUnicode00 f +(and) 720 5304 w +(was) 935 5304 w +(bug-free) 1153 5304 w +(from) 1623 5304 w +(the) 1890 5304 w +(start.) 2080 5304 w +(The) 2400 5304 w +(rest) 2617 5304 w +(of) 2838 5304 w +(the) 2972 5304 w +(protocol,) 3163 5304 w +(concerned) 3635 5304 w +(mostly) 4174 5304 w +(with) 4533 5304 w +(keep\255) 4774 5304 w +(ing) 720 5424 w +(menus) 936 5424 w +(up) 1323 5424 w +(to) 1510 5424 w +(date,) 1670 5424 w +(was) 1975 5424 w +(unfortunately) 2220 5424 w +(too) 2935 5424 w +(unwieldy) 3156 5424 w +(for) 3648 5424 w +(such) 3849 5424 w +(analysis,) 4137 5424 w +(and) 4615 5424 w +(was) 4857 5424 w +(debugged) 720 5544 w +(by) 1255 5544 w +(more) 1418 5544 w +(traditional) 1717 5544 w +(methods,) 2263 5544 w +(primarily) 2766 5544 w +(by) 3246 5544 w +(logging) 3409 5544 w +(in) 3824 5544 w +(a) 3963 5544 w +(file) 4066 5544 w +(all) 4265 5544 w +(messages) 4426 5544 w +(in) 4949 5544 w +(and out of the host.) 720 5664 w +10 /LucidaSans-Demi f +(Reflections) 720 5904 w +10 /LucidaTypewriter f +(Sam) 720 6060 w +10 /LucidaSansUnicode00 f +(is) 983 6060 w +(essentially) 1110 6060 w +(the) 1664 6060 w +(only) 1866 6060 w +(interactive) 2117 6060 w +(editor) 2669 6060 w +(used) 3004 6060 w +(by) 3284 6060 w +(the) 3447 6060 w +(sixty) 3650 6060 w +(or) 3928 6060 w +(so) 4078 6060 w +(members) 4238 6060 w +(of) 4739 6060 w +(the) 4885 6060 w +(computing) 720 6180 w +(science) 1274 6180 w +(research) 1664 6180 w +(center) 2111 6180 w +(in) 2448 6180 w +(which) 2573 6180 w +(I) 2888 6180 w +(work.) 2950 6180 w +(The) 3284 6180 w +(same) 3498 6180 w +(could) 3786 6180 w +(not) 4085 6180 w +(be) 4278 6180 w +(said) 4430 6180 w +(of) 4661 6180 w +10 /LucidaTypewriter f +(jim) 4792 6180 w +10 /LucidaSansUnicode00 f +(;) 5008 6180 w +(the) 720 6300 w +(lack) 921 6300 w +(of) 1160 6300 w +(a) 1304 6300 w +(command) 1405 6300 w +(language) 1929 6300 w +(kept) 2418 6300 w +(some) 2678 6300 w +(people) 2985 6300 w +(from) 3359 6300 w +(adopting) 3637 6300 w +(it.) 4115 6300 w +(The) 4291 6300 w +(union) 4518 6300 w +(of) 4840 6300 w +(a) 4985 6300 w +(user) 720 6420 w +(interface) 967 6420 w +(as) 1428 6420 w +(comfortable) 1571 6420 w +(as) 2192 6420 w +10 /LucidaTypewriter f +(jim) 2335 6420 w +10 /LucidaSansUnicode20 f +(\031) 2551 6420 w +10 /LucidaSansUnicode00 f +(s) 2583 6420 w +(with) 2671 6420 w +(a) 2913 6420 w +(command) 3005 6420 w +(language) 3520 6420 w +(as) 4000 6420 w +(powerful) 4143 6420 w +(as) 4606 6420 w +10 /LucidaTypewriter f +(ed) 4750 6420 w +10 /LucidaSansUnicode20 f +(\031) 4894 6420 w +10 /LucidaSansUnicode00 f +(s) 4926 6420 w +10 /LucidaSansUnicode20 f +( ) 4977 6420 w +10 /LucidaSansUnicode00 f +(is) 720 6540 w +(essential) 841 6540 w +(to) 1308 6540 w +10 /LucidaTypewriter f +(sam) 1447 6540 w +10 /LucidaSansUnicode20 f +(\031) 1663 6540 w +10 /LucidaSansUnicode00 f +(s) 1695 6540 w +(success.) 1787 6540 w +(When) 2265 6540 w +10 /LucidaTypewriter f +(sam) 2572 6540 w +10 /LucidaSansUnicode00 f +(was) 2829 6540 w +(first) 3053 6540 w +(made) 3288 6540 w +(available) 3595 6540 w +(to) 4058 6540 w +(the) 4196 6540 w +10 /LucidaTypewriter f +(jim) 4391 6540 w +10 /LucidaSansUnicode00 f +(commu\255) 4647 6540 w +(nity,) 720 6660 w +(almost) 977 6660 w +(everyone) 1348 6660 w +(switched) 1829 6660 w +(to) 2300 6660 w +(it) 2443 6660 w +(within) 2554 6660 w +(two) 2895 6660 w +(or) 3116 6660 w +(three) 3264 6660 w +(days.) 3562 6660 w +(In) 3893 6660 w +(the) 4030 6660 w +(months) 4231 6660 w +(that) 4643 6660 w +(fol\255) 4880 6660 w +(lowed, even people who had never adopted) 720 6780 w +10 /LucidaTypewriter f +(jim) 2861 6780 w +10 /LucidaSansUnicode00 f +(started using) 3109 6780 w +10 /LucidaTypewriter f +(sam) 3779 6780 w +10 /LucidaSansUnicode00 f +(exclusively.) 4027 6780 w +8 /S1 f +(__________________) 720 6880 w +8 /LucidaSansUnicode20 f +( ) 720 6970 w +8 /LucidaSansUnicode00 f +(The) 770 6970 w +(people) 954 6970 w +(who) 1255 6970 w +(criticize) 1455 6970 w +8 /LucidaTypewriter f +(ed) 1799 6970 w +8 /LucidaSansUnicode00 f +(as) 1954 6970 w +(an) 2078 6970 w +(interactive) 2211 6970 w +(program) 2657 6970 w +(often) 3030 6970 w +(forget) 3274 6970 w +(that) 3551 6970 w +(it) 3745 6970 w +(and) 3838 6970 w +(its) 4022 6970 w +(close) 4156 6970 w +(relative) 4395 6970 w +8 /LucidaTypewriter f +(sed) 720 7060 w +4 /LucidaSansUnicode00 f +(7) 894 7020 w +8 /LucidaSansUnicode00 f +(still) 953 7060 w +(thrive) 1127 7060 w +(as) 1384 7060 w +(programmable) 1503 7060 w +(editors.) 2106 7060 w +(The) 2463 7060 w +(strength) 2642 7060 w +(of) 3005 7060 w +(these) 3118 7060 w +(programs) 3362 7060 w +(is) 3769 7060 w +(independent) 3866 7060 w +(of) 4387 7060 w +(their) 4499 7060 w +(convenience) 720 7150 w +(for) 1227 7150 w +(interactive) 1365 7150 w +(editing.) 1797 7150 w +cleartomark +showpage +saveobj restore +%%EndPage: 27 27 +%%Page: 28 28 +/saveobj save def +mark +28 pagesetup +10 /LucidaSansUnicode00 f +(\255 28 \255) 2752 480 w +(To) 970 840 w +(be) 1152 840 w +(honest,) 1329 840 w +10 /LucidaTypewriter f +(ed) 1748 840 w +10 /LucidaSansUnicode00 f +(still) 1950 840 w +(gets) 2183 840 w +(occasional) 2447 840 w +(use,) 3010 840 w +(but) 3269 840 w +(usually) 3490 840 w +(when) 3889 840 w +(something) 4205 840 w +(quick) 4777 840 w +(needs) 720 960 w +(to) 1043 960 w +(be) 1176 960 w +(done) 1330 960 w +(and) 1607 960 w +(the) 1821 960 w +(overhead) 2010 960 w +(of) 2490 960 w +(downloading) 2622 960 w +(the) 3280 960 w +(terminal) 3469 960 w +(part) 3905 960 w +(of) 4135 960 w +10 /LucidaTypewriter f +(sam) 4267 960 w +10 /LucidaSansUnicode00 f +(isn) 4517 960 w +10 /LucidaSansUnicode20 f +(\031) 4659 960 w +10 /LucidaSansUnicode00 f +(t) 4691 960 w +(worth) 4762 960 w +(the) 720 1080 w +(trouble.) 914 1080 w +(Also,) 1367 1080 w +(as) 1649 1080 w +(a) 1795 1080 w +10 /LucidaSansUnicode20 f +(\030) 1890 1080 w +10 /LucidaSansUnicode00 f +(line) 1922 1080 w +10 /LucidaSansUnicode20 f +(\031) 2098 1080 w +10 /LucidaSansUnicode00 f +(editor,) 2170 1080 w +10 /LucidaTypewriter f +(sam) 2529 1080 w +(-d) 2785 1080 w +10 /LucidaSansUnicode00 f +(is) 2969 1080 w +(a) 3089 1080 w +(bit) 3184 1080 w +(odd;) 3353 1080 w +(when) 3612 1080 w +(using) 3909 1080 w +(a) 4215 1080 w +(good) 4310 1080 w +(old) 4597 1080 w +(ASCII) 4790 1080 w +(terminal,) 720 1200 w +(it) 1193 1200 w +10 /LucidaSansUnicode20 f +(\031) 1259 1200 w +10 /LucidaSansUnicode00 f +(s) 1291 1200 w +(comforting) 1381 1200 w +(to) 1954 1200 w +(have) 2091 1200 w +(a) 2355 1200 w +(true) 2449 1200 w +(line) 2684 1200 w +(editor.) 2898 1200 w +(But) 3287 1200 w +(it) 3482 1200 w +(is) 3586 1200 w +(fair) 3704 1200 w +(to) 3904 1200 w +(say) 4040 1200 w +(that) 4236 1200 w +10 /LucidaTypewriter f +(sam) 4465 1200 w +10 /LucidaSansUnicode20 f +(\031) 4681 1200 w +10 /LucidaSansUnicode00 f +(s) 4713 1200 w +(com\255) 4802 1200 w +(mand) 720 1320 w +(language) 1040 1320 w +(has) 1530 1320 w +(displaced) 1745 1320 w +10 /LucidaTypewriter f +(ed) 2252 1320 w +10 /LucidaSansUnicode20 f +(\031) 2396 1320 w +10 /LucidaSansUnicode00 f +(s) 2428 1320 w +(for) 2526 1320 w +(most) 2712 1320 w +(of) 3001 1320 w +(the) 3146 1320 w +(complicated) 3349 1320 w +(editing) 3985 1320 w +(that) 4371 1320 w +(has) 4610 1320 w +(kept) 4826 1320 w +(line editors \(that is, command-driven editors\) with us.) 720 1440 w +10 /LucidaTypewriter f +(Sam) 970 1596 w +10 /LucidaSansUnicode20 f +(\031) 1186 1596 w +10 /LucidaSansUnicode00 f +(s) 1218 1596 w +(command) 1323 1596 w +(language) 1855 1596 w +(is) 2352 1596 w +(even) 2486 1596 w +(fancier) 2766 1596 w +(than) 3151 1596 w +10 /LucidaTypewriter f +(ed) 3421 1596 w +10 /LucidaSansUnicode20 f +(\031) 3565 1596 w +10 /LucidaSansUnicode00 f +(s,) 3597 1596 w +(and) 3734 1596 w +(most) 3969 1596 w +10 /LucidaTypewriter f +(sam) 4266 1596 w +10 /LucidaSansUnicode00 f +(customers) 4537 1596 w +(don) 720 1716 w +10 /LucidaSansUnicode20 f +(\031) 906 1716 w +10 /LucidaSansUnicode00 f +(t) 938 1716 w +(come) 1008 1716 w +(near to using all its capabilities.) 1302 1716 w +(Does it need to be so sophisticated?) 2913 1716 w +(I think) 4731 1716 w +(the answer is yes, for two reasons.) 720 1836 w +(First,) 970 1992 w +(the) 1257 1992 w +10 /LucidaSans-Italic f +(model) 1456 1992 w +10 /LucidaSansUnicode00 f +(for) 1793 1992 w +10 /LucidaTypewriter f +(sam) 1976 1992 w +10 /LucidaSansUnicode20 f +(\031) 2192 1992 w +10 /LucidaSansUnicode00 f +(s) 2224 1992 w +(command) 2319 1992 w +(language) 2841 1992 w +(is) 3328 1992 w +(really) 3452 1992 w +(relatively) 3758 1992 w +(simple,) 4238 1992 w +(and) 4635 1992 w +(cer\255) 4859 1992 w +(tainly) 720 2112 w +(simpler) 1030 2112 w +(than) 1438 2112 w +(that) 1700 2112 w +(of) 1936 2112 w +10 /LucidaTypewriter f +(ed) 2079 2112 w +10 /LucidaSansUnicode00 f +(.) 2223 2112 w +(For) 2332 2112 w +(instance,) 2533 2112 w +(there) 3013 2112 w +(is) 3310 2112 w +(only) 3435 2112 w +(one) 3684 2112 w +(kind) 3908 2112 w +(of) 4165 2112 w +(textual) 4308 2112 w +(loop) 4690 2112 w +(in) 4949 2112 w +10 /LucidaTypewriter f +(sam) 720 2232 w +10 /LucidaSansUnicode20 f +(\024) 973 2232 w +10 /LucidaSansUnicode00 f +(the) 1110 2232 w +10 /LucidaTypewriter f +(x) 1302 2232 w +10 /LucidaSansUnicode00 f +(command) 1412 2232 w +10 /LucidaSansUnicode20 f +(\024) 1928 2232 w +10 /LucidaSansUnicode00 f +(while) 2066 2232 w +10 /LucidaTypewriter f +(ed) 2357 2232 w +10 /LucidaSansUnicode00 f +(has) 2539 2232 w +(three) 2745 2232 w +(\(the) 3035 2232 w +10 /LucidaTypewriter f +(g) 3261 2232 w +10 /LucidaSansUnicode00 f +(command,) 3371 2232 w +(the) 3919 2232 w +(global) 4112 2232 w +(flag) 4449 2232 w +(on) 4670 2232 w +(sub\255) 4831 2232 w +(stitutions,) 720 2352 w +(and) 1241 2352 w +(the) 1454 2352 w +(implicit loop over lines in multi-line substitutions\).) 1642 2352 w +(Also,) 4181 2352 w +10 /LucidaTypewriter f +(ed) 4455 2352 w +10 /LucidaSansUnicode20 f +(\031) 4599 2352 w +10 /LucidaSansUnicode00 f +(s substi\255) 4631 2352 w +(tute) 720 2472 w +(command) 947 2472 w +(is) 1460 2472 w +(necessary) 1575 2472 w +(to) 2085 2472 w +(make) 2218 2472 w +(changes) 2515 2472 w +(within) 2949 2472 w +(lines,) 3280 2472 w +(but) 3574 2472 w +(in) 3771 2472 w +10 /LucidaTypewriter f +(sam) 3897 2472 w +10 /LucidaSansUnicode00 f +(the) 4148 2472 w +10 /LucidaTypewriter f +(s) 4338 2472 w +10 /LucidaSansUnicode00 f +(command) 4446 2472 w +(is) 4960 2472 w +(more of a familiar convenience than a necessity;) 720 2592 w +10 /LucidaTypewriter f +(c) 3094 2592 w +10 /LucidaSansUnicode00 f +(and) 3198 2592 w +10 /LucidaTypewriter f +(t) 3410 2592 w +10 /LucidaSansUnicode00 f +(can do all the work.) 3514 2592 w +(Second,) 970 2748 w +(given) 1388 2748 w +(a) 1688 2748 w +(community) 1782 2748 w +(that) 2361 2748 w +(expects) 2592 2748 w +(an) 3007 2748 w +(editor) 3164 2748 w +(to) 3491 2748 w +(be) 3629 2748 w +(about) 3788 2748 w +(as) 4106 2748 w +(powerful) 4252 2748 w +(as) 4718 2748 w +10 /LucidaTypewriter f +(ed) 4864 2748 w +10 /LucidaSansUnicode00 f +(,) 5008 2748 w +(it) 720 2868 w +10 /LucidaSansUnicode20 f +(\031) 786 2868 w +10 /LucidaSansUnicode00 f +(s) 818 2868 w +(hard) 905 2868 w +(to) 1162 2868 w +(see) 1296 2868 w +(how) 1495 2868 w +10 /LucidaTypewriter f +(sam) 1731 2868 w +10 /LucidaSansUnicode00 f +(could) 1983 2868 w +(really) 2285 2868 w +(be) 2583 2868 w +(much) 2738 2868 w +(simpler) 3042 2868 w +(and) 3440 2868 w +(still) 3656 2868 w +(satisfy) 3867 2868 w +(that) 4214 2868 w +(expectation.) 4440 2868 w +(People) 720 2988 w +(want) 1073 2988 w +(to) 1337 2988 w +(do) 1469 2988 w +10 /LucidaSansUnicode20 f +(\030\030) 1627 2988 w +10 /LucidaSansUnicode00 f +(global) 1691 2988 w +(substitutes,) 2024 2988 w +10 /LucidaSansUnicode20 f +(\031\031) 2592 2988 w +10 /LucidaSansUnicode00 f +(and) 2690 2988 w +(most) 2904 2988 w +(are) 3180 2988 w +(content) 3366 2988 w +(to) 3766 2988 w +(have) 3898 2988 w +(the) 4157 2988 w +(recipe) 4346 2988 w +(for) 4676 2988 w +(that) 4849 2988 w +(and) 720 3108 w +(a) 944 3108 w +(few) 1043 3108 w +(other) 1257 3108 w +(fancy) 1558 3108 w +(changes.) 1858 3108 w +(The) 2364 3108 w +(sophistication) 2588 3108 w +(of) 3309 3108 w +(the) 3450 3108 w +(command) 3648 3108 w +(language) 4169 3108 w +(is) 4655 3108 w +(really) 4778 3108 w +(just) 720 3228 w +(a) 942 3228 w +(veneer) 1039 3228 w +(over) 1404 3228 w +(a) 1656 3228 w +(design) 1753 3228 w +(that) 2118 3228 w +(makes) 2351 3228 w +(it) 2707 3228 w +(possible) 2816 3228 w +(to) 3262 3228 w +(do) 3403 3228 w +(global) 3570 3228 w +(substitutes) 3912 3228 w +(in) 4491 3228 w +(a) 4625 3228 w +(screen) 4723 3228 w +(editor.) 720 3348 w +(Some) 1104 3348 w +(people will always want something more, however, and it) 1401 3348 w +10 /LucidaSansUnicode20 f +(\031) 4178 3348 w +10 /LucidaSansUnicode00 f +(s gratifying to be) 4210 3348 w +(able) 720 3468 w +(to) 968 3468 w +(provide) 1111 3468 w +(it.) 1521 3468 w +(The) 1696 3468 w +(real) 1922 3468 w +(power) 2148 3468 w +(of) 2491 3468 w +10 /LucidaTypewriter f +(sam) 2634 3468 w +10 /LucidaSansUnicode20 f +(\031) 2850 3468 w +10 /LucidaSansUnicode00 f +(s) 2882 3468 w +(command) 2978 3468 w +(language) 3502 3468 w +(comes) 3991 3468 w +(from) 4349 3468 w +(compos\255) 4627 3468 w +(ability) 720 3588 w +(of) 1048 3588 w +(the) 1180 3588 w +(operators,) 1369 3588 w +(which) 1901 3588 w +(is) 2216 3588 w +(by) 2330 3588 w +(nature) 2479 3588 w +(orthogonal) 2826 3588 w +(to) 3390 3588 w +(the) 3521 3588 w +(underlying) 3709 3588 w +(model.) 4260 3588 w +(In) 4659 3588 w +(other) 4783 3588 w +(words,) 720 3708 w +10 /LucidaTypewriter f +(sam) 1090 3708 w +10 /LucidaSansUnicode00 f +(is) 1351 3708 w +(not) 1476 3708 w +(itself) 1681 3708 w +(complex,) 1965 3708 w +(but) 2456 3708 w +(it) 2663 3708 w +(makes) 2774 3708 w +(complex) 3132 3708 w +(things) 3591 3708 w +(possible.) 3939 3708 w +(If) 4452 3708 w +(you) 4564 3708 w +(don) 4785 3708 w +10 /LucidaSansUnicode20 f +(\031) 4971 3708 w +10 /LucidaSansUnicode00 f +(t) 5003 3708 w +(want) 720 3828 w +(to) 988 3828 w +(do) 1123 3828 w +(anything) 1284 3828 w +(complex,) 1742 3828 w +(you) 2225 3828 w +(can) 2437 3828 w +(ignore) 2642 3828 w +(the) 2990 3828 w +(complexity) 3181 3828 w +(altogether,) 3749 3828 w +(and) 4313 3828 w +(many) 4529 3828 w +(peo\255) 4827 3828 w +(ple do so.) 720 3948 w +(Sometimes) 970 4104 w +(I) 1546 4104 w +(am) 1621 4104 w +(asked) 1815 4104 w +(the) 2144 4104 w +(opposite) 2345 4104 w +(question:) 2812 4104 w +(why) 3311 4104 w +(didn) 3549 4104 w +10 /LucidaSansUnicode20 f +(\031) 3766 4104 w +10 /LucidaSansUnicode00 f +(t) 3798 4104 w +(I) 3882 4104 w +(just) 3958 4104 w +(make) 4185 4104 w +10 /LucidaTypewriter f +(sam) 4494 4104 w +10 /LucidaSansUnicode00 f +(a) 4757 4104 w +(real) 4859 4104 w +(programmable) 720 4224 w +(editor,) 1471 4224 w +(with) 1828 4224 w +(macros) 2071 4224 w +(and) 2461 4224 w +(variables) 2679 4224 w +(and) 3148 4224 w +(so) 3366 4224 w +(on?) 3516 4224 w +(The) 3751 4224 w +(main) 3970 4224 w +(reason) 4247 4224 w +(is) 4611 4224 w +(a) 4729 4224 w +(mat\255) 4822 4224 w +(ter) 720 4344 w +(of) 895 4344 w +(taste:) 1034 4344 w +(I) 1343 4344 w +(like) 1413 4344 w +(the) 1626 4344 w +(editor) 1822 4344 w +(to) 2150 4344 w +(be) 2289 4344 w +(the) 2449 4344 w +(same) 2645 4344 w +(every) 2941 4344 w +(time) 3239 4344 w +(I) 3495 4344 w +(use) 3565 4344 w +(it.) 3775 4344 w +(There) 3946 4344 w +(is) 4265 4344 w +(one) 4387 4344 w +(technical) 4608 4344 w +(reason,) 720 4464 w +(though:) 1112 4464 w +(programmability) 1524 4464 w +(in) 2361 4464 w +(editors) 2486 4464 w +(is) 2858 4464 w +(largely) 2972 4464 w +(a) 3330 4464 w +(workaround) 3419 4464 w +(for) 4034 4464 w +(insufficient) 4207 4464 w +(inter\255) 4782 4464 w +(activity.) 720 4584 w +(Programmable) 1168 4584 w +(editors) 1914 4584 w +(are) 2294 4584 w +(used) 2488 4584 w +(to) 2762 4584 w +(make) 2902 4584 w +(particular,) 3206 4584 w +(usually) 3743 4584 w +(short-term,) 4125 4584 w +(things) 4737 4584 w +(easy) 720 4704 w +(to) 968 4704 w +(do,) 1100 4704 w +(such) 1290 4704 w +(as) 1549 4704 w +(by) 1688 4704 w +(providing) 1836 4704 w +(shorthands) 2331 4704 w +(for) 2909 4704 w +(common) 3081 4704 w +(actions.) 3535 4704 w +(If) 3978 4704 w +(things) 4077 4704 w +(are) 4413 4704 w +(generally) 4598 4704 w +(easy) 720 4824 w +(to) 967 4824 w +(do) 1098 4824 w +(in) 1255 4824 w +(the) 1379 4824 w +(first) 1567 4824 w +(place,) 1795 4824 w +(shorthands) 2115 4824 w +(are) 2694 4824 w +(not) 2880 4824 w +(as) 3074 4824 w +(helpful.) 3214 4824 w +10 /LucidaTypewriter f +(Sam) 3650 4824 w +10 /LucidaSansUnicode00 f +(makes) 3900 4824 w +(common) 4247 4824 w +(editing) 4702 4824 w +(operations) 720 4944 w +(very) 1278 4944 w +(easy,) 1521 4944 w +(and) 1809 4944 w +(the) 2030 4944 w +(solutions) 2226 4944 w +(to) 2710 4944 w +(complex) 2849 4944 w +(editing) 3304 4944 w +(problems) 3683 4944 w +(seem) 4181 4944 w +(commensu\255) 4478 4944 w +(rate) 720 5064 w +(with) 952 5064 w +(the) 1200 5064 w +(problems) 1399 5064 w +(themselves.) 1900 5064 w +(Also,) 2551 5064 w +(the) 2837 5064 w +(ability) 3036 5064 w +(to) 3374 5064 w +(edit) 3516 5064 w +(the) 3745 5064 w +10 /LucidaTypewriter f +(sam) 3944 5064 w +10 /LucidaSansUnicode00 f +(window) 4204 5064 w +(makes) 4617 5064 w +(it) 4974 5064 w +(easy) 720 5184 w +(to) 976 5184 w +(repeat) 1115 5184 w +(commands) 1464 5184 w +10 /LucidaSansUnicode20 f +(\024) 2034 5184 w +10 /LucidaSansUnicode00 f +(it) 2175 5184 w +(only) 2282 5184 w +(takes) 2527 5184 w +(a) 2825 5184 w +(mouse) 2921 5184 w +(button) 3285 5184 w +(click) 3648 5184 w +(to) 3907 5184 w +(execute) 4046 5184 w +(a) 4466 5184 w +(command) 4562 5184 w +(again.) 720 5304 w +10 /LucidaSans-Demi f +(Pros and cons) 720 5544 w +10 /LucidaTypewriter f +(Sam) 720 5700 w +10 /LucidaSansUnicode00 f +(has) 973 5700 w +(several) 1178 5700 w +(other) 1555 5700 w +(good) 1849 5700 w +(points,) 2133 5700 w +(and) 2505 5700 w +(its) 2722 5700 w +(share) 2876 5700 w +(of) 3179 5700 w +(problems.) 3315 5700 w +(Among) 3874 5700 w +(the) 4259 5700 w +(good) 4452 5700 w +(things) 4737 5700 w +(is) 720 5820 w +(the) 850 5820 w +(idea) 1055 5820 w +(of) 1308 5820 w +(structural) 1455 5820 w +(regular) 1970 5820 w +(expressions,) 2365 5820 w +(whose) 3028 5820 w +(usefulness) 3384 5820 w +(has) 3950 5820 w +(only) 4167 5820 w +(begun) 4420 5820 w +(to) 4774 5820 w +(be) 4921 5820 w +(explored.) 720 5940 w +(They) 1256 5940 w +(were) 1531 5940 w +(arrived) 1803 5940 w +(at) 2182 5940 w +(serendipitously) 2316 5940 w +(when) 3100 5940 w +(I) 3399 5940 w +(attempted) 3470 5940 w +(to) 4009 5940 w +(distill) 4149 5940 w +(the) 4459 5940 w +(essence) 4657 5940 w +(of) 720 6060 w +10 /LucidaTypewriter f +(ed) 861 6060 w +10 /LucidaSansUnicode20 f +(\031) 1005 6060 w +10 /LucidaSansUnicode00 f +(s) 1037 6060 w +(way) 1131 6060 w +(of) 1358 6060 w +(doing) 1499 6060 w +(global) 1819 6060 w +(substitution) 2161 6060 w +(and) 2785 6060 w +(recognized) 3008 6060 w +(that) 3589 6060 w +(the) 3823 6060 w +(looping) 4020 6060 w +(command) 4429 6060 w +(in) 4949 6060 w +10 /LucidaTypewriter f +(ed) 720 6180 w +10 /LucidaSansUnicode00 f +(was implicitly imposing a structure \(an array of lines\) on the file.) 896 6180 w +(Another) 970 6336 w +(of) 1402 6336 w +10 /LucidaTypewriter f +(sam) 1544 6336 w +10 /LucidaSansUnicode20 f +(\031) 1760 6336 w +10 /LucidaSansUnicode00 f +(s) 1792 6336 w +(good) 1887 6336 w +(things) 2178 6336 w +(is) 2525 6336 w +(its) 2649 6336 w +(undo) 2811 6336 w +(capability.) 3104 6336 w +(I) 3676 6336 w +(had) 3750 6336 w +(never) 3975 6336 w +(before) 4287 6336 w +(used) 4646 6336 w +(an) 4923 6336 w +(editor) 720 6456 w +(with) 1042 6456 w +(a) 1282 6456 w +(true) 1372 6456 w +(undo,) 1603 6456 w +(but) 1918 6456 w +(I) 2115 6456 w +(would) 2179 6456 w +(never) 2506 6456 w +(go) 2808 6456 w +(back) 2966 6456 w +(now.) 3228 6456 w +(Undo) 3527 6456 w +10 /LucidaSans-Italic f +(must) 3816 6456 w +10 /LucidaSansUnicode00 f +(be) 4092 6456 w +(done) 4245 6456 w +(well,) 4521 6456 w +(but) 4778 6456 w +(if) 4974 6456 w +(it) 720 6576 w +(is,) 824 6576 w +(it) 974 6576 w +(can) 1078 6576 w +(be) 1284 6576 w +(relied) 1441 6576 w +(on.) 1753 6576 w +(For) 1978 6576 w +(example,) 2172 6576 w +(it) 2655 6576 w +10 /LucidaSansUnicode20 f +(\031) 2721 6576 w +10 /LucidaSansUnicode00 f +(s) 2753 6576 w +(safe) 2842 6576 w +(to) 3079 6576 w +(experiment) 3215 6576 w +(if) 3807 6576 w +(you) 3912 6576 w +10 /LucidaSansUnicode20 f +(\031) 4087 6576 w +10 /LucidaSansUnicode00 f +(re) 4119 6576 w +(not) 4255 6576 w +(sure) 4454 6576 w +(how) 4703 6576 w +(to) 4942 6576 w +(write) 720 6696 w +(some) 1006 6696 w +(intricate) 1313 6696 w +(command,) 1756 6696 w +(because) 2311 6696 w +(if) 2750 6696 w +(you) 2861 6696 w +(make) 3081 6696 w +(a) 3388 6696 w +(mistake,) 3488 6696 w +(it) 3944 6696 w +(can) 4055 6696 w +(be) 4268 6696 w +(fixed) 4432 6696 w +(simply) 4723 6696 w +(and) 720 6816 w +(reliably.) 941 6816 w +(I) 1400 6816 w +(learned) 1470 6816 w +(two) 1873 6816 w +(things) 2089 6816 w +(about) 2433 6816 w +(undo) 2753 6816 w +(from) 3043 6816 w +(writing) 3317 6816 w +10 /LucidaTypewriter f +(sam) 3696 6816 w +10 /LucidaSansUnicode00 f +(:) 3912 6816 w +(first,) 3986 6816 w +(it) 4255 6816 w +10 /LucidaSansUnicode20 f +(\031) 4321 6816 w +10 /LucidaSansUnicode00 f +(s) 4353 6816 w +(easy) 4446 6816 w +(to) 4702 6816 w +(pro\255) 4842 6816 w +(vide) 720 6936 w +(if) 955 6936 w +(you) 1056 6936 w +(design) 1266 6936 w +(it) 1624 6936 w +(in) 1725 6936 w +(from) 1851 6936 w +(the) 2117 6936 w +(beginning,) 2306 6936 w +(and) 2859 6936 w +(second,) 3073 6936 w +(it) 3483 6936 w +10 /LucidaSansUnicode20 f +(\031) 3549 6936 w +10 /LucidaSansUnicode00 f +(s) 3581 6936 w +(necessary,) 3666 6936 w +(particularly) 4207 6936 w +(if) 4785 6936 w +(the) 4885 6936 w +(system has some subtle properties that may be unfamiliar or error-prone for users.) 720 7056 w +cleartomark +showpage +saveobj restore +%%EndPage: 28 28 +%%Page: 29 29 +/saveobj save def +mark +29 pagesetup +10 /LucidaSansUnicode00 f +(\255 29 \255) 2752 480 w +10 /LucidaTypewriter f +(Sam) 970 840 w +10 /LucidaSansUnicode20 f +(\031) 1186 840 w +10 /LucidaSansUnicode00 f +(s) 1218 840 w +(lack) 1309 840 w +(of) 1542 840 w +(internal) 1680 840 w +(limits) 2091 840 w +(and) 2399 840 w +(sizes) 2619 840 w +(is) 2903 840 w +(a) 3023 840 w +(virtue.) 3118 840 w +(Because) 3500 840 w +(it) 3930 840 w +(avoids) 4037 840 w +(all) 4389 840 w +(fixed-size) 4543 840 w +(tables) 720 960 w +(and) 1046 960 w +(data) 1261 960 w +(structures,) 1506 960 w +10 /LucidaTypewriter f +(sam) 2061 960 w +10 /LucidaSansUnicode00 f +(is) 2311 960 w +(able) 2425 960 w +(to) 2662 960 w +(make) 2794 960 w +(global) 3090 960 w +(changes) 3423 960 w +(to) 3856 960 w +(files) 3988 960 w +(that) 4224 960 w +(some) 4449 960 w +(of) 4744 960 w +(our) 4876 960 w +(other) 720 1080 w +(tools) 1013 1080 w +(cannot) 1289 1080 w +(even) 1654 1080 w +(read.) 1917 1080 w +(Moreover,) 2233 1080 w +(the) 2756 1080 w +(design) 2948 1080 w +(keeps) 3308 1080 w +(the) 3629 1080 w +(performance) 3821 1080 w +(linear) 4474 1080 w +(when) 4783 1080 w +(doing) 720 1200 w +(such) 1039 1200 w +(operations,) 1307 1200 w +(although) 1897 1200 w +(I) 2369 1200 w +(must) 2439 1200 w +(admit) 2723 1200 w +10 /LucidaTypewriter f +(sam) 3041 1200 w +10 /LucidaSansUnicode00 f +(does) 3298 1200 w +(get) 3570 1200 w +(slow) 3766 1200 w +(when) 4025 1200 w +(editing) 4323 1200 w +(a) 4702 1200 w +(huge) 4798 1200 w +(file.) 720 1320 w +(Now,) 970 1476 w +(the) 1249 1476 w +(problems.) 1439 1476 w +(Externally,) 1995 1476 w +(the) 2538 1476 w +(most) 2728 1476 w +(obvious) 3005 1476 w +(is) 3419 1476 w +(that) 3534 1476 w +(it) 3760 1476 w +(is) 3861 1476 w +(poorly) 3976 1476 w +(integrated) 4318 1476 w +(into) 4851 1476 w +(the) 720 1596 w +(surrounding) 909 1596 w +(window) 1539 1596 w +(system.) 1942 1596 w +(By) 2380 1596 w +(design,) 2524 1596 w +(the) 2913 1596 w +(user) 3102 1596 w +(interface) 3346 1596 w +(in) 3803 1596 w +10 /LucidaTypewriter f +(sam) 3927 1596 w +10 /LucidaSansUnicode00 f +(feels) 4176 1596 w +(almost) 4438 1596 w +(iden\255) 4797 1596 w +(tical to that of) 720 1716 w +10 /LucidaTypewriter f +(mux) 1436 1716 w +10 /LucidaSansUnicode00 f +(, but a thick wall separates) 1652 1716 w +(text) 2986 1716 w +(in) 3210 1716 w +10 /LucidaTypewriter f +(sam) 3334 1716 w +10 /LucidaSansUnicode00 f +(from) 3583 1716 w +(the) 3848 1716 w +(programs) 4036 1716 w +(running) 4536 1716 w +(in) 4949 1716 w +10 /LucidaTypewriter f +(mux) 720 1836 w +10 /LucidaSansUnicode00 f +(.) 936 1836 w +(For) 1034 1836 w +(instance,) 1224 1836 w +(the) 1693 1836 w +10 /LucidaSansUnicode20 f +(\030) 1882 1836 w +10 /LucidaSansUnicode00 f +(snarf) 1914 1836 w +(buffer) 2194 1836 w +10 /LucidaSansUnicode20 f +(\031) 2490 1836 w +10 /LucidaSansUnicode00 f +(in) 2556 1836 w +10 /LucidaTypewriter f +(sam) 2681 1836 w +10 /LucidaSansUnicode00 f +(must) 2930 1836 w +(be) 3206 1836 w +(maintained) 3358 1836 w +(separately) 3932 1836 w +(from) 4460 1836 w +(that) 4725 1836 w +(in) 4949 1836 w +10 /LucidaTypewriter f +(mux) 720 1956 w +10 /LucidaSansUnicode00 f +(.) 936 1956 w +(This) 1035 1956 w +(is) 1275 1956 w +(regrettable,) 1390 1956 w +(but) 1990 1956 w +(probably) 2187 1956 w +(necessary) 2649 1956 w +(given) 3159 1956 w +(the) 3456 1956 w +(unusual) 3647 1956 w +(configuration) 4066 1956 w +(of) 4751 1956 w +(the) 4885 1956 w +(system, with a programmable terminal on the far end of an RS-232 link.) 720 2076 w +10 /LucidaTypewriter f +(Sam) 970 2232 w +10 /LucidaSansUnicode00 f +(is) 1228 2232 w +(reliable;) 1350 2232 w +(otherwise,) 1782 2232 w +(people) 2326 2232 w +(wouldn) 2696 2232 w +10 /LucidaSansUnicode20 f +(\031) 3050 2232 w +10 /LucidaSansUnicode00 f +(t) 3082 2232 w +(use) 3161 2232 w +(it.) 3373 2232 w +(But) 3546 2232 w +(it) 3746 2232 w +(was) 3855 2232 w +(written) 4081 2232 w +(over) 4463 2232 w +(such) 4716 2232 w +(a) 4985 2232 w +(long) 720 2352 w +(time,) 971 2352 w +(and) 1255 2352 w +(has) 1472 2352 w +(so) 1676 2352 w +(many) 1824 2352 w +(new) 2122 2352 w +(\(to) 2353 2352 w +(me\)) 2520 2352 w +(ideas) 2738 2352 w +(in) 3028 2352 w +(it,) 3155 2352 w +(that) 3289 2352 w +(I) 3516 2352 w +(would) 3581 2352 w +(like) 3909 2352 w +(to) 4117 2352 w +(see) 4251 2352 w +(it) 4450 2352 w +(done) 4552 2352 w +(over) 4830 2352 w +(again to clean up) 720 2472 w +(the) 1588 2472 w +(code) 1776 2472 w +(and) 2040 2472 w +(remove) 2253 2472 w +(many) 2645 2472 w +(of) 2940 2472 w +(the) 3071 2472 w +(lingering) 3259 2472 w +(problems) 3724 2472 w +(in) 4214 2472 w +(the) 4338 2472 w +(implemen\255) 4526 2472 w +(tation.) 720 2592 w +(The) 1111 2592 w +(worst) 1338 2592 w +(part) 1651 2592 w +(is) 1893 2592 w +(in) 2019 2592 w +(the) 2156 2592 w +(interconnection) 2357 2592 w +(of) 3160 2592 w +(the) 3304 2592 w +(host) 3505 2592 w +(and) 3762 2592 w +(terminal) 3988 2592 w +(parts,) 4435 2592 w +(which) 4759 2592 w +(might) 720 2712 w +(even) 1047 2712 w +(be) 1317 2712 w +(able) 1480 2712 w +(to) 1727 2712 w +(go) 1869 2712 w +(away) 2036 2712 w +(in) 2319 2712 w +(a) 2454 2712 w +(redesign) 2553 2712 w +(for) 3017 2712 w +(a) 3200 2712 w +(more) 3299 2712 w +(conventional) 3594 2712 w +(window) 4255 2712 w +(system.) 4668 2712 w +(The) 720 2832 w +(program) 938 2832 w +(must) 1391 2832 w +(be) 1671 2832 w +(split) 1826 2832 w +(in) 2071 2832 w +(two) 2198 2832 w +(to) 2409 2832 w +(use) 2543 2832 w +(the) 2748 2832 w +(terminal) 2939 2832 w +(effectively,) 3377 2832 w +(but) 3937 2832 w +(the) 4135 2832 w +(low) 4326 2832 w +(bandwidth) 4529 2832 w +(of) 720 2952 w +(the) 854 2952 w +(connection) 1045 2952 w +(forces) 1613 2952 w +(the) 1946 2952 w +(separation) 2137 2952 w +(to) 2683 2952 w +(occur) 2817 2952 w +(in) 3119 2952 w +(an) 3246 2952 w +(inconvenient) 3399 2952 w +(part) 4054 2952 w +(of) 4287 2952 w +(the) 4422 2952 w +(design) 4614 2952 w +(if) 4974 2952 w +(performance) 720 3072 w +(is) 1372 3072 w +(to) 1488 3072 w +(be) 1622 3072 w +(acceptable.) 1776 3072 w +(A) 2391 3072 w +(simple) 2495 3072 w +(remote) 2851 3072 w +(procedure) 3230 3072 w +(call) 3759 3072 w +(protocol) 3958 3072 w +(driven) 4397 3072 w +(by) 4735 3072 w +(the) 4885 3072 w +(host, emitting only graphics commands,) 720 3192 w +(would) 2708 3192 w +(be) 3033 3192 w +(easy) 3185 3192 w +(to) 3432 3192 w +(write) 3563 3192 w +(but) 3836 3192 w +(wouldn) 4031 3192 w +10 /LucidaSansUnicode20 f +(\031) 4385 3192 w +10 /LucidaSansUnicode00 f +(t) 4417 3192 w +(have) 4487 3192 w +(nearly) 4745 3192 w +(the) 720 3312 w +(necessary) 921 3312 w +(responsiveness.) 1442 3312 w +(On) 2294 3312 w +(the) 2480 3312 w +(other) 2681 3312 w +(hand,) 2984 3312 w +(if) 3304 3312 w +(the) 3415 3312 w +(terminal) 3615 3312 w +(were) 4062 3312 w +(in) 4337 3312 w +(control) 4473 3312 w +(and) 4860 3312 w +(requested) 720 3432 w +(much) 1245 3432 w +(simpler) 1553 3432 w +(file) 1955 3432 w +(services) 2146 3432 w +(from) 2573 3432 w +(the) 2845 3432 w +(host,) 3041 3432 w +(regular) 3325 3432 w +(expression) 3712 3432 w +(searches) 4284 3432 w +(would) 4748 3432 w +(require) 720 3552 w +(that) 1103 3552 w +(the) 1329 3552 w +(terminal) 1519 3552 w +(read) 1956 3552 w +(the) 2206 3552 w +(entire) 2396 3552 w +(file) 2712 3552 w +(over) 2898 3552 w +(its) 3143 3552 w +(RS-232) 3295 3552 w +(link,) 3693 3552 w +(which) 3937 3552 w +(would) 4252 3552 w +(be) 4578 3552 w +(unrea\255) 4731 3552 w +(sonably) 720 3672 w +(slow.) 1126 3672 w +(A) 1441 3672 w +(compromise) 1543 3672 w +(in) 2175 3672 w +(which) 2299 3672 w +(either) 2613 3672 w +(end) 2927 3672 w +(can) 3141 3672 w +(take) 3343 3672 w +(control) 3583 3672 w +(is) 3959 3672 w +(necessary.) 4073 3672 w +(In) 4646 3672 w +(retro\255) 4771 3672 w +(spect,) 720 3792 w +(the) 1057 3792 w +(communications) 1259 3792 w +(protocol) 2103 3792 w +(should) 2554 3792 w +(have) 2929 3792 w +(been) 3201 3792 w +(designed) 3485 3792 w +(and) 3974 3792 w +(verified) 4201 3792 w +(formally,) 4611 3792 w +(although) 720 3912 w +(I) 1189 3912 w +(do) 1257 3912 w +(not) 1420 3912 w +(know) 1619 3912 w +(of) 1916 3912 w +(any) 2053 3912 w +(tool) 2261 3912 w +(that) 2488 3912 w +(can) 2718 3912 w +(adequately) 2925 3912 w +(relate) 3492 3912 w +(the) 3805 3912 w +(protocol) 3999 3912 w +(to) 4442 3912 w +(its) 4580 3912 w +(imple\255) 4737 3912 w +(mentation.) 720 4032 w +(Not) 970 4188 w +(all) 1189 4188 w +(of) 1349 4188 w +10 /LucidaTypewriter f +(sam) 1494 4188 w +10 /LucidaSansUnicode20 f +(\031) 1710 4188 w +10 /LucidaSansUnicode00 f +(s) 1742 4188 w +(users) 1840 4188 w +(are) 2148 4188 w +(comfortable) 2347 4188 w +(with) 2978 4188 w +(its) 3230 4188 w +(command) 3394 4188 w +(language,) 3919 4188 w +(and) 4442 4188 w +(few) 4670 4188 w +(are) 4888 4188 w +(adept.) 720 4308 w +(Some) 1112 4308 w +(\(venerable\)) 1430 4308 w +(people) 2020 4308 w +(use) 2402 4308 w +(a) 2625 4308 w +(sort) 2734 4308 w +(of) 2978 4308 w +10 /LucidaSansUnicode20 f +(\030\030) 3129 4308 w +10 /LucidaTypewriter f +(ed) 3193 4308 w +10 /LucidaSansUnicode00 f +(subset) 3390 4308 w +10 /LucidaSansUnicode20 f +(\031\031) 3710 4308 w +10 /LucidaSansUnicode00 f +(of) 3827 4308 w +10 /LucidaTypewriter f +(sam) 3978 4308 w +10 /LucidaSansUnicode20 f +(\031) 4194 4308 w +10 /LucidaSansUnicode00 f +(s) 4226 4308 w +(command) 4330 4308 w +(lan\255) 4861 4308 w +(guage,) 720 4428 w +(and) 1082 4428 w +(even) 1295 4428 w +(ask) 1554 4428 w +(why) 1751 4428 w +10 /LucidaTypewriter f +(sam) 1975 4428 w +10 /LucidaSansUnicode20 f +(\031) 2191 4428 w +10 /LucidaSansUnicode00 f +(s) 2223 4428 w +(command) 2307 4428 w +(language) 2818 4428 w +(is) 3294 4428 w +(not) 3408 4428 w +(exactly) 3602 4428 w +10 /LucidaTypewriter f +(ed) 3977 4428 w +10 /LucidaSansUnicode20 f +(\031) 4121 4428 w +10 /LucidaSansUnicode00 f +(s.) 4153 4428 w +(\(The) 4302 4428 w +(reason,) 4550 4428 w +(of) 4942 4428 w +(course,) 720 4548 w +(is) 1110 4548 w +(that) 1226 4548 w +10 /LucidaTypewriter f +(sam) 1453 4548 w +10 /LucidaSansUnicode20 f +(\031) 1669 4548 w +10 /LucidaSansUnicode00 f +(s) 1701 4548 w +(model) 1788 4548 w +(for) 2125 4548 w +(text) 2299 4548 w +(does) 2525 4548 w +(not) 2791 4548 w +(include) 2986 4548 w +(newlines,) 3373 4548 w +(which) 3862 4548 w +(are) 4178 4548 w +(central) 4365 4548 w +(to) 4731 4548 w +10 /LucidaTypewriter f +(ed) 4864 4548 w +10 /LucidaSansUnicode00 f +(.) 5008 4548 w +(Making) 720 4668 w +(the) 1108 4668 w +(text) 1299 4668 w +(an) 1526 4668 w +(array) 1679 4668 w +(of) 1959 4668 w +(newlines) 2093 4668 w +(to) 2551 4668 w +(the) 2685 4668 w +(command) 2876 4668 w +(language) 3390 4668 w +(would) 3869 4668 w +(be) 4197 4668 w +(too) 4352 4668 w +(much) 4547 4668 w +(of) 4851 4668 w +(a) 4985 4668 w +(break) 720 4788 w +(from) 1032 4788 w +(the) 1303 4788 w +(seamless) 1497 4788 w +(model) 1978 4788 w +(provided) 2319 4788 w +(by) 2785 4788 w +(the) 2938 4788 w +(mouse.) 3131 4788 w +(Some) 3556 4788 w +(editors,) 3858 4788 w +(such) 4266 4788 w +(as) 4530 4788 w +10 /LucidaTypewriter f +(vi) 4674 4788 w +10 /LucidaSansUnicode00 f +(,) 4818 4788 w +(are) 4888 4788 w +(willing) 720 4908 w +(to) 1082 4908 w +(make) 1225 4908 w +(this) 1532 4908 w +(break,) 1756 4908 w +(though.\)) 2106 4908 w +(The) 2594 4908 w +(difficulty) 2820 4908 w +(is) 3292 4908 w +(that) 3418 4908 w +10 /LucidaTypewriter f +(sam) 3655 4908 w +10 /LucidaSansUnicode20 f +(\031) 3871 4908 w +10 /LucidaSansUnicode00 f +(s) 3903 4908 w +(syntax) 4000 4908 w +(is) 4364 4908 w +(so) 4490 4908 w +(close) 4648 4908 w +(to) 4942 4908 w +10 /LucidaTypewriter f +(ed) 720 5028 w +10 /LucidaSansUnicode20 f +(\031) 864 5028 w +10 /LucidaSansUnicode00 f +(s) 896 5028 w +(that) 996 5028 w +(people) 1236 5028 w +(believe) 1613 5028 w +(it) 2003 5028 w +10 /LucidaSans-Italic f +(should) 2118 5028 w +10 /LucidaSansUnicode00 f +(be) 2487 5028 w +(the) 2655 5028 w +(same.) 2859 5028 w +(I) 3227 5028 w +(thought,) 3305 5028 w +(with) 3769 5028 w +(some) 4022 5028 w +(justification) 4331 5028 w +(in) 4949 5028 w +(hindsight,) 720 5148 w +(that) 1250 5148 w +(making) 1482 5148 w +10 /LucidaTypewriter f +(sam) 1882 5148 w +10 /LucidaSansUnicode00 f +(similar) 2139 5148 w +(to) 2507 5148 w +10 /LucidaTypewriter f +(ed) 2646 5148 w +10 /LucidaSansUnicode00 f +(would) 2832 5148 w +(make) 3166 5148 w +(it) 3470 5148 w +(easier) 3578 5148 w +(to) 3908 5148 w +(learn) 4048 5148 w +(and) 4333 5148 w +(to) 4555 5148 w +(accept.) 4695 5148 w +(But) 720 5268 w +(I) 921 5268 w +(may) 994 5268 w +(have) 1238 5268 w +(overstepped) 1507 5268 w +(and) 2150 5268 w +(raised) 2374 5268 w +(the) 2713 5268 w +(users) 2911 5268 w +10 /LucidaSansUnicode20 f +(\031) 3172 5268 w +10 /LucidaSansUnicode00 f +(expectations) 3247 5268 w +(too) 3909 5268 w +(much.) 4111 5268 w +(It) 4486 5268 w +10 /LucidaSansUnicode20 f +(\031) 4552 5268 w +10 /LucidaSansUnicode00 f +(s) 4584 5268 w +(hard) 4678 5268 w +(to) 4942 5268 w +(decide which way to resolve this problem.) 720 5388 w +(Finally,) 970 5544 w +(there) 1350 5544 w +(is) 1640 5544 w +(a) 1758 5544 w +(tradeoff) 1851 5544 w +(in) 2276 5544 w +10 /LucidaTypewriter f +(sam) 2405 5544 w +10 /LucidaSansUnicode00 f +(that) 2659 5544 w +(was) 2888 5544 w +(decided) 3109 5544 w +(by) 3528 5544 w +(the) 3681 5544 w +(environment) 3874 5544 w +(in) 4524 5544 w +(which) 4654 5544 w +(it) 4974 5544 w +(runs:) 720 5664 w +10 /LucidaTypewriter f +(sam) 1011 5664 w +10 /LucidaSansUnicode00 f +(is) 1270 5664 w +(a) 1393 5664 w +(multi-file) 1491 5664 w +(editor,) 1993 5664 w +(although) 2355 5664 w +(in) 2828 5664 w +(a) 2962 5664 w +(different) 3060 5664 w +(system) 3521 5664 w +(there) 3904 5664 w +(might) 4199 5664 w +(instead) 4525 5664 w +(be) 4921 5664 w +(multiple) 720 5784 w +(single-file) 1167 5784 w +(editors.) 1714 5784 w +(The) 2165 5784 w +(decision) 2395 5784 w +(was) 2846 5784 w +(made) 3078 5784 w +(primarily) 3394 5784 w +(because) 3875 5784 w +(starting) 4318 5784 w +(a) 4741 5784 w +(new) 4845 5784 w +(program) 720 5904 w +(in) 1187 5904 w +(a) 1329 5904 w +(Blit) 1435 5904 w +(is) 1638 5904 w +(time-consuming.) 1768 5904 w +(If) 2688 5904 w +(the) 2804 5904 w +(choice) 3009 5904 w +(could) 3369 5904 w +(be) 3685 5904 w +(made) 3854 5904 w +(freely,) 4171 5904 w +(however,) 4524 5904 w +(I) 5011 5904 w +(would still choose the multi-file architecture, because) 720 6024 w +(it) 3372 6024 w +(allows) 3471 6024 w +(groups) 3806 6024 w +(of) 4179 6024 w +(files) 4310 6024 w +(to) 4545 6024 w +(be) 4676 6024 w +(han\255) 4828 6024 w +(dled) 720 6144 w +(as) 990 6144 w +(a) 1155 6144 w +(unit;) 1268 6144 w +(the) 1548 6144 w +(usefulness) 1761 6144 w +(of) 2336 6144 w +(the) 2492 6144 w +(multi-file) 2705 6144 w +(commands) 3222 6144 w +(is) 3809 6144 w +(incontrovertible.) 3947 6144 w +(It) 4836 6144 w +(is) 4960 6144 w +(delightful to have the source to an entire program available at your fingertips.) 720 6264 w +10 /LucidaSans-Demi f +(Acknowledgements) 720 6504 w +10 /LucidaSansUnicode00 f +(Tom) 720 6660 w +(Cargill) 983 6660 w +(suggested) 1343 6660 w +(the) 1889 6660 w +(idea) 2090 6660 w +(behind) 2339 6660 w +(the) 2720 6660 w +10 /LucidaTypewriter f +(Rasp) 2921 6660 w +10 /LucidaSansUnicode00 f +(data) 3256 6660 w +(structure.) 3513 6660 w +(Norman) 4062 6660 w +(Wilson) 4495 6660 w +(and) 4860 6660 w +(Ken) 720 6780 w +(Thompson) 949 6780 w +(influenced) 1511 6780 w +(the) 2063 6780 w +(command) 2263 6780 w +(language.) 2786 6780 w +(This) 3338 6780 w +(paper) 3588 6780 w +(was) 3911 6780 w +(improved) 4139 6780 w +(by) 4642 6780 w +(com\255) 4802 6780 w +(ments) 720 6900 w +(from) 1064 6900 w +(Al) 1341 6900 w +(Aho,) 1484 6900 w +(Jon) 1753 6900 w +(Bentley,) 1952 6900 w +(Chris) 2379 6900 w +(Fraser,) 2676 6900 w +(Gerard) 3051 6900 w +(Holzmann,) 3424 6900 w +(Brian) 3995 6900 w +(Kernighan,) 4286 6900 w +(Ted) 4858 6900 w +(Kowalski, Doug McIlroy and Dennis Ritchie.) 720 7020 w +cleartomark +showpage +saveobj restore +%%EndPage: 29 29 +%%Page: 30 30 +/saveobj save def +mark +30 pagesetup +10 /LucidaSansUnicode00 f +(\255 30 \255) 2752 480 w +10 /LucidaSans-Demi f +(REFERENCES) 720 840 w +10 /LucidaSansUnicode00 f +(1. R.) 783 1032 w +(Pike,) 1042 1032 w +10 /LucidaSansUnicode20 f +(\030) 1309 1032 w +10 /LucidaSansUnicode00 f +(The) 1341 1032 w +(Blit:) 1559 1032 w +(a) 1781 1032 w +(multiplexed) 1873 1032 w +(graphics) 2488 1032 w +(terminal,) 2939 1032 w +10 /LucidaSansUnicode20 f +(\031) 3373 1032 w +10 /LucidaSans-Italic f +(AT&T) 3442 1032 w +(Bell) 3742 1032 w +(Labs.) 3949 1032 w +(Tech.) 4244 1032 w +(J.,) 4540 1032 w +10 /LucidaSans-Demi f +(63) 4682 1032 w +10 /LucidaSansUnicode00 f +(,) 4810 1032 w +(\(8\),) 4879 1032 w +(1607-1631 \(1984\).) 910 1152 w +(2. L. Johnson,) 783 1308 w +10 /LucidaSans-Italic f +(MacWrite,) 1481 1308 w +10 /LucidaSansUnicode00 f +(Apple Computer Inc., Cupertino, Calif. 1983.) 1996 1308 w +(3. B.) 783 1464 w +(Lampson,) 1047 1464 w +10 /LucidaSansUnicode20 f +(\030) 1564 1464 w +10 /LucidaSansUnicode00 f +(Bravo) 1596 1464 w +(Manual,) 1910 1464 w +10 /LucidaSansUnicode20 f +(\031) 2291 1464 w +10 /LucidaSansUnicode00 f +(in) 2371 1464 w +10 /LucidaSans-Italic f +(Alto) 2510 1464 w +(User's) 2751 1464 w +(Handbook,) 3099 1464 w +10 /LucidaSansUnicode00 f +(pp.) 3670 1464 w +(31-62,) 3876 1464 w +(Xerox) 4266 1464 w +(Palo) 4596 1464 w +(Alto) 4844 1464 w +(Research Center, Palo Alto, Calif.) 910 1584 w +(1979.) 2569 1584 w +(4. W. Teitelman, ) 783 1740 w +10 /LucidaSansUnicode20 f +(\030) 1604 1740 w +10 /LucidaSansUnicode00 f +(A tour through Cedar,) 1636 1740 w +10 /LucidaSansUnicode20 f +(\031) 2705 1740 w +10 /LucidaSans-Italic f +(IEEE Software,) 2769 1740 w +10 /LucidaSans-Demi f +(1) 3487 1740 w +10 /LucidaSansUnicode00 f +(\(2\), 44-73 \(1984\).) 3583 1740 w +(5. J.) 783 1896 w +(Gutknecht,) 1031 1896 w +10 /LucidaSansUnicode20 f +(\030) 1618 1896 w +10 /LucidaSansUnicode00 f +(Concepts) 1650 1896 w +(of) 2158 1896 w +(the) 2315 1896 w +(text) 2529 1896 w +(editor) 2779 1896 w +(Lara,) 3125 1896 w +10 /LucidaSansUnicode20 f +(\031) 3361 1896 w +10 /LucidaSans-Italic f +(Comm.) 3452 1896 w +(ACM,) 3854 1896 w +10 /LucidaSans-Demi f +(28) 4165 1896 w +10 /LucidaSansUnicode00 f +(,) 4293 1896 w +(\(9\),) 4384 1896 w +(942-960) 4604 1896 w +(\(1985\).) 910 2016 w +(6. Bell) 783 2172 w +(Telephone) 1166 2172 w +(Laboratories,) 1758 2172 w +10 /LucidaSans-Italic f +(UNIX) 2477 2172 w +(Programmer's) 2795 2172 w +(Manual,) 3580 2172 w +10 /LucidaSansUnicode00 f +(Holt,) 4054 2172 w +(Rinehart) 4371 2172 w +(and) 4860 2172 w +(Winston, New York 1983.) 910 2292 w +(7. B.) 783 2448 w +(W.) 1055 2448 w +(Kernighan) 1228 2448 w +(and) 1777 2448 w +(R.) 2012 2448 w +(Pike,) 2162 2448 w +10 /LucidaSans-Italic f +(The) 2447 2448 w +(Unix) 2679 2448 w +(Programming) 2948 2448 w +(Environment,) 3675 2448 w +10 /LucidaSansUnicode00 f +(Prentice-Hall,) 4376 2448 w +(Englewood Cliffs, New Jersey 1984.) 910 2568 w +(8.) 783 2724 w +10 /LucidaSans-Italic f +(Unix) 910 2724 w +(Time-Sharing) 1166 2724 w +(System) 1886 2724 w +(Programmer's) 2271 2724 w +(Manual,) 3014 2724 w +(Research) 3446 2724 w +(Version,) 3927 2724 w +(Ninth) 4369 2724 w +(Edition,) 4677 2724 w +(Volume 1,) 910 2844 w +10 /LucidaSansUnicode00 f +(AT&T Bell Laboratories, Murray Hill, New Jersey 1986.) 1432 2844 w +(9.) 783 3000 w +10 /LucidaSans-Italic f +(Unix) 910 3000 w +(Time-Sharing) 1239 3000 w +(System) 2032 3000 w +(Programmer's) 2491 3000 w +(Manual,) 3308 3000 w +(4.1) 3814 3000 w +(Berkeley) 4088 3000 w +(Software) 4612 3000 w +(Distribution, Volumes 1 and 2C,) 910 3120 w +10 /LucidaSansUnicode00 f +(University of California, Berkeley, Calif. 1981.) 2500 3120 w +(10. R.) 720 3276 w +(Pike,) 1056 3276 w +10 /LucidaSansUnicode20 f +(\030) 1337 3276 w +10 /LucidaSansUnicode00 f +(Structural) 1369 3276 w +(Regular) 1889 3276 w +(Expressions,) 2308 3276 w +10 /LucidaSansUnicode20 f +(\031) 2920 3276 w +10 /LucidaSans-Italic f +(Proc.) 3003 3276 w +(EUUG) 3299 3276 w +(Spring) 3613 3276 w +(Conf.,) 3980 3276 w +(Helsinki) 4321 3276 w +(1987,) 4756 3276 w +10 /LucidaSansUnicode00 f +(Eur. Unix User) 910 3396 w +10 /LucidaSansUnicode20 f +(\031) 1601 3396 w +10 /LucidaSansUnicode00 f +(s Group, Buntingford, Herts, UK 1987.) 1633 3396 w +(11. A.) 720 3552 w +(Goldberg,) 1060 3552 w +10 /LucidaSans-Italic f +(Smalltalk-80) 1588 3552 w +10 /LucidaSansUnicode20 f +(\023) 2279 3552 w +10 /LucidaSans-Italic f +(The) 2378 3552 w +(Interactive) 2604 3552 w +(Programming) 3168 3552 w +(Environment,) 3889 3552 w +10 /LucidaSansUnicode00 f +(Addison-) 4584 3552 w +(Wesley, Reading, Mass. 1984.) 910 3672 w +(12. K.) 720 3828 w +(Thompson,) 1042 3828 w +10 /LucidaSansUnicode20 f +(\030) 1625 3828 w +10 /LucidaSansUnicode00 f +(Regular) 1657 3828 w +(expression) 2060 3828 w +(search) 2626 3828 w +(algorithm,) 2977 3828 w +10 /LucidaSansUnicode20 f +(\031) 3478 3828 w +10 /LucidaSans-Italic f +(Comm.) 3545 3828 w +(ACM,) 3923 3828 w +10 /LucidaSans-Demi f +(11) 4211 3828 w +10 /LucidaSansUnicode00 f +(,) 4339 3828 w +(\(6\),) 4407 3828 w +(419-422) 4604 3828 w +(\(1968\).) 910 3948 w +(13. A.) 720 4104 w +(V.) 1060 4104 w +(Aho,) 1206 4104 w +(J.) 1480 4104 w +(E.) 1593 4104 w +(Hopcroft) 1729 4104 w +(and) 2204 4104 w +(J.) 2434 4104 w +(D.) 2547 4104 w +(Ullman,) 2704 4104 w +10 /LucidaSans-Italic f +(The) 3123 4104 w +(Design) 3350 4104 w +(and) 3728 4104 w +(Analysis) 3962 4104 w +(of) 4415 4104 w +(Computer) 4560 4104 w +(Algorithms,) 910 4224 w +10 /LucidaSansUnicode00 f +(Addison-Wesley, Reading, Mass. 1974.) 1509 4224 w +(14. B.) 720 4380 w +(W.) 1052 4380 w +(Kernighan) 1222 4380 w +(and) 1768 4380 w +(D.) 2000 4380 w +(M.) 2159 4380 w +(Ritchie,) 2329 4380 w +10 /LucidaSans-Italic f +(The) 2740 4380 w +(C) 2970 4380 w +(Programming) 3091 4380 w +(Language,) 3815 4380 w +10 /LucidaSansUnicode00 f +(Prentice-Hall,) 4376 4380 w +(Englewood Cliffs, New Jersey 1978.) 910 4500 w +(15. W.) 720 4656 w +(M.) 1086 4656 w +(Waite,) 1262 4656 w +10 /LucidaSansUnicode20 f +(\030) 1615 4656 w +10 /LucidaSansUnicode00 f +(The) 1647 4656 w +(cost) 1886 4656 w +(of) 2144 4656 w +(lexical) 2300 4656 w +(analysis,) 2668 4656 w +10 /LucidaSansUnicode20 f +(\031) 3084 4656 w +10 /LucidaSans-Italic f +(Softw.) 3174 4656 w +(Pract.) 3530 4656 w +(Exp.,) 3875 4656 w +10 /LucidaSans-Demi f +(16) 4167 4656 w +10 /LucidaSansUnicode00 f +(,) 4295 4656 w +(\(5\),) 4385 4656 w +(473-488) 4604 4656 w +(\(1986\).) 910 4776 w +(16. C. W. Fraser, ) 720 4932 w +10 /LucidaSansUnicode20 f +(\030) 1555 4932 w +10 /LucidaSansUnicode00 f +(A generalized text editor,) 1587 4932 w +10 /LucidaSansUnicode20 f +(\031) 2828 4932 w +10 /LucidaSans-Italic f +(Comm. ACM,) 2892 4932 w +10 /LucidaSans-Demi f +(23) 3551 4932 w +10 /LucidaSansUnicode00 f +(, \(3\), 154-158 \(1980\).) 3679 4932 w +(17. R.) 720 5088 w +(Pike,) 1067 5088 w +10 /LucidaSansUnicode20 f +(\030) 1359 5088 w +10 /LucidaSansUnicode00 f +(Graphics) 1391 5088 w +(in) 1877 5088 w +(overlapping) 2031 5088 w +(bitmap) 2667 5088 w +(layers,) 3070 5088 w +10 /LucidaSansUnicode20 f +(\031) 3386 5088 w +10 /LucidaSans-Italic f +(ACM) 3481 5088 w +(Trans.) 3764 5088 w +(on) 4141 5088 w +(Graph.,) 4323 5088 w +10 /LucidaSans-Demi f +(2) 4752 5088 w +10 /LucidaSansUnicode00 f +(,) 4816 5088 w +(\(2\)) 4911 5088 w +(135-160 \(1983\).) 910 5208 w +(18. L.) 720 5364 w +(J.) 1052 5364 w +(Guibas) 1172 5364 w +(and) 1561 5364 w +(J.) 1799 5364 w +(Stolfi,) 1920 5364 w +10 /LucidaSansUnicode20 f +(\030) 2257 5364 w +10 /LucidaSansUnicode00 f +(A) 2289 5364 w +(language) 2416 5364 w +(for) 2917 5364 w +(bitmap) 3114 5364 w +(manipulation,) 3512 5364 w +10 /LucidaSansUnicode20 f +(\031) 4181 5364 w +10 /LucidaSans-Italic f +(ACM) 4271 5364 w +(Trans.) 4549 5364 w +(on) 4921 5364 w +(Graph.,) 910 5484 w +10 /LucidaSans-Demi f +(1) 1308 5484 w +10 /LucidaSansUnicode00 f +(, \(3\), 191-214 \(1982\).) 1372 5484 w +(19. R.) 720 5640 w +(Pike,) 1039 5640 w +(B.) 1303 5640 w +(Locanthi) 1428 5640 w +(and) 1873 5640 w +(J.) 2088 5640 w +(Reiser,) 2186 5640 w +10 /LucidaSansUnicode20 f +(\030) 2549 5640 w +10 /LucidaSansUnicode00 f +(Hardware/software) 2581 5640 w +(trade-offs) 3546 5640 w +(for) 4077 5640 w +(bitmap) 4251 5640 w +(graphics) 4626 5640 w +(on the Blit,) 910 5760 w +10 /LucidaSansUnicode20 f +(\031) 1437 5760 w +10 /LucidaSans-Italic f +(Softw. Pract. Exp.,) 1501 5760 w +10 /LucidaSans-Demi f +(15) 2416 5760 w +10 /LucidaSansUnicode00 f +(, \(2\), 131-151 \(1985\).) 2544 5760 w +(20. T.) 720 5916 w +(A.) 1046 5916 w +(Cargill,) 1189 5916 w +10 /LucidaSansUnicode20 f +(\030) 1577 5916 w +10 /LucidaSansUnicode00 f +(The) 1609 5916 w +(feel) 1832 5916 w +(of) 2052 5916 w +(Pi,) 2192 5916 w +10 /LucidaSansUnicode20 f +(\031) 2308 5916 w +10 /LucidaSans-Italic f +(Winter) 2382 5916 w +(USENIX) 2743 5916 w +(Conference) 3129 5916 w +(Proceedings,) 3715 5916 w +(Denver) 4370 5916 w +(1986,) 4756 5916 w +10 /LucidaSansUnicode00 f +(62-71, USENIX Assoc., El Cerrito, CA.) 910 6036 w +(21. G. J. Holzmann, ) 720 6192 w +10 /LucidaSansUnicode20 f +(\030) 1698 6192 w +10 /LucidaSansUnicode00 f +(Tracing protocols,) 1730 6192 w +10 /LucidaSansUnicode20 f +(\031) 2612 6192 w +10 /LucidaSans-Italic f +(AT&T Tech. J.,) 2676 6192 w +10 /LucidaSans-Demi f +(64) 3399 6192 w +10 /LucidaSansUnicode00 f +(, \(10\), 2413-2434 \(1985\).) 3527 6192 w +cleartomark +showpage +saveobj restore +%%EndPage: 30 30 +%%Trailer +done +%%Pages: 30 diff --git a/sys/doc/sam/sam.tut b/sys/doc/sam/sam.tut new file mode 100644 index 000000000..c00e35f2f --- /dev/null +++ b/sys/doc/sam/sam.tut @@ -0,0 +1,1784 @@ +.de P1 +.KS +.DS +.ft CW +.ta 5n 10n 15n 20n 25n 30n 35n 40n 45n 50n 55n 60n 65n 70n 75n 80n +.. +.de P2 +.ft 1 +.DE +.KE +.. +.de CW +.lg 0 +\%\&\\$3\f(CW\\$1\fP\&\\$2 +.lg +.. +.de WC +.lg 0 +\%\&\\$3\f(CI\\$1\fP\&\\$2 +.lg +.. +.TL +A tutorial for the +.CW sam +.B +command language +.AU +Rob Pike +.AI +.MH +.AB +.CW sam +is an interactive text editor with a command language that makes heavy use +of regular expressions. +Although the language is syntactically similar to +.CW ed (1), +the details are interestingly different. +This tutorial introduces the command language, but does not discuss +the screen and mouse interface. +With apologies to those unfamiliar with the Ninth Edition Blit software, +it is assumed that the similarity of +.CW sam +to +.CW mux (9) +at this level makes +.CW sam 's +mouse language easy to learn. +.PP +The +.CW sam +command language applies identically to two environments: +when running +.CW sam +on an ordinary terminal +(\f2via\f1\f1 +.CW sam\ -d ), +and in the command window of a +.I downloaded +.CW sam , +that is, one using the bitmap display and mouse. +.AE +.SH +Introduction +.PP +This tutorial describes the command language of +.CW sam , +an interactive text editor that runs on Blits and +some computers with bitmap displays. +For most editing tasks, the mouse-based editing features +are sufficient, and they are easy to use and to learn. +.PP +The command language is often useful, however, particularly +when making global changes. +Unlike the commands in +.CW ed , +which are necessary to make changes, +.CW sam +commands tend to be used +only for complicated or repetitive editing tasks. +It is in these more involved uses that +the differences between +.CW sam +and other text editors are most evident. +.PP +.CW sam 's +language makes it easy to do some things that other editors, +including programs like +.CW sed +and +.CW awk , +do not handle gracefully, so this tutorial serves partly as a +lesson in +.CW sam 's +manner of manipulating text. +The examples below therefore concentrate entirely on the language, +assuming that facility with the use of the mouse in +.CW sam +is at worst easy to pick up. +In fact, +.CW sam +can be run without the mouse at all (not +.I downloaded ), +by specifying the +.CW -d +flag, and it is this domain that the tutorial +occupies; the command language in these modes +are identical. +.PP +A word to the Unix adept: +although +.CW sam +is syntactically very similar to +.CW ed , +it is fundamentally and deliberately different in design and detailed semantics. +You might use knowledge of +.CW ed +to predict how the substitute command works, +but you'd only be right if you had used some understanding of +.CW sam 's +workings to influence your prediction. +Be particularly careful about idioms. +Idioms form in curious nooks of languages and depend on +undependable peculiarities. +.CW ed +idioms simply don't work in +.CW sam : +.CW 1,$s/a/b/ +makes one substitution in the whole file, not one per line. +.CW sam +has its own idioms. +Much of the purpose of this tutorial is to publish them +and make fluency in +.CW sam +a matter of learning, not cunning. +.PP +The tutorial depends on familiarity with regular expressions, although +some experience with a more traditional Unix editor may be helpful. +To aid readers familiar with +.CW ed , +I have pointed out in square brackets [] some of +the relevant differences between +.CW ed +and +.CW sam . +Read these comments only if you wish +to understand the differences; the lesson is about +.CW sam , +not +.CW sam +.I vs. +.CW ed . +Another typographic convention is that output appears in +.CW "this font, +while typed input appears as +.WC "slanty text. +.PP +Nomenclature: +.CW sam +keeps a copy of the text it is editing. +This copy is called a +.I file . +To avoid confusion, I have called the permanent storage on disc a +.I +Unix file. +.R +.SH +Text +.PP +To get started, we need some text to play with. +Any text will do; try something from +James Gosling's Emacs manual: +.P1 +$ \f(CIsam -d +a +This manual is organized in a rather haphazard manner. The first +several sections were written hastily in an attempt to provide a +general introduction to the commands in Emacs and to try to show +the method in the madness that is the Emacs command structure. +\&. +.ft +.P2 +.WC "sam -d +starts +.CW sam +running. +The +.CW a +command adds text until a line containing just a period, and sets the +.I +current text +.R +(also called +.I dot ) +to what was typed \(em everything between the +.CW a +and the period. +.CW ed "" [ +would leave dot set to only the last line.] +The +.CW p +command prints the current text: +.P1 +.WC p +This manual is organized in a rather haphazard manner. The first +several sections were written hastily in an attempt to provide a +general introduction to the commands in Emacs and to try to show +the method in the madness that is the Emacs command structure. +.P2 +[Again, +.CW ed +would print only the last line.] +The +.CW a +command adds its text +.I after +dot; the +.CW i +command is like +.CW a, +but adds the text +.I before +dot. +.P1 +.ft CI +i +Introduction +\&. +p +.ft +Introduction +.P2 +There is also a +.CW c +command that changes (replaces) the current text, +and +.CW d +that deletes it; these are illustrated below. +.PP +To see all the text, we can specify what text to print; +for the moment, suffice it to say that +.WC 0,$ +specifies the entire file. +.CW ed "" [ +users would probably type +.WC 1,$ , +which in practice is the same thing, but see below.] +.P1 +.WC 0,$p +Introduction +This manual is organized in a rather haphazard manner. The first +several sections were written hastily in an attempt to provide a +general introduction to the commands in Emacs and to try to show +the method in the madness that is the Emacs command structure. +.P2 +Except for the +.CW w +command described below, +.I all +commands, +including +.CW p , +set dot to the text they touch. +Thus, +.CW a +and +.CW i +set dot to the new text, +.CW p +to the text printed, and so on. +Similarly, all commands +(except +.CW w ) +by default operate on the current +text [unlike +.CW ed , +for which some commands (such as +.CW g ) +default to the entire file]. +.PP +Things are not going to get very interesting until we can +set dot arbitrarily. +This is done by +.I addresses , +which specify a piece of the file. +The address +.CW 1 , +for example, sets dot to the first line of the file. +.P1 +.WC 1p +Introduction +.WC c +.WC Preamble +.WC . +.P2 +The +.CW c +command didn't need to specify dot; the +.CW p +left it on line one. +It's therefore easy to delete the first line utterly; +the last command left dot set to line one: +.P1 +.WC d +.WC 1p +This manual is organized in a rather haphazard manner. The first +.P2 +(Line numbers change +to reflect changes to the file.) +.PP +The address \f(CW/\f2text\f(CW/\f1 +sets dot to the first appearance of +.I text , +after dot. +.CW ed "" [ +matches the first line containing +.I text .] +If +.I text +is not found, the search restarts at the beginning of the file +and continues until dot. +.P1 +.WC /Emacs/p +Emacs +.P2 +It's difficult to indicate typographically, but in this example no newline appears +after +.CW Emacs : +the text to be printed is the string +.CW Emacs ', ` +exactly. +(The final +.CW p +may be left off \(em it is the default command. +When downloaded, however, the default is instead to select the text, +to highlight it, +and to make it visible by moving the window on the file if necessary. +Thus, +.CW /Emacs/ +indicates on the display the next occurrence of the text.) +.PP +Imagine we wanted to change the word +.CW haphazard +to +.CW thoughtless . +Obviously, what's needed is another +.CW c +command, but the method used so far to insert text includes a newline. +The syntax for including text without newlines is to surround the +text with slashes (which is the same as the syntax for +text searches, but what is going on should be clear from context). +The text must appear immediately after the +.CW c +(or +.CW a +or +.CW i ). +Given this, it is easy to make the required change: +.P1 +.WC /haphazard/c/thoughtless/ +.WC 1p +This manual is organized in a rather thoughtless manner. The first +.P2 +[Changes can always be done with a +.CW c +command, even if the text is smaller than a line]. +You'll find that this way of providing text to commands is much +more common than is the multiple-lines syntax. +If you want to include a slash +.CW / +in the text, just precede it with a backslash +.CW \e , +and use a backslash to protect a backslash itself. +.P1 +.WC /Emacs/c/Emacs\e\e360/ +.WC 4p +general introduction to the commands in Emacs\e360 and to try to show +.P2 +We could also make this particular change by +.P1 +.WC /Emacs/a/\e\e360/ +.P2 +.PP +This is as good a place as any to introduce the +.CW u +command, which undoes the last command. +A second +.CW u +will undo the penultimate command, and so on. +.P1 +.WC u +.WC 4p +general introduction to the commands in Emacs and to try to show +.WC u +.WC 3p +This manual is organized in a rather haphazard manner. The first +.P2 +Undoing can only back up; there is no way to undo a previous +.CW u . +.SH +Addresses +.PP +We've seen the simplest forms of addresses, but there is more +to learn before we can get too much further. +An address selects a region in the file \(em a substring \(em +and therefore must define the beginning and the end of a region. +Thus, the address +.CW 13 +selects from the beginning of line thirteen to the end of line thirteen, and +.CW /Emacs/ +selects from the beginning of the word +.CW Emacs ' ` +to the end. +.PP +Addresses may be combined with a comma: +.P1 +13,15 +.P2 +selects lines thirteen through fifteen. The definition of the comma +operator is to select from the beginning of the left hand address (the +beginning of line 13) to the end of the right hand address (the +end of line 15). +.PP +A few special simple addresses come in handy: +.CW . +(a period) represents dot, the current text, +.CW 0 +(line zero) selects the null string at the beginning of the file, and +.CW $ +selects the null string at the end of the file +[not the last line of the file]. +Therefore, +.P1 +0,13 +.P2 +selects from the beginning of the file to the end of line thirteen, +.P1 +\&.,$ +.P2 +selects from the beginning of the current text to the end of the file, and +.P1 +0,$ +.P2 +selects the whole file [that is, a single string containing the whole file, +not a list of all the lines in the file]. +.PP +These are all +.I absolute +addresses: they refer to specific places in the file. +.CW sam +also has relative addresses, which depend +on the value of dot, +and in fact we have already seen one form: +.CW /Emacs/ +finds the first occurrence of +.CW Emacs +searching forwards from dot. +Which occurrence of +.CW Emacs +it finds depends on the value of dot. +What if you wanted the first occurrence +.CW before +dot? Just precede the pattern with a minus sign, which reverses the direction +of the search: +.P1 +-/Emacs/ +.P2 +In fact, the complete syntax for forward searching is +.P1 ++/Emacs/ +.P2 +but the plus sign is the default, and in practice is rarely used. +Here is an example that includes it for clarity: +.P1 +0+/Emacs/ +.P2 +selects the first occurrence of +.CW Emacs +in the file; read it as ``go to line 0, then search forwards for +.CW Emacs .'' +Since the +.CW + +is optional, this can be written +.CW 0/Emacs/ . +Similarly, +.P1 +$-/Emacs/ +.P2 +finds the last occurrence in the file, so +.P1 +0/Emacs/,$-/Emacs/ +.P2 +selects the text from the first to last +.CW Emacs , +inclusive. +Slightly more interesting: +.P1 +/Emacs/+/Emacs/ +.P2 +(there is an implicit +.CW .+ +at the beginning) selects the second +.CW Emacs +following dot. +.PP +Line numbers may also be relative. +.P1 +-2 +.P2 +selects the second previous line, and +.P1 ++5 +.P2 +selects the fifth following line (here the plus sign is obligatory). +.PP +Since addresses may select (and dot may be) more than one line, +we need a definition of `previous' and `following:' +`previous' means +.I +before the beginning +.R +of dot, and `following' +means +.I +after the end +.R +of dot. +For example, if the file contains \f(CWA\f(CIAA\f(CWA\f1, +with dot set to the middle two +.CW A 's +(the slanting characters), +.CW -/A/ +sets dot to the first +.CW A , +and +.CW +/A/ +sets dot to the last +.CW A . +Except under odd circumstances (such as when the only occurrence of the +text in the file is already the current text), the text selected by a +search will be disjoint from dot. +.PP +To select the +.CW "troff -ms +paragraph containing dot, however long it is, use +.P1 +-/.PP/,/.PP/-1 +.P2 +which will include the +.CW .PP +that begins the paragraph, and exclude the one that ends it. +.PP +When typing relative line number addresses, the default number is +.CW 1 , +so the above could be written slightly more simply: +.P1 +-/.PP/,/.PP/- +.P2 +.PP +What does the address +.CW +1-1 +or the equivalent +.CW +- +mean? It looks like it does nothing, but recall that dot need not be a +complete line of text. +.CW +1 +selects the line after the end of the current text, and +.CW -1 +selects the line before the beginning. Therefore +.CW +1-1 +selects the line before the line after the end of dot, that is, +the complete line containing the end of dot. +We can use this construction to expand a selection to include a complete line, +say the first line in the file containing +.CW Emacs : +.P1 +.WC 0/Emacs/+-p +general introduction to the commands in Emacs and to try to show +.P2 +The address +.CW +- +is an idiom. +.SH +Loops +.PP +Above, we changed one occurrence of +.CW Emacs +to +.CW Emacs\e360 , +but if the name of the editor is really changing, it would be useful +to change +.I all +instances of the name in a single command. +.CW sam +provides a command, +.CW x +(extract), for just that job. +The syntax is +\f(CWx/\f2pattern\f(CW/\f2command\f1. +For each occurrence of the pattern in the selected text, +.CW x +sets dot to the occurrence and runs command. +For example, to change +.CW Emacs +to +.CW vi, +.P1 +.WC 0,$x/Emacs/c/vi/ +.WC 0,$p +This manual is organized in a rather haphazard manner. The first +several sections were written hastily in an attempt to provide a +general introduction to the commands in vi and to try to show +the method in the madness that is the vi command structure. +.P2 +This +works by subdividing the current text +.CW 0,$ "" ( +\(em the whole file) into appearances of its textual argument +.CW Emacs ), ( +and then running the command that follows +.CW c/vi/ ) ( +with dot set to the text. +We can read this example as, ``find all occurrences of +.CW Emacs +in the file, and for each one, +set the current text to the occurrence and run the command +.CW c/vi/ , +which will replace the current text by +.CW vi. '' +[This command is somewhat similar to +.CW ed 's +.CW g +command. The differences will develop below, but note that the +default address, as always, is dot rather than the whole file.] +.PP +A single +.CW u +command is sufficient to undo an +.CW x +command, regardless of how many individual changes the +.CW x +makes. +.P1 +.WC u +.WC 0,$p +This manual is organized in a rather haphazard manner. The first +several sections were written hastily in an attempt to provide a +general introduction to the commands in Emacs and to try to show +the method in the madness that is the Emacs command structure. +.P2 +.PP +Of course, +.CW c +is not the only command +.CW x +can run. An +.CW a +command can be used to put proprietary markings on +.CW Emacs : +.P1 +.WC 0,$x/Emacs/a/{TM}/ +.WC /Emacs/+-p +general introduction to the commands in Emacs{TM} and to try to show +.P2 +[There is no way to see the changes as they happen, as in +.CW ed 's +.CW g/Emacs/s//&{TM}/p ; +see the section on Multiple Changes, below.] +.PP +The +.CW p +command is also useful when driven by an +.CW x , +but be careful that you say what you mean; +.P1 +.WC 0,$x/Emacs/p +EmacsEmacs +.P2 +since +.CW x +sets dot to the text in the slashes, printing only that text +is not going to be very +informative. But the command that +.CW x +runs can contain addresses. For example, if we want to print all +lines containing +.CW Emacs , +just use +.CW +- : +.P1 +.WC 0,$x/Emacs/+-p +general introduction to the commands in Emacs{TM} and to try to show +the method in the madness that is the Emacs{TM} command structure. +.P2 +Finally, let's restore the state of the file with another +.CW x +command, and make use of a handy shorthand: +a comma in an address has its left side default to +.CW 0 , +and its right side default to +.CW $ , +so the easy-to-type address +.CW , +refers to the whole file: +.P1 +.WC ",x/Emacs/ /{TM}/d +.WC ,p +This manual is organized in a rather haphazard manner. The first +several sections were written hastily in an attempt to provide a +general introduction to the commands in Emacs and to try to show +the method in the madness that is the Emacs command structure. +.P2 +Notice what this +.CW x +does: for each occurrence of Emacs, +find the +.CW {TM} +that follows, and delete it. +.PP +The `text' +.CW sam +accepts +for searches in addresses and in +.CW x +commands is not simple text, but rather +.I regular\ expressions. +Unix has several distinct interpretations of regular expressions. +The form used by +.CW sam +is that of +.CW egrep (1), +including parentheses +.CW () +for grouping and an `or' operator +.CW | +for matching strings in parallel. +.CW sam +makes two extensions: +although +.CW . +(the most overloaded character in Unix) matches any character +.I except +newline, the regular expression +.CW @ +(think of it as a big dot) matches any character, even newlines; +and the character sequence +.CW \en +matches a newline character. +Replacement text, such as used in the +.CW a +and +.CW c +commands, is still plain text, but the sequence +.CW \en +represents newline in that context, too. +.PP +Here is an example. Say we wanted to double space the document, that is, +turn every newline into two newlines. +The following all do the job: +.P1 +.WC ",x/\en/ a/\en/ +.WC ",x/\en/ c/\en\en/ +.WC ",x/$/ a/\en/ +.WC ",x/^/ i/\en/ +.P2 +The last example is slightly different, because it puts a newline +.I before +each line; the other examples place it after. +The first two examples manipulate newlines directly +[something outside +.CW ed 's +ken]; the last two +use regular expressions: +.CW $ +is the empty string at the end of a line, while +.CW ^ +is the empty string at the beginning. +.PP +These solutions all have a possible drawback: if there is already a blank line +(that is, two consecutive newlines), they make it much larger (four +consecutive newlines). +A better method is to extend every group of newlines by one: +.P1 +.WC ",x/\en+/ a/\en/ +.P2 +The regular expression operator +.CW + +means `one or more;' +.CW \en+ +is identical to +.CW \en\en* . +Thus, this example +takes every sequence of newlines and adds another +to the end. +.PP +A more common example is indenting a block of text by a tab stop. +The following all work, +although the first is arguably the cleanest (the blank text in slashes is a tab): +.P1 +.WC ",x/^/a/ / +.WC ",x/^/c/ / +.WC ",x/.*\en/i/ / +.P2 +The last example uses the pattern (idiom, really) +.CW .*\en +to match lines: +.CW .* +matches the longest possible string of non-newline characters. +Taking initial tabs away is just as easy: +.P1 +.WC ",x/^ /d +.P2 +In these examples I have specified an address (the whole file), but +in practice commands like these are more likely to be run without +an address, using the value of dot set by selecting text with the mouse. +.SH +Conditionals +.PP +The +.CW x +command is a looping construct: +for each match of a regular expression, +it extracts (sets dot to) the match and runs a command. +.CW sam +also has a conditional, +.CW g : +\f(CWg/\f2pattern\f(CW/\f2command\f1 +runs the command if dot contains a match of the pattern +.I +without changing the value of dot. +.R +The inverse, +.CW v , +runs the command if dot does +.I not +contain a match of the pattern. +(The letters +.CW g +and +.CW v +are historical and have no mnemonic significance. You might +think of +.CW g +as `guard.') +.CW ed "" [ +users should read the above definitions very carefully; the +.CW g +command in +.CW sam +is fundamentally different from that in +.CW ed .] +Here is an example of the difference between +.CW x +and +.CW g: +.P1 +,x/Emacs/c/vi/ +.P2 +changes each occurrence of the word +.CW Emacs +in the file to the word +.CW vi , +but +.P1 +,g/Emacs/c/vi/ +.P2 +changes the +.I "whole file +to +.CW vi +if there is the word +.CW Emacs +anywhere in the file. +.PP +Neither of these commands is particularly interesting in isolation, +but they are valuable when combined with +.CW x +and with themselves. +.SH +Composition +.PP +One way to think about the +.CW x +command is that, given a selection (a value of dot) +it iterates through interesting subselections (values of dot within). +In other words, it takes a piece of text and cuts it into smaller pieces. +But the text that it cuts up may already be a piece cut by a previous +.CW x +command or selected by a +.CW g . +.CW sam 's +most interesting property is the ability to define a sequence of commands +to perform a particular task.\(dg +.FS +\(dg +The obvious analogy with shell pipelines is only partially valid, +because the individual +.CW sam +commands are all working on the same text; it is only how the text is +sliced up that is changing. +.FE +A simple example is to change all occurrences of +.CW Emacs +to +.CW emacs ; +certainly the command +.P1 +.WC ",x/Emacs/ c/emacs/ +.P2 +will work, but we can use an +.CW x +command to save retyping most of the word +.CW Emacs : +.P1 +.WC ",x/Emacs/ x/E/ c/e/ +.P2 +(Blanks can be used +to separate commands on a line to make them easier to read.) +What this command does is find all occurrences of +.CW Emacs +.CW ,x/Emacs/ ), ( +and then +.I +with dot set to that text, +.R +find all occurrences of the letter +.CW E +.CW x/E/ ), ( +and then +.I +with dot set to that text, +.R +run the command +.CW c/e/ +to change the character to lower case. +Note that the address for the command \(em the whole file, specified by a comma +\(em is only given to the leftmost +piece of the command; the rest of the pieces have dot set for them by +the execution of the pieces to their left. +.PP +As another simple example, consider a problem +solved above: printing all lines in the file containing the word +.CW Emacs: +.P1 +.WC ",x/.*\en/ g/Emacs/p +general introduction to the commands in Emacs and to try to show +the method in the madness that is the Emacs command structure. +.P2 +This command says to break the file into lines +.CW ,x/.*\en/ ), ( +and for each line that contains the string +.CW Emacs +.CW g/Emacs/ ), ( +run the command +.CW p +with dot set to the line (not the match of +.CW Emacs ), +which prints the line. +To save typing, because +.CW .*\en +is a common pattern in +.CW x +commands, +if the +.CW x +is followed immediately by a space, the pattern +.CW .*\en +is assumed. +Therefore, the above could be written more succinctly: +.P1 +.WC ",x g/Emacs/p +.P2 +The solution we used before was +.P1 +.WC ,x/Emacs/+-p +.P2 +which runs the command +.CW +-p +with dot set to each match of +.CW Emacs +in the file (recall that the idiom +.CW +-p +prints the line containing the end of dot). +.PP +The two commands usually produce the same result +(the +.CW +-p +form will print a line twice if it contains +.CW Emacs +twice). Which is better? +.CW ,x/Emacs/+-p +is easier to type and will be much faster if the file is large and +there are few occurrences of the string, but it is really an odd special case. +.CW ",x/.*\en/ g/Emacs/p +is slower \(em it breaks each line out separately, then examines +it for a match \(em but is conceptually cleaner, and generalizes more easily. +For example, consider the following piece of the Emacs manual: +.P1 +command name="append-to-file", key="[unbound]" +Takes the contents of the current buffer and appends it to the +named file. If the files doesn't exist, it will be created. + +command name="apropos", key="ESC-?" +Prompts for a keyword and then prints a list of those commands +whose short description contains that keyword. For example, +if you forget which commands deal with windows, just type +"@b[ESC-?]@t[window]@b[ESC]". + +\&\f2and so on\f(CW +.P2 +This text consists of groups of non-empty lines, with a simple format +for the text within each group. +Imagine that we wanted to find the description of the `apropos' +command. +The problem is to break the file into individual descriptions, +and then to find the description of `apropos' and to print it. +The solution is straightforward: +.P1 +.WC ,x/(.+\en)+/\ g/command\ name="apropos"/p +command name="apropos", key="ESC-?" +Prompts for a keyword and then prints a list of those commands +whose short description contains that keyword. For example, +if you forget which commands deal with windows, just type +"@b[ESC-?]@t[window]@b[ESC]". +.P2 +The regular expression +.CW (.+\en)+ +matches one or more lines with one or more characters each, that is, +the text between blank lines, so +.CW ,x/(.+\en)+/ +extracts each description; then +.CW g/command\ name="apropos"/ +selects the description for `apropos' and +.CW p +prints it. +.PP +Imagine that we had a C program containing the variable +.CW n , +but we wanted to change it to +.CW num . +This command is a first cut: +.P1 +.WC ",x/n/ c/num/ +.P2 +but is obviously flawed: it will change all +.CW n 's +in the file, not just the +.I identifier +.CW n . +A better solution is to use an +.CW x +command to extract the identifiers, and then use +.CW g +to find the +.CW n 's: +.P1 +.WC ",x/[a-zA-Z_][a-zA-Z_0-9]*/ g/n/ v/../ c/num/ +.P2 +It looks awful, but it's fairly easy to understand when read +left to right. +A C identifier is an alphabetic or underscore followed by zero or more +alphanumerics or underscores, that is, matches of the regular expression +.CW [a-zA-Z_][a-zA-Z_0-9]* . +The +.CW g +command selects those identifiers containing +.CW n , +and the +.CW v +is a trick: it rejects those identifiers containing more than one +character. Hence the +.CW c/num/ +applies only to free-standing +.CW n 's. +.PP +There is still a problem here: +we don't want to change +.CW n 's +that are part of the character constant +.CW \en . +There is a command +.CW y , +complementary to +.CW x , +that is just what we need: +\f(CWy/\f2pattern\f(CW/\f2command\f1 +runs the command on the pieces of text +.I between +matches of the pattern; +if +.CW x +selects, +.CW y +rejects. +Here is the final command: +.P1 +.WC ",y/\e\en/ x/[a-zA-Z_][a-zA-Z_0-9]*/ g/n/ v/../ c/num/ +.P2 +The +.CW y/\e\en/ +(with backslash doubled to make it a literal character) +removes the two-character sequence +.CW \en +from consideration, so the rest of the command will not touch it. +There is more we could do here; for example, another +.CW y +could be prefixed to protect comments in the code. +I won't elaborate the example any further, but you should have +an idea of the way in which the looping and conditional commands +in +.CW sam +may be composed to do interesting things. +.SH +Grouping +.PP +There is another way to arrange commands. +By enclosing them in brace brackets +.CW {} , +commands may be applied in parallel. +This example uses the +.CW = +command, which reports the line and character numbers of dot, +together with +.CW p , +to report on appearances of +.CW Emacs +in our original file: +.P1 +.WC ,p +This manual is organized in a rather haphazard manner. The first +several sections were written hastily in an attempt to provide a +general introduction to the commands in Emacs and to try to show +the method in the madness that is the Emacs command structure. +.ft CI +,x/Emacs/{ + = + +-p +} +.ft +3; #171,#176 +general introduction to the commands in Emacs and to try to show +4; #234,#239 +the method in the madness that is the Emacs command structure. +.P2 +(The number before the semicolon is the line number; +the numbers beginning with +.CW # +are character numbers.) +As a more interesting example, consider changing all occurrences of +.CW Emacs +to +.CW vi +and vice versa. We can type +.P1 +.ft CI +,x/Emacs|vi/{ + g/Emacs/ c/vi/ + g/vi/ c/Emacs/ +} +.ft +.P2 +or even +.P1 +.ft CI +,x/[a-zA-Z]+/{ + g/Emacs/ v/....../ c/vi/ + g/vi/ v/.../ c/Emacs/ +} +.ft +.P2 +to make sure we don't change strings embedded in words. +.SH +Multiple Changes +.PP +You might wonder why, once +.CW Emacs +has been changed to +.CW vi +in the above example, +the second command in the braces doesn't put it back again. +The reason is that the commands are run in parallel: +within any top-level +.CW sam +command, all changes to the file refer to the state of the file +before any of the changes in that command are made. +After all the changes have been determined, they are all applied +simultaneously. +.PP +This means, as mentioned, that commands within a compound +command see the state of the file before any of the changes apply. +This method of evaluation makes some things easier (such as the exchange of +.CW Emacs +and +.CW vi ), +and some things harder. +For instance, it is impossible to use a +.CW p +command to print the changes as they happen, +because they haven't happened when the +.CW p +is executed. +An indirect ramification is that changes must occur in forward +order through the file, +and must not overlap. +.SH +Unix +.PP +.CW sam +has a few commands to connect to Unix processes. +The simplest is +.CW ! , +which runs the command with input and output connected to the terminal. +.P1 +.WC !date +Wed May 28 23:25:21 EDT 1986 +! +.P2 +(When downloaded, the input is connected to +.CW /dev/null +and only the first few lines of output are printed; +any overflow is stored in +.CW $HOME/sam.err .) +The final +.CW ! +is a prompt to indicate when the command completes. +.PP +Slightly more interesting is +.CW > , +which provides the current text as standard input to the Unix command: +.P1 +.WC "1,2 >wc + 2 22 131 +! +.P2 +The complement of +.CW > +is, naturally, +.CW < : +it replaces the current text with the standard output of the Unix command: +.P1 +.WC "1 <date +! +.WC 1p +Wed May 28 23:26:44 EDT 1986 +.P2 +The last command is +.CW | , +which is a combination of +.CW < +and +.CW > : +the current text is provided as standard input to the Unix command, +and the Unix command's standard output is collected and used to +replace the original text. +For example, +.P1 +.WC ",| sort +.P2 +runs +.CW sort (1) +on the file, sorting the lines of the text lexicographically. +Note that +.CW < , +.CW > +and +.CW | +are +.CW sam +commands, not Unix shell operators. +.PP +The next example converts all appearances of +.CW Emacs +to upper case using +.CW tr (1): +.P1 +.WC ",x/Emacs/ | tr a-z A-Z +.P2 +.CW tr +is run once for each occurrence of +.CW Emacs . +Of course, you could do this example more efficiently with a simple +.CW c +command, but here's a trickier one: +given a Unix mail box as input, +convert all the +.CW Subject +headers to distinct fortunes: +.P1 +.WC ",x/^Subject:.*\en/ x/[^:]*\en/ < /usr/games/fortune +.P2 +(The regular expression +.CW [^:] +refers to any character +.I except +.CW : +and newline; the negation operator +.CW ^ +excludes newline from the list of characters.) +Again, +.CW /usr/games/fortune +is run once for each +.CW Subject +line, so each +.CW Subject +line is changed to a different fortune. +.SH +A few other text commands +.PP +For completeness, I should mention three other commands that +manipulate text. The +.CW m +command moves the current text to after the text specified by the +(obligatory) address after the command. +Thus +.P1 +.WC "/Emacs/+- m 0 +.P2 +moves the next line containing +.CW Emacs +to the beginning of the file. +Similarly, +.CW t +(another historic character) copies the text: +.P1 +.WC "/Emacs/+- t 0 +.P2 +would make, at the beginning of the file, a copy of the next line +containing +.CW Emacs . +.PP +The third command is more interesting: it makes substitutions. +Its syntax is +\f(CWs/\f2pattern\f(CW/\f2replacement\f(CW/\f1. +Within the current text, it finds the first occurrence of +the pattern and replaces it by the replacement text, +leaving dot set to the entire address of the substitution. +.P1 +.WC 1p +This manual is organized in a rather haphazard manner. The first +.WC s/haphazard/thoughtless/ +.WC p +This manual is organized in a rather thoughtless manner. The first +.P2 +Occurrences of the character +.CW & +in the replacement text stand for the text matching the pattern. +.P1 +.WC s/T/"&&&&"/ +.WC p +"TTTT"his manual is organized in a rather thoughtless manner. The first +.P2 +There are two variants. The first is that a number may be specified +after the +.CW s , +to indicate which occurrence of the pattern to substitute; the default +is the first. +.P1 +.WC s2/is/was/ +.WC p +"TTTT"his manual was organized in a rather thoughtless manner. The first +.P2 +The second is that suffixing a +.CW g +(global) causes replacement of all occurrences, not just the first. +.P1 +.WC s/[a-zA-Z]/x/g +.WC p +"xxxx"xxx xxxxxx xxx xxxxxxxxx xx x xxxxxx xxxxxxxxxxx xxxxxxx xxx xxxxx +.P2 +Notice that in all these examples +dot is left +set to the entire line. +.PP +[The substitute command is vital to +.CW ed, +because it is the only way to make changes within a line. +It is less valuable in +.CW sam , +in which the concept of a line is much less important. +For example, many +.CW ed +substitution idioms are handled well by +.CW sam 's +basic commands. Consider the commands +.P1 +s/good/bad/ +s/good// +s/good/& bye/ +.P2 +which are equivalent in +.CW sam +to +.P1 +/good/c/bad/ +/good/d +/good/a/ bye/ +.P2 +and for which the context search is likely unnecessary because the desired +text is already dot. +Also, beware this +.CW ed +idiom: +.P1 +1,$s/good/bad/ +.P2 +which changes the first +.CW good +on each line; the same command in +.CW sam +will only change the first one in the whole file. +The correct +.CW sam +version is +.P1 +,x s/good/bad/ +.P2 +but what is more likely meant is +.P1 +,x/good/ c/bad/ +.P2 +.CW sam +operates under different rules.] +.SH +Files +.PP +So far, we have only been working with a single file, +but +.CW sam +is a multi-file editor. +Only one file may be edited at a time, but +it is easy to change which file is the `current' file for editing. +To see how to do this, we need a +.CW sam +with a few files; +the easiest way to do this is to start it +with a list of Unix file names to edit. +.P1 +$ \f(CIecho *.ms\f(CW +conquest.ms death.ms emacs.ms famine.ms slaughter.ms +$ \f(CIsam -d *.ms\f(CW + -. conquest.ms +.P2 +(I'm sorry the Horsemen don't appear in liturgical order.) +The line printed by +.CW sam +is an indication that the Unix file +.CW conquest.ms +has been read, and is now the current file. +.CW sam +does not read the Unix file until +the associated +.CW sam +file becomes current. +.PP +The +.CW n +command prints the names of all the files: +.P1 +.WC n + -. conquest.ms + - death.ms + - emacs.ms + - famine.ms + - slaughter.ms +.P2 +This list is also available in the menu on mouse button 3. +The command +.CW f +tells the name of just the current file: +.P1 +.WC f + -. conquest.ms +.P2 +The characters to the left of the file name encode helpful information about +the file. +The minus sign becomes a plus sign if the file has a window open, and an +asterisk if more than one is open. +The period (another meaning of dot) identifies the current file. +The leading blank changes to an apostrophe if the file is different +from the contents of the associated Unix file, as far as +.CW sam +knows. +This becomes evident if we make a change. +.P1 +.WC 1d +.WC f +\&'-. conquest.ms +.P2 +If the file is restored by an undo command, the apostrophe disappears. +.P1 +.WC u +.WC f + -. conquest.ms +.P2 +The file name may be changed by providing a new name with the +.CW f +command: +.P1 +.CW "f pestilence.ms +\&'-. pestilence.ms +.P2 +.WC f +prints the new status of the file, +that is, it changes the name if one is provided, and prints the +name regardless. +A file name change may also be undone. +.P1 +.WC u +.WC f + -. conquest.ms +.P2 +.PP +When +.CW sam +is downloaded, the current file may be changed simply by selecting +the desired file from the menu (selecting the same file subsequently +cycles through the windows opened on the file). +Otherwise, the +.CW b +command can be used to choose the desired file:\(dg +.FS +\(dg A bug prevents the +.CW b +command from working when downloaded. +Because the menu is more convenient anyway, and +because the method +of choosing files from the command language is slated to change, +the bug hasn't been fixed. +.FE +.P1 +.WC "b emacs.ms + -. emacs.ms +.P2 +Again, +.CW sam +prints the name (actually, executes an implicit +.CW f +command) because the Unix file +.CW emacs.ms +is being read for the first time. +It is an error to ask for a file +.CW sam +doesn't know about, but the +.CW B +command will prime +.CW sam 's +menu with a new file, and make it current. +.P1 +.WC "b flood.pic +?no such file `flood.pic' +.WC "B flood.pic + -. flood.pic +.WC n + - conquest.ms + - death.ms + - emacs.ms + - famine.ms + -. flood.pic + - slaughter.ms +.P2 +Both +.CW b +and +.CW B +will accept a list of file names. +.CW b +simply takes the first file in the list, but +.CW B +loads them all. +The list may be typed on one line \(em +.P1 +.WC "B devil.tex satan.tex 666.tex emacs.tex +.P2 +\(em or generated by a Unix command \(em +.P1 +.WC "B <echo *.tex +.P2 +The latter form requires a Unix command; +.CW sam +does not understand the shell file name metacharacters, so +.CW "B *.tex +attempts to load a single file named +.CW *.tex . +(The +.CW < +form is of course derived from +.CW sam 's +.CW < +command.) +.CW echo +is not the only useful command to run subservient to +.CW B ; +for example, +.P1 +.WC "B <grep -l Emacs * +.P2 +will load only those files containing the string +.CW Emacs . +Finally, a special case: a +.CW B +with no arguments creates an empty, nameless file within +.CW sam . +.PP +The complement of +.CW B +is +.CW D : +.P1 +.WC "D devil.tex satan.tex 666.tex emacs.tex +.P2 +eradicates the files from +.CW sam 's +memory (not from the Unix machine's disc). +.CW D +without any file names removes the current file from +.CW sam . +.PP +There are three other commands that relate the current file +to Unix files. +The +.CW w +command writes the file to disc; +without arguments, it writes the entire file to the Unix file associated +with the current file in +.CW sam +(it is the only command whose default address is not dot). +Of course, you can specify an address to be written, +and a different file name, with the obvious syntax: +.P1 +.WC "1,2w /tmp/revelations +/tmp/revelations: #44 +.P2 +.CW sam +responds with the file name and the number of characters written to the file. +The +.CW write +command on the button 3 menu is identical in function to an unadorned +.CW w +command. +.PP +The other two commands, +.CW e +and +.CW r , +read data from Unix files. +The +.CW e +command clears out the current file, +reads the data from the named file (or uses the current file's old name if +none is explicitly provided), and sets the file name. +It's much like a +.CW B +command, but puts the information in the current file instead of a new one. +.CW e +without any file name is therefore an easy way to refresh +.CW sam 's +copy of a Unix file. +[Unlike in +.CW ed , +.CW e +doesn't complain if the file is modified. The principle is not +to protect against things that can be undone if wrong.] +Since its job is to replace the whole text, +.CW e +never takes an address. +.PP +The +.CW r +command is like +.CW e , +but it doesn't clear the file: +the text in the Unix file replaces dot, or the specified text if an +address is given. +.P1 +.WC "r emacs.ms +.P2 +has essentially the effect of +.P1 +.WC "<cat emacs.ms +.P2 +The commands +.CW r +and +.CW w +will set the name of the file if the current file has no name already defined; +.CW e +sets the name even if the file already has one. +.PP +There is a command, analogous to +.CW x , +that iterates over files instead of pieces of text: +.CW X +(capital +.CW x ). +The syntax is easy; it's just like that of +.CW x +\(em \f(CWX/\f2pattern\f(CW/\f2command\f1. +(The complementary command is +.CW Y , +analogous to +.CW y .) +The effect is to run the command in each file whose menu entry +(that is, whose line printed by an +.CW f +command) matches the pattern. +For example, since an apostrophe identifies modified files, +.P1 +.WC "X/'/ w +.P2 +writes the changed files out to disc. +Here is a longer example: find all uses of a particular variable +in the C source files: +.P1 +.WC "X/\e.c$/ ,x/variable/+-p +.P2 +We can use an +.CW f +command to identify which file the variable appears in: +.P1 +.ft CI +X/\e.c$/ ,g/variable/ { + f + ,x/variable/+-{ + = + p + } +} +.ft +.P2 +Here, the +.CW g +command guarantees that only the names of files containing the variable +will be printed (but beware that +.CW sam +may confuse matters by printing the names of files it reads in during +the command). +The +.CW = +command shows where in the file the variable appears, and the +.CW p +command prints the line. +.PP +The +.CW D +command is handy as the target of an +.CW X . +This example deletes from the menu all C files that do not contain +a particular variable: +.P1 +.WC "X/\e.c$/ ,v/variable/ D +.P2 +If no pattern is provided for the +.CW X , +the command (which defaults to +.CW f ) +is run in all files, so +.P1 +.WC "X D +.P2 +cleans +.CW sam +up for a fresh start. +.PP +But rather than working any further, let's stop now: +.P1 +.WC q +$ +.P2 +.fi +.PP +Some of the file manipulating commands can be undone: +undoing a +.CW f , +.CW e , +or +.CW r +restores the previous state of the file, +but +.CW w , +.CW B +and +.CW D +are irrevocable. +And, of course, so is +.CW q . diff --git a/sys/doc/sam/sam.tut.out b/sys/doc/sam/sam.tut.out new file mode 100644 index 000000000..3bdc36596 --- /dev/null +++ b/sys/doc/sam/sam.tut.out @@ -0,0 +1,4863 @@ +x T utf +x res 720 1 1 +x init +V0 +p1 +x font 1 R +x font 2 I +x font 3 B +x font 4 BI +x font 5 CW +x font 6 H +x font 7 HI +x font 8 HB +x font 9 S1 +x font 10 S +s10 +f1 +H720 +f3 +s12 +V1230 +h1084cA +wh116ct +40u67t40o60r53i34a60lw64f40o60rw83t40h67ewf5 +83s72a72mwf3 +h102cc +53o60mh100cm +h100ca +60n67dw97l34a60n67g60u67a60g60en150 0 +H720 +f2 +s10 +V1470 +h1978cR +61o50bw75P61i28k44en120 0 +H720 +f1 +V1650 +h1812cB +67e44l28lw53L61a44b50o50r33a44t28o50r33i28e44sn120 0 +H720 +V1770 +h1526cM +89u50r33r33a44yw75H72i28l28l28,w50N72e44ww97J39e44r33s39e44yw750507509507504n120 0 +H720 +f2 +V2150 +h1923cA +61B61S50T56R61A61C67Tn140 0 +H720 +f5 +V2410 +h610cs +60a60mwf1 +86i28sw65a44nw76i28n50t28e44r33a44c44t28i28v50ew70t28e44x50tw54e44d50i28t28o50rw59w72i28t28hw76aw70c44o50m78m78a44n50dw77l28a44n50g50u50a44g50ew71t28h50a44tw55m78a44k50e44sw66h50e44a44v50yw77u50s39ew71o50fn120 0 +H720 +V2530 +h360cr +33e44g50u50l28a44rw67e44x50p50r33e44s39s39i28o50n50s39.w84A72l28t28h50o50u50g50hw84t28h50ew78l28a44n50g50u50a44g50ew78i28sw73s39y50n50t28a44c44t28i28c44a44l28l28yw84s39i28m78i28l28a44rw66t28owf5 +83e60df1 +60(33150)33,w58t28h50ew77d50e44t28a44i28l28sn120 0 +H720 +V2650 +h360ca +44r33ew77i28n50t28e44r33e44s39t28i28n50g50l28yw83d50i28f33f33e44r33e44n50t28.w83T61h50i28sw72t28u50t28o50r33i28a44lw61i28n50t28r33o50d50u50c44e44sw72t28h50ew77c44o50m78m78a44n50dw83l28a44n50g50u50a44g50e44,w58b50u50tw61d50o50e44sw72n50o50tn120 0 +H720 +V2770 +h360cd +50i28s39c44u50s39sw85t28h50ew90s39c44r33e44e44nw96a44n50dw96m78o50u50s39ew89i28n50t28e44r33f33a44c44e44.w95W94i28t28hw95a44p50o50l28o50g50i28e44sw84t28ow95t28h50o50s39ew89u50n50f33a44m78i28l28i28a44rw78w72i28t28hw95t28h50en120 0 +H720 +V2890 +h360cN +72i28n50t28hw88E61d50i28t28i28o50nw88B67l28i28tw66s39o50f33t28w72a44r33e44,w63i28tw67i28sw78a44s39s39u50m78e44dw89t28h50a44tw67t28h50ew83s39i28m78i28l28a44r33i28t28yw89o50fwf5 +72s60a60mwf1 +99t28owf5 +89m60u60xf1 +60(33950)w72a44tw67t28h50i28sn120 0 +H720 +V3010 +h360cl +28e44v50e44lw53m78a44k50e44swf5 +64s60a60mf1 +60'33sw64m78o50u50s39ew69l28a44n50g50u50a44g50ew69e44a44s39yw75t28ow75l28e44a44r33n50.n120 0 +H720 +V3166 +h610cT +61h50ewf5 +81s60a60mwf1 +97c44o50m78m78a44n50dw87l28a44n50g50u50a44g50ew81a44p50p50l28i28e44sw76i28d50e44n50t28i28c44a44l28l28yw87t28ow88t28w72ow88e44n50v50i28r33o50n50m78e44n50t28s39:w66w72h50e44nw88r33u50nh50Chy +n120 0 +H720 +V3286 +h360cn +50i28n50gwf5 +95s60a60mwf1 +h104co +50nw94a44nw94o50r33d50i28n50a44r33yw94t28e44r33m78i28n50a44lw72(f2 +33v44i28awf5 +94s60a60mwh120c- +60df1 +60)33,w69a44n50dw94i28nw94t28h50ew88c44o50m78m78a44n50dw94w72i28n50d50o50wwh116co +50fw77an120 0 +H720 +f2 +V3406 +h360cd +50o50w67n50l28o50a50d50e44dwf5 +75s60a60mf1 +60,w50t28h50a44tw53i28s39,w50o50n50ew69u50s39i28n50gw75t28h50ew69b50i28t28m78a44pw75d50i28s39p50l28a44yw75a44n50dw75m78o50u50s39e44.n120 0 +H720 +f3 +V3766 +cI +39n56t33r44o50d56u56c44t33i28o50nn120 0 +H720 +f1 +V3922 +h250cT +61h50i28sw64t28u50t28o50r33i28a44lw53d50e44s39c44r33i28b50e44sw65t28h50ew70c44o50m78m78a44n50dw76l28a44n50g50u50a44g50ew70o50fwf5 +59s60a60mf1 +60,w51a44nw76i28n50t28e44r33a44c44t28i28v50ew70t28e44x50tw54e44d50i28t28o50rw59t28h50a44tw54r33u50n50sw65o50nw76B67l28i28t28sw65a44n50dn120 0 +H720 +V4042 +cs +39o50m78ew77c44o50m78p50u50t28e44r33sw71w72i28t28hw82b50i28t28m78a44pw82d50i28s39p50l28a44y50s39.w82F56o50rw65m78o50s39tw60e44d50i28t28i28n50gw82t28a44s39k50s39,w57t28h50ew76m78o50u50s39e44-33b50a44s39e44dw82e44d50i28t28i28n50gw82f33e44a44t28u50r33e44sw71a44r33ew76s39u50f33f33ih28Chy +n120 0 +H720 +V4162 +cc +44i28e44n50t28,w50a44n50dw75t28h50e44yw75a44r33ew69e44a44s39yw75t28ow75u50s39ew69a44n50dw75t28ow75l28e44a44r33n50.n120 0 +H720 +V4318 +h250cT +61h50ew75c44o50m78m78a44n50dw82l28a44n50g50u50a44g50ew76i28sw71o50f33t28e44nw82u50s39e44f33u50l28,w57h50o50w72e44v50e44r33,w57p50a44r33t28i28c44u50l28a44r33l28yw82w72h50e44nw82m78a44k50i28n50gw82g50l28o50b50a44lw60c44h50a44n50g50e44s39.w82U72n50l28i28k50en120 0 +H720 +V4438 +ct +28h50ew73c44o50m78m78a44n50d50sw68i28nwf5 +79e60df1 +60,w54w72h50i28c44hw79a44r33ew73n50e44c44e44s39s39a44r33yw79t28ow78m78a44k50ew72c44h50a44n50g50e44s39,wf5 +53s60a60mwf1 +88c44o50m78m78a44n50d50sw67t28e44n50dw78t28ow78b50ew72u50s39e44dw78o50n50l28yw78f33o50rw61c44o50mh78Chy +n120 0 +H720 +V4558 +cp +50l28i28c44a44t28e44dw79o50rw62r33e44p50e44t28i28t28i28v50ew74e44d50i28t28i28n50gw80t28a44s39k50s39.w80I33tw58i28sw69i28nw80t28h50e44s39ew74m78o50r33ew74i28n50v50o50l28v50e44dw80u50s39e44sw69t28h50a44tw58t28h50ew74d50i28f33f33e44r33e44n50c44e44sw69b50e44t28w72e44e44nwf5 +80s60a60mwf1 +90a44n50dn120 0 +H720 +V4678 +co +50t28h50e44rw58t28e44x50tw53e44d50i28t28o50r33sw64a44r33ew69m78o50s39tw53e44v50i28d50e44n50t28.n120 0 +H720 +f5 +V4834 +h250cs +60a60mf1 +60'33sw67l28a44n50g50u50a44g50ew72m78a44k50e44sw67i28tw56e44a44s39yw78t28ow78d50ow78s39o50m78ew72t28h50i28n50g50sw67t28h50a44tw57o50t28h50e44rw62e44d50i28t28o50r33s39,w54i28n50c44l28u50d50i28n50gw79p50r33o50g50r33a44m78sw68l28i28k50ewf5 +73s60e60dwf1 +89a44n50dn120 0 +H720 +f5 +V4954 +ca +60w60kf1 +60,w59d50ow84n50o50tw62h50a44n50d50l28ew78g50r33a44c44e44f33u50l28l28y50,w59s39ow84t28h50i28sw73t28u50t28o50r33i28a44lw62s39e44r33v50e44sw73p50a44r33t28l28yw83a44sw72aw77l28e44s39s39o50nw83i28nwf5 +83s60a60mf1 +60'33sw72m78a44n50n50e44rw66o50fw66m78a44n50i28p50u50l28a44t28i28n50gn120 0 +H720 +V5074 +ct +28e44x50t28.w85T61h50ew80e44x50a44m78p50l28e44sw75b50e44l28o50wwh108ct +28h50e44r33e44f33o50r33ew80c44o50n50c44e44n50t28r33a44t28ew80e44n50t28i28r33e44l28yw86o50nw86t28h50ew80l28a44n50g50u50a44g50e44,w61a44s39s39u50m78i28n50gw86t28h50a44tw64f33a44c44i28l28i28t28yw86w72i28t28hw86t28h50en120 0 +H720 +V5194 +cu +50s39ew74o50fw63t28h50ew74m78o50u50s39ew74i28nwf5 +80s60a60mwf1 +89i28sw68a44tw57w72o50r33s39tw57e44a44s39yw79t28ow79p50i28c44kw79u50p50.w79I33nw79f33a44c44t28,wf5 +54s60a60mwf1 +89c44a44nw79b50ew73r33u50nw79w72i28t28h50o50u50tw57t28h50ew73m78o50u50s39ew73a44tw57a44l28lw57(33n50o50tn120 0 +H720 +f2 +V5314 +cd +50o50w67n50l28o50a50d50e44df1 +50)33,w55b50yw80s39p50e44c44i28f33y50i28n50gw80t28h50ewf5 +74-60dwf1 +90f33l28a44g50,w55a44n50dw80i28tw58i28sw69t28h50i28sw69d50o50m78a44i28nw80t28h50a44tw58t28h50ew74t28u50t28o50r33i28a44lw59o50c44c44u50p50i28e44s39;w59t28h50ew75c44o50m78m78a44n50dw81l28a44nh50Chy +n120 0 +H720 +V5434 +cg +50u50a44g50ew69i28nw75t28h50e44s39ew69m78o50d50e44sw64a44r33ew69i28d50e44n50t28i28c44a44l28.n120 0 +H720 +V5590 +h250cA +wh102cw +72o50r33dw80t28ow81t28h50ew75U72n50i28xw81a44d50e44p50t28:w59a44l28t28h50o50u50g50hwf5 +81s60a60mwf1 +91i28sw70s39y50n50t28a44c44t28i28c44a44l28l28yw81v50e44r33yw81s39i28m78i28l28a44rw64t28owf5 +81e60df1 +60,w56i28tw59i28sw70f33u50n50d50a44m78e44n50t28a44l28l28yw81a44n50dn120 0 +H720 +V5710 +cd +50e44l28i28b50e44r33a44t28e44l28yw78d50i28f33f33e44r33e44n50tw56i28nw77d50e44s39i28g50nw77a44n50dw77d50e44t28a44i28l28e44dw77s39e44m78a44n50t28i28c44s39.w77Y72o50uw77m78i28g50h50tw55u50s39ew71k50n50o50w72l28e44d50g50ew71o50fwf5 +60e60dwf1 +87t28ow77p50r33e44d50i28c44tw55h50o50ww99t28h50en120 0 +H720 +V5830 +cs +39u50b50s39t28i28t28u50t28ew70c44o50m78m78a44n50dw76w72o50r33k50s39,w51b50u50tw55y50o50u50'33dw77o50n50l28yw77b50ew71r33i28g50h50tw55i28fw60y50o50uw77h50a44dw77u50s39e44dw77s39o50m78ew71u50n50d50e44r33s39t28a44n50d50i28n50gw77o50fwf5 +60s60a60mf1 +60'33sw66w72o50r33k50i28n50g50sn120 0 +H720 +V5950 +ct +28ow85i28n50f33l28u50e44n50c44ew79y50o50u50rw68p50r33e44d50i28c44t28i28o50n50.w85B67ew79p50a44r33t28i28c44u50l28a44r33l28yw85c44a44r33e44f33u50lw63a44b50o50u50tw63i28d50i28o50m78s39.w85I33d50i28o50m78sw74f33o50r33mwh112ci +28nw84c44u50r33i28o50u50sw73n50o50o50k50sw73o50fw67l28a44nh50Chy +n120 0 +H720 +V6070 +cg +50u50a44g50e44sw78a44n50dw89d50e44p50e44n50dw89o50nw89u50n50d50e44p50e44n50d50a44b50l28ew83p50e44c44u50l28i28a44r33i28t28i28e44s39.wf5 +89e60dwf1 +99i28d50i28o50m78sw78s39i28m78p50l28yw89d50o50n50'33tw68w72o50r33kw90i28nwf5 +90s60a60mf1 +60:wf5 +68160,60$60s60/60a60/60b60/n120 0 +H720 +f1 +V6190 +cm +78a44k50e44sw65o50n50ew70s39u50b50s39t28i28t28u50t28i28o50nw76i28nw76t28h50ew70w72h50o50l28ew70f33i28l28e44,w51n50o50tw54o50n50ew70p50e44rw59l28i28n50e44.wf5 +76s60a60mwf1 +86h50a44sw64i28t28sw64o50w72nw75i28d50i28o50m78s39.w75M89u50c44hw75o50fw58t28h50ew69p50u50r33p50o50s39ew69o50fn120 0 +H720 +V6310 +ct +28h50i28sw64t28u50t28o50r33i28a44lw53i28sw64t28ow75p50u50b50l28i28s39hw75t28h50e44mwh103ca +44n50dw75m78a44k50ew69f33l28u50e44n50c44yw75i28nwf5 +75s60a60mwf1 +85aw69m78a44t28t28e44rw58o50fw58l28e44a44r33n50i28n50g50,w50n50o50tw53c44u50n50n50i28n50g50.n120 0 +H720 +V6466 +h250cT +61h50ew75t28u50t28o50r33i28a44lw59d50e44p50e44n50d50sw70o50nw81f33a44m78i28l28i28a44r33i28t28yw81w72i28t28hw81r33e44g50u50l28a44rw64e44x50p50r33e44s39s39i28o50n50s39,w56a44l28t28h50o50u50g50hw81s39o50m78ew76e44x50p50e44r33i28e44n50c44ew76w72i28t28hw82aw76m78o50r33en120 0 +H720 +V6586 +ct +28r33a44d50i28t28i28o50n50a44lw55U72n50i28xw77e44d50i28t28o50rw60m78a44yw77b50ew71h50e44l28p50f33u50l28.w77T61ow77a44i28dw77r33e44a44d50e44r33sw66f33a44m78i28l28i28a44rw59w72i28t28hwf5 +76e60df1 +60,w51Iw59h50a44v50ew70p50o50i28n50t28e44dw76o50u50tw54i28nw76s39q50u50a44r33ew70b50r33a44c44kh50Chy +n120 0 +H720 +V6706 +ce +44t28sw75[33]w69s39o50m78ew80o50fw69t28h50ew80r33e44l28e44v50a44n50tw65d50i28f33f33e44r33e44n50c44e44sw76b50e44t28w72e44e44nwf5 +87e60dwf1 +97a44n50dwf5 +87s60a60mf1 +60.w87R67e44a44dw87t28h50e44s39ew81c44o50m78m78e44n50t28sw76o50n50l28yw87i28fw70y50o50uw87w72i28s39hw87t28on120 0 +H720 +V6826 +cu +50n50d50e44r33s39t28a44n50dw84t28h50ew78d50i28f33f33e44r33e44n50c44e44s39;w62t28h50ew77l28e44s39s39o50nw83i28sw72a44b50o50u50twf5 +61s60a60mf1 +60,w58n50o50twf5 +61s60a60mwf2 +93v44s39.wf5 +83e60df1 +60.w83A72n50o50t28h50e44rw66t28y50p50o50g50r33a44p50h50i28cw77c44o50n50v50e44n50t28i28o50nw83i28sn120 0 +x font 0 CI +f1 +H720 +V6946 +ct +28h50a44tw53o50u50t28p50u50tw53a44p50p50e44a44r33sw64i28nwf5 +75t60h60i60swh120cf +60o60n60t60,wf1 +85w72h50i28l28ew69t28y50p50e44dw75i28n50p50u50tw53a44p50p50e44a44r33sw64a44swx font 0 CI +f0 +64s60l60a60n60t60ywh120ct +60e60x60t60.n120 0 +H720 +f1 +V7102 +h250cN +72o50m78e44n50c44l28a44t28u50r33e44:wf5 +56s60a60mwf1 +88k50e44e44p50sw67aw72c44o50p50yw78o50fw61t28h50ew72t28e44x50tw56i28tw56i28sw67e44d50i28t28i28n50g50.w78T61h50i28sw67c44o50p50yw78i28sw67c44a44l28l28e44dw78awf2 +72f28i28l28ef1 +44.w78T61ow79a44v50o50i28dw79c44o50n50f33uh50Chy +n120 0 +H720 +V7222 +cs +39i28o50n50,w50Iw58h50a44v50ew69c44a44l28l28e44dw75t28h50ew69p50e44r33m78a44n50e44n50tw53s39t28o50r33a44g50ew69o50nw75d50i28s39cw69awf2 +69U72n50i28xw69f28i28l28e44.n120 0 +V7920 +p2 +x font 1 R +x font 2 I +x font 3 B +x font 4 BI +x font 5 CW +x font 6 H +x font 7 HI +x font 8 HB +x font 9 S1 +x font 10 S +s10 +f1 +H720 +V480 +h2077Chy +w33 252w50 h25Chy +wn120 0 +H720 +f3 +V840 +cT +67e44x50tn120 0 +H720 +f1 +V996 +h250cT +61ow98g50e44tw76s39t28a44r33t28e44d50,w74w72ew93n50e44e44dw99s39o50m78ew93t28e44x50tw77t28ow99p50l28a44yw99w72i28t28h50.w99A72n50yw99t28e44x50tw77w72i28l28lw77d50o50;w77t28r33yw99s39o50m78e44t28h50i28n50gw99f33r33o50mwh127cJ +39a44m78e44sn120 0 +H720 +V1116 +cG +72o50s39l28i28n50g50'33sw64E61m78a44c44sw64m78a44n50u50a44l28:n120 0 +H720 +f5 +V1296 +h360c$ +wx font 0 CI +f0 +h120cs +60a60mwh120c- +60dn120 0 +H720 +V1416 +h360ca +n120 0 +H720 +V1536 +h360cT +60h60i60swh120cm +60a60n60u60a60lwh120ci +60swh120co +60r60g60a60n60i60z60e60dwh120ci +60nwh120ca +wh120cr +60a60t60h60e60rwh120ch +60a60p60h60a60z60a60r60dwh120cm +60a60n60n60e60r60.wh180cT +60h60ewh120cf +60i60r60s60tn120 0 +H720 +V1656 +h360cs +60e60v60e60r60a60lwh120cs +60e60c60t60i60o60n60swh120cw +60e60r60ewh120cw +60r60i60t60t60e60nwh120ch +60a60s60t60i60l60ywh120ci +60nwh120ca +60nwh120ca +60t60t60e60m60p60twh120ct +60owh120cp +60r60o60v60i60d60ewh120ca +n120 0 +H720 +V1776 +h360cg +60e60n60e60r60a60lwh120ci +60n60t60r60o60d60u60c60t60i60o60nwh120ct +60owh120ct +60h60ewh120cc +60o60m60m60a60n60d60swh120ci +60nwh120cE +60m60a60c60swh120ca +60n60dwh120ct +60owh120ct +60r60ywh120ct +60owh120cs +60h60o60wn120 0 +H720 +V1896 +h360ct +60h60ewh120cm +60e60t60h60o60dwh120ci +60nwh120ct +60h60ewh120cm +60a60d60n60e60s60swh120ct +60h60a60twh120ci +60swh120ct +60h60ewh120cE +60m60a60c60swh120cc +60o60m60m60a60n60dwh120cs +60t60r60u60c60t60u60r60e60.n120 0 +H720 +V2016 +h360c. +n120 0 +H720 +V2196 +cs +60a60mwh126c- +60dwf1 +91s39t28a44r33t28swf5 +71s60a60mwf1 +92r33u50n50n50i28n50g50.w82T61h50ewf5 +76awf1 +92c44o50m78m78a44n50dw82a44d50d50sw71t28e44x50tw60u50n50t28i28lw60aw76l28i28n50ew76c44o50n50t28a44i28n50i28n50gw82j28u50s39tw60aw76p50e44r33i28o50d50,w57a44n50dw82s39e44t28sw71t28h50en120 0 +H720 +f2 +V2316 +cc +44u50r39r39e44n50tw63t28e44x44twf1 +63(33a44l28s39ow85c44a44l28l28e44dwf2 +85d50o50tf1 +28)w68t28ow85w72h50a44tw63w72a44sw74t28y50p50e44dwh85Cem +wh135ce +44v50e44r33y50t28h50i28n50gw85b50e44t28w72e44e44nw85t28h50ewf5 +79awf1 +94a44n50dw84t28h50ew78p50e44r33i28o50d50.w84[f5 +33e60dwf1 +94w72o50u50l28dn120 0 +H720 +V2436 +cl +28e44a44v50ew69d50o50tw53s39e44tw53t28ow75o50n50l28yw75t28h50ew69l28a44s39tw53l28i28n50e44.25]w83T61h50ewf5 +69pwf1 +85c44o50m78m78a44n50dw75p50r33i28n50t28sw64t28h50ew69c44u50r33r33e44n50tw53t28e44x50t28:n120 0 +H720 +x font 0 CI +f0 +V2616 +h360cp +n120 0 +H720 +f5 +V2736 +h360cT +60h60i60swh120cm +60a60n60u60a60lwh120ci +60swh120co +60r60g60a60n60i60z60e60dwh120ci +60nwh120ca +wh120cr +60a60t60h60e60rwh120ch +60a60p60h60a60z60a60r60dwh120cm +60a60n60n60e60r60.wh180cT +60h60ewh120cf +60i60r60s60tn120 0 +H720 +V2856 +h360cs +60e60v60e60r60a60lwh120cs +60e60c60t60i60o60n60swh120cw +60e60r60ewh120cw +60r60i60t60t60e60nwh120ch +60a60s60t60i60l60ywh120ci +60nwh120ca +60nwh120ca +60t60t60e60m60p60twh120ct +60owh120cp +60r60o60v60i60d60ewh120ca +n120 0 +H720 +V2976 +h360cg +60e60n60e60r60a60lwh120ci +60n60t60r60o60d60u60c60t60i60o60nwh120ct +60owh120ct +60h60ewh120cc +60o60m60m60a60n60d60swh120ci +60nwh120cE +60m60a60c60swh120ca +60n60dwh120ct +60owh120ct +60r60ywh120ct +60owh120cs +60h60o60wn120 0 +H720 +V3096 +h360ct +60h60ewh120cm +60e60t60h60o60dwh120ci +60nwh120ct +60h60ewh120cm +60a60d60n60e60s60swh120ct +60h60a60twh120ci +60swh120ct +60h60ewh120cE +60m60a60c60swh120cc +60o60m60m60a60n60dwh120cs +60t60r60u60c60t60u60r60e60.n120 0 +H720 +f1 +V3276 +c[ +33A72g50a44i28n50,wf5 +55e60dwf1 +90w72o50u50l28dw80p50r33i28n50tw58o50n50l28yw80t28h50ew74l28a44s39tw58l28i28n50e44.25]w88T61h50ewf5 +75awf1 +91c44o50m78m78a44n50dw81a44d50d50sw70i28t28sw70t28e44x50twf2 +59a50f28t28e44rwf1 +70d50o50t28;w59t28h50ewf5 +75iwf1 +91c44o50m78m78a44n50dw81i28sw70l28i28k50en120 0 +H720 +f5 +V3396 +ca +60,wf1 +85b50u50tw53a44d50d50sw64t28h50ew69t28e44x50twf2 +53b50e44f28o50r39ewf1 +69d50o50t28.n120 0 +H720 +x font 0 CI +f0 +V3576 +h360ci +n120 0 +H720 +V3696 +h360cI +60n60t60r60o60d60u60c60t60i60o60nn120 0 +H720 +V3816 +h360c. +n120 0 +H720 +V3936 +h360cp +n120 0 +H720 +f5 +V4056 +h360cI +60n60t60r60o60d60u60c60t60i60o60nn120 0 +H720 +f1 +V4236 +cT +61h50e44r33ew69i28sw64a44l28s39ow75awf5 +69cwf1 +85c44o50m78m78a44n50dw75t28h50a44tw53c44h50a44n50g50e44sw64(33r33e44p50l28a44c44e44s39)w58t28h50ew69c44u50r33r33e44n50tw53t28e44x50t28,w50a44n50dwf5 +75dwf1 +85t28h50a44tw53d50e44l28e44t28e44sw65i28t28;w54t28h50e44s39ew70a44r33ew70i28l28l28u50s39t28r33a44t28e44dn120 0 +H720 +V4356 +cb +50e44l28o50w72.n120 0 +H720 +V4512 +h250cT +61ow76s39e44ew70a44l28lw54t28h50ew70t28e44x50t28,w51w72ew70c44a44nw76s39p50e44c44i28f33yw76w72h50a44tw54t28e44x50tw54t28ow77p50r33i28n50t28;w55f33o50rw60t28h50ew71m78o50m78e44n50t28,w52s39u50f33f33i28c44ew71i28tw55t28ow77s39a44yw77t28h50a44twx font 0 CI +f0 +55060,60$wf1 +87s39p50e44c44ih28Chy +n120 0 +H720 +V4632 +cf +33i28e44sw64t28h50ew69e44n50t28i28r33ew69f33i28l28e44.w75[f5 +33e60dwf1 +85u50s39e44r33sw64w72o50u50l28dw75p50r33o50b50a44b50l28yw75t28y50p50ewx font 0 CI +f0 +69160,60$f1 +60,w50w72h50i28c44hw75i28nw75p50r33a44c44t28i28c44ew69i28sw64t28h50ew69s39a44m78ew69t28h50i28n50g50,w50b50u50tw53s39e44ew69b50e44l28o50w72.25]n120 0 +H720 +x font 0 CI +f0 +V4812 +h360c0 +60,60$60pn120 0 +H720 +f5 +V4932 +h360cI +60n60t60r60o60d60u60c60t60i60o60nn120 0 +H720 +V5052 +h360cT +60h60i60swh120cm +60a60n60u60a60lwh120ci +60swh120co +60r60g60a60n60i60z60e60dwh120ci +60nwh120ca +wh120cr +60a60t60h60e60rwh120ch +60a60p60h60a60z60a60r60dwh120cm +60a60n60n60e60r60.wh180cT +60h60ewh120cf +60i60r60s60tn120 0 +H720 +V5172 +h360cs +60e60v60e60r60a60lwh120cs +60e60c60t60i60o60n60swh120cw +60e60r60ewh120cw +60r60i60t60t60e60nwh120ch +60a60s60t60i60l60ywh120ci +60nwh120ca +60nwh120ca +60t60t60e60m60p60twh120ct +60owh120cp +60r60o60v60i60d60ewh120ca +n120 0 +H720 +V5292 +h360cg +60e60n60e60r60a60lwh120ci +60n60t60r60o60d60u60c60t60i60o60nwh120ct +60owh120ct +60h60ewh120cc +60o60m60m60a60n60d60swh120ci +60nwh120cE +60m60a60c60swh120ca +60n60dwh120ct +60owh120ct +60r60ywh120ct +60owh120cs +60h60o60wn120 0 +H720 +V5412 +h360ct +60h60ewh120cm +60e60t60h60o60dwh120ci +60nwh120ct +60h60ewh120cm +60a60d60n60e60s60swh120ct +60h60a60twh120ci +60swh120ct +60h60ewh120cE +60m60a60c60swh120cc +60o60m60m60a60n60dwh120cs +60t60r60u60c60t60u60r60e60.n120 0 +H720 +f1 +V5592 +cE +61x50c44e44p50tw67f33o50rw72t28h50ewf5 +83wwf1 +99c44o50m78m78a44n50dw89d50e44s39c44r33i28b50e44dw89b50e44l28o50w72,wf2 +64a50l28lwf1 +67c44o50m78m78a44n50d50s39,w64i28n50c44l28u50d50i28n50gwf5 +89pf1 +60,w64s39e44tw67d50o50tw67t28ow89t28h50ew83t28e44x50tw68t28h50e44yw90t28o50u50c44h50.n120 0 +H720 +V5712 +cT +61h50u50s39,wf5 +54awf1 +89a44n50dwf5 +79iwf1 +89s39e44tw57d50o50tw57t28ow79t28h50ew73n50e44wwh101ct +28e44x50t28,wf5 +54pwf1 +89t28ow79t28h50ew73t28e44x50tw57p50r33i28n50t28e44d50,w54a44n50dw79s39ow79o50n50.w78S56i28m78i28l28a44r33l28y50,w53a44l28lw56c44o50m78m78a44n50d50sw67(33e44x50c44e44p50twf5 +56wf1 +60)n120 0 +H720 +V5832 +cb +50yw88d50e44f33a44u50l28tw66o50p50e44r33a44t28ew82o50nw88t28h50ew82c44u50r33r33e44n50tw66t28e44x50tw66[33u50n50l28i28k50ewf5 +83e60df1 +60,w64f33o50rw72w72h50i28c44hw89s39o50m78ew83c44o50m78m78a44n50d50sw78(33s39u50c44hw89a44swf5 +78gf1 +60)w72d50e44f33a44u50l28tw67t28ow89t28h50en120 0 +H720 +V5952 +ce +44n50t28i28r33ew69f33i28l28e44]33.n120 0 +H720 +V6108 +h250cT +61h50i28n50g50sw89a44r33ew94n50o50tw78g50o50i28n50gwh100ct +28owh100cg +50e44tw78v50e44r33ywh100ci +28n50t28e44r33e44s39t28i28n50gwh100cu +50n50t28i28lw78w72ew94c44a44nwh100cs +39e44tw78d50o50tw78a44r33b50i28t28r33a44r33i28l28y50.wh100cT +61h50i28sw89i28sw89d50o50n50ew95b50yn120 0 +H720 +f2 +V6228 +ca +50d50d50r39e44s39s39e44sf1 +39,w50w72h50i28c44hw75s39p50e44c44i28f33yw75aw69p50i28e44c44ew69o50fw58t28h50ew69f33i28l28e44.w75T61h50ew69a44d50d50r33e44s39swf5 +641f1 +60,w50f33o50rw58e44x50a44m78p50l28e44,w50s39e44t28sw64d50o50tw53t28ow75t28h50ew69f33i28r33s39tw53l28i28n50ew69o50fw58t28h50ew69f33i28l28e44.n120 0 +H720 +x font 0 CI +f0 +V6408 +h360c1 +60pn120 0 +H720 +f5 +V6528 +h360cI +60n60t60r60o60d60u60c60t60i60o60nn120 0 +H720 +x font 0 CI +f0 +V6648 +h360cc +n120 0 +H720 +V6768 +h360cP +60r60e60a60m60b60l60en120 0 +H720 +V6888 +h360c. +n120 0 +H720 +f1 +V7068 +cT +61h50ewf5 +76cwf1 +92c44o50m78m78a44n50dw82d50i28d50n50'33tw60n50e44e44dw82t28ow82s39p50e44c44i28f33yw82d50o50t28;w60t28h50ewf5 +76pwf1 +92l28e44f33tw60i28tw60o50nw82l28i28n50ew76o50n50e44.w83I33t28'33sw72t28h50e44r33e44f33o50r33ew77e44a44s39yw83t28ow83d50e44l28e44t28ew77t28h50ew77f33i28r33s39tn120 0 +H720 +V7188 +cl +28i28n50ew69u50t28t28e44r33l28y50;w53t28h50ew69l28a44s39tw53c44o50m78m78a44n50dw75l28e44f33tw53d50o50tw53s39e44tw53t28ow75l28i28n50ew69o50n50e44:n120 0 +V7920 +p3 +x font 1 R +x font 2 I +x font 3 B +x font 4 BI +x font 5 CW +x font 6 H +x font 7 HI +x font 8 HB +x font 9 S1 +x font 10 S +s10 +f1 +H720 +V480 +h2077Chy +w33 253w50 h25Chy +wn120 0 +H720 +x font 0 CI +f0 +V900 +h360cd +n120 0 +H720 +V1020 +h360c1 +60pn120 0 +H720 +f5 +V1140 +h360cT +60h60i60swh120cm +60a60n60u60a60lwh120ci +60swh120co +60r60g60a60n60i60z60e60dwh120ci +60nwh120ca +wh120cr +60a60t60h60e60rwh120ch +60a60p60h60a60z60a60r60dwh120cm +60a60n60n60e60r60.wh180cT +60h60ewh120cf +60i60r60s60tn120 0 +H720 +f1 +V1320 +c( +33L61i28n50ew69n50u50m78b50e44r33sw64c44h50a44n50g50ew69t28ow75r33e44f33l28e44c44tw53c44h50a44n50g50e44sw64t28ow75t28h50ew69f33i28l28e44.25)n120 0 +H720 +V1476 +h250cT +61h50ew75a44d50d50r33e44s39swf5 +70/f2 +60t28e44x44tf5 +28/wf1 +91s39e44t28sw70d50o50tw59t28ow81t28h50ew75f33i28r33s39tw59a44p50p50e44a44r33a44n50c44ew75o50fwf2 +64t28e44x44tf1 +28,w56a44f33t28e44rw64d50o50t28.w82[f5 +33e60dwf1 +92m78a44t28c44h50e44sw71t28h50ew76f33i28r33s39tw60l28i28n50ew76c44o50nh50Chy +n120 0 +H720 +V1596 +ct +28a44i28n50i28n50gwf2 +75t28e44x44tf1 +28.25]w83I33fwf2 +58t28e44x44twf1 +53i28sw64n50o50tw53f33o50u50n50d50,w50t28h50ew69s39e44a44r33c44hw75r33e44s39t28a44r33t28sw64a44tw53t28h50ew69b50e44g50i28n50n50i28n50gw75o50fw58t28h50ew69f33i28l28ew69a44n50dw75c44o50n50t28i28n50u50e44sw64u50n50t28i28lw53d50o50t28.n120 0 +H720 +x font 0 CI +f0 +V1776 +h360c/ +60E60m60a60c60s60/60pn120 0 +H720 +f5 +V1896 +h360cE +60m60a60c60sn120 0 +H720 +f1 +V2076 +cI +33t28'33sw65d50i28f33f33i28c44u50l28tw54t28ow76i28n50d50i28c44a44t28ew71t28y50p50o50g50r33a44p50h50i28c44a44l28l28y50,w52b50u50tw55i28nw77t28h50i28sw66e44x50a44m78p50l28ew71n50ow77n50e44w72l28i28n50ew71a44p50p50e44a44r33sw66a44f33t28e44rwf5 +60E60m60a60c60sf1 +60:w55t28h50ew71t28e44x50tw55t28ow77b50en120 0 +H720 +V2196 +cp +50r33i28n50t28e44dw84i28sw73t28h50ew78s39t28r33i28n50gw84`f5 +33E60m60a60c60sf1 +60'33,w59e44x50a44c44t28l28y50.w84(33T61h50ew78f33i28n50a44lwf5 +62pwf1 +94m78a44yw84b50ew78l28e44f33tw62o50f33fwh67Cem +wh134ci +28tw61i28sw72t28h50ew77d50e44f33a44u50l28tw61c44o50m78m78a44n50d50.w83W94h50e44nn120 0 +H720 +V2316 +cd +50o50w72n50l28o50a44d50e44d50,w51h50o50w72e44v50e44r33,w51t28h50ew70d50e44f33a44u50l28tw54i28sw65i28n50s39t28e44a44dw76t28ow76s39e44l28e44c44tw54t28h50ew70t28e44x50t28,w51t28ow76h50i28g50h50l28i28g50h50tw54i28t28,w51a44n50dw76t28ow76m78a44k50ew70i28tw54v50i28s39i28b50l28ew70b50yw77m78o50vh50Chy +n120 0 +H720 +V2436 +ci +28n50gw84t28h50ew78w72i28n50d50o50wwh106co +50nw84t28h50ew78f33i28l28ew78i28fw67n50e44c44e44s39s39a44r33y50.w84T61h50u50s39,wf5 +59/60E60m60a60c60s60/wf1 +94i28n50d50i28c44a44t28e44sw72o50nw83t28h50ew77d50i28s39p50l28a44yw83t28h50ew77n50e44x50tw61o50c44c44u50r33r33e44n50c44ew77o50fn120 0 +H720 +V2556 +ct +28h50ew69t28e44x50t28.25)n120 0 +H720 +V2712 +h250cI +33m78a44g50i28n50ew71w72ew71w72a44n50t28e44dw78t28ow78c44h50a44n50g50ew72t28h50ew72w72o50r33dwf5 +78h60a60p60h60a60z60a60r60dwf1 +88t28owf5 +78t60h60o60u60g60h60t60l60e60s60sf1 +60.w78O72b50v50i28o50u50s39l28y50,w53w72h50a44t28'33sw67n50e44e44d50e44dn120 0 +H720 +V2832 +ci +28sw68a44n50o50t28h50e44rwf5 +62cwf1 +89c44o50m78m78a44n50d50,w53b50u50tw56t28h50ew72m78e44t28h50o50dw78u50s39e44dw78s39ow78f33a44rw61t28ow78i28n50s39e44r33tw56t28e44x50tw56i28n50c44l28u50d50e44sw67aw72n50e44w72l28i28n50e44.w78T61h50ew72s39y50n50t28a44xw78f33o50rw61i28n50c44l28u50dh50Chy +n120 0 +H720 +V2952 +ci +28n50gw89t28e44x50tw67w72i28t28h50o50u50tw67n50e44w72l28i28n50e44sw78i28sw78t28ow89s39u50r33r33o50u50n50dw89t28h50ew83t28e44x50tw67w72i28t28hw89s39l28a44s39h50e44sw78(33w72h50i28c44hw89i28sw78t28h50ew83s39a44m78ew83a44sw79t28h50ew84s39y50n50t28a44xw90f33o50rw73t28e44x50tn120 0 +H720 +V3072 +cs +39e44a44r33c44h50e44s39,w53b50u50tw55w72h50a44tw55i28sw66g50o50i28n50gw77o50nw77s39h50o50u50l28dw77b50ew71c44l28e44a44rw60f33r33o50mwh105cc +44o50n50t28e44x50t28)33.w77T61h50ew71t28e44x50tw55m78u50s39tw55a44p50p50e44a44rw60i28m78m78e44d50i28a44t28e44l28yw77a44f33t28e44rw60t28h50ewf5 +71cn120 0 +H720 +f1 +V3192 +c( +33o50rwf5 +58awf1 +85o50rwf5 +58if1 +60)33.w75G72i28v50e44nw75t28h50i28s39,w50i28tw53i28sw64e44a44s39yw75t28ow75m78a44k50ew69t28h50ew69r33e44q50u50i28r33e44dw75c44h50a44n50g50e44:n120 0 +H720 +x font 0 CI +f0 +V3372 +h360c/ +60h60a60p60h60a60z60a60r60d60/60c60/60t60h60o60u60g60h60t60l60e60s60s60/n120 0 +H720 +V3492 +h360c1 +60pn120 0 +H720 +f5 +V3612 +h360cT +60h60i60swh120cm +60a60n60u60a60lwh120ci +60swh120co +60r60g60a60n60i60z60e60dwh120ci +60nwh120ca +wh120cr +60a60t60h60e60rwh120ct +60h60o60u60g60h60t60l60e60s60swh120cm +60a60n60n60e60r60.wh180cT +60h60ewh120cf +60i60r60s60tn120 0 +H720 +f1 +V3792 +c[ +33C67h50a44n50g50e44sw70c44a44nw81a44l28w72a44y50sw70b50ew75d50o50n50ew76w72i28t28hw82awf5 +76cwf1 +92c44o50m78m78a44n50d50,w57e44v50e44nw82i28fw65t28h50ew76t28e44x50tw60i28sw71s39m78a44l28l28e44rw65t28h50a44nw82aw76l28i28n50e44]33.w82Y72o50u50'33l28lw60f33i28n50dw82t28h50a44tn120 0 +H720 +V3912 +ct +28h50i28sw74w72a44yw85o50fw68p50r33o50v50i28d50i28n50gw85t28e44x50tw63t28ow85c44o50m78m78a44n50d50sw74i28sw74m78u50c44hw85m78o50r33ew79c44o50m78m78o50nw84t28h50a44nw84i28sw73t28h50ew78m78u50l28t28i28p50l28e44-33l28i28n50e44sw73s39y50n50t28a44x50.w84I33fw67y50o50un120 0 +H720 +V4032 +cw +72a44n50tw62t28ow84i28n50c44l28u50d50ew78aw78s39l28a44s39hwf5 +84/wf1 +94i28nw84t28h50ew78t28e44x50t28,w60j28u50s39tw63p50r33e44c44e44d50ew79i28tw63w72i28t28hw85aw79b50a44c44k50s39l28a44s39hwf5 +85\f1 +60,w60a44n50dw85u50s39ew79aw79b50a44c44k50s39l28a44s39hw85t28ow85p50r33o50t28e44c44tw63an120 0 +H720 +V4152 +cb +50a44c44k50s39l28a44s39hw75i28t28s39e44l28f33.n120 0 +H720 +x font 0 CI +f0 +V4332 +h360c/ +60E60m60a60c60s60/60c60/60E60m60a60c60s60\60\60360660060/n120 0 +H720 +V4452 +h360c4 +60pn120 0 +H720 +f5 +V4572 +h360cg +60e60n60e60r60a60lwh120ci +60n60t60r60o60d60u60c60t60i60o60nwh120ct +60owh120ct +60h60ewh120cc +60o60m60m60a60n60d60swh120ci +60nwh120cE +60m60a60c60s60\603606600wh120ca +60n60dwh120ct +60owh120ct +60r60ywh120ct +60owh120cs +60h60o60wn120 0 +H720 +f1 +V4752 +cW +94ew69c44o50u50l28dw75a44l28s39ow75m78a44k50ew69t28h50i28sw64p50a44r33t28i28c44u50l28a44rw58c44h50a44n50g50ew69b50yn120 0 +H720 +x font 0 CI +f0 +V4932 +h360c/ +60E60m60a60c60s60/60a60/60\60\60360660060/n120 0 +H720 +f1 +V5148 +h250cT +61h50i28sw67i28sw67a44sw67g50o50o50dw78aw72p50l28a44c44ew72a44sw67a44n50yw78t28ow78i28n50t28r33o50d50u50c44ew72t28h50ewf5 +73uwf1 +89c44o50m78m78a44n50d50,w54w72h50i28c44hw79u50n50d50o50e44sw68t28h50ew73l28a44s39tw57c44o50m78m78a44n50d50.w79Awh101cs +39e44ch44Chy +n120 0 +H720 +V5268 +co +50n50dwf5 +75uwf1 +85w72i28l28lw53u50n50d50ow75t28h50ew69p50e44n50u50l28t28i28m78a44t28ew69c44o50m78m78a44n50d50,w50a44n50dw75s39ow75o50n50.n120 0 +H720 +x font 0 CI +f0 +V5448 +h360cu +n120 0 +H720 +V5568 +h360c4 +60pn120 0 +H720 +f5 +V5688 +h360cg +60e60n60e60r60a60lwh120ci +60n60t60r60o60d60u60c60t60i60o60nwh120ct +60owh120ct +60h60ewh120cc +60o60m60m60a60n60d60swh120ci +60nwh120cE +60m60a60c60swh120ca +60n60dwh120ct +60owh120ct +60r60ywh120ct +60owh120cs +60h60o60wn120 0 +H720 +x font 0 CI +f0 +V5808 +h360cu +n120 0 +H720 +V5928 +h360c3 +60pn120 0 +H720 +f5 +V6048 +h360cT +60h60i60swh120cm +60a60n60u60a60lwh120ci +60swh120co +60r60g60a60n60i60z60e60dwh120ci +60nwh120ca +wh120cr +60a60t60h60e60rwh120ch +60a60p60h60a60z60a60r60dwh120cm +60a60n60n60e60r60.wh180cT +60h60ewh120cf +60i60r60s60tn120 0 +H720 +f1 +V6228 +cU +72n50d50o50i28n50gw75c44a44nw75o50n50l28yw75b50a44c44kw75u50p50;w53t28h50e44r33ew69i28sw64n50ow75w72a44yw75t28ow75u50n50d50ow75aw69p50r33e44v50i28o50u50swf5 +64uf1 +60.n120 0 +H720 +f3 +V6468 +cA +72d56d56r44e44s39s39e44sn120 0 +H720 +f1 +V6624 +h250cW +94e44'33v50ew76s39e44e44nw83t28h50ew77s39i28m78p50l28e44s39tw61f33o50r33m78sw72o50fw66a44d50d50r33e44s39s39e44s39,w58b50u50tw61t28h50e44r33ew77i28sw72m78o50r33ew77t28ow83l28e44a44r33nw83b50e44f33o50r33ew77w72ew77c44a44nw83g50e44tw61t28o50ow83m78u50c44hn120 0 +H720 +V6744 +cf +33u50r33t28h50e44r33.w84A72nw84a44d50d50r33e44s39sw73s39e44l28e44c44t28sw73aw78r33e44g50i28o50nw84i28nw83t28h50ew77f33i28l28ewh77Cem +wh133ca +w77s39u50b50s39t28r33i28n50gwh83Cem +wh133ca +44n50dw83t28h50e44r33e44f33o50r33ew77m78u50s39tw61d50e44f33i28n50ew77t28h50ew77b50e44g50i28n50n50i28n50gn120 0 +H720 +V6864 +ca +44n50dw79t28h50ew73e44n50dw79o50fw62aw73r33e44g50i28o50n50.w79T61h50u50s39,w54t28h50ew73a44d50d50r33e44s39swf5 +681603wf1 +89s39e44l28e44c44t28sw68f33r33o50mwh107ct +28h50ew73b50e44g50i28n50n50i28n50gw79o50fw62l28i28n50ew74t28h50i28r33t28e44e44nw80t28ow80t28h50ew74e44n50dw80o50fw63l28i28n50en120 0 +H720 +V6984 +ct +28h50i28r33t28e44e44n50,w50a44n50dwf5 +75/60E60m60a60c60s60/wf1 +85s39e44l28e44c44t28sw64f33r33o50mwh103ct +28h50ew69b50e44g50i28n50n50i28n50gw75o50fw58t28h50ew69w72o50r33dw75`f5 +33E60m60a60c60sf1 +60'w58t28ow75t28h50ew69e44n50d50.n120 0 +H720 +V7140 +h250cA +72d50d50r33e44s39s39e44sw64m78a44yw75b50ew69c44o50m78b50i28n50e44dw75w72i28t28hw75aw69c44o50m78m78a44:n120 0 +V7920 +p4 +x font 1 R +x font 2 I +x font 3 B +x font 4 BI +x font 5 CW +x font 6 H +x font 7 HI +x font 8 HB +x font 9 S1 +x font 10 S +s10 +f1 +H720 +V480 +h2077Chy +w33 254w50 h25Chy +wn120 0 +H720 +f5 +V900 +h360c1 +60360,601605n120 0 +H720 +f1 +V1080 +cs +39e44l28e44c44t28sw68l28i28n50e44sw68t28h50i28r33t28e44e44nw79t28h50r33o50u50g50hw79f33i28f33t28e44e44n50.w80T61h50ew74d50e44f33i28n50i28t28i28o50nw80o50fw63t28h50ew74c44o50m78m78aw74o50p50e44r33a44t28o50rw63i28sw69t28ow80s39e44l28e44c44tw58f33r33o50mwh108ct +28h50ew74b50e44g50i28n50n50i28n50gn120 0 +H720 +V1200 +co +50fw58t28h50ew69l28e44f33tw53h50a44n50dw75a44d50d50r33e44s39sw64(33t28h50ew69b50e44g50i28n50n50i28n50gw75o50fw58l28i28n50ew69150350)w58t28ow75t28h50ew69e44n50dw75o50fw58t28h50ew69r33i28g50h50tw53h50a44n50dw75a44d50d50r33e44s39sw64(33t28h50ew69e44n50dw75o50fw58l28i28n50ew69150550)33.n120 0 +H720 +V1356 +h250cA +wh104cf +33e44wwh104cs +39p50e44c44i28a44lw60s39i28m78p50l28ew76a44d50d50r33e44s39s39e44sw71c44o50m78ew76i28nw82h50a44n50d50y50:wf5 +60.wf1 +93(33aw77p50e44r33i28o50d50)w66r33e44p50r33e44s39e44n50t28sw72d50o50t28,w58t28h50ew77c44u50r33r33e44n50tw61t28e44x50t28,wf5 +580wf1 +93(33l28i28n50en120 0 +H720 +V1476 +cz +44e44r33o50)w67s39e44l28e44c44t28sw73t28h50ew78n50u50l28lw62s39t28r33i28n50gw84a44tw62t28h50ew78b50e44g50i28n50n50i28n50gw84o50fw67t28h50ew77f33i28l28e44,w58a44n50dwf5 +83$wf1 +93s39e44l28e44c44t28sw72t28h50ew77n50u50l28lw61s39t28r33i28n50gw83a44tw61t28h50ew77e44n50dw83o50fw66t28h50ew77f33i28l28en120 0 +H720 +V1596 +c[ +33n50o50tw53t28h50ew69l28a44s39tw53l28i28n50ew69o50fw58t28h50ew69f33i28l28e44]33.w75T61h50e44r33e44f33o50r33e44,n120 0 +H720 +f5 +V1776 +h360c0 +60,601603n120 0 +H720 +f1 +V1956 +cs +39e44l28e44c44t28sw64f33r33o50mwh103ct +28h50ew69b50e44g50i28n50n50i28n50gw75o50fw58t28h50ew69f33i28l28ew69t28ow75t28h50ew69e44n50dw75o50fw58l28i28n50ew69t28h50i28r33t28e44e44n50,n120 0 +H720 +f5 +V2136 +h360c. +60,60$n120 0 +H720 +f1 +V2316 +cs +39e44l28e44c44t28sw64f33r33o50mwh103ct +28h50ew69b50e44g50i28n50n50i28n50gw75o50fw58t28h50ew69c44u50r33r33e44n50tw53t28e44x50tw53t28ow75t28h50ew69e44n50dw75o50fw58t28h50ew69f33i28l28e44,w50a44n50dn120 0 +H720 +f5 +V2496 +h360c0 +60,60$n120 0 +H720 +f1 +V2676 +cs +39e44l28e44c44t28sw64t28h50ew69w72h50o50l28ew69f33i28l28ew69[33t28h50a44tw53i28s39,w50aw69s39i28n50g50l28ew69s39t28r33i28n50gw75c44o50n50t28a44i28n50i28n50gw75t28h50ew69w72h50o50l28ew69f33i28l28e44,w50n50o50tw53aw69l28i28s39tw53o50fw58a44l28lw53t28h50ew69l28i28n50e44sw64i28nw75t28h50ew69f33i28l28e44]33.n120 0 +H720 +V2832 +h250cT +61h50e44s39ew88a44r33ew88a44l28lwf2 +72a50b50s39o50l28u50t28ewf1 +88a44d50d50r33e44s39s39e44s39:w72t28h50e44yw94r33e44f33e44rw77t28ow94s39p50e44c44i28f33i28cw88p50l28a44c44e44sw83i28nw95t28h50ew89f33i28l28e44.wf5 +95s60a60mwf1 +h105ca +44l28s39ow95h50a44sw84r33e44l28a44t28i28v50en120 0 +H720 +V2952 +ca +44d50d50r33e44s39s39e44s39,w57w72h50i28c44hw82d50e44p50e44n50dw82o50nw82t28h50ew76v50a44l28u50ew76o50fw65d50o50t28,w57a44n50dw82i28nw82f33a44c44tw60w72ew76h50a44v50ew76a44l28r33e44a44d50yw82s39e44e44nw82o50n50ew76f33o50r33m78:wf5 +60/60E60m60a60c60s60/wf1 +92f33i28n50d50sn120 0 +H720 +V3072 +ct +28h50ew73f33i28r33s39tw57o50c44c44u50r33r33e44n50c44ew73o50fwf5 +62E60m60a60c60swf1 +89s39e44a44r33c44h50i28n50gw79f33o50r33w72a44r33d50sw68f33r33o50mwh107cd +50o50t28.w80W94h50i28c44hw80o50c44c44u50r33r33e44n50c44ew74o50fwf5 +63E60m60a60c60swf1 +90i28tw58f33i28n50d50sw69d50e44p50e44n50d50sn120 0 +H720 +V3192 +co +50nw79t28h50ew73v50a44l28u50ew73o50fw62d50o50t28.w79W94h50a44tw57i28fw62y50o50uw79w72a44n50t28e44dw79t28h50ew73f33i28r33s39tw57o50c44c44u50r33r33e44n50c44ewf5 +73b60e60f60o60r60ewf1 +88d50o50t28?w97J39u50s39tw56p50r33e44c44e44d50ew72t28h50ew72p50a44t28t28e44r33nw78w72i28t28hw78an120 0 +H720 +V3312 +cm +78i28n50u50sw64s39i28g50n50,w50w72h50i28c44hw75r33e44v50e44r33s39e44sw64t28h50ew69d50i28r33e44c44t28i28o50nw75o50fw58t28h50ew69s39e44a44r33c44h50:n120 0 +H720 +f5 +V3492 +h360c- +60/60E60m60a60c60s60/n120 0 +H720 +f1 +V3672 +cI +33nw75f33a44c44t28,w50t28h50ew69c44o50m78p50l28e44t28ew69s39y50n50t28a44xw75f33o50rw58f33o50r33w72a44r33dw75s39e44a44r33c44h50i28n50gw75i28sn120 0 +H720 +f5 +V3852 +h360c+ +60/60E60m60a60c60s60/n120 0 +H720 +f1 +V4032 +cb +50u50tw53t28h50ew69p50l28u50sw64s39i28g50nw75i28sw64t28h50ew69d50e44f33a44u50l28t28,w50a44n50dw75i28nw75p50r33a44c44t28i28c44ew69i28sw64r33a44r33e44l28yw75u50s39e44d50.w75H72e44r33ew69i28sw64a44nw75e44x50a44m78p50l28ew69t28h50a44tw53i28n50c44l28u50d50e44sw64i28tw53f33o50rw58c44l28a44r33i28t28y50:n120 0 +H720 +f5 +V4212 +h360c0 +60+60/60E60m60a60c60s60/n120 0 +H720 +f1 +V4392 +cs +39e44l28e44c44t28sw65t28h50ew70f33i28r33s39tw54o50c44c44u50r33r33e44n50c44ew70o50fwf5 +59E60m60a60c60swf1 +86i28nw76t28h50ew70f33i28l28e44;w54r33e44a44dw76i28tw54a44sw65`33`33g50ow76t28ow76l28i28n50ew70050,w52t28h50e44nw77s39e44a44r33c44hw77f33o50r33w72a44r33d50sw66f33o50rwf5 +60E60m60a60c60sf1 +60.25'33'n120 0 +H720 +V4512 +cS +56i28n50c44ew69t28h50ewf5 +69+wf1 +85i28sw64o50p50t28i28o50n50a44l28,w50t28h50i28sw64c44a44nw75b50ew69w72r33i28t28t28e44nwf5 +75060/60E60m60a60c60s60/f1 +60.w75S56i28m78i28l28a44r33l28y50,n120 0 +H720 +f5 +V4692 +h360c$ +60-60/60E60m60a60c60s60/n120 0 +H720 +f1 +V4872 +cf +33i28n50d50sw64t28h50ew69l28a44s39tw53o50c44c44u50r33r33e44n50c44ew69i28nw75t28h50ew69f33i28l28e44,w50s39on120 0 +H720 +f5 +V5052 +h360c0 +60/60E60m60a60c60s60/60,60$60-60/60E60m60a60c60s60/n120 0 +H720 +f1 +V5232 +cs +39e44l28e44c44t28sw64t28h50ew69t28e44x50tw53f33r33o50mwh103ct +28h50ew69f33i28r33s39tw53t28ow75l28a44s39twf5 +53E60m60a60c60sf1 +60,w50i28n50c44l28u50s39i28v50e44.w75S56l28i28g50h50t28l28yw75m78o50r33ew69i28n50t28e44r33e44s39t28i28n50g50:n120 0 +H720 +f5 +V5412 +h360c/ +60E60m60a60c60s60/60+60/60E60m60a60c60s60/n120 0 +H720 +f1 +V5592 +c( +33t28h50e44r33ew69i28sw64a44nw75i28m78p50l28i28c44i28twf5 +53.60+wf1 +85a44tw53t28h50ew69b50e44g50i28n50n50i28n50g50)w58s39e44l28e44c44t28sw64t28h50ew69s39e44c44o50n50dwf5 +75E60m60a60c60swf1 +85f33o50l28l28o50w72i28n50gw75d50o50t28.n120 0 +H720 +V5748 +h250cL +61i28n50ew69n50u50m78b50e44r33sw64m78a44yw75a44l28s39ow75b50ew69r33e44l28a44t28i28v50e44.n120 0 +H720 +f5 +V5928 +h360c- +602n120 0 +H720 +f1 +V6108 +cs +39e44l28e44c44t28sw64t28h50ew69s39e44c44o50n50dw75p50r33e44v50i28o50u50sw64l28i28n50e44,w50a44n50dn120 0 +H720 +f5 +V6288 +h360c+ +605n120 0 +H720 +f1 +V6468 +cs +39e44l28e44c44t28sw64t28h50ew69f33i28f33t28hw75f33o50l28l28o50w72i28n50gw75l28i28n50ew69(33h50e44r33ew69t28h50ew69p50l28u50sw64s39i28g50nw75i28sw64o50b50l28i28g50a44t28o50r33y50)33.n120 0 +H720 +V6624 +h250cS +56i28n50c44ew75a44d50d50r33e44s39s39e44sw70m78a44yw81s39e44l28e44c44tw59(33a44n50dw81d50o50tw59m78a44yw81b50e44)w65m78o50r33ew76t28h50a44nw82o50n50ew76l28i28n50e44,w57w72ew76n50e44e44dw82aw76d50e44f33i28n50i28t28i28o50nw82o50fw65`33p50r33e44v50i28o50u50s39'n120 0 +H720 +V6744 +ca +44n50dw80`33f33o50l28l28o50w72i28n50g50:28'w63`33p50r33e44v50i28o50u50s39'w63m78e44a44n50swf2 +69b50e44f28o50r39ew74t28h50ew74b50e44g50i28n50n50i28n50gwf1 +79o50fw62d50o50t28,w54a44n50dw79`33f33o50l28l28o50w72i28n50g50'w62m78e44a44n50swf2 +68a50f28t28e44rw68t28h50ew73e44n50dwf1 +79o50fw62d50o50t28.n120 0 +H720 +V6864 +cF +56o50rw63e44x50a44m78p50l28e44,w55i28fw63t28h50ew74f33i28l28ew75c44o50n50t28a44i28n50swf5 +70Ax font 0 CI +f0 +60A60Af5 +60Af1 +60,w56w72i28t28hw81d50o50tw59s39e44tw59t28ow81t28h50ew75m78i28d50d50l28ew75t28w72owf5 +81Af1 +60'33sw70(33t28h50ew75s39l28a44n50t28i28n50gw81c44h50a44r33a44c44t28e44r33s39)33,wf5 +56-60/60A60/n120 0 +H720 +f1 +V6984 +cs +39e44t28sw69d50o50tw58t28ow80t28h50ew74f33i28r33s39twf5 +58Af1 +60,w55a44n50dwf5 +80+60/60A60/wf1 +90s39e44t28sw69d50o50tw58t28ow80t28h50ew74l28a44s39twf5 +58Af1 +60.w80E61x50c44e44p50tw58u50n50d50e44rw63o50d50dw80c44i28r33c44u50m78s39t28a44n50c44e44sw69(33s39u50c44hw80a44sw69w72h50e44nw79t28h50en120 0 +H720 +V7104 +co +50n50l28yw90o50c44c44u50r33r33e44n50c44ew84o50fw73t28h50ew84t28e44x50tw68i28nw90t28h50ew84f33i28l28ew84i28sw79a44l28r33e44a44d50yw90t28h50ew84c44u50r33r33e44n50tw68t28e44x50t28)33,w65t28h50ew84t28e44x50tw68s39e44l28e44c44t28e44dw91b50yw91aw85s39e44a44r33c44hw91w72i28l28lw69b50en120 0 +H720 +V7224 +cd +50i28s39j28o50i28n50tw53f33r33o50mwh103cd +50o50t28.n120 0 +V7920 +p5 +x font 1 R +x font 2 I +x font 3 B +x font 4 BI +x font 5 CW +x font 6 H +x font 7 HI +x font 8 HB +x font 9 S1 +x font 10 S +s10 +f1 +H720 +V480 +h2077Chy +w33 255w50 h25Chy +wn120 0 +H720 +V840 +h250cT +61ow75s39e44l28e44c44tw53t28h50ewf5 +69t60r60o60f60fwh120c- +60m60swf1 +85p50a44r33a44g50r33a44p50hw75c44o50n50t28a44i28n50i28n50gw75d50o50t28,w50h50o50w72e44v50e44rw58l28o50n50gw75i28tw53i28s39,w50u50s39en120 0 +H720 +f5 +V1020 +h360c- +60/60.60P60P60/60,60/60.60P60P60/60-601n120 0 +H720 +f1 +V1200 +cw +72h50i28c44hw75w72i28l28lw53i28n50c44l28u50d50ew69t28h50ewf5 +69.60P60Pwf1 +85t28h50a44tw53b50e44g50i28n50sw64t28h50ew69p50a44r33a44g50r33a44p50h50,w50a44n50dw75e44x50c44l28u50d50ew69t28h50ew69o50n50ew69t28h50a44tw53e44n50d50sw64i28t28.n120 0 +H720 +V1356 +h250cW +94h50e44nw81t28y50p50i28n50gw82r33e44l28a44t28i28v50ew76l28i28n50ew76n50u50m78b50e44rw65a44d50d50r33e44s39s39e44s39,w57t28h50ew76d50e44f33a44u50l28tw60n50u50m78b50e44rw65i28swf5 +711f1 +60,w57s39ow82t28h50ew76a44b50o50v50ew76c44o50u50l28dw82b50ew76w72r33i28t28t28e44nn120 0 +H720 +V1476 +cs +39l28i28g50h50t28l28yw75m78o50r33ew69s39i28m78p50l28y50:n120 0 +H720 +f5 +V1656 +h360c- +60/60.60P60P60/60,60/60.60P60P60/60-n120 0 +H720 +f1 +V1872 +h250cW +94h50a44tw55d50o50e44sw66t28h50ew71a44d50d50r33e44s39swf5 +66+60160-601wf1 +87o50rw60t28h50ew71e44q50u50i28v50a44l28e44n50twf5 +55+60-wf1 +87m78e44a44n50?w96I33tw55l28o50o50k50sw66l28i28k50ew71i28tw55d50o50e44sw66n50o50t28h50i28n50g50,w52b50u50tw55r33e44c44a44l28lw56t28h50a44tn120 0 +H720 +V1992 +cd +50o50tw58n50e44e44dw80n50o50tw58b50ew73aw73c44o50m78p50l28e44t28ew73l28i28n50ew73o50fw62t28e44x50t28.wf5 +79+601wf1 +89s39e44l28e44c44t28sw68t28h50ew73l28i28n50ew73a44f33t28e44rw62t28h50ew73e44n50dw79o50fw62t28h50ew73c44u50r33r33e44n50tw57t28e44x50t28,w54a44n50dwf5 +79-601wf1 +89s39e44l28e44c44t28sn120 0 +H720 +V2112 +ct +28h50ew75l28i28n50ew75b50e44f33o50r33ew75t28h50ew75b50e44g50i28n50n50i28n50g50.w81T61h50e44r33e44f33o50r33ewf5 +75+60160-601wf1 +91s39e44l28e44c44t28sw70t28h50ew76l28i28n50ew76b50e44f33o50r33ew76t28h50ew76l28i28n50ew76a44f33t28e44rw65t28h50ew76e44n50dw82o50fw65d50o50t28,w57t28h50a44tw60i28s39,n120 0 +H720 +V2232 +ct +28h50ew71c44o50m78p50l28e44t28ew71l28i28n50ew71c44o50n50t28a44i28n50i28n50gw77t28h50ew71e44n50dw77o50fw60d50o50t28.w77W94ew71c44a44nw77u50s39ew70t28h50i28sw65c44o50n50s39t28r33u50c44t28i28o50nw76t28ow76e44x50p50a44n50dw76aw70s39e44l28e44c44t28i28o50nw76t28ow76i28n50c44l28u50d50ew70an120 0 +H720 +V2352 +cc +44o50m78p50l28e44t28ew69l28i28n50e44,w50s39a44yw75t28h50ew69f33i28r33s39tw53l28i28n50ew69i28nw75t28h50ew69f33i28l28ew69c44o50n50t28a44i28n50i28n50gwf5 +75E60m60a60c60sf1 +60:n120 0 +H720 +x font 0 CI +f0 +V2532 +h360c0 +60/60E60m60a60c60s60/60+60-60pn120 0 +H720 +f5 +V2652 +h360cg +60e60n60e60r60a60lwh120ci +60n60t60r60o60d60u60c60t60i60o60nwh120ct +60owh120ct +60h60ewh120cc +60o60m60m60a60n60d60swh120ci +60nwh120cE +60m60a60c60swh120ca +60n60dwh120ct +60owh120ct +60r60ywh120ct +60owh120cs +60h60o60wn120 0 +H720 +f1 +V2832 +cT +61h50ew69a44d50d50r33e44s39swf5 +64+60-wf1 +85i28sw64a44nw75i28d50i28o50m78.n120 0 +H720 +f3 +V3072 +cL +67o50o50p56sn120 0 +H720 +f1 +V3228 +h250cA +72b50o50v50e44,w52w72ew71c44h50a44n50g50e44dw77o50n50ew71o50c44c44u50r33r33e44n50c44ew71o50fwf5 +60E60m60a60c60swf1 +87t28owf5 +77E60m60a60c60s60\603606600f1 +60,w52b50u50tw55i28fw61t28h50ew72n50a44m78ew72o50fw61t28h50ew72e44d50i28t28o50rw61i28sw67r33e44a44l28l28yn120 0 +H720 +V3348 +cc +44h50a44n50g50i28n50g50,w62i28tw65w72o50u50l28dw87b50ew81u50s39e44f33u50lw65t28ow87c44h50a44n50g50ewf2 +81a50l28lwf1 +65i28n50s39t28a44n50c44e44sw76o50fw70t28h50ew81n50a44m78ew80i28nw86aw80s39i28n50g50l28ew80c44o50m78m78a44n50d50.wf5 +86s60a60mwf1 +96p50r33o50v50i28d50e44sw75an120 0 +H720 +V3468 +cc +44o50m78m78a44n50d50,wf5 +58xwf1 +93(33e44x50t28r33a44c44t28)33,w58f33o50rw66j28u50s39tw61t28h50a44tw61j28o50b50.w83T61h50ew78s39y50n50t28a44xw84i28swf5 +h108cx +60/f2 +60p50a50t28t28e44r39nf5 +50/f2 +60c44o50m72m72a50n50df1 +50.w84F56o50rw67e44a44c44hw84o50c44c44u50r33r33e44n50c44ew78o50fw67t28h50en120 0 +H720 +V3588 +cp +50a44t28t28e44r33nw76i28nw75t28h50ew69s39e44l28e44c44t28e44dw75t28e44x50t28,wf5 +50xwf1 +85s39e44t28sw64d50o50tw53t28ow75t28h50ew69o50c44c44u50r33r33e44n50c44ew69a44n50dw75r33u50n50sw64c44o50m78m78a44n50d50.w75F56o50rw58e44x50a44m78p50l28e44,w50t28ow75c44h50a44n50g50ewf5 +69E60m60a60c60sn120 0 +H720 +f1 +V3708 +ct +28owf5 +75v60i60,n120 0 +H720 +x font 0 CI +f0 +V3888 +h360c0 +60,60$60x60/60E60m60a60c60s60/60c60/60v60i60/n120 0 +H720 +V4008 +h360c0 +60,60$60pn120 0 +H720 +f5 +V4128 +h360cT +60h60i60swh120cm +60a60n60u60a60lwh120ci +60swh120co +60r60g60a60n60i60z60e60dwh120ci +60nwh120ca +wh120cr +60a60t60h60e60rwh120ch +60a60p60h60a60z60a60r60dwh120cm +60a60n60n60e60r60.wh180cT +60h60ewh120cf +60i60r60s60tn120 0 +H720 +V4248 +h360cs +60e60v60e60r60a60lwh120cs +60e60c60t60i60o60n60swh120cw +60e60r60ewh120cw +60r60i60t60t60e60nwh120ch +60a60s60t60i60l60ywh120ci +60nwh120ca +60nwh120ca +60t60t60e60m60p60twh120ct +60owh120cp +60r60o60v60i60d60ewh120ca +n120 0 +H720 +V4368 +h360cg +60e60n60e60r60a60lwh120ci +60n60t60r60o60d60u60c60t60i60o60nwh120ct +60owh120ct +60h60ewh120cc +60o60m60m60a60n60d60swh120ci +60nwh120cv +60iwh120ca +60n60dwh120ct +60owh120ct +60r60ywh120ct +60owh120cs +60h60o60wn120 0 +H720 +V4488 +h360ct +60h60ewh120cm +60e60t60h60o60dwh120ci +60nwh120ct +60h60ewh120cm +60a60d60n60e60s60swh120ct +60h60a60twh120ci +60swh120ct +60h60ewh120cv +60iwh120cc +60o60m60m60a60n60dwh120cs +60t60r60u60c60t60u60r60e60.n120 0 +H720 +f1 +V4668 +cT +61h50i28sw65w72o50r33k50sw65b50yw77s39u50b50d50i28v50i28d50i28n50gw77t28h50ew71c44u50r33r33e44n50tw55t28e44x50tw55(f5 +33060,60$wf1 +h87Cem +wh127ct +28h50ew71w72h50o50l28ew71f33i28l28e44)w60i28n50t28ow77a44p50p50e44a44r33a44n50c44e44sw66o50fw60i28t28sw66t28e44x50t28u50a44lw55a44r33g50u50m78e44n50tn120 0 +H720 +V4788 +c( +f5 +33E60m60a60c60sf1 +60)33,w57a44n50dw82t28h50e44nw82r33u50n50n50i28n50gw81t28h50ew75c44o50m78m78a44n50dw81t28h50a44tw59f33o50l28l28o50w72sw70(f5 +33c60/60v60i60/f1 +60)w64w72i28t28hw81d50o50tw59s39e44tw59t28ow81t28h50ew75t28e44x50t28.w81W94ew75c44a44nw81r33e44a44dw81t28h50i28sn120 0 +H720 +V4908 +ce +44x50a44m78p50l28ew74a44s39,w55`33`33f33i28n50dw80a44l28lw58o50c44c44u50r33r33e44n50c44e44sw69o50fwf5 +63E60m60a60c60swf1 +90i28nw80t28h50ew74f33i28l28e44,w55a44n50dw80f33o50rw63e44a44c44hw80o50n50e44,w55s39e44tw58t28h50ew74c44u50r33r33e44n50tw58t28e44x50tw58t28ow80t28h50ew75o50c44c44u50rh33Chy +n120 0 +H720 +V5028 +cr +33e44n50c44ew73a44n50dw79r33u50nw79t28h50ew73c44o50m78m78a44n50dwf5 +79c60/60v60i60/f1 +60,w54w72h50i28c44hw79w72i28l28lw57r33e44p50l28a44c44ew72t28h50ew72c44u50r33r33e44n50tw56t28e44x50tw56b50ywf5 +78v60i60.f1 +60'33'w61[33T61h50i28sw67c44o50m78m78a44n50dw78i28sw67s39o50m78eh44Chy +n120 0 +H720 +V5148 +cw +72h50a44tw56s39i28m78i28l28a44rw61t28owf5 +78e60df1 +60'33swf5 +67gwf1 +88c44o50m78m78a44n50d50.w78T61h50ew72d50i28f33f33e44r33e44n50c44e44sw67w72i28l28lw56d50e44v50e44l28o50pw78b50e44l28o50w72,w53b50u50tw56n50o50t28ew72t28h50a44tw57t28h50ew73d50e44f33a44u50l28tw57a44d50d50r33e44s39s39,w54a44sn120 0 +H720 +V5268 +ca +44l28w72a44y50s39,w50i28sw64d50o50tw53r33a44t28h50e44rw58t28h50a44nw75t28h50ew69w72h50o50l28ew69f33i28l28e44.25]n120 0 +H720 +V5424 +h250cA +w97s39i28n50g50l28ewf5 +69uwf1 +85c44o50m78m78a44n50dw75i28sw64s39u50f33f33i28c44i28e44n50tw53t28ow75u50n50d50ow75a44nwf5 +75xwf1 +85c44o50m78m78a44n50d50,w50r33e44g50a44r33d50l28e44s39sw64o50fw58h50o50ww97m78a44n50yw76i28n50d50i28v50i28d50u50a44lw54c44h50a44n50g50e44sn120 0 +H720 +V5544 +ct +28h50ewf5 +69xwf1 +85m78a44k50e44s39.n120 0 +H720 +x font 0 CI +f0 +V5724 +h360cu +n120 0 +H720 +V5844 +h360c0 +60,60$60pn120 0 +H720 +f5 +V5964 +h360cT +60h60i60swh120cm +60a60n60u60a60lwh120ci +60swh120co +60r60g60a60n60i60z60e60dwh120ci +60nwh120ca +wh120cr +60a60t60h60e60rwh120ch +60a60p60h60a60z60a60r60dwh120cm +60a60n60n60e60r60.wh180cT +60h60ewh120cf +60i60r60s60tn120 0 +H720 +V6084 +h360cs +60e60v60e60r60a60lwh120cs +60e60c60t60i60o60n60swh120cw +60e60r60ewh120cw +60r60i60t60t60e60nwh120ch +60a60s60t60i60l60ywh120ci +60nwh120ca +60nwh120ca +60t60t60e60m60p60twh120ct +60owh120cp +60r60o60v60i60d60ewh120ca +n120 0 +H720 +V6204 +h360cg +60e60n60e60r60a60lwh120ci +60n60t60r60o60d60u60c60t60i60o60nwh120ct +60owh120ct +60h60ewh120cc +60o60m60m60a60n60d60swh120ci +60nwh120cE +60m60a60c60swh120ca +60n60dwh120ct +60owh120ct +60r60ywh120ct +60owh120cs +60h60o60wn120 0 +H720 +V6324 +h360ct +60h60ewh120cm +60e60t60h60o60dwh120ci +60nwh120ct +60h60ewh120cm +60a60d60n60e60s60swh120ct +60h60a60twh120ci +60swh120ct +60h60ewh120cE +60m60a60c60swh120cc +60o60m60m60a60n60dwh120cs +60t60r60u60c60t60u60r60e60.n120 0 +H720 +f1 +V6540 +h250cO +72fw70c44o50u50r33s39e44,wf5 +62cwf1 +97i28sw76n50o50tw65t28h50ew81o50n50l28yw87c44o50m78m78a44n50dwf5 +87xwf1 +97c44a44nw87r33u50n50.w87A72nwf5 +87awf1 +98c44o50m78m78a44n50dw88c44a44nw88b50ew82u50s39e44dw88t28ow88p50u50tw66p50r33o50p50r33i28e44t28a44r33yn120 0 +H720 +V6660 +cm +78a44r33k50i28n50g50sw64o50nwf5 +75E60m60a60c60sf1 +60:n120 0 +H720 +x font 0 CI +f0 +V6840 +h360c0 +60,60$60x60/60E60m60a60c60s60/60a60/60{60T60M60}60/n120 0 +H720 +V6960 +h360c/ +60E60m60a60c60s60/60+60-60pn120 0 +H720 +f5 +V7080 +h360cg +60e60n60e60r60a60lwh120ci +60n60t60r60o60d60u60c60t60i60o60nwh120ct +60owh120ct +60h60ewh120cc +60o60m60m60a60n60d60swh120ci +60nwh120cE +60m60a60c60s60{60T60M60}wh120ca +60n60dwh120ct +60owh120ct +60r60ywh120ct +60owh120cs +60h60o60wn120 0 +H720 +f1 +V7260 +c[ +33T61h50e44r33ew74i28sw69n50ow80w72a44yw80t28ow80s39e44ew74t28h50ew74c44h50a44n50g50e44sw69a44sw69t28h50e44yw80h50a44p50p50e44n50,w55a44sw69i28nwf5 +80e60df1 +60'33swf5 +69g60/60E60m60a60c60s60/60s60/60/60&60{60T60M60}60/60pf1 +60;w59s39e44ew75t28h50ew75s39e44c44t28i28o50nn120 0 +V7920 +p6 +x font 1 R +x font 2 I +x font 3 B +x font 4 BI +x font 5 CW +x font 6 H +x font 7 HI +x font 8 HB +x font 9 S1 +x font 10 S +s10 +f1 +H720 +V480 +h2077Chy +w33 256w50 h25Chy +wn120 0 +H720 +V840 +co +50nw75M89u50l28t28i28p50l28ew69C67h50a44n50g50e44s39,w50b50e44l28o50w72.25]n120 0 +H720 +V996 +h250cT +61h50ewf5 +69pwf1 +85c44o50m78m78a44n50dw75i28sw64a44l28s39ow75u50s39e44f33u50lw53w72h50e44nw75d50r33i28v50e44nw75b50yw75a44nwf5 +75xf1 +60,w50b50u50tw53b50ew69c44a44r33e44f33u50lw53t28h50a44tw53y50o50uw75s39a44yw75w72h50a44tw53y50o50uw75m78e44a44n50;n120 0 +H720 +x font 0 CI +f0 +V1176 +h360c0 +60,60$60x60/60E60m60a60c60s60/60pn120 0 +H720 +f5 +V1296 +h360cE +60m60a60c60s60E60m60a60c60sn120 0 +H720 +f1 +V1476 +cs +39i28n50c44ewf5 +69xwf1 +85s39e44t28sw64d50o50tw54t28ow76t28h50ew70t28e44x50tw54i28nw76t28h50ew70s39l28a44s39h50e44s39,w51p50r33i28n50t28i28n50gw76o50n50l28yw76t28h50a44tw54t28e44x50tw54i28sw65n50o50tw54g50o50i28n50gw76t28ow76b50ew70v50e44r33yw76i28n50f33o50r33m78a44t28i28v50e44.w76B67u50tw54t28h50en120 0 +H720 +V1596 +cc +44o50m78m78a44n50dw80t28h50a44twf5 +58xwf1 +90r33u50n50sw69c44a44nw80c44o50n50t28a44i28nw80a44d50d50r33e44s39s39e44s39.w80F56o50rw63e44x50a44m78p50l28e44,w55i28fw63w72ew74w72a44n50tw57t28ow79p50r33i28n50tw57a44l28lw57l28i28n50e44sw68c44o50n50t28a44i28n50i28n50gwf5 +79E60m60a60c60sf1 +60,n120 0 +H720 +V1716 +cj +28u50s39tw53u50s39ewf5 +69+60-f1 +60:n120 0 +H720 +x font 0 CI +f0 +V1896 +h360c0 +60,60$60x60/60E60m60a60c60s60/60+60-60pn120 0 +H720 +f5 +V2016 +h360cg +60e60n60e60r60a60lwh120ci +60n60t60r60o60d60u60c60t60i60o60nwh120ct +60owh120ct +60h60ewh120cc +60o60m60m60a60n60d60swh120ci +60nwh120cE +60m60a60c60s60{60T60M60}wh120ca +60n60dwh120ct +60owh120ct +60r60ywh120ct +60owh120cs +60h60o60wn120 0 +H720 +V2136 +h360ct +60h60ewh120cm +60e60t60h60o60dwh120ci +60nwh120ct +60h60ewh120cm +60a60d60n60e60s60swh120ct +60h60a60twh120ci +60swh120ct +60h60ewh120cE +60m60a60c60s60{60T60M60}wh120cc +60o60m60m60a60n60dwh120cs +60t60r60u60c60t60u60r60e60.n120 0 +H720 +f1 +V2316 +cF +56i28n50a44l28l28y50,w58l28e44t28'33sw72r33e44s39t28o50r33ew77t28h50ew77s39t28a44t28ew77o50fw66t28h50ew77f33i28l28ew78w72i28t28hw84a44n50o50t28h50e44rwf5 +67xwf1 +94c44o50m78m78a44n50d50,w59a44n50dw84m78a44k50ew78u50s39ew78o50fw67aw78h50a44n50d50yw84s39h50o50r33t28h50a44n50d50:w62an120 0 +H720 +V2436 +cc +44o50m78m78aw71i28nw77a44nw77a44d50d50r33e44s39sw66h50a44sw66i28t28sw66l28e44f33tw55s39i28d50ew71d50e44f33a44u50l28tw55t28owf5 +770f1 +60,w52a44n50dw77i28t28sw66r33i28g50h50tw55s39i28d50ew71d50e44f33a44u50l28tw54t28owf5 +76$f1 +60,w51s39ow76t28h50ew70e44a44s39y50-33t28o50-33t28y50p50ew70a44d50d50r33e44s39sn120 0 +H720 +f5 +V2556 +c, +wf1 +85r33e44f33e44r33sw64t28ow75t28h50ew69w72h50o50l28ew69f33i28l28e44:n120 0 +H720 +x font 0 CI +f0 +V2736 +h360c, +60x60/60E60m60a60c60s60/wh120c/ +60{60T60M60}60/60dn120 0 +H720 +V2856 +h360c, +60pn120 0 +H720 +f5 +V2976 +h360cT +60h60i60swh120cm +60a60n60u60a60lwh120ci +60swh120co +60r60g60a60n60i60z60e60dwh120ci +60nwh120ca +wh120cr +60a60t60h60e60rwh120ch +60a60p60h60a60z60a60r60dwh120cm +60a60n60n60e60r60.wh180cT +60h60ewh120cf +60i60r60s60tn120 0 +H720 +V3096 +h360cs +60e60v60e60r60a60lwh120cs +60e60c60t60i60o60n60swh120cw +60e60r60ewh120cw +60r60i60t60t60e60nwh120ch +60a60s60t60i60l60ywh120ci +60nwh120ca +60nwh120ca +60t60t60e60m60p60twh120ct +60owh120cp +60r60o60v60i60d60ewh120ca +n120 0 +H720 +V3216 +h360cg +60e60n60e60r60a60lwh120ci +60n60t60r60o60d60u60c60t60i60o60nwh120ct +60owh120ct +60h60ewh120cc +60o60m60m60a60n60d60swh120ci +60nwh120cE +60m60a60c60swh120ca +60n60dwh120ct +60owh120ct +60r60ywh120ct +60owh120cs +60h60o60wn120 0 +H720 +V3336 +h360ct +60h60ewh120cm +60e60t60h60o60dwh120ci +60nwh120ct +60h60ewh120cm +60a60d60n60e60s60swh120ct +60h60a60twh120ci +60swh120ct +60h60ewh120cE +60m60a60c60swh120cc +60o60m60m60a60n60dwh120cs +60t60r60u60c60t60u60r60e60.n120 0 +H720 +f1 +V3516 +cN +72o50t28i28c44ew69w72h50a44tw53t28h50i28swf5 +64xwf1 +85d50o50e44s39:w53f33o50rw58e44a44c44hw75o50c44c44u50r33r33e44n50c44ew69o50fw58E61m78a44c44s39,w50f33i28n50dw75t28h50ewf5 +69{60T60M60}wf1 +85t28h50a44tw53f33o50l28l28o50w72s39,w50a44n50dw75d50e44l28e44t28ew69i28t28.n120 0 +H720 +V3672 +h250cT +61h50ew79`33t28e44x50t28'wf5 +68s60a60mwf1 +95a44c44c44e44p50t28sw74f33o50rw68s39e44a44r33c44h50e44sw74i28nw85a44d50d50r33e44s39s39e44sw74a44n50dw85i28nwf5 +85xwf1 +95c44o50m78m78a44n50d50sw75i28sw75n50o50tw64s39i28m78p50l28ew80t28e44x50t28,w61b50u50tw64r33a44t28h50e44rn120 0 +H720 +f2 +V3792 +cr +39e44g50u50l28a50r39 25e44x44p50r39e44s39s39i28o50n50s39.wf1 +90U72n50i28xw90h50a44sw79s39e44v50e44r33a44lw68d50i28s39t28i28n50c44tw68i28n50t28e44r33p50r33e44t28a44t28i28o50n50sw79o50fw73r33e44g50u50l28a44rw73e44x50p50r33e44s39s39i28o50n50s39.w90T61h50ew84f33o50r33mwh118cu +50s39e44dw89b50yn120 0 +H720 +f5 +V3912 +cs +60a60mwf1 +85i28sw64t28h50a44tw53o50fwf5 +58e60g60r60e60pf1 +60(33150)33,w50i28n50c44l28u50d50i28n50gw75p50a44r33e44n50t28h50e44s39e44swf5 +64(60)wf1 +85f33o50rw58g50r33o50u50p50i28n50gw75a44n50dw75a44nw75`33o50r33'w58o50p50e44r33a44t28o50rwf5 +58|wf1 +85f33o50rw58m78a44t28c44h50i28n50gw75s39t28r33i28n50g50sn120 0 +H720 +V4032 +ci +28nw84p50a44r33a44l28l28e44l28.wf5 +84s60a60mwf1 +94m78a44k50e44sw73t28w72ow84e44x50t28e44n50s39i28o50n50s39:w62a44l28t28h50o50u50g50hwf5 +84.wf1 +94(33t28h50ew78m78o50s39tw62o50v50e44r33l28o50a44d50e44dw84c44h50a44r33a44c44t28e44rw67i28nw84U72n50i28x50)w67m78a44t28c44h50e44sw72a44n50yn120 0 +H720 +V4152 +cc +44h50a44r33a44c44t28e44rwf2 +69e44x44c44e44p50twf1 +65n50e44w72l28i28n50e44,w62t28h50ew81r33e44g50u50l28a44rw70e44x50p50r33e44s39s39i28o50nwf5 +87@wf1 +97(33t28h50i28n50kw87o50fw70i28tw65a44sw76aw81b50i28gw87d50o50t28)w70m78a44t28c44h50e44sw76a44n50yw87c44h50a44r33a44c44t28e44r33,w62e44v50e44nn120 0 +H720 +V4272 +cn +50e44w72l28i28n50e44s39;w62a44n50dw84t28h50ew78c44h50a44r33a44c44t28e44rw66s39e44q50u50e44n50c44ewf5 +77\60nwf1 +93m78a44t28c44h50e44sw72aw77n50e44w72l28i28n50ew77c44h50a44r33a44c44t28e44r33.w83R67e44p50l28a44c44e44m78e44n50tw61t28e44x50t28,w58s39u50c44hw83a44sw72u50s39e44dw83i28nn120 0 +H720 +V4392 +ct +28h50ewf5 +69awf1 +85a44n50dwf5 +75cwf1 +85c44o50m78m78a44n50d50s39,w50i28sw64s39t28i28l28lw53p50l28a44i28nw75t28e44x50t28,w50b50u50tw53t28h50ew69s39e44q50u50e44n50c44ewf5 +69\60nwf1 +85r33e44p50r33e44s39e44n50t28sw64n50e44w72l28i28n50ew69i28nw75t28h50a44tw53c44o50n50t28e44x50t28,w50t28o50o50.n120 0 +H720 +V4548 +h250cH +72e44r33ew77i28sw72a44nw83e44x50a44m78p50l28e44.w83S56a44yw83w72ew77w72a44n50t28e44dw83t28ow83d50o50u50b50l28ew77s39p50a44c44ew77t28h50ew77d50o50c44u50m78e44n50t28,w58t28h50a44tw62i28s39,w59t28u50r33nw84e44v50e44r33yw84n50e44w72l28i28n50ew78i28n50t28on120 0 +H720 +V4668 +ct +28w72ow75n50e44w72l28i28n50e44s39.w75T61h50ew69f33o50l28l28o50w72i28n50gw75a44l28lw53d50ow75t28h50ew69j28o50b50:n120 0 +H720 +x font 0 CI +f0 +V4848 +h360c, +60x60/60\60n60/wh120ca +60/60\60n60/n120 0 +H720 +V4968 +h360c, +60x60/60\60n60/wh120cc +60/60\60n60\60n60/n120 0 +H720 +V5088 +h360c, +60x60/60$60/wh120ca +60/60\60n60/n120 0 +H720 +V5208 +h360c, +60x60/60^60/wh120ci +60/60\60n60/n120 0 +H720 +f1 +V5388 +cT +61h50ew70l28a44s39tw54e44x50a44m78p50l28ew70i28sw65s39l28i28g50h50t28l28yw76d50i28f33f33e44r33e44n50t28,w51b50e44c44a44u50s39ew70i28tw54p50u50t28sw65aw70n50e44w72l28i28n50ewf2 +70b50e44f28o50r39ewf1 +70e44a44c44hw76l28i28n50e44;w54t28h50ew70o50t28h50e44rw59e44x50a44m78p50l28e44sw65p50l28a44c44ew71i28tn120 0 +H720 +V5508 +ca +44f33t28e44r33.w81T61h50ew75f33i28r33s39tw59t28w72ow81e44x50a44m78p50l28e44sw70m78a44n50i28p50u50l28a44t28ew75n50e44w72l28i28n50e44sw70d50i28r33e44c44t28l28yw81[33s39o50m78e44t28h50i28n50gw81o50u50t28s39i28d50ewf5 +75e60df1 +60'33sw70k50e44n50]33;w58t28h50ew74l28a44s39tw58t28w72ow80u50s39en120 0 +H720 +V5628 +cr +33e44g50u50l28a44rw58e44x50p50r33e44s39s39i28o50n50s39:wf5 +53$wf1 +85i28sw64t28h50ew69e44m78p50t28yw75s39t28r33i28n50gw75a44tw53t28h50ew69e44n50dw75o50fw58aw69l28i28n50e44,w50w72h50i28l28ewf5 +69^wf1 +85i28sw64t28h50ew69e44m78p50t28yw75s39t28r33i28n50gw75a44tw53t28h50ew69b50e44g50i28n50n50i28n50g50.n120 0 +H720 +V5784 +h250cT +61h50e44s39ew71s39o50l28u50t28i28o50n50sw66a44l28lw55h50a44v50ew71aw71p50o50s39s39i28b50l28ew71d50r33a44w72b50a44c44k50:w55i28fw60t28h50e44r33ew71i28sw66a44l28r33e44a44d50yw77aw71b50l28a44n50kw77l28i28n50ew72(33t28h50a44tw56i28s39,w53t28w72ow78c44o50n50s39e44c44u50t28i28v50en120 0 +H720 +V5904 +cn +50e44w72l28i28n50e44s39)33,w53t28h50e44yw78m78a44k50ew72i28tw56m78u50c44hw78l28a44r33g50e44rw60(33f33o50u50rw60c44o50n50s39e44c44u50t28i28v50ew71n50e44w72l28i28n50e44s39)33.w77Aw99b50e44t28t28e44rw60m78e44t28h50o50dw77i28sw66t28ow77e44x50t28e44n50dw77e44v50e44r33yw77g50r33o50u50pn120 0 +H720 +V6024 +co +50fw58n50e44w72l28i28n50e44sw64b50yw75o50n50e44:n120 0 +H720 +x font 0 CI +f0 +V6204 +h360c, +60x60/60\60n60+60/wh120ca +60/60\60n60/n120 0 +H720 +f1 +V6384 +cT +61h50ew78r33e44g50u50l28a44rw67e44x50p50r33e44s39s39i28o50nw84o50p50e44r33a44t28o50rwf5 +67+wf1 +95m78e44a44n50sw74`33o50n50ew79o50rw68m78o50r33e44;28'wf5 +68\60n60+wf1 +95i28sw74i28d50e44n50t28i28c44a44lw63t28owf5 +85\60n60\60n60*f1 +60.w85T61h50u50s39,w60t28h50i28sw74e44x50a44m78p50l28en120 0 +H720 +V6504 +ct +28a44k50e44sw64e44v50e44r33yw75s39e44q50u50e44n50c44ew69o50fw58n50e44w72l28i28n50e44sw64a44n50dw75a44d50d50sw64a44n50o50t28h50e44rw58t28ow75t28h50ew69e44n50d50.n120 0 +H720 +V6660 +h250cA +w97m78o50r33ew69c44o50m78m78o50nw75e44x50a44m78p50l28ew69i28sw64i28n50d50e44n50t28i28n50gw75aw69b50l28o50c44kw75o50fw58t28e44x50tw53b50yw75aw69t28a44bw75s39t28o50p50.w75T61h50ew70f33o50l28l28o50w72i28n50gw76a44l28lw54w72o50r33k50,w51a44l28t28h50o50u50g50hn120 0 +H720 +V6780 +ct +28h50ew69f33i28r33s39tw53i28sw64a44r33g50u50a44b50l28yw75t28h50ew69c44l28e44a44n50e44s39tw53(33t28h50ew69b50l28a44n50kw75t28e44x50tw53i28nw75s39l28a44s39h50e44sw64i28sw64aw69t28a44b50)33:n120 0 +V7920 +p7 +x font 1 R +x font 2 I +x font 3 B +x font 4 BI +x font 5 CW +x font 6 H +x font 7 HI +x font 8 HB +x font 9 S1 +x font 10 S +s10 +f1 +H720 +V480 +h2077Chy +w33 257w50 h25Chy +wn120 0 +H720 +x font 0 CI +f0 +V900 +h360c, +60x60/60^60/60a60/wwh200c/ +n120 0 +H720 +V1020 +h360c, +60x60/60^60/60c60/wwh200c/ +n120 0 +H720 +V1140 +h360c, +60x60/60.60*60\60n60/60i60/wwh270c/ +n120 0 +H720 +f1 +V1320 +cT +61h50ew81l28a44s39tw65e44x50a44m78p50l28ew81u50s39e44sw76t28h50ew81p50a44t28t28e44r33nw87(33i28d50i28o50m78,w62r33e44a44l28l28y50)wf5 +70.60*60\60nwf1 +98t28ow88m78a44t28c44hw88l28i28n50e44s39:wf5 +66.60*wf1 +98m78a44t28c44h50e44sw77t28h50ew82l28o50n50g50e44s39tw66p50o50s39s39i28b50l28en120 0 +H720 +V1440 +cs +39t28r33i28n50gw75o50fw58n50o50n50-33n50e44w72l28i28n50ew69c44h50a44r33a44c44t28e44r33s39.w75T61a44k50i28n50gw75i28n50i28t28i28a44lw53t28a44b50sw64a44w72a44yw75i28sw64j28u50s39tw53a44sw64e44a44s39y50:n120 0 +H720 +x font 0 CI +f0 +V1620 +h360c, +60x60/60^wh300c/ +60dn120 0 +H720 +f1 +V1800 +cI +33nw75t28h50e44s39ew69e44x50a44m78p50l28e44sw64Iw58h50a44v50ew69s39p50e44c44i28f33i28e44dw75a44nw75a44d50d50r33e44s39sw64(33t28h50ew69w72h50o50l28ew69f33i28l28e44)33,w50b50u50tw53i28nw76p50r33a44c44t28i28c44ew70c44o50m78m78a44n50d50sw65l28i28k50ew70t28h50e44s39ew70a44r33ew70m78o50r33en120 0 +H720 +V1920 +cl +28i28k50e44l28yw75t28ow75b50ew69r33u50nw75w72i28t28h50o50u50tw53a44nw75a44d50d50r33e44s39s39,w50u50s39i28n50gw75t28h50ew69v50a44l28u50ew69o50fw58d50o50tw53s39e44tw53b50yw75s39e44l28e44c44t28i28n50gw75t28e44x50tw53w72i28t28hw75t28h50ew69m78o50u50s39e44.n120 0 +H720 +f3 +V2160 +cC +72o50n56d56i28t33i28o50n56a50l28sn120 0 +H720 +f1 +V2316 +h250cT +61h50ewf5 +69xwf1 +85c44o50m78m78a44n50dw75i28sw64aw69l28o50o50p50i28n50gw75c44o50n50s39t28r33u50c44t28:w53f33o50rw58e44a44c44hw75m78a44t28c44hw76o50fw59aw70r33e44g50u50l28a44rw59e44x50p50r33e44s39s39i28o50n50,w51i28tw54e44x50t28r33a44c44t28sw65(33s39e44t28sw65d50o50tw54t28o50)n120 0 +H720 +V2436 +ct +28h50ew71m78a44t28c44hw77a44n50dw77r33u50n50sw66aw71c44o50m78m78a44n50d50.wf5 +77s60a60mwf1 +87a44l28s39ow77h50a44sw66aw71c44o50n50d50i28t28i28o50n50a44l28,wf5 +52gf1 +60:wf5 +90g60/f2 +60p50a50t28t28e44r39nf5 +50/f2 +60c44o50m72m72a50n50dwf1 +76r33u50n50sw65t28h50ew70c44o50m78m78a44n50dw76i28fn120 0 +H720 +V2556 +cd +50o50tw55c44o50n50t28a44i28n50sw66aw71m78a44t28c44hw77o50fw60t28h50ew71p50a44t28t28e44r33nwf2 +77w67i28t28h50o50u50tw55c44h50a50n50g50i28n50gw77t28h50ew71v44a50l28u50ew71o50fw55d50o50t28.wf1 +78T61h50ew72i28n50v50e44r33s39e44,wf5 +53vf1 +60,w53r33u50n50sw67t28h50ew72c44o50m78m78a44n50dw78i28fn120 0 +H720 +V2676 +cd +50o50tw57d50o50e44swf2 +68n50o50twf1 +57c44o50n50t28a44i28nw79aw73m78a44t28c44hw79o50fw62t28h50ew73p50a44t28t28e44r33n50.w79(33T61h50ew73l28e44t28t28e44r33swf5 +68gwf1 +89a44n50dwf5 +79vwf1 +89a44r33ew72h50i28s39t28o50r33i28c44a44lw56a44n50dw78h50a44v50ew72n50ow78m78n50e44m78o50n50i28cw72s39i28gh50Chy +n120 0 +H720 +V2796 +cn +50i28f33i28c44a44n50c44e44.w75Y72o50uw75m78i28g50h50tw53t28h50i28n50kw75o50fwf5 +58gwf1 +85a44sw64`33g50u50a44r33d50.25'33)w83[f5 +33e60dwf1 +85u50s39e44r33sw64s39h50o50u50l28dw75r33e44a44dw75t28h50ew69a44b50o50v50ew69d50e44f33i28n50i28t28i28o50n50sw64v50e44r33yw75c44a44r33e44f33u50l28l28y50;w54t28h50en120 0 +H720 +f5 +V2916 +cg +wf1 +h101cc +44o50m78m78a44n50dw91i28nwf5 +91s60a60mwf1 +h101ci +28sw80f33u50n50d50a44m78e44n50t28a44l28l28yw91d50i28f33f33e44r33e44n50tw69f33r33o50mwh119ct +28h50a44tw69i28nwf5 +91e60df1 +60.25]w99H72e44r33ew85i28sw80a44nw91e44x50a44m78p50l28ew85o50fw74t28h50ew84d50i28f33f33e44r33e44n50c44en120 0 +H720 +V3036 +cb +50e44t28w72e44e44nwf5 +75xwf1 +85a44n50dwf5 +75g60:n120 0 +H720 +V3216 +h360c, +60x60/60E60m60a60c60s60/60c60/60v60i60/n120 0 +H720 +f1 +V3396 +cc +44h50a44n50g50e44sw64e44a44c44hw75o50c44c44u50r33r33e44n50c44ew69o50fw58t28h50ew69w72o50r33dwf5 +75E60m60a60c60swf1 +85i28nw75t28h50ew69f33i28l28ew69t28ow75t28h50ew69w72o50r33dwf5 +75v60if1 +60,w50b50u50tn120 0 +H720 +f5 +V3576 +h360c, +60g60/60E60m60a60c60s60/60c60/60v60i60/n120 0 +H720 +f1 +V3756 +cc +44h50a44n50g50e44sw64t28h50ewf2 +69w67h50o50l28ew69f28i28l28ewf1 +69t28owf5 +75v60iwf1 +85i28fw58t28h50e44r33ew69i28sw64t28h50ew69w72o50r33dwf5 +75E60m60a60c60swf1 +85a44n50y50w72h50e44r33ew69i28nw75t28h50ew69f33i28l28e44.n120 0 +H720 +V3912 +h250cN +72e44i28t28h50e44rw66o50fw66t28h50e44s39ew77c44o50m78m78a44n50d50sw73i28sw73p50a44r33t28i28c44u50l28a44r33l28yw84i28n50t28e44r33e44s39t28i28n50gw84i28nw84i28s39o50l28a44t28i28o50n50,w59b50u50tw62t28h50e44yw84a44r33ew78v50a44l28u50a44b50l28ew78w72h50e44nw84c44o50mh78Chy +n120 0 +H720 +V4032 +cb +50i28n50e44dw75w72i28t28hwf5 +75xwf1 +85a44n50dw75w72i28t28hw75t28h50e44m78s39e44l28v50e44s39.n120 0 +H720 +f3 +V4272 +cC +72o50m83p56o50s39i28t33i28o50nn120 0 +H720 +f1 +V4428 +h250cO +72n50ew75w72a44yw81t28ow81t28h50i28n50kw81a44b50o50u50tw59t28h50ewf5 +75xwf1 +91c44o50m78m78a44n50dw82i28sw71t28h50a44t28,w57g50i28v50e44nw82aw76s39e44l28e44c44t28i28o50nw82(33aw76v50a44l28u50ew76o50fw65d50o50t28)w65i28tw60i28t28e44r33a44t28e44sw71t28h50r33o50u50g50hn120 0 +H720 +V4548 +ci +28n50t28e44r33e44s39t28i28n50gw90s39u50b50s39e44l28e44c44t28i28o50n50sw79(33v50a44l28u50e44sw79o50fw72d50o50tw67w72i28t28h50i28n50)33.w89I33nw89o50t28h50e44rw72w72o50r33d50s39,w64i28tw67t28a44k50e44sw78aw83p50i28e44c44ew83o50fw72t28e44x50tw67a44n50dw89c44u50t28sw78i28tw67i28n50t28on120 0 +H720 +V4668 +cs +39m78a44l28l28e44rw59p50i28e44c44e44s39.w76B67u50tw54t28h50ew70t28e44x50tw54t28h50a44tw55i28tw55c44u50t28sw66u50pw77m78a44yw77a44l28r33e44a44d50yw77b50ew71aw71p50i28e44c44ew71c44u50tw55b50yw77aw71p50r33e44v50i28o50u50swf5 +66xwf1 +87c44o50m78m78a44n50dw77o50rw60s39e44l28e44c44t28e44dn120 0 +H720 +V4788 +cb +50yw80awf5 +74gf1 +60.wf5 +80s60a60mf1 +60'33sw69m78o50s39tw58i28n50t28e44r33e44s39t28i28n50gw80p50r33o50p50e44r33t28yw80i28sw69t28h50ew73a44b50i28l28i28t28yw79t28ow79d50e44f33i28n50ew73aw73s39e44q50u50e44n50c44ew73o50fw62c44o50m78m78a44n50d50sw68t28ow79p50e44r33f33o50r33mwh107ca +w73p50a44rh33Chy +n120 0 +H720 +V4908 +ct +28i28c44u50l28a44rw58t28a44s39k50.h25Cdg +wh113cA +w97s39i28m78p50l28ew69e44x50a44m78p50l28ew69i28sw64t28ow75c44h50a44n50g50ew69a44l28lw53o50c44c44u50r33r33e44n50c44e44sw64o50fwf5 +58E60m60a60c60swf1 +85t28owf5 +75e60m60a60c60sf1 +60;w53c44e44r33t28a44i28n50l28yw75t28h50ew69c44o50m78m78a44n50dn120 0 +H720 +x font 0 CI +f0 +V5088 +h360c, +60x60/60E60m60a60c60s60/wh120cc +60/60e60m60a60c60s60/n120 0 +H720 +f1 +V5268 +cw +72i28l28lw53w72o50r33k50,w50b50u50tw53w72ew69c44a44nw75u50s39ew69a44nwf5 +75xwf1 +85c44o50m78m78a44n50dw75t28ow75s39a44v50ew69r33e44t28y50p50i28n50gw75m78o50s39tw53o50fw58t28h50ew69w72o50r33dwf5 +75E60m60a60c60sf1 +60:n120 0 +H720 +x font 0 CI +f0 +V5448 +h360c, +60x60/60E60m60a60c60s60/wh120cx +60/60E60/wh120cc +60/60e60/n120 0 +H720 +f1 +V5628 +c( +33B67l28a44n50k50sw75c44a44nw86b50ew80u50s39e44dw86t28ow86s39e44p50a44r33a44t28ew80c44o50m78m78a44n50d50sw75o50nw86aw80l28i28n50ew80t28ow86m78a44k50ew80t28h50e44mwh114ce +44a44s39i28e44rw69t28ow86r33e44a44d50.25)w94W94h50a44tw65t28h50i28sw76c44o50m78m78a44n50dn120 0 +H720 +V5748 +cd +50o50e44sw65i28sw65f33i28n50dw76a44l28lw53o50c44c44u50r33r33e44n50c44e44sw64o50fwf5 +58E60m60a60c60swf1 +85(f5 +33,60x60/60E60m60a60c60s60/f1 +60)33,w50a44n50dw75t28h50e44nwf2 +75w67i28t28hw75d50o50tw53s39e44tw53t28ow75t28h50a50tw53t28e44x44t28,wf1 +50f33i28n50dw75a44l28lw53o50c44c44u50r33r33e44n50c44e44sn120 0 +H720 +V5868 +co +50fw60t28h50ew71l28e44t28t28e44rwf5 +60Ewf1 +87(f5 +33x60/60E60/f1 +60)33,w52a44n50dw77t28h50e44nwf2 +77w67i28t28hw77d50o50tw55s39e44tw55t28ow77t28h50a50tw55t28e44x44t28,wf1 +52r33u50nw78t28h50ew72c44o50m78m78a44n50dwf5 +78c60/60e60/wf1 +88t28ow78c44h50a44n50g50ew72t28h50ew72c44h50a44r33a44c44t28e44rw61t28on120 0 +H720 +V5988 +cl +28o50w72e44rw71c44a44s39e44.w88N72o50t28ew82t28h50a44tw66t28h50ew82a44d50d50r33e44s39sw76f33o50rw70t28h50ew81c44o50m78m78a44n50dwh87Cem +wh137ct +28h50ew81w72h50o50l28ew81f33i28l28e44,w62s39p50e44c44i28f33i28e44dw87b50yw87aw81c44o50m78m78awh81Cem +wh137ci +28sw76o50n50l28yn120 0 +H720 +V6108 +cg +50i28v50e44nw77t28ow77t28h50ew71l28e44f33t28m78o50s39tw55p50i28e44c44ew71o50fw60t28h50ew71c44o50m78m78a44n50d50;w55t28h50ew71r33e44s39tw55o50fw60t28h50ew72p50i28e44c44e44sw67h50a44v50ew72d50o50tw56s39e44tw56f33o50rw61t28h50e44mwh106cb +50yw78t28h50ew72e44x50e44c44u50t28i28o50nw78o50fn120 0 +H720 +V6228 +ct +28h50ew69p50i28e44c44e44sw64t28ow75t28h50e44i28rw58l28e44f33t28.n120 0 +H720 +V6384 +h250cA +72sw67a44n50o50t28h50e44rw61s39i28m78p50l28ew72e44x50a44m78p50l28e44,w53c44o50n50s39i28d50e44rw61aw72p50r33o50b50l28e44mwh106cs +39o50l28v50e44dw78a44b50o50v50e44:w57p50r33i28n50t28i28n50gw79a44l28lw57l28i28n50e44sw68i28nw79t28h50ew73f33i28l28ew73c44o50n50t28a44i28n50i28n50gn120 0 +H720 +V6504 +ct +28h50ew69w72o50r33dwf5 +75E60m60a60c60s60:n120 0 +H720 +f1 +s8 +V6880 +Cru +h40Cru +h40Cru +h40Cru +h40Cru +h40Cru +h40Cru +h40Cru +h40Cru +h40Cru +h40Cru +h40Cru +h40Cru +h40Cru +h40Cru +h40Cru +h40Cru +h40Cru +n100 0 +H720 +V6980 +Cdg +w70T49h40ew55o40b40v40i22o40u40sw51a35n40a35l22o40g40yw60w58i22t22hw60s31h40e35l22lw42p40i22p40e35l22i22n40e35sw51i22sw51o40n40l22yw60p40a35r26t22i22a35l22l22yw60v40a35l22i22d40,w40b40e35c35a35u40s31ew55t22h40ew55i22n40d40i22v40i22d40u40a35lwf5 +42s48a48mwf1 +68c35o40m62m62a35n40d40sw51a35r26ew56a35l22lw43w58o40r26k40i22n40gw61o40nn100 0 +H720 +V7080 +ct +22h40ew55s31a35m62ew55t22e35x40t22;w42i22tw42i22sw51o40n40l22yw60h40o40ww78t22h40ew55t22e35x40tw42i22sw51s31l22i22c35e35dw60u40pw60t22h40a35tw42i22sw51c35h40a35n40g40i22n40g40.n100 0 +V7920 +p8 +x font 1 R +x font 2 I +x font 3 B +x font 4 BI +x font 5 CW +x font 6 H +x font 7 HI +x font 8 HB +x font 9 S1 +x font 10 S +s10 +f1 +H720 +V480 +h2077Chy +w33 258w50 h25Chy +wn120 0 +H720 +x font 0 CI +f0 +V900 +h360c, +60x60/60.60*60\60n60/wh120cg +60/60E60m60a60c60s60/60pn120 0 +H720 +f5 +V1020 +h360cg +60e60n60e60r60a60lwh120ci +60n60t60r60o60d60u60c60t60i60o60nwh120ct +60owh120ct +60h60ewh120cc +60o60m60m60a60n60d60swh120ci +60nwh120cE +60m60a60c60swh120ca +60n60dwh120ct +60owh120ct +60r60ywh120ct +60owh120cs +60h60o60wn120 0 +H720 +V1140 +h360ct +60h60ewh120cm +60e60t60h60o60dwh120ci +60nwh120ct +60h60ewh120cm +60a60d60n60e60s60swh120ct +60h60a60twh120ci +60swh120ct +60h60ewh120cE +60m60a60c60swh120cc +60o60m60m60a60n60dwh120cs +60t60r60u60c60t60u60r60e60.n120 0 +H720 +f1 +V1320 +cT +61h50i28sw79c44o50m78m78a44n50dw90s39a44y50sw79t28ow90b50r33e44a44kw90t28h50ew84f33i28l28ew84i28n50t28ow90l28i28n50e44sw79(f5 +33,60x60/60.60*60\60n60/f1 +60)33,w65a44n50dw90f33o50rw73e44a44c44hw90l28i28n50ew84t28h50a44tw68c44o50n50t28a44i28n50sw79t28h50ew85s39t28r33i28n50gn120 0 +H720 +f5 +V1440 +cE +60m60a60c60swf1 +90(f5 +33g60/60E60m60a60c60s60/f1 +60)33,w55r33u50nw80t28h50ew74c44o50m78m78a44n50dwf5 +80pwf1 +90w72i28t28hw80d50o50tw58s39e44tw58t28ow80t28h50ew74l28i28n50ew73(33n50o50tw57t28h50ew73m78a44t28c44hw79o50fwf5 +62E60m60a60c60sf1 +60)33,w54w72h50i28c44hw79p50r33i28n50t28sn120 0 +H720 +V1560 +ct +28h50ew72l28i28n50e44.w78T61ow78s39a44v50ew72t28y50p50i28n50g50,w53b50e44c44a44u50s39ewf5 +72.60*60\60nwf1 +88i28sw67aw72c44o50m78m78o50nw78p50a44t28t28e44r33nw78i28nwf5 +78xwf1 +88c44o50m78m78a44n50d50s39,w53i28fw61t28h50ewf5 +73xwf1 +89i28sw68f33o50l28l28o50w72e44dw79i28m78m78e44d50ih28Chy +n120 0 +H720 +V1680 +ca +44t28e44l28yw75b50yw75aw69s39p50a44c44e44,w50t28h50ew69p50a44t28t28e44r33nwf5 +75.60*60\60nwf1 +85i28sw64a44s39s39u50m78e44d50.w75T61h50e44r33e44f33o50r33e44,w50t28h50ew69a44b50o50v50ew69c44o50u50l28dw75b50ew69w72r33i28t28t28e44nw75m78o50r33ew69s39u50c44c44i28n50c44t28l28y50:n120 0 +H720 +x font 0 CI +f0 +V1860 +h360c, +60xwh120cg +60/60E60m60a60c60s60/60pn120 0 +H720 +f1 +V2040 +cT +61h50ew69s39o50l28u50t28i28o50nw75w72ew69u50s39e44dw75b50e44f33o50r33ew69w72a44sn120 0 +H720 +x font 0 CI +f0 +V2220 +h360c, +60x60/60E60m60a60c60s60/60+60-60pn120 0 +H720 +f1 +V2400 +cw +72h50i28c44hw81r33u50n50sw70t28h50ew75c44o50m78m78a44n50dwf5 +81+60-60pwf1 +91w72i28t28hw81d50o50tw59s39e44tw59t28ow81e44a44c44hw82m78a44t28c44hw82o50fwf5 +65E60m60a60c60swf1 +92i28nw82t28h50ew76f33i28l28ew76(33r33e44c44a44l28lw60t28h50a44tw60t28h50ew76i28d50i28o50mwf5 +h110c+ +60-60pn120 0 +H720 +f1 +V2520 +cp +50r33i28n50t28sw64t28h50ew69l28i28n50ew69c44o50n50t28a44i28n50i28n50gw75t28h50ew69e44n50dw75o50fw58d50o50t28)33.n120 0 +H720 +V2676 +h250cT +61h50ew77t28w72ow83c44o50m78m78a44n50d50sw72u50s39u50a44l28l28yw83p50r33o50d50u50c44ew77t28h50ew77s39a44m78ew77r33e44s39u50l28tw61(33t28h50ewf5 +77+60-60pwf1 +93f33o50r33mwh111cw +72i28l28lw61p50r33i28n50tw61aw77l28i28n50ew77t28w72i28c44ew77i28fw66i28tw62c44o50nh50Chy +n120 0 +H720 +V2796 +ct +28a44i28n50swf5 +66E60m60a60c60swf1 +87t28w72i28c44e44)33.w77W94h50i28c44hw77i28sw66b50e44t28t28e44r33?wf5 +96,60x60/60E60m60a60c60s60/60+60-60pwf1 +87i28sw66e44a44s39i28e44rw60t28ow77t28y50p50ew71a44n50dw77w72i28l28lw55b50ew70m78u50c44hw76f33a44s39t28e44rw59i28fw59t28h50ew70f33i28l28en120 0 +H720 +V2916 +ci +28sw83l28a44r33g50ew88a44n50dw95t28h50e44r33ew89a44r33ew89f33e44wwh117co +50c44c44u50r33r33e44n50c44e44sw84o50fw78t28h50ew89s39t28r33i28n50g50,w70b50u50tw73i28tw73i28sw84r33e44a44l28l28yw95a44nw95o50d50dw95s39p50e44c44i28a44lw73c44a44s39e44.wf5 +95,60x60/60.60*60\60n60/n120 0 +H720 +V3036 +cg +60/60E60m60a60c60s60/60pwf1 +88i28sw67s39l28o50w72e44rwh61Cem +wh128ci +28tw56b50r33e44a44k50sw67e44a44c44hw78l28i28n50ew72o50u50tw56s39e44p50a44r33a44t28e44l28y50,w53t28h50e44nw77e44x50a44m78i28n50e44sw66i28tw55f33o50rw60aw71m78a44t28c44hwh77Cem +wh127cb +50u50tw55i28sw66c44o50n50c44e44ph50Chy +n120 0 +H720 +V3156 +ct +28u50a44l28l28yw80c44l28e44a44n50e44r33,w55a44n50dw81g50e44n50e44r33a44l28i28z44e44sw70m78o50r33ew75e44a44s39i28l28y50.w81F56o50rw64e44x50a44m78p50l28e44,w56c44o50n50s39i28d50e44rw64t28h50ew75f33o50l28l28o50w72i28n50gw81p50i28e44c44ew75o50fw64t28h50ew75E61m78a44c44sw70m78a44nh50Chy +n120 0 +H720 +V3276 +cu +50a44l28:n120 0 +H720 +f5 +V3456 +h360cc +60o60m60m60a60n60dwh120cn +60a60m60e60=60"60a60p60p60e60n60d60-60t60o60-60f60i60l60e60"60,wh120ck +60e60y60=60"60[60u60n60b60o60u60n60d60]60"n120 0 +H720 +V3576 +h360cT +60a60k60e60swh120ct +60h60ewh120cc +60o60n60t60e60n60t60swh120co +60fwh120ct +60h60ewh120cc +60u60r60r60e60n60twh120cb +60u60f60f60e60rwh120ca +60n60dwh120ca +60p60p60e60n60d60swh120ci +60twh120ct +60owh120ct +60h60en120 0 +H720 +V3696 +h360cn +60a60m60e60dwh120cf +60i60l60e60.wh120cI +60fwh120ct +60h60ewh120cf +60i60l60e60swh120cd +60o60e60s60n60'60twh120ce +60x60i60s60t60,wh120ci +60twh120cw +60i60l60lwh120cb +60ewh120cc +60r60e60a60t60e60d60.n120 0 +H720 +V3936 +h360cc +60o60m60m60a60n60dwh120cn +60a60m60e60=60"60a60p60r60o60p60o60s60"60,wh120ck +60e60y60=60"60E60S60C60-60?60"n120 0 +H720 +V4056 +h360cP +60r60o60m60p60t60swh120cf +60o60rwh120ca +wh120ck +60e60y60w60o60r60dwh120ca +60n60dwh120ct +60h60e60nwh120cp +60r60i60n60t60swh120ca +wh120cl +60i60s60twh120co +60fwh120ct +60h60o60s60ewh120cc +60o60m60m60a60n60d60sn120 0 +H720 +V4176 +h360cw +60h60o60s60ewh120cs +60h60o60r60twh120cd +60e60s60c60r60i60p60t60i60o60nwh120cc +60o60n60t60a60i60n60swh120ct +60h60a60twh120ck +60e60y60w60o60r60d60.wh180cF +60o60rwh120ce +60x60a60m60p60l60e60,n120 0 +H720 +V4296 +h360ci +60fwh120cy +60o60uwh120cf +60o60r60g60e60twh120cw +60h60i60c60hwh120cc +60o60m60m60a60n60d60swh120cd +60e60a60lwh120cw +60i60t60hwh120cw +60i60n60d60o60w60s60,wh120cj +60u60s60twh120ct +60y60p60en120 0 +H720 +V4416 +h360c" +60@60b60[60E60S60C60-60?60]60@60t60[60w60i60n60d60o60w60]60@60b60[60E60S60C60]60"60.n120 0 +H720 +f2 +V4656 +h360ca +50n50dw75s39ow75o50nn120 0 +H720 +f1 +V4836 +cT +61h50i28sw66t28e44x50tw55c44o50n50s39i28s39t28sw66o50fw60g50r33o50u50p50sw66o50fw60n50o50n50-33e44m78p50t28yw77l28i28n50e44s39,w52w72i28t28hw77aw71s39i28m78p50l28ew71f33o50r33m78a44tw55f33o50rw60t28h50ew71t28e44x50tw55w72i28t28h50i28nw77e44a44c44hw78g50r33o50u50p50.w78I33m78a44gh50Chy +n120 0 +H720 +V4956 +ci +28n50ew73t28h50a44tw57w72ew73w72a44n50t28e44dw79t28ow79f33i28n50dw79t28h50ew73d50e44s39c44r33i28p50t28i28o50nw79o50fw62t28h50ew73`33a44p50r33o50p50o50s39'w62c44o50m78m78a44n50d50.w78T61h50ew72p50r33o50b50l28e44mwh106ci +28sw67t28ow78b50r33e44a44kw78t28h50ew72f33i28l28ew72i28n50t28on120 0 +H720 +V5076 +ci +28n50d50i28v50i28d50u50a44lw53d50e44s39c44r33i28p50t28i28o50n50s39,w50a44n50dw75t28h50e44nw75t28ow75f33i28n50dw75t28h50ew69d50e44s39c44r33i28p50t28i28o50nw75o50fw58`33a44p50r33o50p50o50s39'w58a44n50dw75t28ow75p50r33i28n50tw53i28t28.w75T61h50ew69s39o50l28u50t28i28o50nw75i28sw64s39t28r33a44i28g50h50th28Chy +n120 0 +H720 +V5196 +cf +33o50r33w72a44r33d50:n120 0 +H720 +x font 0 CI +f0 +V5376 +h360c, +60x60/60(60.60+60\60n60)60+60/wh120cg +60/60c60o60m60m60a60n60dwh120cn +60a60m60e60=60"60a60p60r60o60p60o60s60"60/60pn120 0 +H720 +f5 +V5496 +h360cc +60o60m60m60a60n60dwh120cn +60a60m60e60=60"60a60p60r60o60p60o60s60"60,wh120ck +60e60y60=60"60E60S60C60-60?60"n120 0 +H720 +V5616 +h360cP +60r60o60m60p60t60swh120cf +60o60rwh120ca +wh120ck +60e60y60w60o60r60dwh120ca +60n60dwh120ct +60h60e60nwh120cp +60r60i60n60t60swh120ca +wh120cl +60i60s60twh120co +60fwh120ct +60h60o60s60ewh120cc +60o60m60m60a60n60d60sn120 0 +H720 +V5736 +h360cw +60h60o60s60ewh120cs +60h60o60r60twh120cd +60e60s60c60r60i60p60t60i60o60nwh120cc +60o60n60t60a60i60n60swh120ct +60h60a60twh120ck +60e60y60w60o60r60d60.wh180cF +60o60rwh120ce +60x60a60m60p60l60e60,n120 0 +H720 +V5856 +h360ci +60fwh120cy +60o60uwh120cf +60o60r60g60e60twh120cw +60h60i60c60hwh120cc +60o60m60m60a60n60d60swh120cd +60e60a60lwh120cw +60i60t60hwh120cw +60i60n60d60o60w60s60,wh120cj +60u60s60twh120ct +60y60p60en120 0 +H720 +V5976 +h360c" +60@60b60[60E60S60C60-60?60]60@60t60[60w60i60n60d60o60w60]60@60b60[60E60S60C60]60"60.n120 0 +H720 +f1 +V6156 +cT +61h50ew73r33e44g50u50l28a44rw62e44x50p50r33e44s39s39i28o50nwf5 +79(60.60+60\60n60)60+wf1 +89m78a44t28c44h50e44sw68o50n50ew73o50rw63m78o50r33ew74l28i28n50e44sw69w72i28t28hw80o50n50ew74o50rw63m78o50r33ew74c44h50a44r33a44c44t28e44r33sw69e44a44c44h50,w55t28h50a44tw58i28s39,w55t28h50en120 0 +H720 +V6276 +ct +28e44x50twh197cb +50e44t28w72e44e44nwh219cb +50l28a44n50kwh219cl +28i28n50e44s39,wh194cs +39owf5 +h219c, +60x60/60(60.60+60\60n60)60+60/wf1 +h228ce +44x50t28r33a44c44t28swh207ce +44a44c44hwh218cd +50e44s39c44r33i28p50t28i28o50n50;wh196ct +28h50e44nn120 0 +H720 +f5 +V6396 +cg +60/60c60o60m60m60a60n60d60 60n60a60m60e60=60"60a60p60r60o60p60o60s60"60/wf1 +85s39e44l28e44c44t28sw64t28h50ew69d50e44s39c44r33i28p50t28i28o50nw75f33o50rw58`33a44p50r33o50p50o50s39'w58a44n50dwf5 +75pwf1 +85p50r33i28n50t28sw64i28t28.n120 0 +H720 +V6552 +h250cI +33m78a44g50i28n50ew70t28h50a44tw54w72ew70h50a44dw76aw70Cw93p50r33o50g50r33a44mwh104cc +44o50n50t28a44i28n50i28n50gw76t28h50ew70v50a44r33i28a44b50l28ewf5 +70nf1 +60,w51b50u50tw54w72ew70w72a44n50t28e44dw77t28ow77c44h50a44n50g50ew71i28tw55t28owf5 +77n60u60mf1 +60.w77T61h50i28sn120 0 +H720 +V6672 +cc +44o50m78m78a44n50dw75i28sw64aw69f33i28r33s39tw53c44u50t28:n120 0 +H720 +x font 0 CI +f0 +V6852 +h360c, +60x60/60n60/wh120cc +60/60n60u60m60/n120 0 +H720 +f1 +V7032 +cb +50u50tw54i28sw65o50b50v50i28o50u50s39l28yw76f33l28a44w72e44d50:w54i28tw54w72i28l28lw54c44h50a44n50g50ew70a44l28lwf5 +54nf1 +60'33sw65i28nw76t28h50ew70f33i28l28e44,w51n50o50tw54j28u50s39tw54t28h50ewf2 +70i28d50e44n50t28i28f28i28e44rwf5 +65nf1 +60.w76Aw98b50e44t28t28e44rw59s39o50l28u50t28i28o50nw77i28sw66t28ow77u50s39en120 0 +H720 +V7152 +ca +44nwf5 +75xwf1 +85c44o50m78m78a44n50dw75t28ow75e44x50t28r33a44c44tw53t28h50ew69i28d50e44n50t28i28f33i28e44r33s39,w50a44n50dw75t28h50e44nw75u50s39ewf5 +69gwf1 +85t28ow75f33i28n50dw75t28h50ewf5 +69nf1 +60'33s39:n120 0 +V7920 +p9 +x font 1 R +x font 2 I +x font 3 B +x font 4 BI +x font 5 CW +x font 6 H +x font 7 HI +x font 8 HB +x font 9 S1 +x font 10 S +s10 +f1 +H720 +V480 +h2077Chy +w33 259w50 h25Chy +wn120 0 +H720 +x font 0 CI +f0 +V900 +h360c, +60x60/60[60a60-60z60A60-60Z60_60]60[60a60-60z60A60-60Z60_60060-60960]60*60/wh120cg +60/60n60/wh120cv +60/60.60.60/wh120cc +60/60n60u60m60/n120 0 +H720 +f1 +V1080 +cI +33tw59l28o50o50k50sw70a44w72f33u50l28,w56b50u50tw59i28t28'33sw70f33a44i28r33l28yw81e44a44s39yw81t28ow81u50n50d50e44r33s39t28a44n50dw81w72h50e44nw81r33e44a44dw81l28e44f33tw60t28ow82r33i28g50h50t28.w82Awh104cC +w99i28d50e44n50t28i28f33i28e44rw65i28sw71a44nw82a44l28p50h50a44b50e44t28i28cw76o50rn120 0 +H720 +V1200 +cu +50n50d50e44r33s39c44o50r33ew75f33o50l28l28o50w72e44dw81b50yw81z44e44r33ow81o50rw63m78o50r33ew74a44l28p50h50a44n50u50m78e44r33i28c44sw69o50rw63u50n50d50e44r33s39c44o50r33e44s39,w55t28h50a44tw58i28s39,w55m78a44t28c44h50e44sw69o50fw63t28h50ew74r33e44g50u50l28a44rw63e44x50p50r33e44sh39Chy +n120 0 +H720 +V1320 +cs +39i28o50nwf5 +80[60a60-60z60A60-60Z60_60]60[60a60-60z60A60-60Z60_60060-60960]60*f1 +60.w80T61h50ewf5 +74gwf1 +90c44o50m78m78a44n50dw80s39e44l28e44c44t28sw69t28h50o50s39ew74i28d50e44n50t28i28f33i28e44r33sw69c44o50n50t28a44i28n50i28n50gwf5 +80nf1 +60,w55a44n50dw80t28h50ewf5 +75vwf1 +91i28sn120 0 +H720 +V1440 +ca +w76t28r33i28c44k50:w60i28tw60r33e44j28e44c44t28sw71t28h50o50s39ew76i28d50e44n50t28i28f33i28e44r33sw70c44o50n50t28a44i28n50i28n50gw81m78o50r33ew75t28h50a44nw81o50n50ew75c44h50a44r33a44c44t28e44r33.w81H72e44n50c44ew75t28h50ewf5 +75c60/60n60u60m60/wf1 +91a44p50p50l28i28e44sw70o50n50l28yw81t28on120 0 +H720 +V1560 +cf +33r33e44e44-33s39t28a44n50d50i28n50gwf5 +75nf1 +60'33s39.n120 0 +H720 +V1716 +h250cT +61h50e44r33ew73i28sw68s39t28i28l28lw57aw73p50r33o50b50l28e44mwh107ch +50e44r33e44:w57w72ew73d50o50n50'33tw57w72a44n50tw57t28ow79c44h50a44n50g50ewf5 +73nf1 +60'33sw68t28h50a44tw58a44r33ew74p50a44r33tw58o50fw63t28h50ew74c44h50a44r33a44c44t28e44rw63c44o50n50s39t28a44n50twf5 +58\60nf1 +60.n120 0 +H720 +V1836 +cT +61h50e44r33ew70i28sw65aw70c44o50m78m78a44n50dwf5 +76yf1 +60,w51c44o50m78p50l28e44m78e44n50t28a44r33yw76t28owf5 +76xf1 +60,w51t28h50a44tw54i28sw65j28u50s39tw53w72h50a44tw53w72ew69n50e44e44d50:wf5 +88y60/f2 +60p50a50t28t28e44r39nf5 +50/f2 +60c44o50m72m72a50n50dwf1 +75r33u50n50sw64t28h50ew69c44o50mh78Chy +n120 0 +H720 +V1956 +cm +78a44n50dw83o50nw83t28h50ew78p50i28e44c44e44sw73o50fw67t28e44x50twf2 +62b50e44t28w67e44e44nwf1 +84m78a44t28c44h50e44sw73o50fw67t28h50ew78p50a44t28t28e44r33n50;w62i28fwf5 +67xwf1 +94s39e44l28e44c44t28s39,wf5 +59ywf1 +94r33e44j28e44c44t28s39.w84H72e44r33ew78i28sw73t28h50ew78f33i28n50a44lw62c44o50mh78Chy +n120 0 +H720 +V2076 +cm +78a44n50d50:n120 0 +H720 +x font 0 CI +f0 +V2256 +h360c, +60y60/60\60\60n60/wh120cx +60/60[60a60-60z60A60-60Z60_60]60[60a60-60z60A60-60Z60_60060-60960]60*60/wh120cg +60/60n60/wh120cv +60/60.60.60/wh120cc +60/60n60u60m60/n120 0 +H720 +f1 +V2436 +cT +61h50ewf5 +78y60/60\60\60n60/wf1 +94(33w72i28t28hw85b50a44c44k50s39l28a44s39hw85d50o50u50b50l28e44dw85t28ow85m78a44k50ew79i28tw63aw79l28i28t28e44r33a44lw63c44h50a44r33a44c44t28e44r33)w68r33e44m78o50v50e44sw74t28h50ew79t28w72o50-33c44h50a44r33a44c44t28e44rw68s39e44q50u50e44n50c44en120 0 +H720 +f5 +V2556 +c\ +60nwf1 +91f33r33o50mwh109cc +44o50n50s39i28d50e44r33a44t28i28o50n50,w56s39ow81t28h50ew75r33e44s39tw59o50fw64t28h50ew75c44o50m78m78a44n50dw81w72i28l28lw59n50o50tw59t28o50u50c44hw81i28t28.w81T61h50e44r33ew75i28sw70m78o50r33ew75w72ew75c44o50u50l28dw81d50ow81h50e44r33e44;w59f33o50rn120 0 +H720 +V2676 +ce +44x50a44m78p50l28e44,w55a44n50o50t28h50e44rwf5 +63ywf1 +90c44o50u50l28dw80b50ew74p50r33e44f33i28x50e44dw80t28ow80p50r33o50t28e44c44tw58c44o50m78m78e44n50t28sw69i28nw80t28h50ew74c44o50d50e44.w80Iw63w72o50n50'33tw58e44l28a44b50o50r33a44t28ew74t28h50ew74e44x50a44m78p50l28ew75a44n50yn120 0 +H720 +V2796 +cf +33u50r33t28h50e44r33,w60b50u50tw63y50o50uw85s39h50o50u50l28dw85h50a44v50ew79a44nw85i28d50e44aw79o50fw68t28h50ew79w72a44yw85i28nw85w72h50i28c44hw85t28h50ew79l28o50o50p50i28n50gw84a44n50dw84c44o50n50d50i28t28i28o50n50a44lw62c44o50m78m78a44n50d50sw73i28nwf5 +84s60a60mn120 0 +H720 +f1 +V2916 +cm +78a44yw75b50ew69c44o50m78p50o50s39e44dw75t28ow75d50ow75i28n50t28e44r33e44s39t28i28n50gw75t28h50i28n50g50s39.n120 0 +H720 +f3 +V3156 +cG +78r44o50u56p56i28n56gn120 0 +H720 +f1 +V3312 +h250cT +61h50e44r33ew82i28sw77a44n50o50t28h50e44rw72w72a44yw89t28ow89a44r33r33a44n50g50ew83c44o50m78m78a44n50d50s39.w89B67yw89e44n50c44l28o50s39i28n50gw89t28h50e44mwh117ci +28nw89b50r33a44c44ew83b50r33a44c44k50e44t28swf5 +78{60}f1 +60,w64c44o50m78m78a44n50d50sn120 0 +H720 +V3432 +cm +78a44yw82b50ew76a44p50p50l28i28e44dw82i28nw82p50a44r33a44l28l28e44l28.w82T61h50i28sw70e44x50a44m78p50l28ew75u50s39e44sw70t28h50ewf5 +75=wf1 +91c44o50m78m78a44n50d50,w56w72h50i28c44hw81r33e44p50o50r33t28sw70t28h50ew75l28i28n50ew75a44n50dw81c44h50a44r33a44c44t28e44rw64n50u50mh78Chy +n120 0 +H720 +V3552 +cb +50e44r33sw64o50fw58d50o50t28,w50t28o50g50e44t28h50e44rw58w72i28t28hwf5 +75pf1 +60,w50t28ow75r33e44p50o50r33tw53o50nw75a44p50p50e44a44r33a44n50c44e44sw64o50fwf5 +58E60m60a60c60swf1 +85i28nw75o50u50rw58o50r33i28g50i28n50a44lw53f33i28l28e44:n120 0 +H720 +x font 0 CI +f0 +V3732 +h360c, +60pn120 0 +H720 +f5 +V3852 +h360cT +60h60i60swh120cm +60a60n60u60a60lwh120ci +60swh120co +60r60g60a60n60i60z60e60dwh120ci +60nwh120ca +wh120cr +60a60t60h60e60rwh120ch +60a60p60h60a60z60a60r60dwh120cm +60a60n60n60e60r60.wh180cT +60h60ewh120cf +60i60r60s60tn120 0 +H720 +V3972 +h360cs +60e60v60e60r60a60lwh120cs +60e60c60t60i60o60n60swh120cw +60e60r60ewh120cw +60r60i60t60t60e60nwh120ch +60a60s60t60i60l60ywh120ci +60nwh120ca +60nwh120ca +60t60t60e60m60p60twh120ct +60owh120cp +60r60o60v60i60d60ewh120ca +n120 0 +H720 +V4092 +h360cg +60e60n60e60r60a60lwh120ci +60n60t60r60o60d60u60c60t60i60o60nwh120ct +60owh120ct +60h60ewh120cc +60o60m60m60a60n60d60swh120ci +60nwh120cE +60m60a60c60swh120ca +60n60dwh120ct +60owh120ct +60r60ywh120ct +60owh120cs +60h60o60wn120 0 +H720 +V4212 +h360ct +60h60ewh120cm +60e60t60h60o60dwh120ci +60nwh120ct +60h60ewh120cm +60a60d60n60e60s60swh120ct +60h60a60twh120ci +60swh120ct +60h60ewh120cE +60m60a60c60swh120cc +60o60m60m60a60n60dwh120cs +60t60r60u60c60t60u60r60e60.n120 0 +H720 +x font 0 CI +f0 +V4332 +h360c, +60x60/60E60m60a60c60s60/60{n120 0 +H720 +V4452 +h610c= +n120 0 +H720 +V4572 +h610c+ +60-60pn120 0 +H720 +V4692 +h360c} +n120 0 +H720 +f5 +V4812 +h360c3 +60;wh120c# +60160760160,60#601607606n120 0 +H720 +V4932 +h360cg +60e60n60e60r60a60lwh120ci +60n60t60r60o60d60u60c60t60i60o60nwh120ct +60owh120ct +60h60ewh120cc +60o60m60m60a60n60d60swh120ci +60nwh120cE +60m60a60c60swh120ca +60n60dwh120ct +60owh120ct +60r60ywh120ct +60owh120cs +60h60o60wn120 0 +H720 +V5052 +h360c4 +60;wh120c# +60260360460,60#602603609n120 0 +H720 +V5172 +h360ct +60h60ewh120cm +60e60t60h60o60dwh120ci +60nwh120ct +60h60ewh120cm +60a60d60n60e60s60swh120ct +60h60a60twh120ci +60swh120ct +60h60ewh120cE +60m60a60c60swh120cc +60o60m60m60a60n60dwh120cs +60t60r60u60c60t60u60r60e60.n120 0 +H720 +f1 +V5352 +c( +33T61h50ew79n50u50m78b50e44rw68b50e44f33o50r33ew79t28h50ew79s39e44m78i28c44o50l28o50nw85i28sw74t28h50ew79l28i28n50ew79n50u50m78b50e44r33;w64t28h50ew80n50u50m78b50e44r33sw75b50e44g50i28n50n50i28n50gw86w72i28t28hwf5 +86#wf1 +96a44r33ew80c44h50a44r33a44c44t28e44rw69n50u50mh78Chy +n120 0 +H720 +V5472 +cb +50e44r33s39.25)w91A72sw72aw77m78o50r33ew77i28n50t28e44r33e44s39t28i28n50gw83e44x50a44m78p50l28e44,w58c44o50n50s39i28d50e44rw66c44h50a44n50g50i28n50gw83a44l28lw61o50c44c44u50r33r33e44n50c44e44sw71o50fwf5 +65E60m60a60c60swf1 +92t28owf5 +82v60iwf1 +92a44n50dw82v50i28c44ew76v50e44r33s39a44.n120 0 +H720 +V5592 +cW +94ew69c44a44nw75t28y50p50en120 0 +H720 +x font 0 CI +f0 +V5772 +h360c, +60x60/60E60m60a60c60s60|60v60i60/60{n120 0 +H720 +V5892 +h610cg +60/60E60m60a60c60s60/wh120cc +60/60v60i60/n120 0 +H720 +V6012 +h610cg +60/60v60i60/wh120cc +60/60E60m60a60c60s60/n120 0 +H720 +V6132 +h360c} +n120 0 +H720 +f1 +V6312 +co +50rw58e44v50e44nn120 0 +H720 +x font 0 CI +f0 +V6492 +h360c, +60x60/60[60a60-60z60A60-60Z60]60+60/60{n120 0 +H720 +V6612 +h610cg +60/60E60m60a60c60s60/wh120cv +60/60.60.60.60.60.60.60/wh120cc +60/60v60i60/n120 0 +H720 +V6732 +h610cg +60/60v60i60/wh120cv +60/60.60.60.60/wh120cc +60/60E60m60a60c60s60/n120 0 +H720 +V6852 +h360c} +n120 0 +H720 +f1 +V7032 +ct +28ow75m78a44k50ew69s39u50r33ew69w72ew69d50o50n50'33tw53c44h50a44n50g50ew69s39t28r33i28n50g50sw64e44m78b50e44d50d50e44dw75i28nw75w72o50r33d50s39.n120 0 +V7920 +p10 +x font 1 R +x font 2 I +x font 3 B +x font 4 BI +x font 5 CW +x font 6 H +x font 7 HI +x font 8 HB +x font 9 S1 +x font 10 S +s10 +f1 +H720 +V480 +h2052Chy +w33 251500w50 h25Chy +wn120 0 +H720 +f3 +V840 +cM +94u56l28t33i28p56l28ew69C72h56a50n56g50e44sn120 0 +H720 +f1 +V996 +h250cY +72o50uw89m78i28g50h50tw67w72o50n50d50e44rw72w72h50y50,w64o50n50c44ewf5 +83E60m60a60c60swf1 +99h50a44sw78b50e44e44nw89c44h50a44n50g50e44dw89t28owf5 +89v60iwf1 +99i28nw90t28h50ew84a44b50o50v50ew84e44x50a44m78p50l28e44,w65t28h50ew84s39e44c44o50n50dn120 0 +H720 +V1116 +cc +44o50m78m78a44n50dw89i28nw89t28h50ew83b50r33a44c44e44sw78d50o50e44s39n50'33tw67p50u50tw67i28tw67b50a44c44kw89a44g50a44i28n50.w89T61h50ew83r33e44a44s39o50nw88i28sw77t28h50a44tw66t28h50ew82c44o50m78m78a44n50d50sw77a44r33ew82r33u50nw88i28nw88p50a44r33a44l28l28e44l28:n120 0 +H720 +V1236 +cw +72i28t28h50i28nw85a44n50yw85t28o50p50-33l28e44v50e44lwf5 +63s60a60mwf1 +95c44o50m78m78a44n50d50,w60a44l28lw63c44h50a44n50g50e44sw74t28ow85t28h50ew79f33i28l28ew79r33e44f33e44rw68t28ow85t28h50ew79s39t28a44t28ew79o50fw68t28h50ew79f33i28l28ew79b50e44f33o50r33ew79a44n50yw85o50fw69t28h50en120 0 +H720 +V1356 +cc +44h50a44n50g50e44sw66i28nw77t28h50a44tw54c44o50m78m78a44n50dw76a44r33ew70m78a44d50e44.w76A72f33t28e44rw59a44l28lw54t28h50ew70c44h50a44n50g50e44sw65h50a44v50ew70b50e44e44nw76d50e44t28e44r33m78i28n50e44d50,w51t28h50e44yw76a44r33ew70a44l28lw54a44p50p50l28i28e44dw76s39i28m78u50lh28Chy +n120 0 +H720 +V1476 +ct +28a44n50e44o50u50s39l28y50.n120 0 +H720 +V1632 +h250cT +61h50i28sw79m78e44a44n50s39,w65a44sw80m78e44n50t28i28o50n50e44d50,w66t28h50a44tw69c44o50m78m78a44n50d50sw80w72i28t28h50i28nw91aw85c44o50m78p50o50u50n50dw91c44o50m78m78a44n50dw91s39e44ew85t28h50ew85s39t28a44t28ew85o50fw74t28h50ew85f33i28l28en120 0 +H720 +V1752 +cb +50e44f33o50r33ew93a44n50yw99o50fw82t28h50ew93c44h50a44n50g50e44sw88a44p50p50l28y50.w99T61h50i28sw88m78e44t28h50o50dw99o50fw82e44v50a44l28u50a44t28i28o50nw99m78a44k50e44sw88s39o50m78ew93t28h50i28n50g50sw88e44a44s39i28e44rw82(33s39u50c44hw99a44sw87t28h50en120 0 +H720 +V1872 +ce +44x50c44h50a44n50g50ew70o50fwf5 +59E60m60a60c60swf1 +86a44n50dwf5 +76v60if1 +60)33,w51a44n50dw76s39o50m78ew70t28h50i28n50g50sw65h50a44r33d50e44r33.w76F56o50rw59i28n50s39t28a44n50c44e44,w51i28tw54i28sw65i28m78p50o50s39s39i28b50l28ew71t28ow77u50s39ew71awf5 +71pwf1 +87c44o50m78m78a44n50dw77t28on120 0 +H720 +V1992 +cp +50r33i28n50tw54t28h50ew70c44h50a44n50g50e44sw65a44sw65t28h50e44yw76h50a44p50p50e44n50,w51b50e44c44a44u50s39ew70t28h50e44yw76h50a44v50e44n50'33tw54h50a44p50p50e44n50e44dw76w72h50e44nw76t28h50ewf5 +70pwf1 +86i28sw65e44x50e44c44u50t28e44d50.w76A72nw75i28n50d50i28r33e44c44tw53r33a44m78ih28Chy +n120 0 +H720 +V2112 +cf +33i28c44a44t28i28o50nw75i28sw64t28h50a44tw53c44h50a44n50g50e44sw64m78u50s39tw53o50c44c44u50rw58i28nw75f33o50r33w72a44r33dw75o50r33d50e44rw58t28h50r33o50u50g50hw75t28h50ew69f33i28l28e44,w50a44n50dw75m78u50s39tw53n50o50tw53o50v50e44r33l28a44p50.n120 0 +H720 +f3 +V2352 +cU +72n56i28xn120 0 +H720 +f5 +V2508 +h250cs +60a60mwf1 +87h50a44sw66aw71f33e44ww99c44o50m78m78a44n50d50sw66t28ow77c44o50n50n50e44c44tw55t28ow77U72n50i28xw77p50r33o50c44e44s39s39e44s39.w77T61h50ew71s39i28m78p50l28e44s39tw55i28swf5 +66!f1 +60,w52w72h50i28c44hw77r33u50n50sw66t28h50ew72c44o50m78m78a44n50dn120 0 +H720 +V2628 +cw +72i28t28hw75i28n50p50u50tw53a44n50dw75o50u50t28p50u50tw53c44o50n50n50e44c44t28e44dw75t28ow75t28h50ew69t28e44r33m78i28n50a44l28.n120 0 +H720 +x font 0 CI +f0 +V2808 +h360c! +60d60a60t60en120 0 +H720 +f5 +V2928 +h360cW +60e60dwh120cM +60a60ywh120c2 +608wh120c2 +60360:60260560:602601wh120cE +60D60Twh120c1 +609608606n120 0 +H720 +V3048 +h360c! +n120 0 +H720 +f1 +V3228 +c( +33W94h50e44nw94d50o50w72n50l28o50a44d50e44d50,w69t28h50ew88i28n50p50u50tw72i28sw84c44o50n50n50e44c44t28e44dw95t28owf5 +95/60d60e60v60/60n60u60l60lwf1 +h105ca +44n50dw95o50n50l28yw95t28h50ew89f33i28r33s39tw73f33e44wwh117cl +28i28n50e44sw84o50fw78o50u50t28p50u50tw73a44r33en120 0 +H720 +V3348 +cp +50r33i28n50t28e44d50;w59a44n50yw81o50v50e44r33f33l28o50wwh103ci +28sw70s39t28o50r33e44dw81i28nwf5 +81$60H60O60M60E60/60s60a60m60.60e60r60rf1 +60.25)w89T61h50ew75f33i28n50a44lwf5 +58!wf1 +90i28sw69aw74p50r33o50m78p50tw58t28ow80i28n50d50i28c44a44t28ew74w72h50e44nw80t28h50ew74c44o50mh78Chy +n120 0 +H720 +V3468 +cm +78a44n50dw75c44o50m78p50l28e44t28e44s39.n120 0 +H720 +V3624 +h250cS +56l28i28g50h50t28l28yw87m78o50r33ew81i28n50t28e44r33e44s39t28i28n50gw87i28swf5 +76>f1 +60,w62w72h50i28c44hw87p50r33o50v50i28d50e44sw76t28h50ew81c44u50r33r33e44n50tw65t28e44x50tw66a44sw77s39t28a44n50d50a44r33dw88i28n50p50u50tw66t28ow88t28h50ew82U72n50i28xw88c44o50mh78Chy +n120 0 +H720 +V3744 +cm +78a44n50d50:n120 0 +H720 +x font 0 CI +f0 +V3924 +h360c1 +60,602wh120c> +60w60cn120 0 +H720 +wf5 +V4044 +h720c2 +wh480c2 +602wh420c1 +603601n120 0 +H720 +V4164 +h360c! +n120 0 +H720 +f1 +V4344 +cT +61h50ew71c44o50m78p50l28e44m78e44n50tw55o50fwf5 +60>wf1 +87i28s39,w53n50a44t28u50r33a44l28l28y50,wf5 +53<f1 +60:w56i28tw56r33e44p50l28a44c44e44sw67t28h50ew72c44u50r33r33e44n50tw56t28e44x50tw56w72i28t28hw78t28h50ew72s39t28a44n50d50a44r33dw78o50u50t28p50u50tw56o50fw61t28h50ew72U72n50i28xw78c44o50mh78Chy +n120 0 +H720 +V4464 +cm +78a44n50d50:n120 0 +H720 +x font 0 CI +f0 +V4644 +h360c1 +wh120c< +60d60a60t60en120 0 +H720 +f5 +V4764 +h360c! +n120 0 +H720 +x font 0 CI +f0 +V4884 +h360c1 +60pn120 0 +H720 +f5 +V5004 +h360cW +60e60dwh120cM +60a60ywh120c2 +608wh120c2 +60360:60260660:604604wh120cE +60D60Twh120c1 +609608606n120 0 +H720 +f1 +V5184 +cT +61h50ew71l28a44s39tw55c44o50m78m78a44n50dw77i28swf5 +66|f1 +60,w52w72h50i28c44hw77i28sw66aw71c44o50m78b50i28n50a44t28i28o50nw77o50fwf5 +60<wf1 +87a44n50dwf5 +77>f1 +60:w55t28h50ew71c44u50r33r33e44n50tw55t28e44x50tw55i28sw66p50r33o50v50i28d50e44dw77a44sw66s39t28a44n50d50a44r33dw78i28n50p50u50tw56t28on120 0 +H720 +V5304 +ct +28h50ew76U72n50i28xw82c44o50m78m78a44n50d50,w57a44n50dw82t28h50ew76U72n50i28xw81c44o50m78m78a44n50d50'33sw70s39t28a44n50d50a44r33dw81o50u50t28p50u50tw59i28sw70c44o50l28l28e44c44t28e44dw81a44n50dw81u50s39e44dw81t28ow81r33e44p50l28a44c44ew75t28h50ew75o50r33i28g50i28n50a44ln120 0 +H720 +V5424 +ct +28e44x50t28.w75F56o50rw58e44x50a44m78p50l28e44,n120 0 +H720 +x font 0 CI +f0 +V5604 +h360c, +60|wh120cs +60o60r60tn120 0 +H720 +f1 +V5784 +cr +33u50n50swf5 +65s60o60r60tf1 +60(33150)w59o50nw76t28h50ew70f33i28l28e44,w51s39o50r33t28i28n50gw76t28h50ew70l28i28n50e44sw65o50fw59t28h50ew70t28e44x50tw54l28e44x50i28c44o50g50r33a44p50h50i28c44a44l28l28y50.w76N72o50t28ew70t28h50a44twf5 +54<f1 +60,wf5 +52>wf1 +87a44n50dwf5 +77|wf1 +87a44r33ewf5 +71s60a60mwf1 +87c44o50mh78Chy +n120 0 +H720 +V5904 +cm +78a44n50d50s39,w50n50o50tw53U72n50i28xw75s39h50e44l28lw53o50p50e44r33a44t28o50r33s39.n120 0 +H720 +V6060 +h250cT +61h50ew69n50e44x50tw53e44x50a44m78p50l28ew69c44o50n50v50e44r33t28sw64a44l28lw53a44p50p50e44a44r33a44n50c44e44sw64o50fwf5 +58E60m60a60c60swf1 +85t28ow75u50p50p50e44rw58c44a44s39ew69u50s39i28n50gwf5 +75t60rf1 +60(33150)33:n120 0 +H720 +x font 0 CI +f0 +V6240 +h360c, +60x60/60E60m60a60c60s60/wh120c| +wh120ct +60rwh120ca +60-60zwh120cA +60-60Zn120 0 +H720 +f5 +V6420 +ct +60rwf1 +88i28sw67r33u50nw78o50n50c44ew72f33o50rw61e44a44c44hw78o50c44c44u50r33r33e44n50c44ew72o50fwf5 +61E60m60a60c60sf1 +60.w78O72fw61c44o50u50r33s39e44,w53y50o50uw78c44o50u50l28dw78d50ow78t28h50i28sw67e44x50a44m78p50l28ew73m78o50r33ew73e44f33f33i28c44i28e44n50t28l28yw79w72i28t28hn120 0 +H720 +V6540 +ca +w76s39i28m78p50l28ewf5 +76cwf1 +92c44o50m78m78a44n50d50,w57b50u50tw60h50e44r33e44'33sw71aw76t28r33i28c44k50i28e44rw65o50n50e44:w60g50i28v50e44nw82aw76U72n50i28xw82m78a44i28lw60b50o50xw82a44sw71i28n50p50u50t28,w57c44o50n50v50e44r33tw60a44l28lw59t28h50ewf5 +75S60u60b60j60e60c60tn120 0 +H720 +f1 +V6660 +ch +50e44a44d50e44r33sw64t28ow75d50i28s39t28i28n50c44tw53f33o50r33t28u50n50e44s39:n120 0 +H720 +x font 0 CI +f0 +V6840 +h360c, +60x60/60^60S60u60b60j60e60c60t60:60.60*60\60n60/wh120cx +60/60[60^60:60]60*60\60n60/wh120c< +wh120c/ +60u60s60r60/60g60a60m60e60s60/60f60o60r60t60u60n60en120 0 +H720 +f1 +V7020 +c( +33T61h50ew91r33e44g50u50l28a44rw80e44x50p50r33e44s39s39i28o50nwf5 +97[60^60:60]wf1 +h107cr +33e44f33e44r33sw86t28ow97a44n50yw97c44h50a44r33a44c44t28e44rwf2 +80e44x44c44e44p50twf5 +75:wf1 +h108ca +44n50dw98n50e44w72l28i28n50e44;w76t28h50ew92n50e44g50a44t28i28o50nw98o50p50e44r33a44t28o50rwf5 +81^n120 0 +H720 +f1 +V7140 +ce +44x50c44l28u50d50e44sw88n50e44w72l28i28n50ew93f33r33o50mwh127ct +28h50ew93l28i28s39tw77o50fw82c44h50a44r33a44c44t28e44r33s39.25)w82A72g50a44i28n50,wf5 +74/60u60s60r60/60g60a60m60e60s60/60f60o60r60t60u60n60ewf1 +h109ci +28sw88r33u50nw99o50n50c44ew93f33o50rw82e44a44c44hn120 0 +H720 +f5 +V7260 +cS +60u60b60j60e60c60twf1 +85l28i28n50e44,w50s39ow75e44a44c44hwf5 +75S60u60b60j60e60c60twf1 +85l28i28n50ew69i28sw64c44h50a44n50g50e44dw75t28ow75aw69d50i28f33f33e44r33e44n50tw53f33o50r33t28u50n50e44.n120 0 +V7920 +p11 +x font 1 R +x font 2 I +x font 3 B +x font 4 BI +x font 5 CW +x font 6 H +x font 7 HI +x font 8 HB +x font 9 S1 +x font 10 S +s10 +f1 +H720 +V480 +h2052Chy +w33 25150150 h25Chy +wn120 0 +H720 +f3 +V840 +cA +w97f33e44ww97o50t33h56e44rw69t33e44x50tw58c44o50m83m83a50n56d56sn120 0 +H720 +f1 +V996 +h250cF +56o50rw71c44o50m78p50l28e44t28e44n50e44s39s39,w63Iw71s39h50o50u50l28dw88m78e44n50t28i28o50nw88t28h50r33e44ew82o50t28h50e44rw71c44o50m78m78a44n50d50sw78t28h50a44tw67m78a44n50i28p50u50l28a44t28ew83t28e44x50t28.w89T61h50ewf5 +83mwf1 +99c44o50m78m78a44n50dn120 0 +H720 +V1116 +cm +78o50v50e44sw64t28h50ew69c44u50r33r33e44n50tw53t28e44x50tw53t28ow75a44f33t28e44rw58t28h50ew69t28e44x50tw53s39p50e44c44i28f33i28e44dw75b50yw75t28h50ew69(33o50b50l28i28g50a44t28o50r33y50)w58a44d50d50r33e44s39sw64a44f33t28e44rw58t28h50ew69c44o50m78m78a44n50d50.w75T61h50u50sn120 0 +H720 +x font 0 CI +f0 +V1296 +h360c/ +60E60m60a60c60s60/60+60-wh120cm +wh120c0 +n120 0 +H720 +f1 +V1476 +cm +78o50v50e44sw65t28h50ew70n50e44x50tw54l28i28n50ew70c44o50n50t28a44i28n50i28n50gwf5 +76E60m60a60c60swf1 +86t28ow76t28h50ew70b50e44g50i28n50n50i28n50gw76o50fw59t28h50ew70f33i28l28e44.w76S56i28m78i28l28a44r33l28y50,wf5 +51twf1 +86(33a44n50o50t28h50e44rw60h50i28s39t28o50r33i28cw71c44h50a44r33a44c44t28e44r33)n120 0 +H720 +V1596 +cc +44o50p50i28e44sw64t28h50ew69t28e44x50t28:n120 0 +H720 +x font 0 CI +f0 +V1776 +h360c/ +60E60m60a60c60s60/60+60-wh120ct +wh120c0 +n120 0 +H720 +f1 +V1956 +cw +72o50u50l28dw75m78a44k50e44,w50a44tw53t28h50ew69b50e44g50i28n50n50i28n50gw75o50fw58t28h50ew69f33i28l28e44,w50aw69c44o50p50yw75o50fw58t28h50ew69n50e44x50tw53l28i28n50ew69c44o50n50t28a44i28n50i28n50gwf5 +75E60m60a60c60sf1 +60.n120 0 +H720 +V2112 +h250cT +61h50ewh163ct +28h50i28r33dwh169cc +44o50m78m78a44n50dwh169ci +28swh158cm +78o50r33ewh163ci +28n50t28e44r33e44s39t28i28n50g50:wh147ci +28twh148cm +78a44k50e44swh159cs +39u50b50s39t28i28t28u50t28i28o50n50s39.wh170cI +33t28swh159cs +39y50n50t28a44xwh170ci +28sn120 0 +H720 +f5 +V2232 +cs +60/f2 +60p50a50t28t28e44r39nf5 +50/f2 +60r39e44p50l28a50c44e44m72e44n50tf5 +28/f1 +60.w78W94i28t28h50i28nw78t28h50ew72c44u50r33r33e44n50tw55t28e44x50t28,w52i28tw55f33i28n50d50sw66t28h50ew71f33i28r33s39tw55o50c44c44u50r33r33e44n50c44ew71o50fw60t28h50ew71p50a44t28t28e44r33nw77a44n50dw77r33e44p50l28a44c44e44sw66i28tn120 0 +H720 +V2352 +cb +50yw75t28h50ew69r33e44p50l28a44c44e44m78e44n50tw53t28e44x50t28,w50l28e44a44v50i28n50gw75d50o50tw53s39e44tw53t28ow75t28h50ew69e44n50t28i28r33ew69a44d50d50r33e44s39sw64o50fw58t28h50ew69s39u50b50s39t28i28t28u50t28i28o50n50.n120 0 +H720 +x font 0 CI +f0 +V2532 +h360c1 +60pn120 0 +H720 +f5 +V2652 +h360cT +60h60i60swh120cm +60a60n60u60a60lwh120ci +60swh120co +60r60g60a60n60i60z60e60dwh120ci +60nwh120ca +wh120cr +60a60t60h60e60rwh120ch +60a60p60h60a60z60a60r60dwh120cm +60a60n60n60e60r60.wh180cT +60h60ewh120cf +60i60r60s60tn120 0 +H720 +x font 0 CI +f0 +V2772 +h360cs +60/60h60a60p60h60a60z60a60r60d60/60t60h60o60u60g60h60t60l60e60s60s60/n120 0 +H720 +V2892 +h360cp +n120 0 +H720 +f5 +V3012 +h360cT +60h60i60swh120cm +60a60n60u60a60lwh120ci +60swh120co +60r60g60a60n60i60z60e60dwh120ci +60nwh120ca +wh120cr +60a60t60h60e60rwh120ct +60h60o60u60g60h60t60l60e60s60swh120cm +60a60n60n60e60r60.wh180cT +60h60ewh120cf +60i60r60s60tn120 0 +H720 +f1 +V3192 +cO +72c44c44u50r33r33e44n50c44e44sw64o50fw58t28h50ew69c44h50a44r33a44c44t28e44rwf5 +58&wf1 +85i28nw75t28h50ew69r33e44p50l28a44c44e44m78e44n50tw53t28e44x50tw53s39t28a44n50dw75f33o50rw58t28h50ew69t28e44x50tw53m78a44t28c44h50i28n50gw75t28h50ew69p50a44t28t28e44r33n50.n120 0 +H720 +x font 0 CI +f0 +V3372 +h360cs +60/60T60/60"60&60&60&60&60"60/n120 0 +H720 +V3492 +h360cp +n120 0 +H720 +f5 +V3612 +h360c" +60T60T60T60T60"60h60i60swh120cm +60a60n60u60a60lwh120ci +60swh120co +60r60g60a60n60i60z60e60dwh120ci +60nwh120ca +wh120cr +60a60t60h60e60rwh120ct +60h60o60u60g60h60t60l60e60s60swh120cm +60a60n60n60e60r60.wh180cT +60h60ewh120cf +60i60r60s60tn120 0 +H720 +f1 +V3792 +cT +61h50e44r33ew69a44r33ew69t28w72ow75v50a44r33i28a44n50t28s39.w75T61h50ew69f33i28r33s39tw53i28sw64t28h50a44tw53aw69n50u50m78b50e44rw58m78a44yw75b50ew69s39p50e44c44i28f33i28e44dw75a44f33t28e44rw58t28h50ewf5 +70sf1 +60,w51t28ow76i28n50d50i28c44a44t28ew70w72h50i28c44hw76o50c44c44u50r33r33e44n50c44en120 0 +H720 +V3912 +co +50fw58t28h50ew69p50a44t28t28e44r33nw75t28ow75s39u50b50s39t28i28t28u50t28e44;w53t28h50ew69d50e44f33a44u50l28tw53i28sw64t28h50ew69f33i28r33s39t28.n120 0 +H720 +x font 0 CI +f0 +V4092 +h360cs +60260/60i60s60/60w60a60s60/n120 0 +H720 +V4212 +h360cp +n120 0 +H720 +f5 +V4332 +h360c" +60T60T60T60T60"60h60i60swh120cm +60a60n60u60a60lwh120cw +60a60swh120co +60r60g60a60n60i60z60e60dwh120ci +60nwh120ca +wh120cr +60a60t60h60e60rwh120ct +60h60o60u60g60h60t60l60e60s60swh120cm +60a60n60n60e60r60.wh180cT +60h60ewh120cf +60i60r60s60tn120 0 +H720 +f1 +V4512 +cT +61h50ew69s39e44c44o50n50dw75i28sw64t28h50a44tw53s39u50f33f33i28x50i28n50gw75awf5 +69gwf1 +85(33g50l28o50b50a44l28)w58c44a44u50s39e44sw64r33e44p50l28a44c44e44m78e44n50tw53o50fw58a44l28lw53o50c44c44u50r33r33e44n50c44e44s39,w50n50o50tw53j28u50s39tw53t28h50ew69f33i28r33s39t28.n120 0 +H720 +x font 0 CI +f0 +V4692 +h360cs +60/60[60a60-60z60A60-60Z60]60/60x60/60gn120 0 +H720 +V4812 +h360cp +n120 0 +H720 +f5 +V4932 +h360c" +60x60x60x60x60"60x60x60xwh120cx +60x60x60x60x60xwh120cx +60x60xwh120cx +60x60x60x60x60x60x60x60xwh120cx +60xwh120cx +wh120cx +60x60x60x60x60xwh120cx +60x60x60x60x60x60x60x60x60x60xwh120cx +60x60x60x60x60x60xwh180cx +60x60xwh120cx +60x60x60x60xn120 0 +H720 +f1 +V5112 +cN +72o50t28i28c44ew69t28h50a44tw53i28nw75a44l28lw53t28h50e44s39ew69e44x50a44m78p50l28e44sw64d50o50tw53i28sw64l28e44f33tw53s39e44tw53t28ow75t28h50ew69e44n50t28i28r33ew69l28i28n50e44.n120 0 +H720 +V5268 +h250c[ +33T61h50ew71s39u50b50s39t28i28t28u50t28ew71c44o50m78m78a44n50dw77i28sw66v50i28t28a44lw55t28owf5 +77e60d60,wf1 +87b50e44c44a44u50s39ew71i28tw55i28sw66t28h50ew71o50n50l28yw78w72a44yw78t28ow78m78a44k50ew72c44h50a44n50g50e44sw67w72i28t28h50i28nw78aw72l28i28n50e44.w78I33tn120 0 +H720 +V5388 +ci +28sw67l28e44s39sw67v50a44l28u50a44b50l28ew72i28nwf5 +78s60a60mf1 +60,w53i28nw78w72h50i28c44hw78t28h50ew72c44o50n50c44e44p50tw56o50fw61aw72l28i28n50ew72i28sw67m78u50c44hw78l28e44s39sw67i28m78p50o50r33t28a44n50t28.w78F56o50rw61e44x50a44m78p50l28e44,w52m78a44n50ywf5 +77e60dwf1 +87s39u50bh50Chy +n120 0 +H720 +V5508 +cs +39t28i28t28u50t28i28o50nw75i28d50i28o50m78sw64a44r33ew69h50a44n50d50l28e44dw75w72e44l28lw53b50ywf5 +75s60a60mf1 +60'33sw64b50a44s39i28cw69c44o50m78m78a44n50d50s39.w50C67o50n50s39i28d50e44rw58t28h50ew69c44o50m78m78a44n50d50sn120 0 +H720 +f5 +V5688 +h360cs +60/60g60o60o60d60/60b60a60d60/n120 0 +H720 +V5808 +h360cs +60/60g60o60o60d60/60/n120 0 +H720 +V5928 +h360cs +60/60g60o60o60d60/60&wh120cb +60y60e60/n120 0 +H720 +f1 +V6108 +cw +72h50i28c44hw75a44r33ew69e44q50u50i28v50a44l28e44n50tw53i28nwf5 +75s60a60mwf1 +85t28on120 0 +H720 +f5 +V6288 +h360c/ +60g60o60o60d60/60c60/60b60a60d60/n120 0 +H720 +V6408 +h360c/ +60g60o60o60d60/60dn120 0 +H720 +V6528 +h360c/ +60g60o60o60d60/60a60/wh120cb +60y60e60/n120 0 +H720 +f1 +V6708 +ca +44n50dw76f33o50rw59w72h50i28c44hw76t28h50ew70c44o50n50t28e44x50tw54s39e44a44r33c44hw76i28sw65l28i28k50e44l28yw76u50n50n50e44c44e44s39s39a44r33yw76b50e44c44a44u50s39ew71t28h50ew71d50e44s39i28r33e44dw77t28e44x50tw55i28sw66a44l28r33e44a44d50yw77d50o50t28.w77A72l28s39o50,w52b50e44w72a44r33en120 0 +H720 +V6828 +ct +28h50i28swf5 +64e60dwf1 +85i28d50i28o50m78:n120 0 +H720 +f5 +V7008 +h360c1 +60,60$60s60/60g60o60o60d60/60b60a60d60/n120 0 +H720 +f1 +V7188 +cw +72h50i28c44hw77c44h50a44n50g50e44sw66t28h50ew71f33i28r33s39twf5 +55g60o60o60dwf1 +87o50nw77e44a44c44hw77l28i28n50e44;w55t28h50ew71s39a44m78ew71c44o50m78m78a44n50dw78i28nwf5 +78s60a60mwf1 +88w72i28l28lw56o50n50l28yw78c44h50a44n50g50ew72t28h50ew72f33i28r33s39tw56o50n50ew72i28nw78t28h50en120 0 +H720 +V7308 +cw +72h50o50l28ew69f33i28l28e44.w75T61h50ew69c44o50r33r33e44c44twf5 +53s60a60mwf1 +85v50e44r33s39i28o50nw75i28sn120 0 +V7920 +p12 +x font 1 R +x font 2 I +x font 3 B +x font 4 BI +x font 5 CW +x font 6 H +x font 7 HI +x font 8 HB +x font 9 S1 +x font 10 S +s10 +f1 +H720 +V480 +h2052Chy +w33 251502w50 h25Chy +wn120 0 +H720 +f5 +V900 +h360c, +60xwh120cs +60/60g60o60o60d60/60b60a60d60/n120 0 +H720 +f1 +V1080 +cb +50u50tw53w72h50a44tw53i28sw64m78o50r33ew69l28i28k50e44l28yw75m78e44a44n50tw53i28sn120 0 +H720 +f5 +V1260 +h360c, +60x60/60g60o60o60d60/wh120cc +60/60b60a60d60/n120 0 +H720 +V1440 +cs +60a60mwf1 +85o50p50e44r33a44t28e44sw64u50n50d50e44rw58d50i28f33f33e44r33e44n50tw53r33u50l28e44s39.25]n120 0 +H720 +f3 +V1680 +cF +61i28l28e44sn120 0 +H720 +f1 +V1836 +h250cS +56ow84f33a44r33,w59w72ew78h50a44v50ew78o50n50l28yw84b50e44e44nw84w72o50r33k50i28n50gw84w72i28t28hw84aw78s39i28n50g50l28ew78f33i28l28e44,w59b50u50twf5 +62s60a60mwf1 +94i28sw73aw78m78u50l28t28i28-33f33i28l28ew79e44d50i28t28o50r33.w85O72n50l28yw85o50n50ew79f33i28l28en120 0 +H720 +V1956 +cm +78a44yw76b50ew70e44d50i28t28e44dw76a44tw54aw70t28i28m78e44,w51b50u50tw54i28tw54i28sw65e44a44s39yw76t28ow76c44h50a44n50g50ew70w72h50i28c44hw76f33i28l28ew70i28sw65t28h50ew70`33c44u50r33r33e44n50t28'w59f33i28l28ew70f33o50rw59e44d50i28t28i28n50g50.w76T61ow76s39e44ew70h50o50ww98t28ow76d50on120 0 +H720 +V2076 +ct +28h50i28s39,w52w72ew71n50e44e44dw77awf5 +71s60a60mwf1 +87w72i28t28hw77aw71f33e44ww99f33i28l28e44s39;w55t28h50ew71e44a44s39i28e44s39tw55w72a44yw77t28ow77d50ow77t28h50i28sw66i28sw66t28ow77s39t28a44r33tw55i28tw55w72i28t28hw77aw71l28i28s39tw56o50fw61U72n50i28xw78f33i28l28ew72n50a44m78e44sw67t28on120 0 +H720 +V2196 +ce +44d50i28t28.n120 0 +H720 +f5 +V2376 +h360c$ +wx font 0 CI +f0 +h120ce +60c60h60owh120c* +60.60m60sn120 0 +H720 +f5 +V2496 +h360cc +60o60n60q60u60e60s60t60.60m60swh120cd +60e60a60t60h60.60m60swh120ce +60m60a60c60s60.60m60swh120cf +60a60m60i60n60e60.60m60swh120cs +60l60a60u60g60h60t60e60r60.60m60sn120 0 +H720 +V2616 +h360c$ +wx font 0 CI +f0 +h120cs +60a60mwh120c- +60dwh120c* +60.60m60sn120 0 +H720 +wf5 +V2736 +h420c- +60.wh120cc +60o60n60q60u60e60s60t60.60m60sn120 0 +H720 +f1 +V2916 +c( +33I33'33mwh105cs +39o50r33r33yw77t28h50ew71H72o50r33s39e44m78e44nw77d50o50n50'33tw55a44p50p50e44a44rw60i28nw77l28i28t28u50r33g50i28c44a44lw56o50r33d50e44r33.25)w86T61h50ew72l28i28n50ew72p50r33i28n50t28e44dw78b50ywf5 +78s60a60mwf1 +88i28sw67a44nw78i28n50d50i28c44a44t28i28o50nw78t28h50a44tw56t28h50en120 0 +H720 +V3036 +cU +72n50i28xw79f33i28l28ewf5 +73c60o60n60q60u60e60s60t60.60m60swf1 +89h50a44sw68b50e44e44nw79r33e44a44d50,w54a44n50dw79i28sw67n50o50wwh100ct +28h50ew72c44u50r33r33e44n50tw56f33i28l28e44.wf5 +78s60a60mwf1 +88d50o50e44sw67n50o50tw56r33e44a44dw78t28h50ew72U72n50i28xw78f33i28l28ew72u50n50t28i28ln120 0 +H720 +V3156 +ct +28h50ew69a44s39s39o50c44i28a44t28e44dwf5 +75s60a60mwf1 +85f33i28l28ew69b50e44c44o50m78e44sw64c44u50r33r33e44n50t28.n120 0 +H720 +V3312 +h250cT +61h50ewf5 +69nwf1 +85c44o50m78m78a44n50dw75p50r33i28n50t28sw64t28h50ew69n50a44m78e44sw64o50fw58a44l28lw53t28h50ew69f33i28l28e44s39:n120 0 +H720 +x font 0 CI +f0 +V3492 +h360cn +n120 0 +H720 +wf5 +V3612 +h420c- +60.wh120cc +60o60n60q60u60e60s60t60.60m60sn120 0 +H720 +wV3732 +h420c- +wh180cd +60e60a60t60h60.60m60sn120 0 +H720 +wV3852 +h420c- +wh180ce +60m60a60c60s60.60m60sn120 0 +H720 +wV3972 +h420c- +wh180cf +60a60m60i60n60e60.60m60sn120 0 +H720 +wV4092 +h420c- +wh180cs +60l60a60u60g60h60t60e60r60.60m60sn120 0 +H720 +f1 +V4272 +cT +61h50i28sw65l28i28s39tw54i28sw65a44l28s39ow76a44v50a44i28l28a44b50l28ew70i28nw76t28h50ew70m78e44n50uw76o50nw76m78o50u50s39ew70b50u50t28t28o50nw76350.w76T61h50ew70c44o50m78m78a44n50dwf5 +76fwf1 +86t28e44l28l28sw65t28h50ew70n50a44m78ew70o50fw59j28u50s39tw54t28h50ew70c44u50r33r33e44n50tn120 0 +H720 +V4392 +cf +33i28l28e44:n120 0 +H720 +x font 0 CI +f0 +V4572 +h360cf +n120 0 +H720 +wf5 +V4692 +h420c- +60.wh120cc +60o60n60q60u60e60s60t60.60m60sn120 0 +H720 +f1 +V4872 +cT +61h50ew87c44h50a44r33a44c44t28e44r33sw82t28ow93t28h50ew87l28e44f33tw72o50fw77t28h50ew88f33i28l28ew88n50a44m78ew88e44n50c44o50d50ew88h50e44l28p50f33u50lw72i28n50f33o50r33m78a44t28i28o50nw94a44b50o50u50tw72t28h50ew88f33i28l28e44.w94T61h50ew88m78i28n50u50sw83s39i28g50nn120 0 +H720 +V4992 +cb +50e44c44o50m78e44sw73aw78p50l28u50sw73s39i28g50nw84i28fw67t28h50ew78f33i28l28ew78h50a44sw73aw78w72i28n50d50o50wwh106co +50p50e44n50,w59a44n50dw84a44nw84a44s39t28e44r33i28s39kw84i28fw67m78o50r33ew78t28h50a44nw84o50n50ew78i28sw73o50p50e44n50.w84T61h50ew77p50e44r33i28o50dn120 0 +H720 +V5112 +c( +33a44n50o50t28h50e44rw58m78e44a44n50i28n50gw75o50fw58d50o50t28)w58i28d50e44n50t28i28f33i28e44sw64t28h50ew69c44u50r33r33e44n50tw53f33i28l28e44.w75T61h50ew69l28e44a44d50i28n50gw75b50l28a44n50kw75c44h50a44n50g50e44sw64t28ow76a44nw76a44p50o50s39t28r33o50p50h50ew70i28fw59t28h50ew70f33i28l28ew70i28sn120 0 +H720 +V5232 +cd +50i28f33f33e44r33e44n50tw61f33r33o50mwh111ct +28h50ew77c44o50n50t28e44n50t28sw72o50fw66t28h50ew77a44s39s39o50c44i28a44t28e44dw83U72n50i28xw83f33i28l28e44,w58a44sw72f33a44rw66a44swf5 +72s60a60mwf1 +93k50n50o50w72s39.w83T61h50i28sw71b50e44c44o50m78e44sw71e44v50i28d50e44n50tw60i28fw65w72en120 0 +H720 +V5352 +cm +78a44k50ew69aw69c44h50a44n50g50e44.n120 0 +H720 +x font 0 CI +f0 +V5532 +h360c1 +60dn120 0 +H720 +V5652 +h360cf +n120 0 +H720 +f5 +V5772 +h360c' +60-60.wh120cc +60o60n60q60u60e60s60t60.60m60sn120 0 +H720 +f1 +V5952 +cI +33fw58t28h50ew69f33i28l28ew69i28sw64r33e44s39t28o50r33e44dw75b50yw75a44nw75u50n50d50ow75c44o50m78m78a44n50d50,w50t28h50ew69a44p50o50s39t28r33o50p50h50ew69d50i28s39a44p50p50e44a44r33s39.n120 0 +H720 +x font 0 CI +f0 +V6132 +h360cu +n120 0 +H720 +V6252 +h360cf +n120 0 +H720 +wf5 +V6372 +h420c- +60.wh120cc +60o60n60q60u60e60s60t60.60m60sn120 0 +H720 +f1 +V6552 +cT +61h50ew69f33i28l28ew69n50a44m78ew69m78a44yw75b50ew69c44h50a44n50g50e44dw75b50yw75p50r33o50v50i28d50i28n50gw75aw69n50e44ww97n50a44m78ew69w72i28t28hw75t28h50ewf5 +69fwf1 +85c44o50m78m78a44n50d50:n120 0 +H720 +f5 +V6732 +h360cf +wh120cp +60e60s60t60i60l60e60n60c60e60.60m60sn120 0 +H720 +V6852 +h360c' +60-60.wh120cp +60e60s60t60i60l60e60n60c60e60.60m60sn120 0 +H720 +x font 0 CI +f0 +V7032 +cf +wf1 +99p50r33i28n50t28sw78t28h50ew83n50e44wwh111cs +39t28a44t28u50sw78o50fw72t28h50ew84f33i28l28e44,w65t28h50a44tw68i28s39,w65i28tw68c44h50a44n50g50e44sw79t28h50ew84n50a44m78ew84i28fw73o50n50ew84i28sw79p50r33o50v50i28d50e44d50,w65a44n50dw90p50r33i28n50t28sw79t28h50ew84n50a44m78en120 0 +H720 +V7152 +cr +33e44g50a44r33d50l28e44s39s39.w75Aw97f33i28l28ew69n50a44m78ew69c44h50a44n50g50ew69m78a44yw75a44l28s39ow75b50ew69u50n50d50o50n50e44.n120 0 +V7920 +p13 +x font 1 R +x font 2 I +x font 3 B +x font 4 BI +x font 5 CW +x font 6 H +x font 7 HI +x font 8 HB +x font 9 S1 +x font 10 S +s10 +f1 +H720 +V480 +h2052Chy +w33 25150350 h25Chy +wn120 0 +H720 +x font 0 CI +f0 +V900 +h360cu +n120 0 +H720 +V1020 +h360cf +n120 0 +H720 +wf5 +V1140 +h420c- +60.wh120cc +60o60n60q60u60e60s60t60.60m60sn120 0 +H720 +f1 +V1356 +h250cW +94h50e44nwf5 +79s60a60mwf1 +89i28sw68d50o50w72n50l28o50a44d50e44d50,w54t28h50ew73c44u50r33r33e44n50tw57f33i28l28ew73m78a44yw79b50ew74c44h50a44n50g50e44dw80s39i28m78p50l28yw80b50yw80s39e44l28e44c44t28i28n50gw80t28h50ew74d50e44s39i28r33e44dw80f33i28l28ew74f33r33o50mn120 0 +H720 +V1476 +ct +28h50ew71m78e44n50uw77(33s39e44l28e44c44t28i28n50gw77t28h50ew71s39a44m78ew71f33i28l28ew71s39u50b50s39e44q50u50e44n50t28l28yw77c44y50c44l28e44sw66t28h50r33o50u50g50hw77t28h50ew71w72i28n50d50o50w72sw66o50p50e44n50e44dw77o50nw76t28h50ew70f33i28l28e44)33.w76O72t28h50e44r33w72i28s39e44,n120 0 +H720 +V1596 +ct +28h50ewf5 +69bwf1 +85c44o50m78m78a44n50dw75c44a44nw75b50ew69u50s39e44dw75t28ow75c44h50o50o50s39ew69t28h50ew69d50e44s39i28r33e44dw75f33i28l28e44:h28Cdg +n120 0 +H720 +x font 0 CI +f0 +V1776 +h360cb +wh120ce +60m60a60c60s60.60m60sn120 0 +H720 +wf5 +V1896 +h420c- +60.wh120ce +60m60a60c60s60.60m60sn120 0 +H720 +f1 +V2076 +cA +72g50a44i28n50,wf5 +54s60a60mwf1 +89p50r33i28n50t28sw68t28h50ew73n50a44m78ew73(33a44c44t28u50a44l28l28y50,w55e44x50e44c44u50t28e44sw69a44nw80i28m78p50l28i28c44i28twf5 +58fwf1 +90c44o50m78m78a44n50d50)w63b50e44c44a44u50s39ew74t28h50ew74U72n50i28xw80f33i28l28ewf5 +74e60m60a60c60s60.60m60sn120 0 +H720 +f1 +V2196 +ci +28sw68b50e44i28n50gw79r33e44a44dw79f33o50rw62t28h50ew73f33i28r33s39tw57t28i28m78e44.w79I33tw57i28sw68a44nw79e44r33r33o50rw62t28ow79a44s39kw79f33o50rw62aw73f33i28l28ewf5 +73s60a60mwf1 +89d50o50e44s39n50'33tw57k50n50o50wwh101ca +44b50o50u50t28,w54b50u50tw57t28h50ewf5 +73Bwf1 +89c44o50m78m78a44n50dn120 0 +H720 +V2316 +cw +72i28l28lw53p50r33i28m78ewf5 +69s60a60mf1 +60'33sw64m78e44n50uw75w72i28t28hw75aw69n50e44ww97f33i28l28e44,w50a44n50dw75m78a44k50ew69i28tw53c44u50r33r33e44n50t28.n120 0 +H720 +x font 0 CI +f0 +V2496 +h360cb +wh120cf +60l60o60o60d60.60p60i60cn120 0 +H720 +f5 +V2616 +h360c? +60n60owh120cs +60u60c60hwh120cf +60i60l60ewh120c` +60f60l60o60o60d60.60p60i60c60'n120 0 +H720 +x font 0 CI +f0 +V2736 +h360cB +wh120cf +60l60o60o60d60.60p60i60cn120 0 +H720 +wf5 +V2856 +h420c- +60.wh120cf +60l60o60o60d60.60p60i60cn120 0 +H720 +x font 0 CI +f0 +V2976 +h360cn +n120 0 +H720 +wf5 +V3096 +h420c- +wh180cc +60o60n60q60u60e60s60t60.60m60sn120 0 +H720 +wV3216 +h420c- +wh180cd +60e60a60t60h60.60m60sn120 0 +H720 +wV3336 +h420c- +wh180ce +60m60a60c60s60.60m60sn120 0 +H720 +wV3456 +h420c- +wh180cf +60a60m60i60n60e60.60m60sn120 0 +H720 +wV3576 +h420c- +60.wh120cf +60l60o60o60d60.60p60i60cn120 0 +H720 +wV3696 +h420c- +wh180cs +60l60a60u60g60h60t60e60r60.60m60sn120 0 +H720 +f1 +V3876 +cB +67o50t28hwf5 +80bwf1 +90a44n50dwf5 +80Bwf1 +90w72i28l28lw58a44c44c44e44p50tw58aw74l28i28s39tw59o50fw64f33i28l28ew75n50a44m78e44s39.wf5 +81bwf1 +91s39i28m78p50l28yw81t28a44k50e44sw70t28h50ew75f33i28r33s39tw59f33i28l28ew75i28nw81t28h50ew75l28i28s39t28,w56b50u50twf5 +59Bwf1 +91l28o50a44d50sw70t28h50e44mwh109ca +44l28l28.n120 0 +H720 +V3996 +cT +61h50ew69l28i28s39tw53m78a44yw75b50ew69t28y50p50e44dw75o50nw75o50n50ew69l28i28n50ewh69Cem +n120 0 +H720 +x font 0 CI +f0 +V4176 +h360cB +wh120cd +60e60v60i60l60.60t60e60xwh120cs +60a60t60a60n60.60t60e60xwh120c6 +60660660.60t60e60xwh120ce +60m60a60c60s60.60t60e60xn120 0 +H720 +f1 +V4356 +Cem +wh125co +50rw58g50e44n50e44r33a44t28e44dw75b50yw75aw69U72n50i28xw75c44o50m78m78a44n50dwh75Cem +n120 0 +H720 +x font 0 CI +f0 +V4536 +h360cB +wh120c< +60e60c60h60owh120c* +60.60t60e60xn120 0 +H720 +f1 +V4716 +cT +61h50ew73l28a44t28t28e44rw63f33o50r33mwh108cr +33e44q50u50i28r33e44sw69aw74U72n50i28xw80c44o50m78m78a44n50d50;wf5 +58s60a60mwf1 +90d50o50e44sw69n50o50tw58u50n50d50e44r33s39t28a44n50dw80t28h50ew74s39h50e44l28lw58f33i28l28ew74n50a44m78ew74m78e44t28a44c44h50a44r33a44c44t28e44r33s39,w55s39on120 0 +H720 +f5 +V4836 +cB +wh130c* +60.60t60e60xwf1 +94a44t28t28e44m78p50t28sw73t28ow84l28o50a44dw84aw78s39i28n50g50l28ew78f33i28l28ew78n50a44m78e44dwf5 +84*60.60t60e60xf1 +60.w84(33T61h50ewf5 +78<wf1 +94f33o50r33mwh112ci +28sw73o50fw67c44o50u50r33s39ew78d50e44r33i28v50e44dw84f33r33o50mwf5 +h112cs +60a60mf1 +60'33swf5 +73<n120 0 +H720 +f1 +V4956 +cc +44o50m78m78a44n50d50.25)wf5 +83e60c60h60owf1 +85i28sw64n50o50tw53t28h50ew69o50n50l28yw75u50s39e44f33u50lw53c44o50m78m78a44n50dw75t28ow75r33u50nw75s39u50b50s39e44r33v50i28e44n50tw53t28owf5 +75Bf1 +60;w53f33o50rw58e44x50a44m78p50l28e44,n120 0 +H720 +x font 0 CI +f0 +V5136 +h360cB +wh120c< +60g60r60e60pwh120c- +60lwh120cE +60m60a60c60swh120c* +n120 0 +H720 +f1 +V5316 +cw +72i28l28lw57l28o50a44dw79o50n50l28yw79t28h50o50s39ew73f33i28l28e44sw68c44o50n50t28a44i28n50i28n50gw79t28h50ew73s39t28r33i28n50gwf5 +79E60m60a60c60sf1 +60.w79F56i28n50a44l28l28y50,w54aw73s39p50e44c44i28a44lw57c44a44s39e44:w58awf5 +74Bwf1 +90w72i28t28hw80n50ow80a44r33g50u50m78e44n50t28sw69c44r33eh44Chy +n120 0 +H720 +V5436 +ca +44t28e44sw64a44nw75e44m78p50t28y50,w50n50a44m78e44l28e44s39sw64f33i28l28ew69w72i28t28h50i28nwf5 +75s60a60mf1 +60.n120 0 +H720 +V5592 +h250cT +61h50ew69c44o50m78p50l28e44m78e44n50tw53o50fwf5 +58Bwf1 +85i28swf5 +64Df1 +60:n120 0 +H720 +x font 0 CI +f0 +V5772 +h360cD +wh120cd +60e60v60i60l60.60t60e60xwh120cs +60a60t60a60n60.60t60e60xwh120c6 +60660660.60t60e60xwh120ce +60m60a60c60s60.60t60e60xn120 0 +H720 +f1 +V5952 +ce +44r33a44d50i28c44a44t28e44sw77t28h50ew82f33i28l28e44sw77f33r33o50mwf5 +h116cs +60a60mf1 +60'33sw78m78e44m78o50r33yw89(33n50o50tw67f33r33o50mwh117ct +28h50ew83U72n50i28xw89m78a44c44h50i28n50e44'33sw78d50i28s39c44)33.wf5 +89Dwf1 +99w72i28t28h50o50u50tw67a44n50yw89f33i28l28ew83n50a44m78e44sn120 0 +H720 +V6072 +cr +33e44m78o50v50e44sw64t28h50ew69c44u50r33r33e44n50tw53f33i28l28ew69f33r33o50mwf5 +h103cs +60a60mf1 +60.n120 0 +H720 +V6228 +h250cT +61h50e44r33ew73a44r33ew73t28h50r33e44ew73o50t28h50e44rw62c44o50m78m78a44n50d50sw68t28h50a44tw57r33e44l28a44t28ew73t28h50ew73c44u50r33r33e44n50tw57f33i28l28ew73t28ow79U72n50i28xw79f33i28l28e44s39.w79T61h50ewf5 +74wwf1 +90c44o50m78m78a44n50dw80w72r33i28t28e44sw69t28h50en120 0 +H720 +V6348 +cf +33i28l28ew79t28ow85d50i28s39c44;w63w72i28t28h50o50u50tw63a44r33g50u50m78e44n50t28s39,w60i28tw63w72r33i28t28e44sw74t28h50ew79e44n50t28i28r33ew79f33i28l28ew78t28ow84t28h50ew78U72n50i28xw84f33i28l28ew78a44s39s39o50c44i28a44t28e44dw84w72i28t28hw84t28h50ew78c44u50r33r33e44n50tw62f33i28l28ew78i28nn120 0 +H720 +f5 +V6468 +cs +60a60mwf1 +86(33i28tw54i28sw65t28h50ew70o50n50l28yw76c44o50m78m78a44n50dw76w72h50o50s39ew70d50e44f33a44u50l28tw54a44d50d50r33e44s39sw65i28sw65n50o50tw54d50o50t28)33.w76O72fw59c44o50u50r33s39e44,w51y50o50uw76c44a44nw76s39p50e44c44i28f33yw76a44nw76a44d50d50r33e44s39sw66t28ow77b50en120 0 +H720 +V6588 +cw +72r33i28t28t28e44n50,w50a44n50dw75aw69d50i28f33f33e44r33e44n50tw53f33i28l28ew69n50a44m78e44,w50w72i28t28hw75t28h50ew69o50b50v50i28o50u50sw64s39y50n50t28a44x50:n120 0 +H720 +s8 +V6880 +Cru +h40Cru +h40Cru +h40Cru +h40Cru +h40Cru +h40Cru +h40Cru +h40Cru +h40Cru +h40Cru +h40Cru +h40Cru +h40Cru +h40Cru +h40Cru +h40Cru +h40Cru +n100 0 +H720 +V6980 +Cdg +w70Aw78b40u40gw60p40r26e35v40e35n40t22sw51t22h40ewf5 +55bwf1 +68c35o40m62m62a35n40dw61f26r26o40mw83w58o40r26k40i22n40gw61w58h40e35nw61d40o40w58n40l22o40a35d40e35d40.w61B54e35c35a35u40s31ew56t22h40ew56m62e35n40uw61i22sw52m62o40r26ew56c35o40n40v40e35n40i22e35n40tw43a35n40y40w58a35y40,w41a35n40dw61b40eh35Chy +n100 0 +H720 +V7080 +cc +35a35u40s31ew55t22h40ew55m62e35t22h40o40dw60o40fw46c35h40o40o40s31i22n40gw60f26i22l22e35sw51f26r26o40mw82t22h40ew55c35o40m62m62a35n40dw60l22a35n40g40u40a35g40ew55i22sw51s31l22a35t22e35dw60t22ow60c35h40a35n40g40e35,w40t22h40ew55b40u40gw60h40a35s31n40'26tw42b40e35e35nw60f26i22x40e35d40.n100 0 +V7920 +p14 +x font 1 R +x font 2 I +x font 3 B +x font 4 BI +x font 5 CW +x font 6 H +x font 7 HI +x font 8 HB +x font 9 S1 +x font 10 S +s10 +f1 +H720 +V480 +h2052Chy +w33 251504w50 h25Chy +wn120 0 +H720 +x font 0 CI +f0 +V900 +h360c1 +60,60260wwh120c/ +60t60m60p60/60r60e60v60e60l60a60t60i60o60n60sn120 0 +H720 +f5 +V1020 +h360c/ +60t60m60p60/60r60e60v60e60l60a60t60i60o60n60s60:wh120c# +604604n120 0 +H720 +V1200 +cs +60a60mwf1 +85r33e44s39p50o50n50d50sw64w72i28t28hw75t28h50ew69f33i28l28ew70n50a44m78ew70a44n50dw76t28h50ew70n50u50m78b50e44rw59o50fw59c44h50a44r33a44c44t28e44r33sw65w72r33i28t28t28e44nw76t28ow76t28h50ew70f33i28l28e44.w76T61h50ewf5 +70w60r60i60t60ewf1 +86c44o50m78m78a44n50dw76o50nn120 0 +H720 +V1320 +ct +28h50ew69b50u50t28t28o50nw753w75m78e44n50uw75i28sw64i28d50e44n50t28i28c44a44lw53i28nw75f33u50n50c44t28i28o50nw75t28ow75a44nw75u50n50a44d50o50r33n50e44dwf5 +75wwf1 +85c44o50m78m78a44n50d50.n120 0 +H720 +V1476 +h250cT +61h50ew71o50t28h50e44rw60t28w72ow77c44o50m78m78a44n50d50s39,wf5 +52ewf1 +87a44n50dwf5 +77rf1 +60,w52r33e44a44dw77d50a44t28aw71f33r33o50mwh105cU +72n50i28xw77f33i28l28e44s39.w77T61h50ewf5 +71ewf1 +87c44o50m78m78a44n50dw77c44l28e44a44r33sw66o50u50tw55t28h50ew72c44u50r33r33e44n50tn120 0 +H720 +V1596 +cf +33i28l28e44,w57r33e44a44d50sw71t28h50ew76d50a44t28aw76f33r33o50mwh110ct +28h50ew76n50a44m78e44dw81f33i28l28ew75(33o50rw64u50s39e44sw70t28h50ew75c44u50r33r33e44n50tw59f33i28l28e44'33sw70o50l28dw81n50a44m78ew75i28fw64n50o50n50ew75i28sw70e44x50p50l28i28c44i28t28l28yw81p50r33o50v50i28d50e44d50)33,n120 0 +H720 +V1716 +ca +44n50dw76s39e44t28sw65t28h50ew70f33i28l28ew70n50a44m78e44.w77I33t28'33sw66m78u50c44hw77l28i28k50ew71awf5 +71Bwf1 +87c44o50m78m78a44n50d50,w52b50u50tw55p50u50t28sw66t28h50ew71i28n50f33o50r33m78a44t28i28o50nw77i28nw77t28h50ew71c44u50r33r33e44n50tw55f33i28l28ew71i28n50s39t28e44a44dw77o50fw60an120 0 +H720 +V1836 +cn +50e44ww98o50n50e44.wf5 +76ewf1 +86w72i28t28h50o50u50tw54a44n50yw76f33i28l28ew70n50a44m78ew70i28sw65t28h50e44r33e44f33o50r33ew70a44nw76e44a44s39yw76w72a44yw76t28ow76r33e44f33r33e44s39hwf5 +76s60a60mf1 +60'33sw65c44o50p50yw76o50fw59aw70U72n50i28xw76f33i28l28e44.w76[33U72n50l28i28k50ew69i28nn120 0 +H720 +f5 +V1956 +ce +60df1 +60,wf5 +61ewf1 +96d50o50e44s39n50'33tw64c44o50m78p50l28a44i28nw86i28fw69t28h50ew80f33i28l28ew80i28sw75m78o50d50i28f33i28e44d50.w86T61h50ew80p50r33i28n50c44i28p50l28ew80i28sw75n50o50tw64t28ow86p50r33o50t28e44c44tw64a44g50a44i28n50s39tw64t28h50i28n50g50sw75t28h50a44tw64c44a44nw87b50en120 0 +H720 +V2076 +cu +50n50d50o50n50ew69i28fw58w72r33o50n50g50.25]w83S56i28n50c44ew69i28t28sw64j28o50bw75i28sw64t28ow75r33e44p50l28a44c44ew69t28h50ew69w72h50o50l28ew69t28e44x50t28,wf5 +50ewf1 +85n50e44v50e44rw58t28a44k50e44sw64a44nw75a44d50d50r33e44s39s39.n120 0 +H720 +V2232 +h250cT +61h50ewf5 +78rwf1 +94c44o50m78m78a44n50dw84i28sw73l28i28k50ewf5 +78ef1 +60,w59b50u50tw62i28tw62d50o50e44s39n50'33tw62c44l28e44a44rw67t28h50ew78f33i28l28e44:w62t28h50ew78t28e44x50tw62i28nw84t28h50ew78U72n50i28xw84f33i28l28ew78r33e44p50l28a44c44e44sw73d50o50t28,w60o50rw68t28h50en120 0 +H720 +V2352 +cs +39p50e44c44i28f33i28e44dw75t28e44x50tw53i28fw58a44nw75a44d50d50r33e44s39sw64i28sw64g50i28v50e44n50.n120 0 +H720 +x font 0 CI +f0 +V2532 +h360cr +wh120ce +60m60a60c60s60.60m60sn120 0 +H720 +f1 +V2712 +ch +50a44sw64e44s39s39e44n50t28i28a44l28l28yw75t28h50ew69e44f33f33e44c44tw53o50fn120 0 +H720 +x font 0 CI +f0 +V2892 +h360c< +60c60a60twh120ce +60m60a60c60s60.60m60sn120 0 +H720 +f1 +V3072 +cT +61h50ew73c44o50m78m78a44n50d50swf5 +68rwf1 +89a44n50dwf5 +79wwf1 +89w72i28l28lw57s39e44tw57t28h50ew73n50a44m78ew73o50fw62t28h50ew73f33i28l28ew73i28fw63t28h50ew74c44u50r33r33e44n50tw58f33i28l28ew74h50a44sw69n50ow80n50a44m78ew74a44l28r33e44a44d50yw80d50e44f33i28n50e44d50;wf5 +58ewf1 +90s39e44t28sn120 0 +H720 +V3192 +ct +28h50ew69n50a44m78ew69e44v50e44nw75i28fw58t28h50ew69f33i28l28ew69a44l28r33e44a44d50yw75h50a44sw64o50n50e44.n120 0 +H720 +V3348 +h250cT +61h50e44r33ew77i28sw72aw77c44o50m78m78a44n50d50,w58a44n50a44l28o50g50o50u50sw72t28owf5 +83xf1 +60,w58t28h50a44tw61i28t28e44r33a44t28e44sw72o50v50e44rw66f33i28l28e44sw72i28n50s39t28e44a44dw83o50fw67p50i28e44c44e44sw73o50fw67t28e44x50t28:wf5 +62Xwf1 +94(33c44a44p50i28t28a44lwf5 +62xf1 +60)33.n120 0 +H720 +V3468 +cT +61h50ew79s39y50n50t28a44xw85i28sw74e44a44s39y50;w63i28t28'33sw74j28u50s39tw63l28i28k50ew79t28h50a44tw63o50fwf5 +68xwf1 +h95Cem +wf5 +h134cX +60/f2 +60p50a50t28t28e44r39nf5 +50/f2 +60c44o50m72m72a50n50df1 +50.w84(33T61h50ew78c44o50m78p50l28e44m78e44n50t28a44r33yw84c44o50m78m78a44n50dw84i28swf5 +73Yf1 +60,n120 0 +H720 +V3588 +ca +44n50a44l28o50g50o50u50sw79t28owf5 +90yf1 +60.25)w98T61h50ew84e44f33f33e44c44tw68i28sw79t28ow90r33u50nw90t28h50ew84c44o50m78m78a44n50dw90i28nw90e44a44c44hw90f33i28l28ew84w72h50o50s39ew84m78e44n50uw90e44n50t28r33yw91(33t28h50a44tw69i28s39,w66w72h50o50s39ew85l28i28n50en120 0 +H720 +V3708 +cp +50r33i28n50t28e44dw75b50yw75a44nwf5 +75fwf1 +85c44o50m78m78a44n50d50)w58m78a44t28c44h50e44sw64t28h50ew69p50a44t28t28e44r33n50.w75F56o50rw58e44x50a44m78p50l28e44,w50s39i28n50c44ew69a44nw75a44p50o50s39t28r33o50p50h50ew69i28d50e44n50t28i28f33i28e44sw64m78o50d50i28f33i28e44dw75f33i28l28e44s39,n120 0 +H720 +x font 0 CI +f0 +V3888 +h360cX +60/60'60/wh120cw +n120 0 +H720 +f1 +V4068 +cw +72r33i28t28e44sw66t28h50ew71c44h50a44n50g50e44dw77f33i28l28e44sw66o50u50tw55t28ow77d50i28s39c44.w77H72e44r33ew71i28sw66aw71l28o50n50g50e44rw61e44x50a44m78p50l28e44:w56f33i28n50dw78a44l28lw56u50s39e44sw67o50fw61aw72p50a44r33t28i28c44u50l28a44rw61v50a44r33i28a44b50l28ew72i28nw78t28h50ew72Cn120 0 +H720 +V4188 +cs +39o50u50r33c44ew69f33i28l28e44s39:n120 0 +H720 +x font 0 CI +f0 +V4368 +h360cX +60/60\60.60c60$60/wh120c, +60x60/60v60a60r60i60a60b60l60e60/60+60-60pn120 0 +H720 +f1 +V4548 +cW +94ew69c44a44nw75u50s39ew69a44nwf5 +75fwf1 +85c44o50m78m78a44n50dw75t28ow75i28d50e44n50t28i28f33yw75w72h50i28c44hw75f33i28l28ew69t28h50ew69v50a44r33i28a44b50l28ew69a44p50p50e44a44r33sw64i28n50:n120 0 +H720 +x font 0 CI +f0 +V4728 +h360cX +60/60\60.60c60$60/wh120c, +60g60/60v60a60r60i60a60b60l60e60/wh120c{ +n120 0 +H720 +V4848 +h610cf +n120 0 +H720 +V4968 +h610c, +60x60/60v60a60r60i60a60b60l60e60/60+60-60{n120 0 +H720 +wV5088 +h860c= +n120 0 +H720 +wV5208 +h860cp +n120 0 +H720 +V5328 +h610c} +n120 0 +H720 +V5448 +h360c} +n120 0 +H720 +f1 +V5628 +cH +72e44r33e44,w59t28h50ewf5 +78gwf1 +94c44o50m78m78a44n50dw84g50u50a44r33a44n50t28e44e44sw73t28h50a44tw62o50n50l28yw84t28h50ew78n50a44m78e44sw73o50fw67f33i28l28e44sw73c44o50n50t28a44i28n50i28n50gw84t28h50ew78v50a44r33i28a44b50l28ew78w72i28l28lw63b50ew79p50r33i28n50t28e44dw85(33b50u50tn120 0 +H720 +V5748 +cb +50e44w72a44r33ew73t28h50a44twf5 +57s60a60mwf1 +89m78a44yw79c44o50n50f33u50s39ew73m78a44t28t28e44r33sw68b50yw79p50r33i28n50t28i28n50gw79t28h50ew73n50a44m78e44sw68o50fw62f33i28l28e44sw68i28tw57r33e44a44d50sw68i28nw79d50u50r33i28n50gw78t28h50ew72c44o50m78m78a44n50d50)33.w78T61h50en120 0 +H720 +f5 +V5868 +c= +wf1 +85c44o50m78m78a44n50dw75s39h50o50w72sw64w72h50e44r33ew69i28nw75t28h50ew69f33i28l28ew69t28h50ew69v50a44r33i28a44b50l28ew69a44p50p50e44a44r33s39,w50a44n50dw75t28h50ewf5 +69pwf1 +85c44o50m78m78a44n50dw75p50r33i28n50t28sw64t28h50ew69l28i28n50e44.n120 0 +H720 +V6024 +h250cT +61h50ewf5 +74Dwf1 +90c44o50m78m78a44n50dw80i28sw69h50a44n50d50yw80a44sw69t28h50ew74t28a44r33g50e44tw58o50fw63a44nwf5 +81Xf1 +60.w81T61h50i28sw70e44x50a44m78p50l28ew75d50e44l28e44t28e44sw70f33r33o50mwh109ct +28h50ew75m78e44n50uw81a44l28lw59Cw98f33i28l28e44sw70t28h50a44tn120 0 +H720 +V6144 +cd +50ow75n50o50tw53c44o50n50t28a44i28nw75aw69p50a44r33t28i28c44u50l28a44rw58v50a44r33i28a44b50l28e44:n120 0 +H720 +x font 0 CI +f0 +V6324 +h360cX +60/60\60.60c60$60/wh120c, +60v60/60v60a60r60i60a60b60l60e60/wh120cD +n120 0 +H720 +f1 +V6504 +cI +33fw58n50ow75p50a44t28t28e44r33nw75i28sw64p50r33o50v50i28d50e44dw75f33o50rw58t28h50ewf5 +69Xf1 +60,w50t28h50ew69c44o50m78m78a44n50dw75(33w72h50i28c44hw75d50e44f33a44u50l28t28sw64t28owf5 +75ff1 +60)w58i28sw64r33u50nw75i28nw75a44l28lw53f33i28l28e44s39,w50s39on120 0 +H720 +x font 0 CI +f0 +V6684 +h360cX +wh120cD +n120 0 +H720 +f1 +V6864 +cc +44l28e44a44n50swf5 +64s60a60mwf1 +85u50pw75f33o50rw58aw69f33r33e44s39hw75s39t28a44r33t28.n120 0 +H720 +V7020 +h250cB +67u50tw53r33a44t28h50e44rw58t28h50a44nw75w72o50r33k50i28n50gw75a44n50yw75f33u50r33t28h50e44r33,w50l28e44t28'33sw64s39t28o50pw75n50o50w72:n120 0 +V7920 +p15 +x font 1 R +x font 2 I +x font 3 B +x font 4 BI +x font 5 CW +x font 6 H +x font 7 HI +x font 8 HB +x font 9 S1 +x font 10 S +s10 +f1 +H720 +V480 +h2052Chy +w33 25150550 h25Chy +wn120 0 +H720 +x font 0 CI +f0 +V900 +h360cq +n120 0 +H720 +f5 +V1020 +h360c$ +n120 0 +H720 +f1 +V1236 +h250cS +56o50m78ew75o50fw64t28h50ew75f33i28l28ew75m78a44n50i28p50u50l28a44t28i28n50gw81c44o50m78m78a44n50d50sw70c44a44nw81b50ew75u50n50d50o50n50e44:w59u50n50d50o50i28n50gw81awf5 +75ff1 +60,wf5 +56ef1 +60,w56o50rwf5 +64rwf1 +91r33e44s39t28o50r33e44sw70t28h50ew76p50r33e44v50i28o50u50sn120 0 +H720 +V1356 +cs +39t28a44t28ew69o50fw58t28h50ew69f33i28l28e44,w50b50u50twf5 +53wf1 +60,wf5 +50Bwf1 +85a44n50dwf5 +75Dwf1 +85a44r33ew69i28r33r33e44v50o50c44a44b50l28e44.w75A72n50d50,w50o50fw58c44o50u50r33s39e44,w50s39ow75i28swf5 +64qf1 +60.n120 0 +x trailer +V7920 +x stop diff --git a/sys/doc/sam/sam0.png b/sys/doc/sam/sam0.png Binary files differnew file mode 100644 index 000000000..eb488950f --- /dev/null +++ b/sys/doc/sam/sam0.png diff --git a/sys/doc/sam/sam1.png b/sys/doc/sam/sam1.png Binary files differnew file mode 100644 index 000000000..dcc645778 --- /dev/null +++ b/sys/doc/sam/sam1.png diff --git a/sys/doc/sam/sam2.png b/sys/doc/sam/sam2.png Binary files differnew file mode 100644 index 000000000..dfb72baba --- /dev/null +++ b/sys/doc/sam/sam2.png diff --git a/sys/doc/sam/sam3.png b/sys/doc/sam/sam3.png Binary files differnew file mode 100644 index 000000000..f33a701c2 --- /dev/null +++ b/sys/doc/sam/sam3.png diff --git a/sys/doc/sam/sam4.png b/sys/doc/sam/sam4.png Binary files differnew file mode 100644 index 000000000..6d85990df --- /dev/null +++ b/sys/doc/sam/sam4.png |