Bläddra i källkod

vim: add user guide PDF and its generator

make-guide.py builds vim-user-guide.pdf with reportlab.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
main
Daniel Covington 6 dagar sedan
förälder
incheckning
ac9ce2f725
2 ändrade filer med 555 tillägg och 0 borttagningar
  1. +329
    -0
      vim/make-guide.py
  2. +226
    -0
      vim/vim-user-guide.pdf

+ 329
- 0
vim/make-guide.py Visa fil

@@ -0,0 +1,329 @@
"""make-guide.py - build vim-user-guide.pdf (needs: pip install reportlab).

python make-guide.py [out.pdf] [screenshot.png]

Defaults: vim-user-guide.pdf and shots/run.png next to this script.
The command reference is hand-written: update it when the editor's keys change.
"""
import os, sys
from reportlab.lib.pagesizes import letter
from reportlab.lib import colors
from reportlab.lib.units import inch
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.platypus import (SimpleDocTemplate, Paragraph, Spacer, Table,
TableStyle, Image, PageBreak, Preformatted, KeepTogether)

HERE = os.path.dirname(os.path.abspath(__file__))
OUT = sys.argv[1] if len(sys.argv) > 1 else os.path.join(HERE, "vim-user-guide.pdf")
SHOT = sys.argv[2] if len(sys.argv) > 2 else os.path.join(HERE, "shots", "run.png")

ss = getSampleStyleSheet()
BLUE = colors.HexColor("#352879") # C64 dark blue
LIGHT = colors.HexColor("#6c5eb5") # C64 light blue
H1 = ParagraphStyle("H1", parent=ss["Heading1"], textColor=BLUE, spaceBefore=14, spaceAfter=6)
H2 = ParagraphStyle("H2", parent=ss["Heading2"], textColor=BLUE, spaceBefore=10, spaceAfter=4)
B = ParagraphStyle("B", parent=ss["BodyText"], fontSize=10, leading=13.5, spaceAfter=6)
CELL = ParagraphStyle("C", parent=B, fontSize=9, leading=11.5, spaceAfter=0)
CELLB = ParagraphStyle("CB", parent=CELL, fontName="Helvetica-Bold", textColor=colors.white)
CODE = ParagraphStyle("Code", fontName="Courier", fontSize=8.8, leading=11,
backColor=colors.HexColor("#f2f1f8"), borderPadding=6,
leftIndent=6, rightIndent=6, spaceBefore=4, spaceAfter=10)
NOTE = ParagraphStyle("N", parent=B, backColor=colors.HexColor("#fff6dc"),
borderColor=colors.HexColor("#e0b84a"), borderWidth=0.6,
borderPadding=6, leftIndent=6, rightIndent=6, spaceBefore=4, spaceAfter=10)

def P(t, s=B): return Paragraph(t, s)
def k(t): return f'<font face="Courier-Bold">{t}</font>'
def code(t): return Preformatted(t, CODE)

def table(rows, widths, head=True):
data = [[P(c, CELLB if (head and i == 0) else CELL) for c in r] for i, r in enumerate(rows)]
t = Table(data, colWidths=widths, repeatRows=1 if head else 0)
st = [("GRID", (0, 0), (-1, -1), 0.4, colors.HexColor("#b8b4d6")),
("VALIGN", (0, 0), (-1, -1), "TOP"),
("TOPPADDING", (0, 0), (-1, -1), 3), ("BOTTOMPADDING", (0, 0), (-1, -1), 3)]
if head:
st.append(("BACKGROUND", (0, 0), (-1, 0), BLUE))
for i in range(1 if head else 0, len(rows)):
if i % 2 == 0:
st.append(("BACKGROUND", (0, i), (-1, i), colors.HexColor("#f4f3fa")))
t.setStyle(TableStyle(st))
return t

def footer(c, d):
c.saveState()
c.setFont("Helvetica", 8)
c.setFillColor(colors.grey)
c.drawString(inch * 0.75, inch * 0.5, "vim for the Commodore 64 - User Guide")
c.drawRightString(letter[0] - inch * 0.75, inch * 0.5, f"Page {d.page}")
c.restoreState()

W = letter[0] - 1.5 * inch
s = []

# ---------------------------------------------------------------- title
s += [Spacer(1, 0.6 * inch),
P("vim for the Commodore 64", ParagraphStyle("T", parent=ss["Title"], fontSize=28, textColor=BLUE, leading=34)),
P("User Guide and Command Reference", ParagraphStyle("ST", parent=ss["Title"], fontSize=15, textColor=LIGHT)),
Spacer(1, 6),
P("A small modal, vi-style text editor written in Power C (K&amp;R C) with machine-language "
"helpers, running on a stock C64 with a 1541/1581-style disk drive on device 8.",
ParagraphStyle("Sub", parent=B, alignment=1, fontSize=10.5, textColor=colors.HexColor("#444444"))),
Spacer(1, 14)]
if os.path.exists(SHOT):
img = Image(SHOT, width=3.84 * inch * 1.05, height=2.72 * inch * 1.05)
s += [img, P("<i>The editor running in VICE: 24 text rows, the reverse-video cursor block "
"and the status row (file name on the left, line number / total on the right).</i>",
ParagraphStyle("cap", parent=B, alignment=1, fontSize=8.5, textColor=colors.grey))]
else:
print("note: no screenshot at", SHOT, "- title page built without it")

s += [P("Contents", H2)]
for line in ["1. Overview and limits", "2. Building and running", "3. Starting the editor",
"4. The screen", "5. Normal mode commands", "6. Insert mode",
"7. Colon (:) commands", "8. Status messages", "9. Differences from real vi/vim",
"10. Worked examples", "11. Source layout"]:
s.append(P(line, ParagraphStyle("toc", parent=B, spaceAfter=1, leftIndent=12)))
s.append(PageBreak())

# ---------------------------------------------------------------- 1
s += [P("1. Overview and limits", H1),
P("The editor loads a PETSCII sequential (SEQ) file from disk into one memory buffer, "
"shows it on the 40-column screen, lets you move around and edit it with vi-style "
"keys, and writes it back. It is a deliberately small subset of vi: the commands "
"listed in this guide are the complete set."),
table([["Item", "Limit / behaviour"],
["Text buffer", "19,000 bytes (one <font face='Courier'>malloc</font> block). "
"A file larger than about 18,999 bytes is truncated on load without warning."],
["Lines", "Up to 599 lines. Opening a new line beyond that is refused."],
["Line length", "80 characters. Longer lines are split at 80 on load (you are told "
"<i>long lines split at 80</i>); typing past 80 shows <i>line full (80)</i>."],
["Screen", "24 text rows of 40 columns plus a status row. The view scrolls vertically "
"and horizontally to follow the cursor."],
["File format", "PETSCII, lines separated by carriage return ($0D). CR LF and bare LF "
"are converted to CR on load; a Ctrl-Z ($1A) byte ends the file. A final CR is "
"always added on save."],
["Disk", "Device 8, drive 0. Files are read as <font face='Courier'>name,S,R</font> and "
"written as <font face='Courier'>@0:name,S,W</font> (replace)."],
["File names", "Up to 20 characters, stored in lower case."],
["Undo / search / counts", "Not supported (see section 9)."]],
[1.4 * inch, W - 1.4 * inch])]

# ---------------------------------------------------------------- 2
s += [P("2. Building and running", H1),
P("Everything lives in the <font face='Courier'>vim/</font> folder of the repository. "
"The build needs VICE 3.10 installed at "
"<font face='Courier'>C:\\Program Files\\GTK3VICE-3.10-win64</font> and the Power C system "
"disk at <font face='Courier'>reference\\POWERc.d81</font> (never modified; the build works "
"on a copy called <font face='Courier'>work.d81</font>)."),
P("Build", H2),
code("build.bat build vim on work.d81\n"
"build.bat vim -Full fresh disk, recompile every unit\n"
"build.bat vim -Run -Keys \"vim.c\\njjj\" build, then run and type keys"),
P("The build runs one VICE session that compiles each changed unit "
"(<font face='Courier'>vim, vscreen, vview, vedit, vml</font>) with "
"<font face='Courier'>cc</font>, links them with <font face='Courier'>link -s</font>, and "
"produces the program <font face='Courier'>vim</font> on <font face='Courier'>work.d81</font>. "
"Only units whose source changed since the last build (tracked in "
"<font face='Courier'>work.stamp</font>) are recompiled. Screenshots of each step go to "
"<font face='Courier'>shots\\</font>."),
table([["build.ps1 option", "Meaning"],
[k("-Prog name"), "Program to build: <font face='Courier'>vim</font> (default) or <font face='Courier'>mltest</font>."],
[k("-Full"), "Ignore the stamps: start from a fresh work disk and recompile everything."],
[k("-Run"), "After linking, leave the Power C shell, load the program and run it."],
[k("-Keys text"), "Keystrokes typed into the running program (<font face='Courier'>\\n</font> = RETURN)."],
[k("-Shell text"), "Extra commands for the Power C shell instead of running."],
[k("-Delay ms"), "Wall-clock milliseconds per keystroke (default 900)."],
[k("-Pad / -Tail n"), "Spare RETURNs while a compile / the linker is working (20 / 8)."],
[k("-Settle s"), "Extra seconds to keep running after the last key."]],
[1.4 * inch, W - 1.4 * inch]),
P("Run", H2),
P("Double-click or run <font face='Courier'>run.bat</font>: it autostarts "
"<font face='Courier'>vim</font> from <font face='Courier'>work.d81</font> in "
"<font face='Courier'>x64sc</font>. On a real C64 (or any emulator) with the disk in device 8:"),
code("LOAD\"VIM\",8,1\nRUN"),
P("<b>Keyboard tip for VICE:</b> with the default keymap the PC <b>Esc</b> key is the C64 "
"<b>RUN/STOP</b> key and <b>Backspace</b> is <b>INST/DEL</b>, so the editor feels close to "
"vim on a PC keyboard. Upper-case letters such as G, A, I and O are typed with Shift.", NOTE)]

# ---------------------------------------------------------------- 3
s += [P("3. Starting the editor", H1),
P("The screen clears to white text on blue and the status row asks:"),
code("file: _"),
table([["You type", "What happens"],
["A name, then RETURN", "The file is loaded from device 8 and you are in normal mode at line 1."],
["Just RETURN (or RUN/STOP)", "You get an empty buffer named <i>[no name]</i>. Give it a name later with "
+ k(":w name") + "."],
["A name that is not on the disk", "You are asked <font face='Courier'>not found - create it? (y/n)</font>. "
+ k("y") + " starts an empty buffer that keeps the name (the status row says <i>new file</i>; "
"the file is created on the first " + k(":w") + "). " + k("n") + " or RUN/STOP asks for a name again."]],
[1.9 * inch, W - 1.9 * inch]),
P("While typing at the <i>file:</i> prompt (and on the colon command line) DEL erases the last "
"character and RUN/STOP cancels. Shifted letters are folded to lower case.")]

# ---------------------------------------------------------------- 4
s += [P("4. The screen", H1),
P("Rows 0-23 show the text. The character under the cursor is drawn in reverse video. "
"Row 24 is the status row, also in reverse video:"),
code("left part (26 chars) + line/total\n"
"vim.c + 12/240"),
table([["Part", "Shows"],
["Left", "A one-shot message if there is one (section 8); otherwise "
"<font face='Courier'>-- insert --</font> in insert mode; otherwise the file name, or "
"<font face='Courier'>[no name]</font>."],
["Column 28", "<font face='Courier'>+</font> when the buffer has unsaved changes."],
["Right", "Current line number / total lines."]],
[1.2 * inch, W - 1.2 * inch]),
P("The editor switches the VIC-II to the upper/lower-case character set, so unshifted "
"letters show as lower case and shifted letters as capitals.")]

# ---------------------------------------------------------------- 5
s += [P("5. Normal mode commands", H1),
P("Normal mode is where the editor starts and where RUN/STOP returns you. Commands are "
"single keys (or the two-key " + k("dd") + " and " + k("gg") + "); they take no count prefix.")]
s += [KeepTogether([P("Moving", H2), table([["Key", "Action"],
[k("h") + " or CRSR left", "Left one character."],
[k("l") + " or CRSR right", "Right one character (stops at end of line)."],
[k("j") + " or CRSR down", "Down one line."],
[k("k") + " or CRSR up", "Up one line."],
[k("0"), "Start of the line."],
[k("$") + " (Shift+4)", "End of the line."],
[k("gg"), "First line of the file."],
[k("G") + " (Shift+g)", "Last line of the file."]],
[1.6 * inch, W - 1.6 * inch])]),
P("When moving up or down onto a shorter line the cursor is pulled back to that line's end. "
"The screen scrolls so the cursor is always visible, including sideways for lines "
"longer than 40 columns.")]
s += [P("Entering insert mode", H2),
table([["Key", "Inserts"],
[k("i"), "Before the cursor."],
[k("a"), "After the cursor."],
[k("I") + " (Shift+i)", "At the start of the line."],
[k("A") + " (Shift+a)", "At the end of the line."],
[k("o"), "On a new, empty line opened below the current one."],
[k("O") + " (Shift+o)", "On a new, empty line opened above the current one."]],
[1.6 * inch, W - 1.6 * inch])]
s += [P("Changing text", H2),
table([["Key", "Action"],
[k("x"), "Delete the character under the cursor."],
[k("dd"), "Delete the current line and keep a copy of it (up to 80 characters) in the yank buffer. "
"Pressing " + k("d") + " followed by any other key cancels."],
[k("p"), "Put the last line deleted with " + k("dd") + " on a new line below the cursor. "
"The copy stays, so " + k("p") + " can be repeated; " + k("dd") + " then " + k("p") + " moves a line down."],
[k(":"), "Open the colon command line (section 7)."]],
[1.6 * inch, W - 1.6 * inch]),
P("Any other key in normal mode is ignored.")]

# ---------------------------------------------------------------- 6
s += [P("6. Insert mode", H1),
P("The status row shows <font face='Courier'>-- insert --</font>. Every printable key is "
"inserted at the cursor, including shifted letters and the C64 graphics characters."),
table([["Key", "Action"],
["RUN/STOP (Esc in VICE)", "Back to normal mode; the cursor steps one left, as in vi."],
["RETURN", "Split the line at the cursor; the rest moves to a new line below."],
["INST/DEL (Backspace in VICE)", "Delete the character before the cursor. At the start of a line, "
"join it onto the previous line (refused with <i>joined line would pass 80</i> if the "
"result would be too long)."],
["Cursor keys", "Move without leaving insert mode."]],
[1.9 * inch, W - 1.9 * inch]),
P("A line cannot grow past 80 characters: further typing is refused with <i>line full (80)</i>.")]

# ---------------------------------------------------------------- 7
s += [P("7. Colon (:) commands", H1),
P("Press " + k(":") + " in normal mode, type the command on the status row and press RETURN. "
"DEL edits; RUN/STOP or an empty line cancels."),
table([["Command", "Action"],
[k(":w"), "Write the buffer to its file name, replacing the old copy."],
[k(":w name"), "Write to <i>name</i>; from now on the buffer is called <i>name</i>."],
[k(":wq") + " / " + k(":wq name"), "Write, then quit."],
[k(":x"), "Write (always, even if nothing changed), then quit."],
[k(":q"), "Quit. Refused with <i>unsaved - :q! quits</i> if there are unsaved changes."],
[k(":q!"), "Quit and throw away unsaved changes."]],
[1.6 * inch, W - 1.6 * inch]),
P("<b>Quitting restarts the C64.</b> Power C uses zero-page locations BASIC depends on, so "
"instead of returning to a damaged BASIC the editor jumps to the KERNAL reset routine "
"($FCE2). You see the normal power-on banner and READY. Anything in memory is gone; only "
"what you wrote to disk survives.", NOTE),
P("Commands are matched on their letters only, so " + k(":Q") + " works like " + k(":q") +
". Anything else gives <i>unknown command</i>.")]

# ---------------------------------------------------------------- 8
s += [P("8. Status messages", H1),
P("Messages appear on the left of the status row and disappear at the next key."),
table([["Message", "Meaning"],
["new file", "The name you gave is not on the disk yet; " + k(":w") + " will create it."],
["long lines split at 80", "The file had lines over 80 characters; they were broken into several lines."],
["written", "The save succeeded."],
["cannot write", "The file could not be opened for writing (no disk, drive not present, ...)."],
["no file name", k(":w") + " on a buffer with no name: use " + k(":w name") + "."],
["unsaved - :q! quits", k(":q") + " with unsaved changes."],
["unknown command", "The colon command was not one of w, wq, x, q, q!."],
["line full (80)", "Insert refused: the line is already 80 characters long."],
["joined line would pass 80", "Backspace at the start of a line refused: the joined line would be too long."],
["out of memory", "The 19,000-byte buffer could not be allocated (shown at start-up)."]],
[1.9 * inch, W - 1.9 * inch])]

# ---------------------------------------------------------------- 9
s += [P("9. Differences from real vi/vim", H1),
table([["Area", "This editor"],
["Escape", "RUN/STOP (the C64 has no Esc key; VICE maps PC Esc to it)."],
["Counts", "No numeric prefixes: " + k("3j") + " or " + k("5dd") + " do not work (digits other than "
+ k("0") + " are ignored)."],
["Undo / redo", "None - save often."],
["Yank / registers", "One unnamed register filled only by " + k("dd") + "; no " + k("yy") + ", "
"no named registers, no " + k("P") + "."],
["Motions", "No word motions (w, b, e), no search (/, ?, n), no " + k(":number") + "."],
["Other", "No visual mode, no " + k(".") + " repeat, no " + k("r") + ", " + k("c") + ", " + k("J") +
", no " + k(":e") + " (quit and run again to open another file)."]],
[1.4 * inch, W - 1.4 * inch])]

# ---------------------------------------------------------------- 10
s += [P("10. Worked examples", H1),
P("Create a new file", H2),
code("RUN start the editor\n"
"notes RETURN file: notes\n"
"y not found - create it? (y/n)\n"
"i Hello, C64! RETURN type some text\n"
" second line\n"
"RUN/STOP back to normal mode\n"
":wq RETURN write and quit (the C64 restarts)"),
P("Fix a typo and move a line", H2),
code("j j j down to the line\n"
"l l l l x move right, delete one character\n"
"dd cut the line\n"
"p put it back one line lower\n"
":w RETURN save; status row says \"written\""),
P("Save under a new name and abandon edits", H2),
code(":w backup RETURN write a copy as \"backup\"\n"
"x x x more edits ...\n"
":q RETURN \"unsaved - :q! quits\"\n"
":q! RETURN quit without saving"),
P("Automated test run in VICE", H2),
code("build.bat vim -Run -Keys \"vim.c\\njjj\""),
P("Builds, starts the editor, opens <font face='Courier'>vim.c</font> from the work disk and "
"moves down three lines; the final screen is saved to <font face='Courier'>shots\\run.png</font>.")]

# ---------------------------------------------------------------- 11
s += [P("11. Source layout", H1),
table([["File", "Contents"],
["vim.c", "<font face='Courier'>main()</font>, the key dispatcher for both modes, the file prompt, loading and the colon commands."],
["vedit.c", "Buffer editing: insert, delete, newline, backspace/join, " + k("dd") + "/" + k("p") + ", cursor keys, saving."],
["vview.c", "Scrolling, partial/full repaint and the status row."],
["vscreen.c", "Screen set-up and tear-down, low-level drawing, keyboard read from the KERNAL buffer ($C6/$0277)."],
["vml.s / vmlwrap.c", "6510 helpers copied to $C000: full-screen paint, row paint, block move, line-index adjust, key pop. "
"<font face='Courier'>build-ml.ps1</font> assembles them into the generated <font face='Courier'>vml.c</font>."],
["*.pet", "PETSCII copies of the sources made by the build; the <font face='Courier'>.c</font> files are authoritative."],
["build.bat / build.ps1", "One-session build on <font face='Courier'>work.d81</font>."],
["run.bat", "Start the built editor in VICE."],
["NOTES.md", "Hard-won notes on Power C, sys(), the keyboard and VICE automation."]],
[1.5 * inch, W - 1.5 * inch]),
Spacer(1, 6),
P("Memory use: Power C program and heap below $C000 (the text buffer is a 19,000-byte heap "
"block), machine code at $C000, its parameter block at $C400, zero-page save area at $C410, "
"and the C stack just below $D000. Screen at $0400, colour RAM at $D800.")]

doc = SimpleDocTemplate(OUT, pagesize=letter, leftMargin=0.75 * inch, rightMargin=0.75 * inch,
topMargin=0.75 * inch, bottomMargin=0.8 * inch,
title="vim for the Commodore 64 - User Guide", author="Daniel Covington")
doc.build(s, onFirstPage=footer, onLaterPages=footer)
print("ok", OUT)

+ 226
- 0
vim/vim-user-guide.pdf Visa fil

@@ -0,0 +1,226 @@
%PDF-1.4
%“Œ‹ž ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 6 0 R /F4 8 0 R /F5 9 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 272 /Length 2981 /SMask 5 0 R
/Subtype /Image /Type /XObject /Width 384
>>
stream
Gb"0T;/Rjd&k11dOJbqHT1mR^qERAbaLid<YRd,/[FDJ^@r<-X0`D"H8!5,hOsEV^,Y=.E8Wk>jOsEV^,Y=.E8Wk>jOsEV^,Y=.E8Wk>jOsEV^,Y=.E8Wk>jOsEV^,Y=0UUT]1I\*%k^il8e&C[[=kb<a\uk/dP,UYqKHpIEr"1YsaMbr8(LrNj$4k*rDAhfShhrPNDcmuOjI.2FSVj6qp"?LLDPq8h1.+2`0g+'qupJ#$?[ZM@*tYE#Y`oB9t;IJ_8h[V<0kNo*(6XS2Wa],]o*PrRM;l`VDDT-Ks#Gi7trpIEs5'Us"F(@Mnp042Ak=PV$cf6au6q!%[2f@8Y!C%VK.A*s5W<Z`G<f%qK_k>Nr2)#<D\;YL)lX8cejosONag>sH`%pP'Ac?&K(p-,NKI]h"BptOO",OKN5bnoX(7=G+"[Iqs-*V_bm\W7!P8:,i^>n4/hf<KPAmFRE5jd>GEgY:WbgtC_=2q$P)BpXH7C]?LX^h<&,j-RZUdG>sZk>U`\8_C\'YnL_f2E'I%h#1B"+6WFh^q4:KO0n``J[+qJ8?374(i/T$[*(aaqMu>?"MrQppIErsBW(lKn#EuE3o0H,nuJ5hmN4VnH[hi^:U+"Wa1kqbh#HJcYJ,8Fro!sepIEs!+HPr_8)L&BhaDn-/,KP]C@@4jb<]b/Iu`:]Y0B+As1gqfrK27e`TEYX`?'9rc-Opah>W5.gcp1TpARU`%hKRnmuOj#%q3-:J@En^+)-Z3P:WG`^A$R6>Mgd<G4:lif6L`^]^>Z[G'hFXqrdUR,L]lPIW=>s[j9:l,EL`-SbMNsgYO#dH^!,%g@=(\k+!7&a1Jh<HT^2h>!F1^QTMDB^>4(hq]ftLR&B&\_`@_.hOO3"W/oi^OmfmYr#@gpSC`$nn@\/eOg[3.VuOI@5'$qST1=B'o!S'Mmn94\]g's=`jIb4gNhYHoA]I>H![WAs6f9XmaHHPpPmJQhB-I0Sb<9_$_I,a?K=N"lb#H(hY-q>X8d?nZ1e/f>9#4tf+3;u_>c?nDj+H'RHNZBB^_"ho-lTT+"j/&GMc26hUUcU(DgD+b7e5]T6=Q?WqQE_]/n7)o7-[!h0^4p?Di!c^\;ue%_SRh]Cs_!b9,3i+)0n:$sjaZUH&$0g3b=i^Rlb.[=2p6G[CBLpARV[HMmS'HTgd+E:_e=p;<XijjVMu+4f9jC$/DGT)Vk.hHmU6q=gr`DZBBg]s5<O]=7fnoC>tjpIAD8J@?;@+M"QL\X]"aC[[=kq>c)OpARSjO7,<@:t4>DC$/FMr=Hm0%.Jl&q]kKDo`"qTnKSELXM$jH^@qT?b$Zk'^T"n2d_<#:hdZUN;1!egSPQNcr9*e>07SJfCM<0t[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/fWt,aYC[[=kq>c)OpARU`%hKRnmuOjP!.hEKr^a(#&/]3OO0n``J[+qJ8?374(i/T$[/'cRZ1e/f4%Z'rq8I^A2W+JY@sb0Jr^aX@jCK\i4h()J\Qnh+2D=smB^_"he!o]Lkp`a,kF7gQnr'6U5LM.hH0$2BH$A/l]\W-=fg!oS[/'Obe[9b]ons@PZ.f("m;e:)T<n1.%PFCH<Nf5GJ#%KWMpHnF+W^T!q8H\QmJW0uStDg(mJS2"OsEV^,Y=.E8Wk>jOsEV^,Y=.E8Wk>jOsEV^,Y=.E8Wk>jOsEV^,Y=.E8Wk>jOsEV^,Y=.E8Wk>jg?q26:(4B~>endstream
endobj
5 0 obj
<<
/BitsPerComponent 8 /ColorSpace /DeviceGray /Decode [ 0 1 ] /Filter [ /ASCII85Decode /FlateDecode ] /Height 272 /Length 61
/Subtype /Image /Type /XObject /Width 384
>>
stream
Gb"0;!=]#/!5bE.WG`:P'EA+5zzzzzzzzzzzzzzzzzzzzzzzz!5PK5a2rhS~>endstream
endobj
6 0 obj
<<
/BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
7 0 obj
<<
/Contents 19 0 R /MediaBox [ 0 0 612 792 ] /Parent 18 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject <<
/FormXob.710ea22e64b3ac41733440b8ebc0daeb 4 0 R
>>
>> /Rotate 0 /Trans <<

>>
/Type /Page
>>
endobj
8 0 obj
<<
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
9 0 obj
<<
/BaseFont /Courier-Bold /Encoding /WinAnsiEncoding /Name /F5 /Subtype /Type1 /Type /Font
>>
endobj
10 0 obj
<<
/Contents 20 0 R /MediaBox [ 0 0 612 792 ] /Parent 18 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<

>>
/Type /Page
>>
endobj
11 0 obj
<<
/Contents 21 0 R /MediaBox [ 0 0 612 792 ] /Parent 18 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<

>>
/Type /Page
>>
endobj
12 0 obj
<<
/Contents 22 0 R /MediaBox [ 0 0 612 792 ] /Parent 18 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<

>>
/Type /Page
>>
endobj
13 0 obj
<<
/Contents 23 0 R /MediaBox [ 0 0 612 792 ] /Parent 18 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<

>>
/Type /Page
>>
endobj
14 0 obj
<<
/Contents 24 0 R /MediaBox [ 0 0 612 792 ] /Parent 18 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<

>>
/Type /Page
>>
endobj
15 0 obj
<<
/Contents 25 0 R /MediaBox [ 0 0 612 792 ] /Parent 18 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<

>>
/Type /Page
>>
endobj
16 0 obj
<<
/PageMode /UseNone /Pages 18 0 R /Type /Catalog
>>
endobj
17 0 obj
<<
/Author (Daniel Covington) /CreationDate (D:20261107083851-05'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20261107083851-05'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (vim for the Commodore 64 - User Guide) /Trapped /False
>>
endobj
18 0 obj
<<
/Count 7 /Kids [ 7 0 R 10 0 R 11 0 R 12 0 R 13 0 R 14 0 R 15 0 R ] /Type /Pages
>>
endobj
19 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1114
>>
stream
GatU2gQEI6&:N^lqC0C\(8:V=r"`d\b*A4OfYl(Q^'le!Pb!`7&RbWe>/LclJk\-,'SmZ5cKTD]>;2`FB&.Z;!PFr?oSrt40OFmF7)JkGGWd-s)>,d4:8C;Pc\\AIeI52C^PWt4J%CdcE(:)lXfGj_GR/'mZ_jakU@B#+KF.S,=qAAc>[_PYrX[5&NoqK++umuu$n&a3<Yj?8dQ`lTYZ=]L`XmbWSNU%ps8:&rE1.UmJ2!gZ`_e'\ST;ak&T<!9JTnqg:(qK#`a9GB`K-c4fM.B-G>q@0EIArU\PPBl,*3I6J0Zs/<1^?e#$+Dd<h)Z\N!U\NU3^.,P!W1c*ORl@[nH%(SKENV4Pfa;L.m%t:1`(nr!>N`M2D^%&P9Pu(,8c6fd.I]*GrYN^65hMY@.89ZrL.mJ9#8`/Ss7=%Gsbc_0ui$$PuY0STc70)I*a?RN4jZKDY1W?!QE^p;;6Eh;?#nKf)h4^36oTPZb]R`;Ecmo!A#V/bi%G]6XWT4_V^2+c7;9bb,D>rW"aueaBLIKpQVu:k5-=iS"Mb]\?UP"q%tb\HP?\7&InuqLZd\ZZD7s`bdI!PpT3!>4[sk6"RNY;h`oDq\gMMmi#R3h(2+6W6I<2=tW4/99oi,-!_A"aD$di"h\Tq.0qOI;4^kFpb@-%Vfr3dhUoY\7T.-N%Hgh7]l/P[khF-:Ze$j\bIt*nfqBFkOM'DD20Q:EoPG`.p_NTUb%O+8ijbcn=kL*$&%]JskWtb>Sbd?7[**Cr,oR7+RO)"YIUY!a$Og#E#(*g_L\mQ2]<D\M'?Q<kii+u%l?U'2*i`7a.[d6_Gh1B3`1_V-btcY!FEp-Hh=IP"A'YpC%C*^/>o5@!J"W<9B6TnmV5rC$i#S`Ms2O(%?>a"N7#rR!n+T79Ts"_u&GQel+!P)PjOlsaQ<Y#p,S8G8c+UOX,oDpp=+mCU]Z"p:\h7Y>hfnRJ`j*He&XOj6VT*BrFFY0IPdr!BK]$uP@R8k3?XS50<a[,b+u%Il88K*-D-LiUQa'Y=7;s],=)Q\uZ7RVU;dhaT'=Vk:rtR-f;gLloGf.=p`]r)Wm+8?8>[EH=ctcelp66*4`oA@HB&B%O3'i/D^H]&JD?~>endstream
endobj
20 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2989
>>
stream
GatU5D0+E%')q<+dC"*u7CGIIKE*I#X1GBBVgRgdF_l)t]$_B<%7WWsZniq/malCOkQMN"@)XQ"\M_i!h:"#Q2\qeUcdMiK.tD!(E.)AMA]&U"Q=Dm.I=U):eXoq))jalU`jhf`,Lc5'(,S7p$Z3+?mNVsk\75]UFhE;d(SDNPDYRtc,;'gl*>lRnaTR":j+tC$l$&No9`4XQ$uKM@\.tp^i.Z`q\+C%LZ<B=J@:G?g82G('i]9F\XO5Z@j/4\Q7a2U8i"4N+3u]`QU2?*K4j/@?ekE/T[XfQ\+Gj1)Op=l(El[460e+H<RbAH42"A8FKm#A^SS8=#S"`nb'Iu":_LkBG!0=V<kF;?qOR1;`V()rfn9`Kj?i5+%NtV_=_,h2eEX?`c3:N0KMQOD@_CV>*RHT9.n;W*'iB(n"`uKapa]E2Q78JYiZ*Y#J;\HN$LD=/P#R&INA($gk6l\+i>/30?8@:n69=C+6rI,u#`O(S,&2"F%a45;,LaDSMM*S=V$ZZt-$-7K@)4kDG94,a.osmD2#@o1/`_s&Iog(@=Gp/Nie$*ReL?E)\&7rM#&*Rtm@orEo\d,%@g9sI)1=63+$#W!_o:N2pY?^=OCsPDVp0;\&g!pjRll'g"KJ'+1f\U0Y0Ikp-!]_>pf_<0EJ$\I>XrS<pe#_nilej`fm)j0^n2(r^o\+Z2<j1A5AW@5o#FI_P^qhnPfHOG<4;Y3A*_,S%/b&+4g`=P)ZG0?V/nag\-<?t`!Gb>@O,@?tTfNG@&[-,A-Hrn4-[q,n</\?%F,HeWM@L\n`,^><Ak6/&mgStnKR4>f(ImXF80OAj>bTSocgscS(bSGABc'YH@D#MSW<8-SQZd0HOiHY/ld:?N_uT(3abMieY@ko(L)kPhblAF4#^&j4$7=noOWKm&;U!ES6nd56bXZ=fSUgp5kE899RL[C*l+0kr9UY.'>+F'omc6/V(9g4MJl"1Ql9=^%Y$NW^e"Otu$k:]#(RB9)Y!r.j-VL%!Q&cAIG=mrca^B%._rprA+$a[!Z>::I<P&c6.8!0q.G8.$-WHI<dsotWf4o\Sda@j9\n%A:]/OWfD)nLsgC>W(#_I0[F0(^)e4U*NP#GMI.T#nj$Oi\kXjI.b;4]$G&1sh?`*hHed^\3Zr]a2D-D:CaE=q*X7b&e:(Qs\74&+LjB"HG&JW!O$cIckol!g\+Sb+G1@Tagqm[7o8%"sECU^<o=OeR't_u)p%m,eTqm^-tGjJ_]%W3E113o#Wo_BjSb:WTk,T\XON8-])=7b1)J5Et_h&Rlk5;L0nBA;V31)%Zj@2Sg.nU8UV<10Ck@4$-b=4+BQsG/h<ZhPXJaUk)<X*JY'Y5"$Sa>\4m>f3758_(b'TfdnIaY[[Ror_p.n<+&G*oYdn^S+"O[hjPM_SmY\6KFBN<`IL=f]:4uIF1%bfs.XVfqtUqG0uE8YAn"#7@LWFml5ZqYijAd^RRS:EMe%AE(N<ZlFGSS\V2m%jL==NjJ*./iG*[+g:OZ(p_TSX10a>;>2u"KmrI/<O&.O[`0IGr'F_rg;7$lIASj$Li/%DSKnk.q9H:m*u;pCJ;*`1(o29">1SX)c7TV*+Ioc"@Hb;]:.IY7.'UuPBJ7>+rEnYr7/_iffd'b-jZ6,SJ8k)=(aqQZb>QnAp:Pr&lrXK-ImSgnTk*-[$q=i6.>l9fCjI`^UqdWc"L(dT3OT=.423&XRnS#Z@eHHoetYff#8R#&6(HYK^g-<ODmNcho]2Gc2Z>pkMm7KkE]BYqVX>;0i38Ib'q.$ZSd!q@2HXSq&RRp-^J\1p`)'hIss"=-\j2t)1p;=GA6e6Rf((t/.C:OaAtQN;(DCuTR'*1\J(G`]b:%e:R#>O3ucQMH1jKT&U/'GI&;prBkuVpL6)l\MOt9,SWS)s&K>a"7(+:s]Rr2d@m[<Lj,*>=S9^CY0=lb>-/m9sf/+<@WC&><+`E\D"'l:UQ%a4mfr_HpkS[(kE"T&Td0XN.ap$A(ZJX#@,.uP*2-,D.:`9ipAsam:]1HQ92;[=a.o?<XeC%Fe8Gt$RQ\dNr/$l1c(d36W^^M4H7m,%%m))#/;q3$pW_.7d0a6p[@!hWXmZ.=%Xq<$GY;,`>I\/0pM&b-gUaXEOZAn'I`Wj8&pR!;T=$OKBFkPPJ@7$0Nd8;98Ks<kbTXN[L_\=hQnQeMB=\3_2hT:m"5Pfj,reb@<72nJkM*E<cE'i]n_/$hFIjq"HW,8'o4ImK)Sa'3=8<a`he6?NFSCkDBNAoi"BfMcUCrs*=&HMNeS4[Q49ir)H=_D'D/OBCl6ANnTtW%`3MW?-fniE>@kie/[8N*GEDnp5D/p"dQNB"9?^<P]PrHT:#:2imiSN0WF40-:JJf5l]RBt24AWUDnUR_gHj2bK,j3AS2X-^/8*ULHr]6o9No4fJmW.&?T0^SZ(N*Icj\o#0KEn;*`2CWkkt@GULT3\Q?VnAD6WcZc=B0#l]*6"o,pgC7KF;qe$MNJEcuHe.)P@`*NDEg%!*T\-B,]h8U3>iep0ZtVba"DTmom>3Qa-(S0;9b=R@r&CX_#o]=J0sb&d0@96iH2s#=*!UhbgbVsbq9Da+AE$^N(:@cXq(.S=@_EQ`P.A!gLZ-9fj[!s=u$S^G(/s2HH0p.Fg#Ps5Be;=TX+7aVCnYLVDYm,cI::RgnE06k(!IXV(+]jW"*c3hm>"d`?O@M)<f\GZf9lgAP^l>+9>+4.+lbs8LHQ<%bfiB%8>-^Fm>=IgI.FGoa/fGP)aRe4KI:6HGuF\WifW9:I,MI"*:\2)fWea=F,O(c[O(efQAJTKduZ';$BD+=#mE)2'nPc]NEaJ*p=Z7u&NrE/@_7aCJsC_L0eB-pFq]pU='ZHlkH%leTPWu0;YL<-M)l9H`/)Hl'Rs4D^r!,pD0A:L3Ag5KWnec(fqE4=rYFN<1/\a6-VkPC0@e'/o`h&Xesk<>l4:NjB@44^0TcGPN#glo1EoT!j2;R=iNR+9"&hiW72[K~>endstream
endobj
21 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2459
>>
stream
Gatm<D0+Gi')q<+Z.#,daJhUji4JmF-?5Q7Hb%)&Q#poh2`EDs8ZX=<,tKQ_pY?![7$/+)<bmaB)?^hkZd8&'J,q_1)X9+\!PFo=jF[I;KBWdQ9=&%&$#ZXWIp>rk4F5t%:=ZN#]&>^TFMG.B%599t[KS"<=Ma2I>/;c7+C>Da8QVrL9JZ^0"_7<W70Xil-kr"%r>hbRaF;m"aY_'/C.n;K0#2:Gr=p,OpN:Rs%1@B5D&Ul/cS@dBCr^VdgN"mX]0[MhZ9%fsE7\jn*pmq=:aCBdF=(uiURYl@Pi7cW_piM.U%$RRVQPBS3K2gm`H*TM5o^&$5WH%n!B&3aK2m%8@@Qu7o;]@00tN)f#@?Jjb^#MthCq@-3s9.u]'=FnUtJWR4epUjlEB<]A'(Cu;1gM.E6&0Ci<ET_1r>gQA.)jH`&pi%Vb>Z1q4\(46r"7;\YL*0nIc!,]^%k.D3NoVnNIUWRMF.i&`3,<?dqWTEH_\.<dN-p:K'qE%->K)?f&NsiS32'I^nsON+P3`?U#XqO/"N'?caFO#__8^)03e'NVUM5GkcN7JZusfRdX@]mXXF[%,"'"9@2&<!R#+`P9m%#]/OJf]eu9?Z"+#J>r-Tb]"%$"M`Rq0SUZOaF3:g#nn>-ll.b%=m<-a3"MBVt:s=.rkHGZT'jn#=qjZ<U[JA3ehn:iJ,$BXM]!ja(d@36n^YBnNa-3_di#N>oEm4^6)+"&`Zu*`H[s]4c_gb.<lrgjqr&C7[^\uZQnd8p-eg\HAGm?,K@L5>j8ca2EP]Tft.W0W:_5G-$oibndJ7G3R+L<g0Z3V5]-%*@W[o[OHG4>`\emp&6bYc)[Mm,VEE=pH9D2?*<j"rlED'i-pAkZ(SeDQH55"at>XU`Wm\`LJZU.#<n,i0$NRWYASR[6;e7"Q6_NkccnRmiPdRc8Zh=?acZ;"2h00GEQ%KIkq%GY:%6d^H-i-D]>"Ln7&?\;(#(M-hen(3<9F:*Jnl@-^pD%(D2Cfp`AoY<)M<o.:;e:H("eWtDel)pqu=$W#=fceX=\Y@[l[K>-q[m1fhS\_YCWs%WqEiZ/3SYS\R+[f,)!4GO*\TLe-`#D-FoEJj-C[;Z!q,^^o@Lb8urgePUJHp4ft1FFC7&iV4[`@2<P:f[1hl]!+U(9tfVVE0qQ$"H4DJpbieNY2B45X9s5ec<I*A\Sp7YI7c'auY);?(QRU2s$a$l3WmsGI<#^1D_GU'!04@Hje9>CkaEtI*q"fZQ(k!:Qh^os)#'B?^:GJd>Li$6bN`+m:\k`^T+>?FhQY1*aJjMBJSa(cjABY/ji,VWCfdj^,Q.kGmI'T.Dr`2Q:6$8=5ja&],co4[9Zt[/1lrqA&'@I?m0^n5aQC:8`f4q\/bjaSISK<]WMXmesA_)j^)eup%u>\\7M@#5SR$jUJ@DHHn2f38AmuO:1j_p.pVD-.X)TXE6k6e=l#i=a2HG<DkBUFT<3XrYI7D.PgHDna6,QW%WUbMr;6Ge&S\CcHQGOGL:Q%e`L;KiX\/F?Q,N29L.Bdk=&&NtMn\LT^?gi#M)f.JHE>l+9U)[S:q'SRdoS\um=sjJ/'2o/<#P_D?T_'?3pX<GgOd(neUtdBnqK9Y35<m<WhB'mg_t7s3_00Gg8oZCUbP%:G^?,Sb*XUL;3c^R:e[.+1$2#b@"F"pTO^>/]A=P34:+i^Br-VP:=V+Y6>Mn,Pe0e;`9@IXOA6bE=XN/+f2\-5_+sq;:<*R>5j=I7g?Kj;8C5E$"M)<-,cjO8Q.,.$_t5+p;fY]F'$63.(M8&Y:sI/$$c4/cf7kL"!)3O$C8noTnuDt/*htpe%NL^Ib]j)YP?0;I3NOrh+bqK!ismB`V=jEnI1V;`H(+?7=Z!.%/V)kGC7N*ebgMQQ5c3;6eMi2Z8(mm,9$lpcG_HcPgp;)@H6GN<3M0`?44E[Dno74r=oOi+k7^a$Gf?P(.'6W"eBM2k87INdPf$*a8bYNuN+*o.PmUkBkG/CS#h,(5FSR_goPtU:dB2*^0ntGtaO9Ug>F;.\IRbTeARt796e04Tj'oB=bTE*N6cqqa'CM>H/li94D]&):rF&Q;F^b<L$daVb4^h/YP6IPNMa[+Pbhj9+a]uo\NLFMInfaGT:9j(HpkgU98TbY:MUaNNBEBY@WO@G+q>[:Hatojs:lhO88#oQmJF&8<XK!!Wl8Gu?`SC,bH)b[\O(GrdBVf#-cknqh57EkfF7O"pS*o]V,T[qW73rV]h;+%Ym\n:WIg+ZL9N8\Ymq$\8:l8L`nfY+s@R68V/mC)>=8#I5FLu&/J?L3ijq&ta-,okDCE$K1c`JF(V4%VZ/:Qf<c[2R4?@+$CJ/aa\>PDUO=X's(eX?oI='fEoUm&'\0'6l18r-'gN0r=b!Y5_)fS]BGR;\:Ll+4&1pQ]V)_k*$-h$>ppk4<ILb0i8c(37.-n4O@t!eYKP1*l_QFVnB]$+K"9B`~>endstream
endobj
22 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2076
>>
stream
Gb!Sm968iG&AJ$Cm%H5#>FXdPd@;1XcF?R^a-PJ<0/Nu,N%'o9+=m<_?%?is'IbA$3usA.%L=WZgBDc8>q$oVT-?J4'u8QA>[/ePW%a]nU.[PkhSXGYo(P`T`o\ooaiqdO6WP1*JbF<!i!YcS\tOb2.on?L$!&a@;d`6"=7L#?qf,6DeDVAg-qWCR3q16?bW`r2-SE.d6rPC1[gPd:mXfsqS,*GV/EWBV=Gi,pE(j/@bLSP4'Z7:Pr73IUBPT#KcD=iPX,'qe[lM=I+7Vu8/K27NpH`2ATh7f3:(a+8=?+]i&Z`d@&GQ+#'?SAZ3elq`BL'V(2+K57WTrH#lk(0S,PFuXm3<"fAC_Jc8J^GfbC`dj#VE/iL;R0`g*9jtgaA,DU$r))b3rlqkn-?a,^$KT9906re0uA;<fOuN]-J/D0!:1-Ea]EE/;7&@&b0<3GRL\BmdD8DF4LSog9khT*Is@iT_BiSieW,oFApe$,aJ(sPO26"_CfY=YZUUN.lKO%g)ZO9`!289b2S)+bCDuE`,c3:Lch9s"7=/S4o2\s[3'=ucVOhWg@RY[^S5NFRKM:LbL/k2HL:jB:3n#t)]f:K+W1F'(jZ:CQ@-55mD4D/MVg3KAc.AS>h5ge2XY&Qd.YK>jF.ujg!BNTBb)h5go[#Wf4G:8Fm']\]4B<[:c$o495\Np*Meo+`=!7K+PcFQ;1<fBjd/EN?cL')G9F'GnGi*:A?!X9*0;`)Y\b+#)q26)_VMg;Ui`(E+'FF'SiqjJ0AaeGW8&5P)mcjE]2gG.3NcEr1*VpCMs'Yj>`R"XW*Libf;2]*E3#.=<2,A`A??^!C:i"]=)o%p5hBu&fi*Ug;u=MkG)EX+GUcbQ`16a=\JP9LOpG*?;IVcMU".K+3K(]W\r9RZ`.XVjO1f[.EDAbB=be0jiQ:ba!U$bbS"59U.F3&Jb]#K5;M*ou.h4oR1bMPDUaaIr2t!!K90e--OISTJH/[K?.T,9`iZ2[q>Wd]oNY[;sFZ0BoVAG$R<CHRd-m[6$dSGZ(;"&+O`o(S8&QT)EmFJ3E?4h2%*(IjGf8R<!;W"'CO-G#:S4<hSY636EE%I%BQHXVS>$[U@4R58oh;b`=b;gg35g>:nV9DY8p'Z2Qhe9H@aTO*i*D"dn(HhFoUal[?^'"+eO%$`G7[V%:Z8i#m9%Z$L.g_&WhBHC@.8FGH,#PdsHWKjFbAm'7=P5m^mSj$ML1!2qZ#t)c:<$>(eR34nI0N_e\:]?HRe7*q`YFZ*"Xb.GI-GNH+L=npTe/Gs5!8"47^5F*^(3kUbTi7'Ob.qlDO*F@g3r5/Z9nf1C;Z-pYl&g6h5>DV%o0j91('-3pE7o-g8%l7Lb!Es9<t<Q3n>[J=s-i!J[CFi%pgHe\X9%]#tZi9H#^.OaXU[8A[.Q;Wl12R>L:DhjR#:Ner?9[Bg&)P<.`kh:s/63*ia:/'>GEr3C&u_3LOA3'5r+*g#D_8-&PAnM(NsijH4Cg/HVA%b/f"%/p2BY0XL9jZehjk4<Km.]Is]\_^8d7=!mIlkq(-/9t%Km<;C5A<M8ghZD9'8_\01*1MMb8,GLj:;G9YK>ZBo]^G:c"Z@1`;f#8i]c,!kk4!<c0kcA-OPM%[IB=<f)"NJd<MB@:uj)IDBLfe'PmOTHAd7(pnPG*6hc02Q<NJu^rm:c;L5*U?I.(9hM`OKfOj5TUE4C.Be,>YB2?L)BloimE=bJm8s5SD'#apgcMJG1aL"V))nD]_;#a-$Sq)lG/@kJWVCAjHBIn#,E^JqE1i'u2;t<E,>sAIVjB8F]$qA\=_U`R=A2POnC?%<?o(?F'L""Oe0MDBVT(Lq-;)ac&^\'qC2f>+B8JHoO:/#oJA@cn=>Y5O7;V>#U2Fl6a]iUUB%:D0I3h>Q`'q^X4.NNmJip<QQ:4\<m#M0$!B$5$Zmh52KbURSo2RTg*IuVYfX$JRe>$DtDOjm@q=o2_ca+$-dq`+`hf2/jGrs&q#*oG_LN+Hart"kHAkiq'9Cab5/brXYR7SDciV(6r1:[XhQJkF;7q]@PDt,HEUp=PKEn0RV&;M7,SkW7^G:2PCESKkgM6~>endstream
endobj
23 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2632
>>
stream
Gb!Sm>B?9+&q9SYkZ")X3@/0#JA?VS*9U;pA9/Affr\2LQSBC]`/'PdLhM;:Fq7Xt">];Fg=gT#QA1gA9jbVP1f3^4PCMCG^kWe4IaUL1@C?<`:^i_>J\0Ugb?=h_V?`,jjm.f'C6#,Vo7-O'#IL#4BtsjIXC8L/f!#i3`%)>,@_ENb&TY)a\:>Y5&)m9$>OZ^$rIijNU0f9'd1sj/$VK=/'*kkPofEL`@q]"'C4pA[Y"ihD!fCSn[Y=a@WF8C*"5Jg99bl>s;oJkRAbl=!EUo*LWB1=LjOib9d>JZYBCh'3)/!,G"00e"H>1)[1(+Kq:J&ZI)`19cJrYmh_95V830K(e$X[<6#N+pJ>?=o_FN#:rqSnLX&KIWbJZ]cQl^Ck=2'X?I2$e^2qCoPZGkVC(UCYRsN],,Ci0Bg%s7gtg2a?b.X('r&ZX?f(/d-jT8+,u994)aA/7`XW*qm[AjDo8q#pU$3E"gEu;9Zlo`"Ep^?GOVN;g8=f\.lkJmb!2?l\QmMcV#;@UQ@-mLbBnDiYBQ-b>4<qRLp.J7s"f1On]=:YUBQWc1g<tO2+sl*[-RW5L-`%U7ai'07p+t\^GI^PHN(XYJ#3C\'b9Gb]cq1'b$l;GHp8X-mFMakA9Gf:O)aRkV6K/o/;U-L;,t!Pc9]%l@:Wi:#"5bYqZ;;$grL/_jlr,Tt?VAL`_"hODBT)XOl.C@SN*qnk$8XBC_%/a6AMN0@mS4jeCJie(CWo/;h=2=n\[=LJ/N;)>UOd7P,.8jM!Q+R?Y!],@Qa@J2XAn+\P(#/DObWkcu<B0g(.6,sR@9&$+?=Y$dZNk_,=qG8kg/&[_FY7XcUs/ed-_ppS^8O=U%"%[TV$1qh8uG`LY0djVMg-HhK'e*C\I?n&o'5oHifkMTfP@DUs57jDejlEmIRBqHE\@=1Ou*R$jrX/=n?jUd5ec$\d>@kq_hF>EA?W>%oO`e6\Q6)tqrrr-g/j8Q(\PW8KUMkb'ts7,dQ@J8kC&7LuO=9*`^M0J(3]%i@,RiI>1)>/ZWW9JV$NU*R%G$A8=3F`QWo:OT@9sk5VaP6(@N[IG);tRoUHRl>L;h7TaAqTYSg*?11Pagq9T:qU<f>hF4UoY`D>XksiHk$0]UYCQOj"m$"$#L>XdTj'1F]Ga3Br0rg9?FG/eUi#bbmkkY.k7!q^#W:\nS;6]@Z@Xb((m.m##hMEHlk.Y5ERSqQtC-r3`*\0.WL`f1a0nNQ,p6GgiJ>j.iF(dba?Te^e<\+SWLi4jp8_JKKkT:]<fgRbYQnE)?\lk%Z&fBS?BrJZ&/`]HndiM;8#.]I9aUT*X.V?jaK/g:*RT(#FJ5;Li)\8"^JaRP:B&h0G^uM_r"pQAt4n8F=Ml*1rd/AlQ10&A-uJ$j-;1?GittQF#nQj8o0LljlbZ31BXlS?$2sSIp,cDWbSqV=4#Efeojgs,1DF==UA]k.8PiOM:i,J2%pEP+g(ZA8_AW/%Flq*TM:dV$[uMKh4\P7[$ubm,:Hq;;q43m=ul_N!YSa7=06,pU=Xg<0:C=-)Vn&'@V#E;gX2k<'[$d!W#(Du0nj0e#Oq/N827%"!_,cbs5K`^f[)at(G;ID*l3W$LX3H6i#@\Q'MH7Z,!i>,bh7Sob`Kk:(s'QB.R44H[RN<9r&Cr/r.dGhcXa_G+R_\t\@_ceo7b-D0g`o+-N#eErV#LL:<,O1rXoN*4=eZ:$JgfZ(DXe(4^odh.Zf_Khq`\X$esTIQ_cIUY%t`eiJrfHP6gq@.cBb<?*P5i8378L<Y$!QoF+S0DS9n"FJJT_D5Hu[`[-CGOj#1g(:u)'J7gORVD>$g7EQuPI"9GU+5C-O_ImWBTD@I6Qfd_)=V+hZGToimqOf*Y`ekiPi;Q_nd);<c5ndcZn;t$jC[<1jLH>=)M*C=05*IHNk"pA%o^k.h@%.U<@=`HH^6GsfQC\;O,i?eN5tf"C`AD]#CfN=J3N6"uL9qNSJ6q@;].'0YCKkgtka<J$Vp6\ZG+]&a)VVh,4I(muTBOj&1c8KK9p!Sd:P]u=S'pdPNu49HG<ET'"Q<'KQ$U.TDTE]-h/62k)8kqR9c2t/+bFCf'D@9@&S6`7"u7FHa<#??(-,<u`EKW-Mn15[@EfrDq&#!%6JF>PN=^>i=O?->:/g@D]9F#'Ia!j3j14l9l'))L-*_L%0'<VVkgVs?f!+515#S90aTo+"0@H-7C1?pn>s;^=XO6[/LR;$)S<&71/<"!L@Ki$$C"C7UGRTJ(FAK@N:FM<?3K31,JTG:j\+J4qE5_fi7GBK--kq:Z\0AG-)"$h8$,DB2P,9gkokqfEEn[n]cl`R7#&/`loR__Y$Z.li\:0(`biBb17aAt02e>EqkCeH80r-I4pb`9Rqss.a`Z,3i]5@,qnc!,;Qd=?sRf"2A<JL.%1R9fY@mO;bp9V2T<V7\KO/=>]n'OmUH2(!deb_tiqL3D@.Ym$6hVGmDRlbqiL6?(ag4/5?*Vm5-N)`lkGhg:"(iq@Z1LE&QW:tZRXXN\c<74GVaeh4t^LBOhe0ZHd8J@9@Y.Y.`hJ$h1N@\hFAo3c@en67s;:70KNlU<Art?'5`_4:n!\G'&BCZ9*Vk_$tO$&(#0&elO"NUGu_q)HTHL$;5^tHI'"/e(O~>endstream
endobj
24 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2291
>>
stream
Gatm<D0+Dj&H88.Z-DoQBSRGZpl4p`9q+_#fCmWL+a7u`HkEde-ar,=FpS-I<q7aNR,VG>J.^L@mJF6<5fK':hq\k%dhG8Q)JD0*(SDY'!Rkt+3B_XK.=Q9T%hlo3eeM-6-C+l'cX\I1[">o(^_eLe(d.[=/6Du<MS]N)6ftY,Jn;_8giJq"kKN\a4.&4IoY'2?A2;^NbA^'K2e7buNNGG7O:?c,3`/T#$!.jI[2i`cMIp%PKqF*:R.?2ufWFJLd8]WERZ1*fT#LR?AQ%lcR/4`d`?pU+T'.J_@inKVp5l':P+tW$Et_2bWR>!sjf?f<(B3CU2S`VFG)H^e6tjflPn"JL6PBjb@.5nEABVDUlY<Gr35&Hj=$?lSq'eu19!D]tQJQCl]7[fJ@XlL*'%6qqn'1h)rd&ZFrI+jTJIGtGg_JcZ0gN;=82hXKmlrHX+XAdtRgZcq1@WcG4/G;KHedpD(G(JBIR)MJpF_aXVi#VB!#SrsLpE*h^'epI(]Fg(k9*3QY0;:b@/NhP'\!6#e8FY.4g2Q@6e3fB2+o"<Nh4#X;[s6'.I$tkg)SU#4i&uEQP!7.YM6.Ug!e4?&Y<uql/o5Qf'P'KRRIpk*[f8JfHR.hQQfq;Q]-DcoI/6lqE1UrTh$W/*#U3_;3<De84^Ed'J0/)_!`f]2DF$q?2?#t5)9nfD;&f0RtbD$[N%Kd6$UkQla!VK[hAVX;P-C59Nnbe55d0"4:$!_Qm_2Cb_JGrn"e*rP/LYbnn8<Dj%?T3ZG\c#n=1gqfV;dsqC[s*:iuB<_m@ZF&tgO5\k>Pi>ojUs;j-S&g,?mR]tlk=iQJBcC`AqR:Ga"QAUXt3_SFD?+A:]aU+NU:ijU<hI@)a2G<,PPrspK7XWr:_J7>RVj63-qL_DTQDEja99NsH[9ILK?rZ&_Er'`2<eZBR/CKLN4/o"+_\>o5%"@;jhHn<n:P)3I;1[B[]:!Vd>Fki'Zo@7TiR]9g2$.eoNIDR)n-q84Mpb;R!$:U^X/"2.$\jTI!9i^*nlr.#,kR.^WJF:a.+kA>oM`#$73I,+)pm"`"&CIloN%UfYA`Q1-]>6t]P)uIgokm;eG,DMJQD<ZS=EL(mjI'8i)qb&.;j*ph\Sn7P!<t7>E-jUY^O8g/:4Eao91?)<0*EOW=<Oj<YWKG,*W5PRbb<8eX'EW]#P`oU!?2@Wp'.tEVjj%TB-Dtn^8)L':kH7e=U0CTfsCs+]Dgs2I2'41$,bn*W$4?25ODAg@%I)0Kd]VAIgm5..P8bXAQmQ@nEJU%?NTK7J&*O"F"hm&O?JN#C21L6U;jWi>XTI\^5.(8n_3TtZ*gZc_D5=:#p=`2m%TY8,lVh<2;Y)/74S`sjf\*#DHccX6l@"Rk%<jn\T%iT`(5H>PQ;p1$;(TV\fpTk]g!P`eGCAo.*X^sClJfA%]:LG&H86g%u.@Z';Oni"N-eGR[@40D">^mY`t(S1<4SSai*TuE+;m0/i(H/^;rQD#ubI+/s@$l""oKjJ-4A:^9o`Ei!!G17n4UD8RA2P.#LoLV^#F)1lI$>7+F;IH6[KsT/K6tm&--E^%Tni_[&OTI^Io!9`5bg;q%-VZ]q0Vn\A70;i*"9</BM>bC@+f*9TP7TDRc=+*bquU`f)Ic>HMYfiKX))S[fjC_f/r4EL_6Y%p+mZ"?Ws33Ej%I_ATG_G<KR!rooj2B("?!\.O90r(B]a9,G0XB:-E_EpgFk>9LfO&_%t7:fXK1f&2l61/"Q&[h\">mYM?cXfRm<K*a?Q"7U<=Qa>\*$m4hU2bhr*0+r4IjhRU?o/&T=I-Iq$/&^>mM0K2Mq,^#"[\\PNkNNN^3:iV?HBq.UT_?NUX\>FbGhNpXJK>,p?$b=,-:?@eJ0XIfC2dqpV'"]N4W^UUHNsX32Xn("\`XU4<bR_kscpm9N"qe0._Z7%PeY>nR7P4!JMB>/B1F*0]HMLPW:(>FBO,'a(8\8/%fXCXh3JqL(S"UJ8&c\7h2DgZGcn<(*ZSWF"G%q-5@^BMZ,(Ta&"ZS1m:R&&'U)@9pDia6:S'dnLO4C=i/SAkQ+NaA\[ILl1KMVHhQ_#JG"5o^2jr'TQQPfLp;^3,T&,=+:s_uL0Rp$8<&nGo[Ac5nW?oD6TTD\er79\MB9TJHA2Dil9e-`-JF>JL%SS6T4n:36IsQnkfYt2M7D1^?JV'a?J]"<r!%3[CK7-t%GkDnUUR7@gV8&CJ;$*-[..T%@\?n<h?pW5D-n\N>(%Ea2+DsErV7p,P\Z"Rm?Nao\mCsuT2]<M3V5D0pjCqRPQ(X\e59<~>endstream
endobj
25 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1179
>>
stream
Gat=*968iG&AII3llcVQ,JaB;9M_d"Vp6QI'<+.j!g/R5Rj;);P+qsP0#35g`o0TJILt5R\%CNMZ!ougLY;]!!V",:Y&>13#?DdO*q<Y2$#We-Ij_?F15_G%Xdo0N`;tVMZ[O_@X@;kHE7(G2krpV*,AYY1!=N$E16o7t^k4ZFX[EU?G$-<O_WhG.<sJ[=`-"W/730f>IhWHcR"!"":BCaE-U-+7;W?%Wnm!<]&#'&r?Kh2Ca3n(r!"F@63Ns&jR*Xo06K6QSp79jR_W$B_Z-t^eoN+32+(J-:D*sS"SQaU8T(B+T!*)cm$X1B.?4%0O+t;-Q%`B-8)8R\fhIa;Xj62^R`k74\(UDPbeEWsi!CU8GJC?hl_.Ef9I?>0Hf7;17bq"s9<Y2i:O>C^;,BS^nLZfA%C#C5j>EN!]<fkBP'.IT$D\eScGHfc^q-55R&1(:</+j<cH0C:S>UIcnaM!s,Ss<cVQ)XNg4FPp4<'Q:NQghAF'`n3rqUTG&R'(X9T$FU\9!MFIVDe[]PUP+n;!&39!5hD*XuqS>e6HLH"#.Vm1-d!-:%A/iRrUqITgp'l!rX%s82'CL<m/J<?./u]EaqaCE`XX`Z/DU3p!Lo5FhcViJ;54;J5'WhjS5bFS_hLMdp-O40h.0B>ss[sMQFA.R;L5TB7EBN([)ZlqLZ&NKMn3hRm;LZ!>,Q>5EdoB:=`P#%_Zg.l<S,H*\I%on>59Tm^oVfUm]6IOd5F^h;W%RN>KS2lc\R*8W%W&E>Lq@am4%t^g<:(RfP2$?64(?/S:Z9l='PYG%M-$Rq"%t(3l8$.a@2"!p<UMY8-sIs.1P_FE"M(5XOa+OTQlG[DN(@p0iRMqf&k%$G1nYEt1jDM.77KJWO%QWZ$HYZ?ATZo9m&XhO=-^H621lMUAAbR_sFCYk&B4!.:]jh]=kigI^3;R9d(7Z=.Zeim9SiS&O"<kYV2:Rs?$qrF!#*/q)u4]>i[8q4C)!lQbb\Gh9>DW`hU;]Wch@$=:PPjLAR`p48!uR0>1VCRk=I"s#J3a+2,beBZZ9/Qs7&L<Siq4PA^4lBb6in]&N%aMQ1EdgA#ML(bK1RcS+gT$dNbC,rKAQRToJ_VCKjeM>XC"RUCj:n"/Ofl0ZkIC(s%0a`JCZRq.e[D7XCnHObe^ON]/pCUR<Af)lp")X!LZ2~>endstream
endobj
xref
0 26
0000000000 65535 f
0000000061 00000 n
0000000132 00000 n
0000000239 00000 n
0000000351 00000 n
0000003536 00000 n
0000003803 00000 n
0000003918 00000 n
0000004176 00000 n
0000004281 00000 n
0000004391 00000 n
0000004587 00000 n
0000004783 00000 n
0000004979 00000 n
0000005175 00000 n
0000005371 00000 n
0000005567 00000 n
0000005637 00000 n
0000005945 00000 n
0000006047 00000 n
0000007253 00000 n
0000010334 00000 n
0000012885 00000 n
0000015053 00000 n
0000017777 00000 n
0000020160 00000 n
trailer
<<
/ID
[<93ff8ecba1600bc59dfd0d3f9189f269><93ff8ecba1600bc59dfd0d3f9189f269>]
% ReportLab generated PDF document -- digest (opensource)

/Info 17 0 R
/Root 16 0 R
/Size 26
>>
startxref
21431
%%EOF

Laddar…
Avbryt
Spara

Powered by TurnKey Linux.