#!/opt/bin/perl # # Copyright(C) 2014 Marc Alexander Lehmann # # vt102 is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License as published by the Free # Software Foundation; either version 3, or (at your option) any later # version. # # vt102 is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # # If this file contains embedded ROMs, the above copyright notice does # not apply to them. use 5.010; use strict; use integer; #use common::sense; my $VT102 = 1; my $VT131 = 0; my $AVO = 1; shift, ($VT102 = 0), ($AVO = 0) if $ARGV[0] =~ /^-?-vt100$/; shift, ($VT102 = 0) if $ARGV[0] =~ /^-?-vt100\+avo$/; shift if $ARGV[0] =~ /^-?-vt102$/; shift, ($VT131 = 1) if $ARGV[0] =~ /^-?-vt131$/; # vt100 wps = word processing roms # vt101 = vt102 - avo, but custom rom? really? # vt103 = vt100 + tu58 tape drive # vt125 = vt100 + gpo graphics processor # vt132 = vt100 + avo, stp # vt180 = vt100 + z80 cp/m if ($ARGV[0] =~ /^-/) { die < EOF } ############################################################################# # ROM/hardware init my $PTY; # the pty we allocated, if any my $KBD = 1; my $ROMS = do { binmode DATA; local $/; }; 0x6801 == length $ROMS or die "corrupted rom image"; my @M = (0xff) x 65536; # main memory # populate mem with rom contents if ($VT102) { @M[0x0000 .. 0x1fff] = unpack "C*", substr $ROMS, 0x2000, 0x2000; @M[0x8000 .. 0x9fff] = unpack "C*", substr $ROMS, 0x4000, 0x2000; @M[0xa000 .. 0xa7ff] = unpack "C*", substr $ROMS, 0x6000, 0x0800 if $VT131; } else { @M[0x0000 .. 0x1fff] = unpack "C*", substr $ROMS, 0x0000, 0x2000; } ############################################################################# # 8085 CPU registers and I/O support # 8080/8085 registers my ($A, $B, $C, $D, $E, $H, $L); # 8 bit general purpose my ($PC, $SP, $IFF); # program counter, stack pointer, interrupt flag my ($FA, $FZ, $FS, $FP, $FC); # condition codes (psw) my $RST = 0; # pending interrupts (external interrupt logic) my $INTMASK = 7; # 8085 half interrupt mask my $INTPEND = 0; # 8085 half interrupts pending my $CLK; # rather inexact clock, counts extended basic blocks ############################################################################# # the dreaded NVR1400 chip. not needed to get it going, but provided anyway # nvram my @NVR = (0x3fff) x 100; # vt102: 214e accum, 214f only lower 8 bit used, first 44 bytes my $NVRADDR; my $NVRDATA; my $NVRLATCH; my @NVRCMD = ( sub { $NVRDATA = ($NVRDATA << 1) + $_[1]; }, # 0 accept data sub { $NVRADDR = ($NVRADDR << 1) + $_[1]; }, # 1 accept addr sub { ($NVRDATA <<= 1) & 0x4000 }, # 2 shift out undef, # 3 not used, will barf sub { $NVR[$_[0]] = $NVRDATA & 0x3fff; }, # 4 write sub { $NVR[$_[0]] = 0x3fff; }, # 5 erase sub { $NVRDATA = $NVR[$_[0]]; }, # 6 read sub { }, # 7 standby ); my @NVR_BITIDX; $NVR_BITIDX[1 << $_] = 9 - $_ for 0..9; # the nvr1400 state machine. what a monster sub nvr() { my $a1 = $NVR_BITIDX[(~$NVRADDR ) & 0x3ff]; my $a0 = $NVR_BITIDX[(~$NVRADDR >> 10) & 0x3ff]; $NVRCMD[($NVRLATCH >> 1) & 7]($a1 * 10 + $a0, $NVRLATCH & 1) } ############################################################################# # I/O ports - output my $DC11_REVERSE = 0; # light background? my $XON = 1; # false if terminal wants us to pause my $PUSARTCMD; my $KSTATUS; # keyboard status (click + scan flag + leds) my @KXMIT; # current scan queue my %KXMIT; # currently pressed keys my @KQUEUE; # key event queue my $KXCNT; # count for debouncew my @PUSARTRECV; # serial input (to terminal) queue sub out_00 { # pusartdata # handle xon/xoff, but also pass it through if ($_[0] == 0x13) { $XON = 0; return;#d# } elsif ($_[0] == 0x11) { $XON = 1; return;#d# } syswrite $PTY, chr $_[0]; $INTPEND |= 1; } sub out_01 { # pusartcmd $PUSARTCMD = shift; $INTPEND |= 1 if $PUSARTCMD & 0x01; # VT102, 5.5 txrdy $INTPEND |= 2 if $PUSARTCMD & 0x04 && !@PUSARTRECV; # VT102, 6.5 rxrdy, needed for some reason } sub out_02 { } # baudrate generator sub out_23 { } # vt102 unknown sub out_27 { } # vt102 unknown sub out_2f { } # vt102 unknown, connected to in 0f sub out_42 { } # brightness sub out_62 { # nvr latch register (4 bits) $NVRLATCH = shift; } sub out_a2 { # device control 011 my $dc11 = 0x0f & shift; $DC11_REVERSE = 1 if $dc11 == 0b1010; $DC11_REVERSE = 0 if $dc11 == 0b1011; } sub out_c2 { } # unknown sub out_d2 { } # device control 012, 0..3 == 80c/132c/60hz/50hz sub out_82 { # keyboard txmit # CLICK STARTSCAN ONLINE LOCKED | L1 L2 L3 L4 (vt100) # CLICK STARTSCAN ONLINE LOCKED | CTS DSR INS L1 (vt102) $KSTATUS = $_[0]; # start new scan unless scan is in progress if (($_[0] & 0x40) && !@KXMIT) { # do not reply with keys in locked mode # or during post (0xff), # mostly to skip init and not fail POST, # and to send startup keys only when terminal is ready unless (($_[0] & 0x10) || ($_[0] == 0xff) || ($VT102 && $INTMASK == 0x07)) { if ($KXCNT <= 0 && @KQUEUE) { my $c = shift @KQUEUE; if ($c < 0) { # key up delete $KXMIT{-$c}; $KXCNT = 10; } elsif ($c > 0) { # key down undef $KXMIT{$c}; $KXCNT = 10; } else { # delay $KXCNT = 100; } } --$KXCNT; @KXMIT = sort keys %KXMIT; } $RST |= 1; } } ############################################################################# # I/O ports - input my $NVRBIT; # the current nvr data bit my $LBA6; # twice the frequenxy of LBA7 sub in_00 { # pusart data # interrupt not generated here, because infinite # speed does not go well with the vt102. shift @PUSARTRECV } sub in_01 { # pusart status # DSR SYNDET FE OE | PE TXEMPTY RXRDY TXRDY 0x85 + (@PUSARTRECV && 0x02) } sub in_22 { # modem buffer # wild guess: -CTS -SPDI -RI -CD 0 0 0 0 0x20 } sub in_0f { 0xff } # vt102 unknown, connected to out 2f sub in_42 { # flag buffer ++$LBA6; $NVRBIT = nvr ? 0x20 : 0x00 if ($LBA6 & 0x3) == 0x2; # KBD_XMITEMPTY LBA7 NVRDATA ODDFIELD - OPTION !GFX !AVO PUSART_TXRDY my $f = 0x85 | $NVRBIT; $f |= 0x02 unless $AVO; $f |= 0x40 if $LBA6 & 0x2; $f } sub in_82 { # tbmt keyboard uart return 0x7f unless @KXMIT; $RST |= 1; shift @KXMIT } sub in_03 { 0xff } # vt102 unknown, printer uart input? sub in_0b { 0xff } # vt102 unknown sub in_17 { 0xff } # vt102 unknown, printer status clear by reading? sub in_1b { 0xff } # vt102 unknown ############################################################################# # 8085 cpu opcodes and flag handling my $x; # dummy scratchpad for opcodes sub sf { # set flags, full version (ZSC - AP not implemented) $FS = $_[0] & 0x080; $FZ = !($_[0] & 0x0ff); $FC = $_[0] & 0x100; $_[0] &= 0xff; } sub sf8 { # set flags, for 8-bit results (ZSC - AP not implemented) $FS = $_[0] & 0x080; $FZ = !($_[0] & 0x0ff); $FC = 0; } sub sf_nc { # set flags, except carry $FS = $_[0] & 0x080; $FZ = ($_[0] & 0x0ff) == 0; $_[0] &= 0xff; } # opcode table my @op = map { sprintf "status(); die 'unknown op %02x'", $_ } 0x00 .. 0xff; my @reg = qw($B $C $D $E $H $L $M[$H*256+$L] $A); # r/m encoding my @cc = ('!$FZ', '$FZ', '!$FC', '$FC', 'die;', 'die;', '!$FS', '$FS'); # cc encoding. die == unimplemented $FP parity $op[0x00] = ''; # nop # mov r,r / r,M / M,r for my $s (0..7) { for my $d (0..7) { $op[0x40 + $d * 8 + $s] = "$reg[$d] = $reg[$s]"; # mov } } $op[0x76] = 'die "HLT"'; # hlt (mov m,m) # mvi r / M $op[0x06 + $_ * 8] = "$reg[$_] = IMM8" for 0..7; $op[0x01] = '($B, $C) = (IMM16 >> 8, IMM16 & 0xff)'; # lxi $op[0x11] = '($D, $E) = (IMM16 >> 8, IMM16 & 0xff)'; # lxi $op[0x21] = '($H, $L) = (IMM16 >> 8, IMM16 & 0xff)'; # lxi $op[0x31] = '$SP = IMM16' ; # lxi $op[0x02] = '$M[$B * 256 + $C] = $A'; # stax $op[0x12] = '$M[$D * 256 + $E] = $A'; # stax $op[0x32] = '$M[IMM16 ] = $A'; # sta $op[0x0a] = '$A = $M[$B * 256 + $C]'; # ldax b $op[0x1a] = '$A = $M[$D * 256 + $E]'; # ldax d $op[0x3a] = '$A = $M[IMM16]'; # lda $op[0x22] = '($M[IMM16], $M[IMM16 + 1]) = ($L, $H)'; # shld $op[0x2a] = '($L, $H) = ($M[IMM16], $M[IMM16 + 1])'; # lhld sub inxdcx($$$) { $x = $_[0] * 256 + $_[1] + $_[2]; ($_[0], $_[1]) = (($x >> 8) & 0xff, $x & 0xff); } $op[0x03] = 'inxdcx $B, $C, 1'; # inx $op[0x13] = 'inxdcx $D, $E, 1'; # inx $op[0x23] = 'inxdcx $H, $L, 1'; # inx $op[0x33] = '$SP++' ; # inx $op[0x0b] = 'inxdcx $B, $C, -1'; # dcx $op[0x1b] = 'inxdcx $D, $E, -1'; # dcx $op[0x2b] = 'inxdcx $H, $L, -1'; # dcx $op[0x3b] = '--$SP' ; # dcx # "no carry" doesn't seem to be needed for vt100 - optimize? $op[0x04 + $_ * 8] = "sf_nc ++$reg[$_]" for 0..7; # inr $op[0x05 + $_ * 8] = "sf_nc --$reg[$_]" for 0..7; # dcr $op[0x07] = ' $FC = $A & 0x80; $A = (($A << 1) + ($FC && 0x01)) & 0xff '; # rlc $op[0x17] = ' ($FC, $A) = ($A & 0x80, (($A << 1) + ($FC && 0x01)) & 0xff)'; # ral $op[0x0f] = ' $FC = $A & 0x01; $A = ($A >> 1) | ($FC && 0x80) '; # rrc $op[0x1f] = ' ($FC, $A) = ($A & 0x01, ($A >> 1) | ($FC && 0x80))'; # rar # getting this insn wrong (its the only 16 bit insn to modify flags) # wasted three of my best days with mindless vt102 rom reverse engineering sub dad { $x = $H * 256 + $L + $_[0]; ($H, $L) = (($x >> 8) & 0xff, $x & 0xff); $FC = $x > 0xffff; } $op[0x09] = 'dad $B * 256 + $C'; # dad $op[0x19] = 'dad $D * 256 + $E'; # dad $op[0x29] = 'dad $H * 256 + $L'; # dad $op[0x39] = 'dad $SP '; # dad $op[0x2f] = '$A ^= 0xff'; # cma $op[0x80 + $_] = 'sf $A += + ' . $reg[$_] for 0..7; # add $op[0x88 + $_] = 'sf $A += ($FC && 1) + ' . $reg[$_] for 0..7; # adc $op[0x90 + $_] = 'sf $A -= + ' . $reg[$_] for 0..7; # sub $op[0x98 + $_] = 'sf $A -= ($FC && 1) + ' . $reg[$_] for 0..7; # sbb $op[0xa0 + $_] = 'sf8 $A &= ' . $reg[$_] for 0..7; # ana $op[0xa8 + $_] = 'sf8 $A ^= ' . $reg[$_] for 0..7; # xra $op[0xb0 + $_] = 'sf8 $A |= ' . $reg[$_] for 0..7; # ora $op[0xb8 + $_] = 'sf $x = $A - ' . $reg[$_] for 0..7; # cmp # possible todo: optimize ora a, maybe xra a, possibly ana $op[0xc6] = 'sf $A += IMM8'; # adi $op[0xd6] = 'sf $A -= IMM8'; # sui $op[0xe6] = 'sf8 $A &= IMM8'; # ani $op[0xee] = 'sf8 $A ^= IMM8'; # xri $op[0xf6] = 'sf8 $A |= IMM8'; # ori $op[0xfe] = 'sf $A - IMM8'; # cpi # ce ACI NYI, apparently unused # de SBI NYI, apparently unused $op[0xc5] = 'PUSH $B; PUSH $C'; $op[0xd5] = 'PUSH $D; PUSH $E'; $op[0xe5] = 'PUSH $H; PUSH $L'; $op[0xf5] = 'PUSH $A; PUSH +($FS && 0x80) | ($FZ && 0x40) | ($FA && 0x10) | ($FP && 0x04) | ($FC && 0x01)'; # psw $op[0xc1] = '($C, $B) = (POP, POP)'; # pop $op[0xd1] = '($E, $D) = (POP, POP)'; # pop $op[0xe1] = '($L, $H) = (POP, POP)'; # pop $op[0xf1] = '($x, $A) = (POP, POP); ($FS, $FZ, $FA, $FP, $FC) = ($x & 0x80, $x & 0x40, $x & 0x10, $x & 0x04, $x & 0x01)'; # pop psw $op[0xc2 + $_ * 8] = 'BRA IMM16 if ' . $cc[$_] for 0..7; # jcc $op[0xc3] = 'JMP IMM16'; # jmp $op[0xc4 + $_ * 8] = '(PUSH PC >> 8), (PUSH PC & 0xff), (BRA IMM16) if ' . $cc[$_] for 0..7; # ccc $op[0xcd] = '(PUSH PC >> 8), (PUSH PC & 0xff), (BRA IMM16)'; # call $op[0xc0 + $_ * 8] = 'BRA POP + POP * 256 if ' . $cc[$_] for 0..7; # rcc $op[0xc9] = 'JMP POP + POP * 256'; # ret $op[0xc7 + $_ * 8] = "JMP $_ * 8" for 0..7; # rst $op[0xe9] = 'JMP $H * 256 + $L'; # pchl # f9 SPHL NYI, apparently unused $op[0x37] = '$FC = 1 '; # stc $op[0x3f] = '$FC = !$FC'; # cmc $op[0xd3] = 'OUT'; # out $op[0xdb] = 'IN'; # in $op[0xeb] = '($D, $E, $H, $L) = ($H, $L, $D, $E)'; # xchg # e3 xthl NYI # @ 917b in e69, hl <-> (sp) $op[0x20] = '$A = $INTPEND * 16 + $INTMASK + ($IFF && 8)'; # rim (8085, incomplete) $op[0x30] = '$INTMASK = $A & 7 if $A & 8'; # sim (8085, incomplete) $op[0xf3] = '$IFF = 0'; # di $op[0xfb] = '$IFF = 1'; # ei # yeah, the fucking setup screen actually uses daa... $op[0x27] = ' my ($h, $l); ($h, $l) = ($A >> 4, $A & 15); if ($l > 9 || $FA) { sf $A += 6; ($h, $l) = ($A >> 4, $A & 15); } if ($h > 9 || $FC) { $h += 6; $A = ($h * 16 + $l) & 0xff; } '; # daa, almost certainly borked, also, acarry not set by sf ############################################################################# # debug # print cpu status, for debugging sub status { my $PC = shift || $PC; printf "%04x/%04x A=%02x BC=%02x:%02x DE=%02x:%02x HL=%02x:%02x ZSCAP=%s: %02x %s\n", $PC, $SP, $A, $B, $C, $D, $E, $H, $L, ($FZ ? "1" : "0") . ($FS ? "1" : "0") . ($FC ? "1" : "0") . ($FA ? "1" : "0") . ($FP ? "1" : "0"), $M[$PC], $op[$M[$PC]]; } ############################################################################# # video emulation binmode STDOUT; my @CHARMAP = ( # acschars / chars 0..31 " " , "\x{29eb}", "\x{2592}", "\x{2409}", "\x{240c}", "\x{240d}", "\x{240a}", "\x{00b0}", "\x{00b1}", "\x{2424}", "\x{240b}", "\x{2518}", "\x{2510}", "\x{250c}", "\x{2514}", "\x{253c}", "\x{23ba}", "\x{23bb}", "\x{2500}", "\x{23bc}", "\x{23bd}", "\x{251c}", "\x{2524}", "\x{2534}", "\x{252c}", "\x{2502}", "\x{2264}", "\x{2265}", "\x{03c0}", "\x{2260}", "\x{00a3}", "\x{00b7}", (map chr, 0x020 .. 0x7e), ); utf8::encode $_ for @CHARMAP; my @SGR; # sgr sequences for attributes for (0x00 .. 0xff) { my $sgr = ""; # ~1 sgr 5 blink # ~2 sgr 4 underline # ~4 sgr 1 bold # 0x80 in attr, sgr 7, reversed $sgr .= ";5" unless $_ & 0x01; $sgr .= ";4" unless $_ & 0x02; $sgr .= ";1" unless $_ & 0x04; $sgr .= ";7" if $_ & 0x80; $SGR[$_] = "\e[${sgr}m"; } my @LED = $VT102 ? qw(L1 INSERT DSR CTS LOCKED LOCAL SCAN BEEP) : qw(L4 L3 L2 L1 LOCKED LOCAL SCAN BEEP); my $CURSOR_IS_ON; # display screen sub display { # this is for the powersave mode - check whether the cursor is on here, # and only allow powersave later when it was on the last display time $CURSOR_IS_ON = $M[$VT102 ? 0x207b : 0x21ba]; my $leds = join " ", map $KSTATUS & 2**$_ ? "\e[7m$LED[$_]\e[m" : "$LED[$_]", reverse 0 .. $#LED; my $scr = sprintf "\e[H--- LED [ %s ] CLK %d\e[K\n", $leds, $CLK; $scr .= "\e[?5" . ($DC11_REVERSE ? "h" : "l"); my $i = 0x2000; line: for my $y (0 .. 25) { # ntsc, two vblank delay lines, up to 24 text lines my $prev_attr; my ($c, $attr); # declare here for speedup $scr .= sprintf "%2d \xe2\x94\x82", $y; for (0..139) { $c = $M[$i]; if ($c == 0x7f) { # also 0xff, but the firmware avoids that $scr .= "\e[m\xe2\x94\x82\e[K\n"; my $a1 = $M[$i + 1]; my $a0 = $M[$i + 2]; $i = 0x2000 + (($a1 * 256 + $a0) & 0xfff); next line; } $scr .= $SGR[$prev_attr = $attr] if $prev_attr != ($attr = ($M[$i++ + 0x1000] & 15) | ($c & 0x80)); $scr .= $CHARMAP[$c & 0x7f]; } $scr .= "\e[K\nvideo overflow\e[K\n"; last; } $scr .= "\e[m\e[J"; syswrite STDOUT, $scr; } ############################################################################# # keyboard handling # 0x080 shift, 0x100 ctrl my %KEYMAP = ( "\t" => 0x3a, "\r" => 0x64, "\n" => 0x44, "\x00" => 0x77 | 0x100, # CTRL-SPACE "\x1c" => 0x45 | 0x100, # CTRL-\ "\x1d" => 0x14 | 0x100, # CTRL-] "\x1e" => 0x24 | 0x100, # CTRL-~ "\x1f" => 0x75 | 0x100, # CTRL-? # hardcoded rxvt keys "\e" => 0x2a, # ESC "\e[2~" => 0x79 | 0x100, # CTRL-C (insert) "\e[3~" => 0x03, # DC "\e[5~" => 0x7e, # CAPS LOCK (prior) "\e[6~" => 0x6a, # NO SCROLL (next) "\e[A" => 0x30, # UP "\e[B" => 0x22, # DOWN "\e[C" => 0x10, # RIGHT "\e[D" => 0x20, # LEFT "\e[a" => 0x30 | 0x080, # UP "\e[b" => 0x22 | 0x080, # DOWN "\e[c" => 0x10 | 0x080, # RIGHT "\e[d" => 0x20 | 0x080, # LEFT "\e[7~" => 0x7b, # SETUP (home) "\e[8~" => 0x23, # BREAK (end) "\e[8\$" => 0x23 | 0x080, # SHIFT BREAK / DISCONNECT (shift-end) "\x7f" => 0x33, # BACKSPACE "\e[11~" => 0x32, # PF1 "\e[12~" => 0x42, # PF2 "\e[13~" => 0x31, # PF3 "\e[14~" => 0x41, # PF4 ); @KEYMAP{map chr, 0x20 .. 0x40, 0x5b .. 0x7e} = unpack "C*", pack "H*", "779ad5a9a8b8a755a6b5b6b466256575" . "351a3929283837273626d656e634e5f5" . "b9" # 20..40 . "154514b7a5" . "244a6879591949485816574746766706" . "050a185a0817780969077a95c594a4"; # 5b..7e $KEYMAP{"\x1f" & $_} ||= $KEYMAP{$_} | 0x100 for "a" .. "z"; # ctrl $KEYMAP{"\x20" ^ $_} ||= $KEYMAP{$_} | 0x080 for "a" .. "z"; # shift my $KEYMATCH = join "|", map quotemeta, reverse sort keys %KEYMAP; $KEYMATCH = qr{^($KEYMATCH)}s; my %KMOD; # currently pressed modifier keys sub key { my ($key) = @_; push @KQUEUE, -0x7c if !($key & 0x100) && delete $KMOD{0x7c}; # ctrl-up push @KQUEUE, -0x7d if !($key & 0x080) && delete $KMOD{0x7d}; # shift-up push @KQUEUE, 0x7c if $key & 0x100 && !$KMOD{0x7c}++; # ctrl-down push @KQUEUE, 0x7d if $key & 0x080 && !$KMOD{0x7d}++; # shift-down $key &= 0x7f; push @KQUEUE, $key, -$key; } my $STDIN_BUF; sub stdin_parse { key $KEYMAP{$1} while $STDIN_BUF =~ s/$KEYMATCH//; # skip input we can't decipher substr $STDIN_BUF, 0, 1, ""; } if ($KBD) { system "stty -icanon -icrnl -inlcr -echo min 1 time 0"; # -isig eval q{ sub END { system "stty sane" } }; $SIG{INT} = $SIG{TERM} = $SIG{QUIT} = sub { exit 1 }; } ############################################################################# # initial key input, to set up online mode etc. # could be done via nvram defaults @KQUEUE = ( 0x7b, -0x7b, # setup 0, # delay 0x28, -0x28, # 4, toggle local/online 0x38, -0x38, # 5, setup b 0, # delay (0x10, -0x10) x 2, # cursor right 0x37, -0x37, # 6 toggle soft scroll (0x10, -0x10) x 1, # cursor right 0x37, -0x37, # 6 toggle autorepeat off (0x10, -0x10) x 8, # cursor right 0x37, -0x37, # 6 toggle keyclick (0x10, -0x10) x 1, # cursor right $VT102 ? () : (0x37, -0x37), # 6 toggle ansi/vt52 (0x10, -0x10) x 7, # cursor right 0x37, -0x37, # 6 toggle wrap around 0x7b, -0x7b, # leave setup ); ############################################################################# # process/pty management if (1) { require IO::Pty; $PTY = IO::Pty->new; my $slave = $PTY->slave; $PTY->set_winsize (24, 80); unless (fork) { $ENV{LC_ALL} = "C"; $ENV{TERM} = $VT102 ? "vt102" : "vt100"; close $PTY; open STDIN , "<&", $slave; open STDOUT, ">&", $slave; open STDERR, ">&", $slave; system "stty ixoff erase ^H"; $PTY->make_slave_controlling_terminal; $PTY->close_slave; @ARGV = "sh" unless @ARGV; exec @ARGV; } $PTY->close_slave; } else { open $PTY, "+(); ++$CLK; # things we do from time to time only unless ($CLK & 0xf) { # do I/O unless ($CLK & 0xfff) { if (select $x = $RIN, undef, undef, $POWERSAVE < 10 ? 0 : $CURSOR_IS_ON && 3600) { # pty/serial I/O if ($PTY && (vec $x, fileno $PTY, 1) && (@PUSARTRECV < 128) && !@KQUEUE) { sysread $PTY, my $buf, 256; # linux don't do cs7 and/or parity anymore, so we need to filter # out xoff characters to avoid freezes. push @PUSARTRECV, grep { ($_ & 0x7f) != 0x13 } unpack "C*", $buf; } # keyboard input if ($KBD && (vec $x, 0, 1)) { # to avoid non-blocking mode on stdin (and stty min 0), we # just read byte-by-byte after a select says there is data. while (select my $rin = "\x01", undef, undef, 0) { sysread STDIN, $STDIN_BUF, 1, length $STDIN_BUF or last; } stdin_parse if length $STDIN_BUF; } $POWERSAVE = 0; # activity } elsif (@PUSARTRECV || @KQUEUE) { $POWERSAVE = 0; } else { ++$POWERSAVE; } } # kick off serial input interrupt quite often $RST |= 2 if @PUSARTRECV && $XON; # VT100, but works on vt102, too (probably not used on real hardware though) #$INTPEND |= 2 if @PUSARTRECV && $XON; # VT102, 6.5 rxrdy # kick off vertical retrace interrupt from time to time unless ($CLK & 0x1ff) { $RST |= 4; # vertical retrace } # handle video hardware unless ($CLK & 0x3fff) { display; } } # the interrupt logic - we only interrupt after basic blocks # which, as a side effect, ensures that we don't interrupt # "ei; ret" sequences and thus reduce the risk of stack overflows. if (($RST || ($INTPEND & ~$INTMASK)) && $IFF) { # rst 1 kbd data available # rst 2 pusart xmit+recv flag # rst 4 vertical retrace # 5.5 vt125 mb7 trans ready (serial send?) # 6.5 vt125 mb7 read ready (something modem?) # 7.5 vt125 mb7 vblank h(?) # trap vt125 mbi init h(?) my $vec; my $pend = $INTPEND & ~$INTMASK; if ($pend & 1) { $vec = 0x2c; $INTPEND &= ~1; } elsif ($pend & 2) { $vec = 0x34; $INTPEND &= ~2; } elsif ($pend & 4) { $vec = 0x3c; $INTPEND &= ~4; # } elsif ($RST ) { $vec = $RST * 8; $RST = 0; # the vt102 firmware doesn't like combined interrupts } elsif ($RST & 1) { $vec = 0x08; $RST &= ~1; # separate is better for vt102 } elsif ($RST & 2) { $vec = 0x10; $RST &= ~2; } elsif ($RST & 4) { $vec = 0x20; $RST &= ~4; } else { die; } # jump to the interrupt vector $M[--$SP] = $PC >> 8; $M[--$SP] = $PC & 0xff; $PC = $vec; $IFF = 0; } } ############################################################################# # roms in the data section + one newline # # vt100 @ 0x0000+0x0800 23-032E2 # vt100 @ 0x0800+0x0800 23-061E2 # vt100 @ 0x1000+0x0800 23-033E2 # vt100 @ 0x1800+0x0800 23-034E2 # # vt102 @ 0x0000+0x2000 23-226E4 # vt102 @ 0x8000+0x2000 23-225E4 # # vt131 @ 0xa000+0x0800 23-280E2 # __DATA__ ó1N Ã;ÍýûÉÍÌûÉÍÌÍýûÉÍÏÉÍÏÉÍÌÍÏûÉÃ0ó>Ób/ÓB¯Wog/2É!Óbÿû>£>Âà>ÿÓ‚ x±ÂÖÓ‚:h ·úõzöWÕÍ¢ÑÃuõÛ‚åÅGÖ|úg$>% !h ¶wÃ-!h >¦þò-4!j ÍÞpÁáñÉæO:{ ·ÂÿyþÊÃ:§!æ Âu:x!·Â_yþAú[>Íyà >ÍyþAò[>?ÍyÆ@à :x!·ÂžyþAú[þPúž>Í>OÍÃ[>Í>[ÃŽ:¼!·ÊµyþAò‡>Í>OÃlyþAú«þPú”Ç!å:¥!·ÀÍS!h ~æ ~æ ÊäÒ>%ö°Ó: �OÅÍ“Á: ¹ÂðÔ!å¯20!2¸!!£!yÖAG~Ê"Ê&ÊÊÉ=øwÉ<þ ÈwÉ:§!/æ!¥!¶ÂA:¿! ÂEyÖ2Ä!Í~Ãó1N ! å~ÚeÛBæÊi<2È!Í¢:P =2S!á~6·Ê˜ò…!Ë!6 æ2½!Æ0*ö wþ4ʘ> 2¥!Íò Í~î!N ²̓/2!! "R !Ð""ö ÉÍ ! ÙÍ‹!0ÿÃpòÐpp pp!"-!>52,!>2[ 2v!!ÿ"I!>2s >÷2ú ÛBæ>Â2y >ÿ2!2º!&€l"À É>@Ó:X!Ó:¤!ÓÍ”>2É!ÓbÉ:¢!·ÊK>GÓÂ:| ÓÂþ !p Â^!p" :¨!æÈxÓÂÉ:¦!æ Âu>ö Ó¢:[!ö Ó¢É:¢!·Êc Ãw w#‹É:¥!·>Ÿ>Ã{Í�ÍÛÍkÃB͈͇!w!~·6Ä :¥!·Ê®¯2D!îõÅåÛæÊ:O:¥!·Â:Ûæ8Êí>'öÓyþÊ7:§!æyÊ !Â!þÊ>þÊD!À NDy<æ¿wG:Á �Â'qx<æ¿o6Ã1ò,Æ@þ Â7Í~ÍGáÁñÉ>þ¦ÃG>¶wÃ70)1!2@3#4$5%6^7&8*9(-_=+`~[{]};:/?'",<.>\| poytwqÃ][iure1ÄÂ�`-9743ÁÒÐ=08652 ·ÓѰ \lkgfa¸�²±';jhds®¬µ´ .,nbx‚¹³¶­/m vczÿõåÕÍNÅ> Ó¢û:e ·Â !Q ¶Ê>>2e ¶6>2[ :V!ò>™2[ :U!=Í/2z [ !Z †'æwWæÓ¢z§öÓ¢z·Â>2e ·:V!ú8:U!=ÍÎ2z !x ~·ÊO5æ2F!!,!~=Âi65>Ó¢!Ë!~·ÊjÓ¢îw>@2H!! 4:£!ÓB:X!Ó:É!ÓbÁÑáñÉ:¥!!{ ¶ÀÍuÈG:{ ·x©:y xÚ©þ Ú²*@!éþÂÌ!¸Ã þ2ÂÅ>2y à G>ÍÒxÍÒÃb OÅ͈ÁÛBæÂÓyÓâÉÍF õþÊsåÕÅO!ü V#z…ozÖòÿz2ü V:ú ²GzyÒÖ_þ ÒOzæ@yÊ$þ#Â$:û ±O:B!·ÊA!ø :S!¾ÂA6ÅÍU Á*ö q|Ægpx2õ !ô q!ø :S!¾Âhy2ô :¨!æ@Ãm4Í6¯2B!ÁÑáñÉ:Ä!·Â…!À ~#–‡¯Én& V!Á ~<æ¿ö€w+–òœÆ@þ0§Í~z·É:h _æ€È!Aå{æþú¯2g ÉW!n ~·ÊèåÅ!j ¾Êß#òÖÁáÊç6 #ÂÊ{æÀ²Âû>á2r É!Gå:r <Ê 2r :¦!æ@È{æÀ:P!!_¾È#Â!s 5À6:r þÿÀyþÀ!n ~·ÂC#Â8ÉáÃvyþðj !n ~·Ê[ ¾Êf#}þrÂQ ÃlÂNÉG:g ¸x2g Àá2P!þ{ÊþjÊ,C_:D!·ÂA{æðW‚W{’!v_Ny·ú1þ ÚÿxæpÊÿyþ{ÒÂþaÚÂæßOÃ×xæ0Ê×!K~¹ÊÕ##ÃË#NxæÊÿyþAÚèþ[Úüþ?Êüþ Êüþ{ÚAþÒAæŸO±õ:§!æ€Ê 2T!ñö€ÍÍS:P!!n ¾ÊA#Â!n ~·Ê8#Â+ÃA:P!w>á2r ¯!h Vw#r#w#ÂLÉ:§!æ@È>€2G!É{*j:d:0!ÖÀW:1!_>£Â=z·Ä§Õ;Ñ>£Ä>ܧ>£Äb>ܧz·Â >£Âoz2 ÃQ²W>£È>€²WÉþÊž þÚÔ_ÖæýÀ{þÊËþÀÍ >ÃæÉÖø!å‡_^#Vë¯é — 8 A ù U U U K ûü<2ü É:¥!·À*{!|½È!r!>¶wÉ!r!~æïw!{!F#\!~¸Ê0 # Â$ ö€Ãó!x ~ÆØwÉ!ø ~·È5Ã6¯2ø Ã6ÍK :¨!æ ÄK !ù V:V!ºÊs Í¿xºÈrÃ6:¦!æ€Ê˜ ÍŽ>ÿ2Ã!4Íæ:Ã!·Â‰ 2ô =2õ ÉÍï2} 2¸!!« à þ0Ò½ !} O~·Ê» ÿqÉ2~ ! å:} ·ÂÜ :§!æ !P ÂÙ ! Ã÷ G:§!æ xÈþ(ý Ê2 þ)Ê1 þ#!{ À¹!¯:~ O¯†È#¹Ê ##à ~#fo¯éá!æ"@!ÉA› B› C› D› F G H– I£ J› K› Y ZÆ =ß >å 1W <ë ]` cER M£ 1W [Ž Hß DU 7h 8q =ß >å ZÆ NF OF 3¨4¬5J6¤7` 8§ !Â"@!áÉ>H2~ !"0!á! å:} ·À!Ù Í÷ :¹!·À!0!:K!·_ ~åÕ!õ GÍ÷ Ñá:¹!·È# ÉDBCHSAþr¦fSxßydcÁ q n JAKülím hògÏ ! "@!áÉGþ Ú²þ!Q!Â. !« "@!É~·ÂB 6xÖ 2R!! "@!É6xÖ þPÒO 2ø Í¿:R!¸Ò] 2ù Í Ã6¯2¢!Í­PÍùÍLPÉ >2¢!Í­„ÍùÍL„¯2U!Í¿x2V!y2P ÍBÍH>ê!ù :U!G~¸Ê¸ ·È!ù 5Ã6:¦!æ€ÊÙ ÍŽ>ÿ2Ã!5Íë:Ã!·ÂÎ 2ô ÉÍ-Ã!x!6É!x!6É!§!~ö w:¨!æ€&Êþ &Hl"ý "ÿ ¯2ü É&ˆÃ &l"ý É!E!x·Â# ~æðwÉÖðG¯7Â) ¶wÉ:~ G!J ##~·È¸Â9 #~É!ü 44ÉAHB0ˆ12€!y ~·Ê 6�á!­Ã !!ø Ãw !ø ! Í‹Ã6!Š x·Ê— Ãÿ ¢ § ³ » 2û !ú ~ö÷wÉ>ûõ :È!·Â» >ýõ >þ!ú ¦wÉ>€2û É:0!·À!r!~öwÉ>ûÍ¿ :§!æ Âã 6Ú+6/Ãó6?#>1͹ ÛBG/æOxæÊù yö0w#6ãÃó:¸!·Àx!r!þÊ2 þÀ~öwÉ>÷Í¿ :½!·xÂ) ¯ö0w#6îÃó~öwÉ>þÍ¿ :ù G:!·ÊJ :U!Ox‘<Íz Í» :ø <Íz 6ÒÃóÛBæÀ�ÍŽ>ÿÓâ͈ÛBæÂo É_0dÍ™ ʈ w# Í™ Ê“ w#{ö0w#É{0‘òœ �_xºÉ>E2Ç!Í�>E2ô ¯2Ç!Éw#6;#É!r!¦w!\!6#6[#ÉBx·ÂØ Íå ÉþÀÍì ÉÍ#¶wÉÍ#/¦wÉ!‘!¯w#}þ¢Âï ÉÍ# ·Ú W¦zÊü Ã#}þ¢>€Â :S!¹Úy2ø Ã6:ø OW!‘!æ…ozæW>€øÃ8:¥!!{ ¶GÀÛBæÈ!Á!~·6+È~ÓÉóÍ>ûx·ÂmÛBæÈ:Â!·À!s!~·Êy*t!é:r!·ÈÚ‰À!”~#foé7 ðÎ    !\ FT]w# ©!C!5~OÂÁ!r!~æßw:¥!·ÂÏyþÒÒ¯2D!xæ€?2s!! "t!xæG:¥!!{ ¶x“ÓÉ!"t!¯2q!<2s!!q!~4!\!…oFx·òá¯2s!ÃáåÕW:§!æÊ+zÖ‘æýÊa!r!~ö w!C!~4!\ _…or>�ºÂN:¨!æ ŠÂ2:¥!·Â[>»>2D!ÑáÉzæW!Á!~·Âu+~ºÂu#rJÍ~Ã^:§!æÈ:¥!·Ày!¿!þxÊž/¦wõæ2Ä!ñÀ¶wy!À!¾Èw#wÉ! †¾Èåõ:{ ·Ìˆñáî*N |öðg"N :P G|æö gÆW]>ÿ6#ÂØ<2Ã!ÉÿÃí!U!V#^x·zòú{Íæ{’O:+!Vwx…o zòæ2+!>ÿ2!Ã6Í‘:V!Í/Íæ:U!=Ã>Í‘:U!=Í/Íë:V!=ÍÎû2z !V!~+–þÀ!z ~6·È*V ë*X r#s*y!ë*u r#s!V "X "u ÉÍãæ€2W!Í�"N!Ép#z³ÂƒÉ!Q ó:e ¶ûʧyÅ܈Í“ÁÃŽyÐÑ!p" ¯2Q 2e 2Z Ó¢>Ó¢Íjû>ͪ!Ð"|ÆW]/ :Ç!w#>ÿ x±Â×:Ç!2ô ¯2ù 2ø >ÿ2õ ɯ2Q :e ·Âý!Ð" Í¿ Í6åÍ6á6#"T 6p#6yÍÞ6 >2 !òÐ" É6#T]zöðw#syÍÞÂ6É! Ð">s#r#ë ë=ÂY2U!Í¿x2V!<2+!*ò >¸Ê~*Þ |öðg"N !!¯w,<ò‰Éó:z ·Ê û͈Ñ:e ·Â°:Q ·ûÈÙ:[ !Z †'æÊ™ûÉå:¢!!È!¦áÈ É·òè! å~#nöðg"N Í�áBKà ÍÍ�åÕëÍ�BKÑzöðgk"N á|öŸ<ÂÍ™ó"u Ã(Í�:P WÍÞ#ó"u zÍÞp#q`i"y!ûÉõ;ñ·! úHÍ|öŸ<ÂRÍ™ó"X F#NÃqÍ�:P GÍÞ#ó"X xF#NÍÞë*N ës+r*N "V Í™p#qûÉýÍ¿ :v!ö2͹ :©!õæÀö‡<òöæ͹ 1ñæ Âx͹ :«!Íz Í» :¬!Íz Í» >1͹ :ª!æðÍz 6øÃó!W!~·ÈÍ‘!!:ù …o~æwÍ�:P GÍÞ¯w#Âk>ð2!Í•¯2W!Ã6:ù Íæ! ‡…oÉÍ€~#foÉæpG:ù =! ú½ÍæWæ͆Í�:P _#ü½~æ�°wÉ:P T]ÍÞëÍÛ~#ÂÒÉ:P …oÐ$É:ù !!…o~ÉÃôÿ:¸!·!&Êþ?À! xAÍÿ É*/WGN?f_ m8!¼!pÉÍv§! Ãò Ív¨! É!!pÍHÉÍv¦!€ÉÍv¦! Ãk!¢!pÍ�ÉÍv¦!@ÉÍv¨!@ÉÍv¨!ÃBá^#V#~#ëO/¦wx¡¶wëéÍ“æ̪ÃYÛBæ€È!D!~·Ê¢>!¥!¶!E!¶#¶#¶6#¶6Ó‚!t 4:w ·À:e !Q ¶À*-!+|µÊÔ"-!É:º!îÿ2º!!Âå! "-!*ö F:Y!¨w:Z!®wÉtx·Ê=Ê =ÀÍ:ø G*N!Ã):ø G:W!·:P Ê$�G*ö |ÆW]>ÿ6#Â02õ ¯2ô Éx·Êj=ÊU=ÀÍUÍjÃJ!ù ~õG¯wÿ͆ñwÍtà :ø ·ÌJÍ!ù ~õO>‘G͆ñwÃtø qÅåÍãæw>pÍ•Ít:P GÍ)áÁÆ�ÍŽÍ¿:0!·Ê¶=W:1!·ÂÀx<=_x»Øz»Ð!U!r#sKBy�<_! x·ÊèP~æwÍ+ÂÝ~ö€wÍ+Âè>‘ÊW~æwÍ+Âúx2U!y2V!!!~·ò#å͆~#foÍÃá# ÂÃH#næö g#ÃÛ! "-!¯2º!*ö :ô Gw|Æg:õ w:P =_:{ ·Â{:ù !!¾ÊwÍt¯2T!!W!~·Ê{{=·_{2S!!S!ø ¾ÚŒ~:»!Æ–¡#¶Ê¡Í8 ¯2T!:ø 2»!*N!ÍÞ"ö ~2ô G|Æg~2õ *ö pÉG!ñ"@!¯2/!2K!2} !0!¯w# ÂÙ!¸!6xþ@Òòþ<ÚòwÉGxþ:ÒÖ0úO!/!~þÒG€Ú�Ò>ÿwÉ0!õ!K!Në /! w¯þÊ2<ñGþ;ÈæÀxÊC2~ â !} †ÒL>ÿw!3"@!ÉÃbÍÀ ÅÕ;Ñó!{!3¯2®!y2­!Õåz·~2¯!̮ͣáÑ:¯!Êžw:­!®O#:®!<Ãq¾ÁʬÂbÍÐy·õ@>cÍ+!òÐ" ñÉì!Ì!Í‹!qÌ" É!{!'6€#ÂÕó Í‹>02x ÉWaitpn ÐP àà:U!ÿÃÍ¿:V!!ù Ã%:S!ÿÃ"¯ÿ!ø W:¸!·Â :0!·Â5<_~ºÊD¸ÊD�Â7wÃ6!"0!>ÿ2!:!O!0!~·Ê`=Gy·Êi:U!€Gy·:V!ÂyHÍ¿xA¸Ú~x2ù #~·Êˆ=Gy·Â•:P =Ø:S!¸Ú�x2ø Ã6@Í(ÍÁü@Í(ͨÍwÍÖ>0ÓbÉÛB¡ÊÁÛB¡ÂÇ>-ÓbÛB¡ÊÑÛB¡Â×>/Ób!Ó!ÛB¡ÊæÛB¡Âì>%ÓbÛB¡ÊöÛBw#ÛB¡ÂÂö>/ÓbÓ!!)æ µoÂ"¯!É:®!ÿÖ ò-Æ !Ó!#s#Â<6/!Ó!_6"!Ó!> €_6"ÛB¡ÂW!Ó!ÛB¡ÊbøÛB¡Âj~Ób#Ãb*¯!))Ó!> )Â�>/!Ó!ÛB¡Ê“ÛB¡Â™~Ób#“ÉÛB¡Ê¨ÛB¡Â®>+ÓbÍÀ>/ÓbÉ!;ÛB¡ÊÃÛB¡ÂÉ+|µÂÃÉÛB¡ÊÖÛB¡ÂÜ>)ÓbÍÀ>/ÓbÉþ CÊÿ!°åþ ÊK þ Êù þ:Ò`Ö0ø‡!¢ÍÞÍ�x¬!é2w!Ã:{ îÿ2{ Êa€ÍŽ*@!"!!î"@!!"C!"r!* "Å!*ø " !ͺ"N!¯2ø ÍùÃ6*!"@!ͺ:P 6ÿ#=Âq! !~2ø >ÿ#wÍ6*Å!" ¯2Ä!2Â!ÛBæÊ¡:v!·ÌèÉÏ Ðòþ "@A¶ÍR¯2!2 !:¢!·õÌw ñÄc ÃEÇÍR:ø ·ÈÍ#®wÍ#¦TÂèx2ô :ø ÃêÍRÍì ÍÍÃæ!¥!~î w¯2D!ÉÍK !Z"~îw2e"æ2¾!ÊÓÃ5ÍY!¦!:ø Öþ(ÐWÍ+®wÍÛÃÓëÍY2ø ~ÆwÍÛÃÓ:¾!·ÀáÉ:¾!·ÈáÉ:i æ ÈxþSÂrÍTÃ�þR†Í[ûÍ¢Í+ûÍùÉþAÀÍYÍK >AÍæ>=Íæ> Íæ!Ÿ"@!áɘþaøþ{ðæßÉÍ”!î"@!É*N ÃÃ!Ì!|æö gÉͺÍÈå6#ëÍÀ|æöp}á:P _T{Í'¦Êô{ÍêÂèÉ­!S">úÍqÍŠ­>úÍqPÍŠ¶>ýÍq͈6#ëͺ|öp}ÍÀ:P G>1w#OæyÂIî€<'ÒPö€æ�ö0Â>ÍŸÍÊ>2¾!!S"|eæö0o" ÉåÑõ ·Ê†ñw#ÃwñÉpë6#T]zæ°w#s# ‹É6T]#zæöpw#sÉSET-UP ATO EXIT PRESS "SET-UP"ͺÃÈÍÍÍÀå>NÍËáå##ÛBæõÊðÍÌö°w# Âò6# ÂÂðñõÂyÆO6# ÂK:«!ÍaV:¬!ÍaÍŸñÊ= >1áw< Â@¯Ã` T SPEED R SPEED O Í‹yO�O|ë ëË 50 75 110 134 150 200 300 600 1200 1800 2000 2400 3600 4800 960019200å!¦!S{Í+¦áÈ>É:¬!æðG:«!æð°2X!æðþ :¤!Êÿæ?ö€Ãæ?öÀ2¤!ÛBæÊ!§!~öw>nÃ1:©!æÀG:©!æ ö °G:¤!æÃ°2¤!:©!æÊ>>Æ 2| :¦!æÊM>ÍnÍ):ø þÌBþÌBþ Ìò þÌò Í6É·Êy2[!¯Ã”ÛBæÂ�2Y!>2[!>2Z!Ãk¯2[!2Z!>€2Y!ÃkÍÝ!{!w#"´!G̓!¸"@!ÉÍÝ*´!G:{!O¸ÊÓ}þ�ÊÓp#"´!ÉqÍÍÍK ðõþ Òå>ÍãñÉå!N O:¢!·ÂüyþPò~#fo|æö gy…oÒ $pxáÉÕ¯2¥!x2X!ÓyÓ!ÀÅåÍuáÁÂH#|µÂ&>Ó:X!Ó>%2¥!¯7ÑÉæ¹Â6yþ€O xÆGþ¯ÑÉÕzÍ{Í¡ºÂ6Âe>Ó¯ÑÉGæö2É!ÓbxæÊ“%xæÊ�yöOyÓÉÛ"Gxæ�ʳþ�>ÿÀxæ@ʽyöOÛ/æ ¨æ >ÿÀxæ ÂÔyöO·yÉó1Ð"ÃÒ vÍûÉvvvÍÛûÉ �vÍÛÍûÉÃßvvvvvÃßvÃkžvÃvÃðvÃßvÃø•v×n [€°€#«!„è˜õœÇœñ¡© I�}È„c„ÿ„þ›‚ ��ó1Ð"ÍœÍi:d =2,!! ~6æ¿Ê°ò—!D06 æÆ0*!w2!þ4>2J0> ­¯2y!û:y!·Ì†ÍÍI>ÿ2("Í ¯2 !> Ó'ÍŠ–ÍÎÍ¿‰:B!·ü% Í!Ã`! jÍ0�!Ð"0 Í0�>ÿ2w!!80(Í0�<2f !Ð""!!", >52+ >÷2!>ÿ2*!2{ &€l"~ :w!ÓB!GœÍå‚Íõ€ÉÍ! MÍ_ÉpòÐpp pp°w# Â_Éó>ŠÓ>@·Ó:x!Ó:/!Ó:@!ÓbÍÐÉ!.šÍå‚!F!~æw¯#w#w2?0ÉÍ—Íf͹:v!·Ê®>ÓÂ:&0æ!pÊÀ>!p Æ ÓÂ" : 0æ> ÂÒ<Ó¢:0!æö ӢɻõåÕÅÍØ€> Ó¢:| öÓ:W0æû®!e ~·úÊ<w#~·:.!ò:-!=ÍÀŽû!f ~G#†'æwÂ<++~æwx·:.!ú8:-!=ÍaŽû!I ~·ÊS5æ!L G~æ°w!!4!g ~æÓ¢~öÓ¢Í2�!H0>þ¦w![0~æÂ~6ÿÉ=w‰ÍLŽÃŒÍø�!+ 5§65>Ó¢!D0~æʧÓ¢îw!X0>¶wÁÑáñÉ!X0>þ¦w¯2l :w!ÓBÛÒÐ:/!Ó:@!ÓbÍ{�Ã+ŽõÅå: ·Êí:(0æÊô:B!·üC ÛæOgÛæ8GÊ-:| öÓxæÊ:#0æÊ-xæ Â-|·Â-:| öæûÓ:y!·Âï|·ÊïþÊï:| æÊïyþÒ¶:$0æÊyyþÂy:70æÊt:60æþÂt:H!þÂy€Ã‹:70æÊ‘!z!y¾Â‘ !F!~°wy2H!:!0æʵ:70æþòµy!þ¦Ãü>¶wÃïõÛ‚åÅG!N0:M0æÊw:w æ€Ê6ÿ~æÂ9xÖ|úFg$>%Â-!w ¶Ã[xþ€Ê\¯2N0Ã\!w ~æO4>¦Â[!x y…oxwÁáñÉ:X0æÊ€þ Òk!~ ^#V!€åëé³Í2�ÍÓ!I0~æ6Ä© ÍuÄkž:B!·ü Ú`::0æ´!F0~æ6ÄÈ„Û OæÂÇyæÄœ–y·ÌŠ–:!·ÂÖ: !æÄø•:K þÒ`:B0æþ2B0!H0>ý¦wÃ`õÛæÄÛÅÕå!L F: ·Ê :B!·>ìú< wÍŠÊ :00æ±OÍuG:"0æ°Â2:B0 Ê;>±G!L ~°Gæ¿wx!+!¶6!y!¶Ó‚:e ·Âœ:H0æœ*, +|µÊq", Ü!{ ~/·w!Â�! ", *!ë!0!>€¦ë®w ë>¦ë®w:H0æʬ:L æ€ÌLŽáÑÁñûÉ!m FT]w# »!K 5xæ€î€25!!Ú"6!xæGÉ:B!·ü= ÍuG:"0æ°WÊ:S0æÂ:R0æ·ÊÍuÈÕͲÑz·ÅÕÄñÑÁzæýÀÈŸ!)"6!¯23!<25!É:B!·ü@ ÍdFxö/25!xæG:y!·Àë͈Ÿ:5!·ÀÍoÈ!z!x¾~ë#Èö€w>25!É!3!~4!M …oÉ:70æÈ:%0æÉ>åÕW:!0æÊš:70æÖòšzÖ‘æýÊé!K ~4!m _…or>�ºÂ¾:C0æ¾:"0æŠÂšÍuW:"0æ²>ÂÓ>»>G:B0°2B0=280:B!·ü1 ÑáÉzæW!;!~·Âý+~ºÂý#rJÍÃÛ:70æþÊþÈþÈ:!0æÈ:y!·Ày!} þxÊ6/¦wõæ2=!ñÀ¶wy!:!¾Èw#wÃ+Ž*I!~æÊe:F!æ Âe!B0~æûw:!ÀÛBæÉ:!·ÂU!B0~öw¯É͊ʆGÅ:B!·ü Áx!y!¶!!¶Éæ_þÊä‘:!·Â¡{=Ê:!0æÂÑ:T0æ½{þAô{{Ãä‘Í{{þAò¹>?Í}{Æ@Ãä‘:T0æÂ÷{þAú¹þPúïÍ{>OÍ}ùÍ{>[Ãé:G0æ{Ê þAòäÍ{>OÃÈþAúþPúïÃä!ì‘å:y!·À:B0æÀÍø‘!w ~æÂ ~æ :G!ÊCö€ÃEö2G!É:!0/æ!y!¶Âì‘:70æþÊì‘þÊì‘:}  ÂqyÖ2=!ÍÃé‘:;0æ ÊËyþʾÍR‰:;0æʬÅ:y!·!~!"!Ív‰Á> 2;0:y!·!~!"!AÍv‰Íf‰É!;0>¦ÂË> wÉy!×_^¯éòñðïî&Ú^tsrgâáàßÞÝÜÛÛÙÙÆÖÕÔÓö ÃS�<2!É:S0æÀ*O!|½È!4!>¶wÉ!4!~æþw!O!FL #~¸Ê/ Ã$ ö€Ã:S0æÈ!I ó~ÆÚG wûÃ?ޝ2!×ÍK :;0æ Ân :90æÊn y2J ÅÍ…ÁÍ{ À:"0æÄK É!!V:.!ºÊ� >ºÈr×:S0æÄŠÀ: 0æÊú–Í;�>2V0!e 4#wÍ?™Í,€¯É¯2!2 !<2R0!zÃÉÍ>Ãó>ÿÓB>0¯Wõ>ÓÂ>ÓÂ> Ó¢>Ó¢>Ó¢> Ó¢ñog&€Ãú þÂú @ª&@+6+|þÂ0 #yÓ‚~·ÊM æ|ÂE þ0ÚJ p~¨Ê^ æ|ÂV þ0Ú[ ,Â= $|æÂ= |þ@Â: xGÚ+ ÕÍäÑzæ@2B!ÕÍO�ÑÊŽ zöW>2W0>0ÿû>£>¤ >ÿÓ‚ x±Âš Ó‚:w ·ú¹ zöW¯2W0ÃÑ :/ ÖÀW:0 _>£ÂÔ zæ¿Ä >2B0ÕÍù�Ñ>£ÄÆ’>Ü >£Ä“>Ü >£Äƒ“> Ü zæ¿Â >£ÂË z2 ¯2B0Ãq²W>£È>€²WÉÍ9�:/ ·Ê1 =W:0 ·Â; x<=_x»Øz»Ð!-!r#sKBy�<_! x·Êc P~æwÍ¢ ÂX ~ö€wÍ¢ Âc >‘Ê€ W~æwÍ¢ Âu x2-!y2.!! ~·òš å͢Í™á# Â� ÃÝ #næö g#Ã-™Í²—!Ÿ—åx·ÊÍ =Ê =ÀÍÍ :!G*!Ãâ :!G:Q0æ:d ÊÝ �G*!Í%ŽÍŠ Òö Í€2!¯2!ÉÍ ‹*!~2!ÉÅÕÍ9�ÑÁͲ—!Ÿ—åx·Ê8 =Ê# =ÀÍ# Í8 à !!~õG¯wÿÍT ñwÍ �à:!·Ìƒ ÍÍ !!~Oõ>–GÍT ñwà �ø qÅåÍŠ Òk Í5™æw>pÍè˜Í �:Q0æ:d Êz GÍâ áÁÃT ÍŠ ÐÃ!„ÍŠ7È:+0æÈ7Éz:-!ÿç :.!!!ÃÁ :,!ÿþ ¯2/ ¯ÿ!!W:/ ·ÂÊ <_~ºÊÙ ¸ÊÙ �ÂÌ w×!"/ >ÿ2*!:!O!/ ~·Êû =·òû >Gy·Ê :-!€Gy·:.! >¸Ú x2!#~·Ê =2!×þ _Â5 åÕÅ!ì‘åÃ¥!SåO:B!·ü" Ú| yþ ÊK þ Ê~œþ:Ò} Ö0ø‡!h Í0™~#fo:E0æé½| ¾Í×ðjs‘É:v æ Èy!Š ÃÜAÊC]DýM,PR²S§Tê2I0Ãé‘!!~îÿÂJ!A!~6ÒÈ ÍfÍi:| Óû*>!" !!~¾ÊÒ Í/Í€6!)!~2!#~2!:E!2/ :Z0æÊ?=Êðx2 !Í!2C02!:O0õÍï–ñ2O0*E "? É!"~!"¼!"û!""""¯2!*!")!Í/"!¯2C02!:d =2,!ÍŸ—Í?Í{Í—ÉÇÍ :!·ÈÍxœÍÑÉÍ ÍkœÍÑÉ!y!~î wÂç>€2F!ɯ2R0>0ÓÉ! "~îw2"æÂ{Í_ÍþÉÍ!—å:!þ>ÐÆW! 0Ͱœ®wÍñ:!þÊÇþʹþ ÊHþÊIþÊ%þ2Ê¥þ4Ê%É:!0æÀ::!þÀ:70æÖðÿͯ2} 2:!Ƀ!10Ãyƒ!20Í4Í%Ã�Í!304ÍÎÍ0ÉÍ !v!~/w¯2*!2)!Í—Ã�ÍJ�ûÍ?Í{ÉÍO�>€2F!û͹Í¥ÍÎÍ%ÚÍÍK AÍY=ÍY ÍY>2C0!ÃnÍ !e!6€#ÂòÍÑÉÍ=Í"žÃµÍ:E0æÂ!40ÍÍ%Ã(!50ÍÍÎÍ0ÉÍÍU>€2F!!70ÍþÌþÂQ:60æÊ]Í0É:E0æÈáÉÍÍU:B!·Âp:70æÈ!60Í:70æʆ>ð¾ÊpÍ0:60æ晃_Ò™2z!É!é‘å¯2/ 2 !!w!{þ ºÃáÖAG~ÊÑÊÕ:v ÊÛÊêÉ=øwÉ<þ ÈwÉæ Âø:C0æÀí æ Âø:C0æÀú Í!E0~æ¨È~îwÃ0: "þAÈáÉ: "þBÈáÉ~æ<¸ú#¯wÉ€:A!±2A!É*b Ã8!{!|æö gÉ!"}Í€Å!">úÍÍ4Á>úÍPÍ4 >ýÍ>"Í2ÍIÉ!n"pÍ"l"ÍŽ˜Í5Í€Í5:d G=2,!>1w#Oæy§î€<'Ò®ö€æ�ö0œÍIÍ/Í€å6#ëÍ5|æöp}á:d _{ͬœ¦ ÊáT{Í�ÂÕ {Í�Í/pÍ"x"ÍþÉͲ—*!~2!!"0Í" É|eæ°oÉåÑõ ·Ê0ñw#Ã!ñÉpë6#T]zæ°w#s# Â5É6T]#zæöpw#sÉÍ/„À>52,!Í—¯2!2E0!z"pÍ"x"ÍŽ˜ÍWÍ5„Í€ÍñÍI*¨:ªG:ÌŸ¸Úž*ÊŸë!|!:§w#s#6.#r!‹!">ýÍ!®!(>ýÍ!¹!pÍ5Í0pÍ56ëÍ/Íë#s#rÍ5pÍ"l"ÉÍ/>>Í0™pÍ51p##å! 0S{Ͱœ¦áÊ>ö°w#  xþ8È##Ã:E0æî€G!Á!:40˜™ÍÛ0Í_:10H™ÍËÍ÷4Í_:20H™ÍËÍ÷Í’xî€G!î!:50°™ÍÛ2Í_:30H™ÍËÉ:70È™ÍËÅ:B!·Â²:70æ²>õ:60æÍ÷æ™ëÍ0™ëÍ_ÁÉæO�ëÍ0™ëÃ_õÕ6Í_ÑñæëÍüëÍ_Í÷Ép#p#ÉO‡�Ã0™SET-UP ATO EXIT PRESS "SET-UP"MODEMPRINTERT=T/R=P=:K!·ÂO!10~æ#G~æ°2/!!@!æþ~ÚbæßÃdö wÉÍ8:/!æðþðÀÊ�:#0æ@Ê�À:&0æ>ÊŒ<°G:40æþ¦:/!æðþà¦>À°G:40æ!˜™Íü##~°2x!É!0!: 0æÊÉ6�×6×õ:30æþÚÝ:50æ!°™Íü##~°Ó/:30æO!þ™ Ûö€Ó/~Ó##~Ó'ÛæÓ/ñÉÍh!O!w#"!GÍ0�!(ÃÍh*!G:O!O¸ÊC}þdÊCp#"!ÉqÍ/>Í€ÍK ¯2C0!% Ãx2!:!<2!Í—ÉõþÊsþ Òu>Gþ#Â…:"0æÊ…ÍYñÉ:!Oå7!,!žÒ¨*b |æö gy…oÒ§$páɬÍzÛBæ@Ê®ÛBæ@µ> ±ÓbÛBæ@ÊÁÛBæ@ÂÈ>±Ób!‚!ÛBæ@ÊÙÛBæ@Âà>±ÓbÛBæ@ÊìÛBw#ÛBæ@Â÷Âì>±Ób‚!!)æ µoÂ"/ ÃtÍzÛBæ@Ê&ÛBæ@Â-> ±ÓbÍÐ>±Ób*/ ))‚!>)ÂK>͵ÛBæ@Ê^ÛBæ@Âe> ±ÓbÍÐ>±ÓbÉ:. G:@!æðOxÿÖ ò‡Æ !‚!6#”6!‚!_6/€Æ _6ÛBæ@¬!�!ÛBæ@ʸ#øÛBæ@ÂÂ~±Óbø!;ÛBæ@ÊÓÛBæ@ÂÚ+|µÂÓÉG!"? ¯2. 2!2!!/ ¯w# Âÿ! !6xþ@Òþ<ÚwÉGxþ:Ò=Ö0ú=O!. ~þÒ9G€Ú9�Ò;>ÿwÉx/ õ!!Në . w¯þÊY<ñGþ;ÈæÀxÊj2!Ã~!!†Òs>ÿw!ZÃþ0ÒŒ!!O~·ÊŠÿqÉ2!:B!·ü Ú!å:!·ÊÂG:!0æÈxþ(!Êæþ)Êåþ#À![ÃÙ:!0æ!óÊÙ!3Í…ŠÊÙ!0:!OÍçÐ~#fo¯é¯†È#¹7È##ÃçAsBsCsDsFhGmHsIêJsKsV÷„Wæ•Y¼Z‘]È„^Ø•_á•=7><<3g„4k„5!„6c„8¥!è"? áÉ!"/ ¯2!á:B!·ü Ú:;0æÊ#:y!·Â#: !·ÂÍ:!·ÂÍ:!þiÂÍ!/ :!_·Â¹~þÊÇ#¹ÃÍÍò•ÈÍR‰!~!"!Ív‰[Ív‰: !GÍv‰!/ :!·OÂþ Ãþ;ÅÍv‰Á#~Ååͺ–áÁ Âö:!GÍv‰:!GÍv‰> 2;0Íf‰Ã!å:!·ÀÍŸ—: !·Â!ˆÍÙÍ…Š°ÊHª!/ :!·OÂT FÕåÅëå!"? !=!~öwáÍÙ¯2:0ÁáÑ# ÂT!=!~æþwÉþ?ÀÅÃHA˜ B¡ C­ Dº Hè Le‹Mˆ‹P«‹fè r$ yÀ }t|²J K­ cŒgNœm#nÍqÒi^hÖ“lÑ“nà:B!·À°øþð!L ~æþ°wÉ:!G!ŠN#~#·È¸ÂíyÉ!!44ɯ2R0!"? É!!!Ã!!! Í_×!.x·Ê;ÃÜFKPX2!!!~ö÷wÉ>ûÃR>ýÃR>þ!!¦wÉ>€2!É>ÿ2:0: !·!xÊsþ?À!‚H ÃÝÈ„ò•æ•÷„á•Ø•:/ ·À!4!~öwÉ>ûÍ­:!0æ®6Ú+6/Ã6?#6:B!·ÊÆåÅ:B!·ü: Ááp#6ãÃ:/ þÊþ>À!4!¶wÉ:/ þ>ÃÙ>÷Í­:J0æ>3Âû>0w#Ã>ïÍ­6?#61#: !îÍx6îÃ!4!~öw:=!ö2=!É>ýÍ­:!G:!·Ê<:-!Ox‘<Íx6;#:!<Íx6Ò:=!æû2=!Ã>¿Í­6?#61#60#:(0æ>ìÂt>èwÃ_0dÍ—ʆw# Í—Ê‘w#{ö0w#É{0‘òš�_xºÉ>2U0×!4!¦w!M 6#6[#É!ÂÃnxÖ 2. !ÎÃxÖ þPÒÙ2!:. þÒä2!Í×ó>2^0û!!:-!¾Ê ¯¶Â¯2^0É5¯2^0×: 0æÊ-Í;�>2V04#6™Í?™¯2^0Ã1€¯2^0Ͱ€Ãý–>Ã=¯2T0É!!0~öwÉ:B!·üI :"0æ&Ê\&l"!"!¯2!É&Ão&l"!Éx·Ê�þþÊ•!©~·È#¸Ê�#Ã�:*0¶2*0É!+0~öwɯ2*0!+0~æwÉ:B!·È:70æÀx·øÊÌþÐ=ÂÌ>260ÍŒÉ:y!!!¶À:S0æÒè:5!·ÀÍbÐG¯Ãó>2S0:!·xÂþ ÒO:B!·üL Ã}*? éõåÕÅÍÁÑáñÉþÈO:B!·ü( Úl!;0~æÊ«:(0æÄ…ŠW:"0æ²ÊO:S0æ«å!~!"!á: !æÊ«~æÂs:y!·Â«AÍv‰Ãl:!0æ6 y‰þXÂ�Íò•Ãlþ[Â�6 Íñ[ÍñÃlÅÍv‰ÁAÍv‰Ãl!", ¯2{ >2H0:(0æÄ…ŠÊËÍ‚Âl:00æÄžÍÏ:O0æÊ1Å:(0æÄ…ŠÂûÍK :90æÄÿ„Í{ Ã0:.!G:!¸Ú$:S0ÂæÂ0ÍR Ã'æÂa:!þÊdÍS�Í‚Âd͘Á:B!·üR Úl*!q|Ægpx2!y2!!!:,!¾Âh:"0æ2O0ÃlÍ6 ÁÃl4Í —:(0æÄ…ŠÄÇŒÄS�:B!·ü+ ÉÅÍnjʖ¯2P0ÍS�Í6 ÍÇŒÁÉ:00æÈÅÍŸ—ÍŽ*!yÍ0™:!Gy�ÚÍO |]ÆW ÊÍ+~#w+üÁÉyþÊ2!!V#z…ozÖòæz2!~G!("¾Äùˆx·Ê2=Âyþ#Â2Ã2=Ê=Ê2=Â%yþ_Ú2Ö_OÃ2*L!~#F#·Ê2¹Â%H:S0æÊW:(0æÄ…ŠÊW*!~怱O|Æg~æ°GÉ:!°G:!±OÉ:=!·À:@0æÀ:A0æÀ!~ ~#–ʤn& V! ~<ö€w+–ò�Æ€þpšÍ:R0æ/¢7ɯÉvV12 vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*b |öðg"b Í€<2V0É:d G|æö gÆW]>ÿ6#Â"€ÉÿÃ3€!-!V#^x·zò@€{Í8™{’O:* Vwx…o zòI€æ2* Ãý–ÍP�:-!G:.!¸Êv€Í�Í,€:-!=ÃÉ€Í �:Q0æ:d Ê…€Gë!ë͊ €>ÿq#–€=É~æ€wö# €=ÉÍP�:.!G:-!¸Êv€=Í�Í1€:.!=ÍaŽû!.!~+–þÂþ€!K0~6æÈ*h ë*j Í �*8!ë*G Í �!h "j "G —ÉÍÀޝ2K0ûÉ|·õægr#sñð+:d Í0™r#sÉÍ5™æ€2Q0ÍȘ"!Ép#z³Â0�É�!e ~·ÊM�yÅÜ2�ÁÃ;�yÐó:K0æÊ`�ûÍ2�ÃP�:e ·úl�ÂY�ûÉ:f !g †'æÊY�ûÉÛ"/æÐGæ °æG:y!·Êœ�:F!Ò‚ÃÒ�!K!:70æþ³�xæ@ʳ�ˆz¾Ê¼�rÍ8x* !+" !)ÒÊ�öG:F!ÒØ�!.šÃå‚°G:G!Ò ‚:$0æÊÒ�*I!~æÊÒ�͸‚Âÿ�>ö€Í}>ö€Í}!šÃå‚:$0æÊ‚:G!°GÛõ·ò&‚>€°GñæÊ-‚ :L æóWx·ò=‚>²Wxæ²2L :y!·À:!·Êh‚*I!_š{½Â]‚z¼Èz›{½Âh‚z¼È*I!~#æÀÊt‚##x®/##¦Gˆ‚+y®/##¦OÈ+ÅNxÚ¨‚GyÒ™‚OzæÂ�‚ÁA#ÃŒ‚zþ Ò°‚+Á#ÃÜ‚:70æÊÅ‚:60æþÉ#^#V#ëØ‚Å:70æéëÊã‚^#VëÃå‚##"I!FxþÿÊÈ‚—2G!:F!æ2F!:70æþõx ƒæÃƒæ/2| öÓñxƒæîO:@!æï±2@!Ób:&0æ#Â5ƒ#xæÀÊPƒòDƒ^ÃLƒ~æW~æð_ë" !û*I!~æÊjƒ:F!æ Âjƒ!B0~æûwÉ:!·Âbƒ!B0~öwÉ:?0æÀÆ2?0:$0æÊ“ƒ>Í ¯É>·ÉÖø¯É:%0æÉõ¯25!2K 2R0:!·Âºƒ!"? ñÖøÈÖÉÖÉ:$0æɯ25!2K ÍŒ:70æþÒìƒÿ!:!6õÍñ·É:!·ÂþƒÍ!!"? ¯2=!2B02:!2;!2R02T02002G0ÍI&€l"~ É:Q0æÈÍ9�ÍŸ—>ðÍè˜! :!…o~æwÍŽ˜ÍȘ:d GÍ0™|ÆW]>ÿ6#ÂS„¯2Q0Ãý–Ío„PÍo„0Ío„Í9�ÍŸ—! :!…o~ö€wÍȘÍ™á~Íè˜:,!!!·¾Òý–!!"!Ãý–:)0æÂ*…ÍR‰!¼!"!Ív‰SÍv‰ÍoÈ:z!GÍv‰É:{!·Âñ„:^0æÂñ„ÍR‰ÍÍ9�ÿ{2ú!> 2J Ã…!F06ÿÉ> 2J Ã…> 2J ÍŠÀ¯2ú!: !æÈ{!~!"!ÃB…Í*…:{!æÌf‰ÉÍR‰ÍÍ9�>ÿ2ú!¯!¼!"!2"::0æÊj…!9}Ð"“!"w#Ñs#r#<<ú[…+V+^Õ:"·õÂŒ…ͳŒÂ……ÍŠÊ……:y!·Ê‘…ñÍf‰Ã6 >ðÓ…>2{!Í¿‰ÍR‰:y!·Â«…:"0æʲ…!B0~öwñÊÎ…òÜ…:#0æÊa†>Í@‰ë""¯Ãn†>ÿ2Y0:)0OæÊê…Í=‰""ë""ëÃt†yæÂa†*C!"ý!*!"C!µÂ†:!=úã†O:-!=ú†¹Òã†yÍ@‰ëÃ%†Í=‰:!=Í0™"":þ!O:-!=ú7†¹Òk†:!¹Úk†ÂO†:ý!O:!¹Úk†Êã†:þ!Í@‰:ý!Í0™""Ãt†:.!Í@‰ë"":-!Í@‰"":"·"û!ÍŸ—*û!"|!Íî�>Ò�†/ 2""û!ë:)0æ G:"°Âņå*"ëÕ*|!Í5‰ÑáòņåëÍ5‰}áòņ<�O*"Í?‡Ø:"½Â~†:"¼Â~†:"O:!W:"º:"·Êû†:#0æ !ú!¦Äv‰Ã1‡:)0æ ‡:"·ÄLJ:)0æÊ(‡!!6:"0æÊ(‡#:.!¾Ê(‡4:z!GþÿÄv‰Í¯2{!×9åÍéŒÊg‡:(0æ>Âg‡:"·Âg‡ÍˆÚŇÍv‰Ãº‡2'":"·Êx‡:"/Ã�‡Í…ŠÊ–‡:(0æÊ–‡~æÊ‘‡þ –‡+ †‡ÍˆÚŇͅŠÊº‡:(0æʺ‡:"·ÊÁ‡:"·Ìv‰:"·ÂćÍLJ¯áÉ:"·Âæ‡Í‰ÈÍv‰õxþÊä‡:"0æÂû‡ñÉ Ív‰:90æÊü‡:J GÍv‰Éñ Ív‰É:B!·üO Úžˆ*|!+#"|!å*!#VÅÍv‰ÁráØy·È:'"æFÊ0ˆ ÅÍ%Žæ/æ€OxæÂJˆ Óˆþ ÊEˆ±OþÂ[ˆÓˆ!"~Í ˆÒ’ˆ:ÿ!Í ˆÒŽˆ*1!^#V#F#:"¸Êqˆ:ÿ!¸ÊqˆåëͧˆáÚqˆPÍ÷‰CÍv‰Á*|! ˆ¯ÉÍùˆÔ§ˆÉÅyæO|µÊɈ~¹Â¹ˆ_·ÊɈ#~#¹Â³ˆÁÃ׈ÁY²Âôˆyæþ Úôˆyæ€xÊçˆþÈþÈÃôˆþÊôˆþÊôˆ¯<ɯ<7YÉG!("w*1!^#V#~#¸Ê‰7‰Éë"L!É:+0æÈ:+0æÂ1‰:60æþÊ1‰ ɰÉ+}“o|šgÉ:!Í8™Í˘]T<‡ÂH‰É!=!~ö€wÍŠÈ:B0ö2B0É!=!~æw:B0æý2B0Éå*!#~<þ<ƒ‰¯O+¾#~”‰O=ò’‰>;#…op*!~#q‘ò¤‰Æ<þ Ò½‰*!}þ~>7ʺ‰2A0áÉ2@0áÉ:!W:"ºÄ÷‰!!~#"~#~#:"0æÊå‰x2ÿ!!)Š"1!:B!·üX É:B!·ü[ ÚŠ!Š#~#ºÂŠÍv‰(Ív‰FÍv‰z2"ÉAB012:Š=Š=Šÿ#_`abcdefgh i j k l mnopqrstuvwxyz{|}~þ:(0æÈ:B!·È: ·É:w æ È!(0~æÊ£Š~îwÉ!4!~ö@wÉ:/ G·Â´ŠþÿÉÍŸ—:w æ ÊëŠ:-!2!ÍùŠ!!4:.!<¾ÒÈŠ¯2!:-!2!ÍÝ–ÍÇŒÄS�ɯ2!:-!2!ÍÝ–ÉÍ �:Q0æ:d Ê‹GÍéŒÂ‹~æ€wö# ‹ÉÍŸ•ÍŸ—:!_Ê4‹{ͬœ¦Ê(‹Õ*!:!OÍ%ŽÍ �G¯¹ÊS‹ +Í �¸ÊC‹ Ñy»ÚZ‹YÍ¿�ÈÍŕ‹ÉÍ«ŠÈÍÆ‹ÅÍnŒÂiŒÚiŒáÅDMÅÍó‹ÁÂz‹á"-!ÉÍ«ŠÈÍÆ‹ÅÍnŒÂiŒÚiŒáÅDMÅÍNŒÁÂ�‹á"-!ÉÍ«ŠÈÅÍnjʽ‹Í6 ÁÃS�Í[•Á¯‹ÉxþÚ΋:!!-!¾Úß‹!.!O~¹ÐáÉÍnŒÂjŒÚjŒÅÍó‹á"-!ÉͰ€ÂÝ–ÍŸ—:-!õÍ@‰ñ<åÍ@‰ÑÁÅÍŠÈåÕ~æ<ú%Œ~æ€#ÃŒxá ëá G~ö#Â/ŒÃÝ–ÍnŒÂjŒÚjŒÅÍNŒá"-!ÉÍ[€ÂÝ–ÍŸ—:.!õÍ@‰ñ=åÍ@‰ÑÁà ŒÁÍ6 ÉÍ9�ͳŒÀÍ�x<Ê’Œ:.!¸Ò…ŒG!-!N:!WxºÒ•Œ¯7Ér#~pG*!ó"!~2!|Æg~2!û¯2!É:-!W:!O’úÃŒ:.!‘?ø¯ÉÍŸ—*!ÍŠÈ:S0æÂãŒ:+0æÊ㌯ÉÅͳŒÁÀÍŠÈÅͳŒÂ �Í%Ž:*0GÍ �Ê� ÁÉ:+0æÁÉ~îæÉÍŸ—:!O*!ÍÍŒ~æ<ú5�ÍÍŒÂD�#Ã#�!!~¸ÊO�4Í �Ã�!!~A=¹ÊO�Gqà �ÍŸ—:!W:!_:,!»Âr�:.!ºÊ}�Ã}�{ÕͬœÑ¦Ê^�ÕÍä�Ú��:.!!!¾Ê��>¾Ê��ÍŠÊ��4!!FÑxºÊ¯�Ò´�PYô�y»Úª�Í»�ÂS�Éz2!{2!Í—:!!.!¾úá�ÊÙ�¸Âá�:,!!!¾ÈÃnjͲ—:!O*!Í%ŽÍ �G#~+<‡ÊŽ #Í �¸Êõ�ÍŠÊõ�T]7ÉT]##~æÆ #ngÉÍä�Ð É|ÆW]É:\0æÀ æö0É æö 0É:W0æÀ æö0É æö 0É æö0É æö 0É·òzŽ! ~#nöðg"b Í�! ÛŽÍ �åÍ�PY`iÍ�zöðgk"b á|öŸ<¢ŽÍ!�ó"G õŽÍ+�:d Í0™#ó|ö€g"G `i"8!>2K0ÉõÍ€ñ·! úÙŽÍ �|öŸ<ÂãŽÍ!�ó"j F#NÃúŽÍ+�:d Í0™#óF#N+|ö€g"j *b "h Í!�p#qúŽÿwû2[0!ã�å:B!·üF :w _æÀA ·Êy�!x æ¾Ê�#Ân�¯ Âb�!@ x ·Êš�#~·Â‹�wõ>2D ñ †�!ð‘å!A ~·ò²�æW# ©�À:D ·ÊÅ�=2D É: 0æÈá:]0æ=2]0À>2]0zÍ’ÈÃ�!w ~2v ¯w# Âí�¯2M0É:M0æÀ!L ~ö@wÃ?Ž6·úy�Í’Í�ö€Ãy�Íð‘åÕÅþþÊ£ þ‚ÊIþÿÊì‘Oþ�Â?�:w æÊ:B0æÂì‘!]‘åé‘Í…ŠÈ>2S0:!·À>Ó¹Âj�:w æ Âp�:(0æÈ!…�ÍçÚá!Œ�ÍçÐÁÕÃá Ü� ÷�Á/‘Â>‘ÃN‘ÄW‘ÐS�ÑÅ�ÒÔ�Óº�­·Š¬‹� ‘ ‘›Ð�C• S�:w æ ÊL•Ã�Š:w æ Êá‹Ã<ŒáÃì‘!00~îwÉ!!6ÕÅÍ—ÁÑ:y!·Â÷�:)0æÂy�ÁÕ!!~þÈ:.!¾È4×:w æ Ê‘ÃÈ„:w æÂÐ�:y!·ÂÐ�Í¡„:{!æÌf‰É:-!!!¾È~·È5×!!~þÈ:.!¾È4×:,!!!ÃH‘!!Ã7‘!�‘å!S06:!·À>�¹À:w Gæ Ê‘!é‘ãÃÈ„:w æÈ!90~îwáÃé‘:B!·üU Úé‘y·ú�:!·Â®‘:!0æ2P0:70æÊã‘y!z!¾Êã‘:%0æÊã‘yþ Âã‘:C0æÂã‘yÍ}:"0æ> Ä}Nyö€Í}Íø‘ÁÑáÉõ>2]0ñÉ:!0æÈ>€2+!Ã?ŽåÕÅO:w G:B!·ü ÚÂ’yþ{Â#’>þÃÂ’yæðW‚Wy’_:&0æ{ÊE’þ0ÊC’þ1ÂE’î!òœ_Ny§ú²’þ Ú²’xæpʲ’yþ{Òt’þaÚt’Ö Ox棒ò’xæ0ʈ’!Çœ~#¹Ê‡’#Ã}’Nxæʲ’yþ Ê£’þ?Ê£’þ{Ú¬’þÒ¬’yæŸO¯yÃÂ’¯>ÿÃÂ’!ky¾ÊÂ’#¸’ÁÑáÉÕ!LšÍ傯2y!ÛBæ€ÊÑ’Íðx2/!ÓyÓ!ÅåÍbáÁÚÿ’#|µÂë’¯7ÑÉæ¹Âû’yþ€OÂå’xÆGÒÝ’¯ÑÉóÕzÍ.“ÍT“ºÂû’ò“¯ÑûÉGæÊ@“yö0O{ö _xæÊJ“{ö_{Óy2@!ÓbÉÛ"OÛ_/æ ©æ >ÿÀyæ Âo“yî@æÐÊ€“þÐ>ÿÀx³ÉÕ!Ž“åõÃÔ:50æ·yœ“ö€Ó#!ÛG泓#|µÂ¡“¯7ÑÉx毓۹¯“yþ€Oœ“zÆWÒ†“¯ÑÉÃØ“ÿ: !!"”þ?Âæ“!”HBÍÝÍ…ŠÈ: !!/”þ?ÂÝ!9”ÃÝI”N”x”c”o”\”�””ϔ֔!†”””£” ¸”U”ë”ò”ù” • • ä”Ý”•!G0pÉÍ1•!0ÉÍ1•"0É!!pÃÝ ÅÍ9�ÁÍ1• 0ÉÍ1• 0ÃÇ!v!p×Í1• 0ÉÍ1•%0ÉÍ1•"0É:70æþÐÍ1•B0ÉÍ1•00:00æG!L ~æý°wÉÍ1•"0:"0õæGñæî°2"0ÉÍ1•#0ÉÍ1•#0ÉÍ1•)0ÉÍ1•(0ÉÍ1•(0ÉÍ1•+0ÉÍ1•)0ÉÍ1•)0ÉÍ1•(0É:B!·ðÍ1•(0!"C!ÍŠÊ(•!L ~æþ°wÉá^#V#~#ëO/¦wx¡¶wëéÍÅ•Ê6 Í·•Ͳ—ÍÇŒÊ[•Í6 ÃS�ÍŽ!!y–O*!Ê}•|ÆW]#~+w# Âo•2O0~æ€w|Æg~öw*!~2!|Æg~2!Í—É!—å!!5~<À4#ÍÅ•È5+6„Ãý–ÍÅ•ÈÍŸ•Ínj·•É:-!G:!¸ÒÒ•¿ÉÀ:!·É: !æÈÃ╯290É: !æÈ> 2;0ɯ2;0ÉÁÛæ È:<0æÀ: !·ð!~!"!~G#¾Â9–::0æÈ:{!·À1Ð"!"~õ/…ÆoñV+^+Õ<<ú.–ÉÍu–Â]–õ¯2@0:{!æðÊY–ÍR‰*|!¯Íx†Ã\–Íf‰ñG:50æ·xÂj–ö€ÍÎÓ#!l 6É#x…oF*!~<þ<Â…–¯w#¾xÉÛæ ! !Ê—–6�ɶÈ6ÉÛæGÛx!<0þʵ–þÀ>¶Ã¸–>þ¦wÉ_0dÍ—ÊÉ–Ív‰ Í—ÊÕ–Ív‰{ö0GÍv‰É*!~2!~2!Ãý–>ÿ2*!Ͳ—à —Í[€>ÿ2*!ÍŸ—à —ÍŸ—:!·ÂC—:!!*!¾ÊC—wÍ �¯2P02O0:Q0æÊ<—:d ==·2,!ÃC—:d =2,!!,!N!!Fx¹ÚT—qÃ^—:!·Â^—2O0:!Æ‘ò}—xÆ‘ú}—:P0æÊ}—Í< ¯2P0:!2!*!Í0™"!~2!G|Æg~2!*!p¿ÉͲ—*!:!w|Æg:!wÉ!", ¯2{ >2H0ÉÍ9�ó!p"h ! "j >2K0ûÍŽ˜!Ð"|ÆW]0 :U0æÂ˜2!w#=< Âñ—òñ—Ø>E2!>ÿ6E#  ˜ò ˜¯2U02!2!>ÿ2!!Ð""!!I">‡Í0™Í­˜Â0˜åÍ£˜Í0™#6p#6á‡Í­˜>2 !òÐ" x2.!<2* ͢|öðg"b ¯2-!! w,<òw˜Í£˜2d Í¥ÍÝ ÍŽ˜É!!~<¾Èåõ:!·Ì2�ñáÓ˜:v!·>PÈ>„ÉÅå‡ëáåÍ£˜Í0™6#zöðw#sáÁÉÍ5™æÕ_bk)ëë)ëë)))))ëÐ"ÑÉæpG:!=! ú ™Í8™Wæ͢:d _#ü ™~æ�°wÉ:d ##T]Í0™ëÍ-™~+Â$™É:d …oÐ$É:!! …o~É:V0æÂ?™É 50 75 110 134 150 200 300 600 1200 1800 2000 2400 3600 4800 9600192007M 7S 7O7E87N8O8E<8N 7M7S7O 7E7N8O 8E8NFDX AFDX BFDX CHDX AHDX *HDX B ÿETXEOT CR DC3 FF YæW»sÖ9�N4/' £ 'š#.š€ 7š€Zl‚BšBšÿ˃SšÿyƒLš'.œ Zšÿ—ƒz›€€fšÿîƒkš‚tšÿœƒ�š‚‚šBÕ›.šbÕ Š.ššš.šÿ»ƒªš"ªš�š.šÿyƒ¸š¢¸šÿ»ƒïšÿƒâš#AÙ.š›Ñš�šü›b».SÓ.š›Âš.šü›#™.šüš�šü›#AÉ.š›�šü›£âš›"›BÕ›.šÿ¢ƒb›ÿƒL›aå.š�šA›2›ê›V1GG�š#›�šê›¡.š#›ê›….šW›ê›–L›�š@Ä.š�šm›F1FF�šb›�š"€€�›ÿ›¢�›bÕš›.š& £›.šÿyƒ±›¦±›'�.šÝ›¾›œÿŃЛ§±›.šœ§dx±›.šœ& �.š±›Ð›œŽó›†›"œª œ¢�š&œ®%œ¦±›&5œ®>œ¦LšGœx·ÂWœÍdœÉþÀÍkœÉͨœ¶wÉͨœ/¦wÉ!e!6#}þvÂnœÉͨœ®wÉͨœ ·Ú�œW¦zÊ�œÃšœ#}þv>€Â‡œ :,!¹Ú¢œy2!×:!OW!e!æ…oÒ»œ$zæW>€øÃÁœ0)1!2@3#4$5%6^7&8*9(-_=+`~[{]};:/?'",<.>\| poytwqÃ][iure1ÄÂ�`-9743›ÁÒÐ=08652 ·ÓѰ \lkgfa¸�²±';jhds®¬µ´ .,nbx‚¹³¶­/m vczÃT�Í=¯* åÕõÍù�ó:B!·ü4 ñÑÂ�� Å!O!¯,ÿͳ�ÁÊ„�Âm�Ã�� Å! 0>2ͳ�ÁÊ¥�†�Í"ž>02I y·õ>cÍ}ñá" É2. y2N!ÅÕå~ 2/ z·Ì#Í«áÑÁ:/ ú÷�õw:N!O:/  ©OñÊï�#:. <õ�!N!ÿÃè�¾É:&0æÊž> 2 ž!{!>ÿÍ!q{" ÃŽ˜Waitp!O!'6€#Â'žMžÍ_! 0RžÍ_:B!·ü7 ÉN ÿ  LõóÛæÄÛÍ8Ž>ÿ2\0ÅÕåÍ�žó¯2\0áÑÁñûÉû:y!·ÊŸž¯25!24!ÃÌžÍDÈó!;!~G·6ûÊÌž:70æþxˆŸþ!F!~ÂÉžæïÃËžöw:5!·úÚž:4!·Âឯ͆Â;Ÿ:ÿ2\0:70æÊ«Ÿx!z!¾Â«Ÿ!F!~ö w!B0~öw:40æ·x·Ÿö€Ó!l 6¯2\0Ã+ޝ2\0É12 vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvÿ‚ÉÉÉÉÉÉÃ^ ÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉÉyþ5Êk þ6Ê¡¯É! "~þAÈþCŠ >Bw2"!z"pÍv¡"x"¯É>Cw2"!n"pÍv¡"l"!!~<¾Â  ÍN¡Í[¡>2,!ÍN¡Ap##å!(0S{Í}¡¦áÊË >ö°w# » xþEÊä ##ö 6T]#zæöpw#sÍX¡6#ëÍN¡|æöp}ÍH¡pÍv¡"x"7É: "þCÊ¡¯É*Cå!(0:!Æþ@ÐWþ Ê=¡þÊ=¡Í}¡®wï ¯2C!2D!zÃ5¡*b ÃQ¡!{!|æö gÉÍH¡:d G|æö gÆW]>ÿ6#Âk¡<É|eæ°oÉæ…ozæW>€øÊ¡ÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇÇ