aboutsummaryrefslogtreecommitdiffstats
path: root/util/alevt
diff options
context:
space:
mode:
authoretobi <git@e-tobi.net>2013-09-03 09:48:45 +0200
committeretobi <git@e-tobi.net>2013-09-03 09:48:45 +0200
commit9fe4d4ea9c054e539ab679ed2e9c076c35beb69d (patch)
treeaffff927f15c8ae6c77890cc9564855efe2e51db /util/alevt
parent9a5228e0f2b898367b7943d294be58caf6ce8bb3 (diff)
downloadlinux-dvb-apps-9fe4d4ea9c054e539ab679ed2e9c076c35beb69d.tar.gz
Imported Upstream version 1.1.1+rev1355upstream/1.1.1+rev1355
Diffstat (limited to '')
-rw-r--r--util/alevt/COPYRIGHT297
-rw-r--r--util/alevt/ChangeLog535
-rw-r--r--util/alevt/EXPORT.HOWTO84
-rw-r--r--util/alevt/Makefile130
-rw-r--r--util/alevt/README72
-rw-r--r--util/alevt/README.OLD78
-rw-r--r--util/alevt/ReadmeGR28
-rw-r--r--util/alevt/TODO12
-rw-r--r--util/alevt/alevt-cap.153
-rw-r--r--util/alevt/alevt-cap.c280
-rw-r--r--util/alevt/alevt-date.141
-rw-r--r--util/alevt/alevt-date.c225
-rw-r--r--util/alevt/alevt.160
-rw-r--r--util/alevt/alevt.desktop9
-rw-r--r--util/alevt/bdf2xbm.c212
-rw-r--r--util/alevt/cache.c229
-rw-r--r--util/alevt/cache.h41
-rw-r--r--util/alevt/dllist.h55
-rw-r--r--util/alevt/exp-gfx.c258
-rw-r--r--util/alevt/exp-html.c299
-rw-r--r--util/alevt/exp-txt.c226
-rw-r--r--util/alevt/export.c364
-rw-r--r--util/alevt/export.h66
-rw-r--r--util/alevt/fdset.c97
-rw-r--r--util/alevt/fdset.h28
-rw-r--r--util/alevt/font.c5
-rw-r--r--util/alevt/font.h19
-rw-r--r--util/alevt/hamm.c229
-rw-r--r--util/alevt/hamm.h7
-rw-r--r--util/alevt/help.c83
-rw-r--r--util/alevt/help.h8
-rw-r--r--util/alevt/icon.xbm17
-rw-r--r--util/alevt/lang.c393
-rw-r--r--util/alevt/lang.h28
-rw-r--r--util/alevt/main.c221
-rw-r--r--util/alevt/misc.c66
-rw-r--r--util/alevt/misc.h32
-rw-r--r--util/alevt/os.h7
-rw-r--r--util/alevt/search.c127
-rw-r--r--util/alevt/search.h16
-rw-r--r--util/alevt/ui.c721
-rw-r--r--util/alevt/ui.h35
-rw-r--r--util/alevt/vbi.c942
-rw-r--r--util/alevt/vbi.h47
-rw-r--r--util/alevt/vt.h62
-rw-r--r--util/alevt/vt900.out29
-rw-r--r--util/alevt/vt901.out29
-rw-r--r--util/alevt/vt902.out29
-rw-r--r--util/alevt/vt903.out29
-rw-r--r--util/alevt/vt904.out29
-rw-r--r--util/alevt/vt905.out29
-rw-r--r--util/alevt/vt906.out29
-rw-r--r--util/alevt/vt907.out29
-rw-r--r--util/alevt/vt908.out29
-rw-r--r--util/alevt/vt909.out29
-rw-r--r--util/alevt/vt910.out29
-rw-r--r--util/alevt/vt911.out29
-rw-r--r--util/alevt/vt912.out29
-rw-r--r--util/alevt/vt913.out29
-rw-r--r--util/alevt/vt914.out29
-rw-r--r--util/alevt/vt915.out29
-rw-r--r--util/alevt/vtxt-iso8859-7.bdf5768
-rw-r--r--util/alevt/vtxt-koi8.bdf5906
-rw-r--r--util/alevt/vtxt-latin-1.bdf5906
-rw-r--r--util/alevt/vtxt-latin-2.bdf5906
-rw-r--r--util/alevt/xio.c1156
-rw-r--r--util/alevt/xio.h80
67 files changed, 32030 insertions, 0 deletions
diff --git a/util/alevt/COPYRIGHT b/util/alevt/COPYRIGHT
new file mode 100644
index 0000000..17930ea
--- /dev/null
+++ b/util/alevt/COPYRIGHT
@@ -0,0 +1,297 @@
+This message applies to all files within the archive:
+
+ Copyright (C) 1998,1999,2000 Edgar Toernig (froese@gmx.de)
+ All rights reserved.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License Version 2 as
+ published by the Free Software Foundation.
+
+ This program 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.
+
+
+And here's the GNU GPL V2:
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 675 Mass Ave, Cambridge, MA 02139, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
diff --git a/util/alevt/ChangeLog b/util/alevt/ChangeLog
new file mode 100644
index 0000000..896ddc3
--- /dev/null
+++ b/util/alevt/ChangeLog
@@ -0,0 +1,535 @@
+Thu Feb 11 22:05:00 MET 2010 (1.7.0)
+
+ - redesigned version:
+ - outfile, new starting methods, libzvbi implementation
+ - lots of bug fixes, all patches available in the Internet applied
+ - extensive code cleanup
+
+Mon Dec 3 03:11:07 MET 2007 (1.6.2)
+
+ - compilation fixes for newer gcc
+ - makefile tweaks (man vs share/man, /usr/X11R6 vs /usr, etc)
+ - default device changed to /dev/vbi0
+ - adapt to current v4l2 api
+ - some minor fixes collected during the past years
+
+ This is a build-time update to conform to newer compilers and
+ system environments. If you have a running AleVT there's no
+ reason to update. The only real fix is in the html-exporter
+ which was producing broken html (missing double-quotes).
+
+Thu Jan 23 01:53:10 MET 2003
+
+ - Fixed a bug in contrib/cap-all.c (fdset_init before vbi_open)
+ - Expaned cap-all.c to show how to save in two formats simultaneously.
+
+Tue Aug 20 05:22:16 MEST 2002 (1.6.1)
+
+ - Removed the bttv-warning from the help pages ;-)
+
+Mon Jul 23 18:34:32 MEST 2001
+
+ - Fixed bug in ui.c - found by <pawel@sakowski.eu.org>.
+ - When clicking on page numbers accept sub-page numbers too.
+
+Sat Dec 23 15:12:11 MET 2000
+
+ - Fixed 'double height last line' bug in export.c reported by
+ <Matthias.Kleinmann@urz.uni-heidelberg.de>
+
+Thu Oct 12 02:19:31 MEST 2000
+
+ - The &nbsp; fix was wrong. Removed it.
+
+Wed Oct 11 19:41:38 MEST 2000 (1.6.0)
+
+ - Some documentation tweaks.
+ - Release. Made it 1.6 because of V4l2 API.
+
+Thu Sep 21 21:07:12 MEST 2000
+
+ - Removed old bttv-only decoder. Only the v4l2-based stays.
+ If the device does not support v4l2, default parameters
+ appropriate for the bttv-driver are taken.
+ - Subpage cycling (up/down and 2nd wheel) stays in the current
+ page.
+
+Sat Sep 16 23:52:12 MEST 2000
+
+ - Experimental v4l2 interface added.
+ - Finetune defaults to 1 now. Works best for me. Tell me
+ if you don't like it.
+ - Russian patch still not added :-/
+ - Fixed the bug in xio.c that Ben Smithurst
+ <ben@scientia.demon.co.uk> found.
+ - Added the dual-wheel-mouse patch from Holger Fitzner.
+
+Tue May 30 03:09:24 MEST 2000
+
+ - As Matto Fransen <matto@matto.nl> reported: the ; after &nbsp
+ in exp-html is missing. fixed that.
+
+Tue May 9 20:21:52 MEST 2000
+
+ - Removed the -oldbttv/-newbttv options. If your driver has
+ a buffer size different from that in the current bttv you
+ either have to support the VBISIZE ioctl or change the source.
+ (Tried to implement an autodetect by non-blocking reads but
+ that confuses the driver that much that it no longers gives
+ reasonable data.)
+ - Added a compression option to the png export filter and
+ changed the default compression level to the lib's default.
+ The prev default of 9 was way to slow.
+
+Wed May 3 19:18:55 MEST 2000
+
+ - Added a smaller font. Made out of the neep9 font from
+ the really great jmk-fonts (http://www.pobox.com/~jmknoble).
+
+Sat Apr 29 02:36:41 MEST 2000
+
+ - Fixed SEGV in export.c:adjust.
+ - Fixed a possible buffer overrun in exp-txt.c
+
+Thu Nov 4 21:18:52 MET 1999 (1.5.1)
+
+ - Added os.h. That way alevt compiles right out of the
+ box on all BSD systems (I hope *g*).
+ - Fixed the DST bug in alevt-date.
+ - Put vtwiz.pl in contrib, a perl/tk/set-tv script to
+ launch alevt written by Joern Borgert.
+
+Tue Oct 26 23:55:09 MEST 1999 (1.5.1-pre1)
+
+ - Added timeout option to alevt-cap.
+ - Use install instead of cp in the Makefile.
+ - Added -I/usr/local/include and -L/usr/local/lib
+ in the Makefile.
+ - Changed #ifdef FREEBSD to #ifdef BSD.
+ - exchanged contrib/paul-export.patch with
+ paul.fmt_page.c (a replacement for export.c:fmt_page())
+ and paul.fmt_page.patch (the same in form of a
+ patch file).
+ - Some doc corrections.
+
+Thu Oct 14 02:49:48 MEST 1999
+
+ - Added FREEBSD patches.
+
+Fri Oct 8 23:36:45 MEST 1999 (1.5.0)
+
+ - Updated the documentation.
+
+ So, what's new since 1.4.9 (nearly 4 months ago)?
+ Two major things: full latin-2 support and export
+ filters for alevt-cap and alevt itself.
+
+ For the latin-2 support page enhancement packets
+ have to be decoded and some latin-1 pages may
+ benefit from that, too. Note: if you select
+ latin-2 everything is latin-2, even cut'n paste.
+ (new cmdline option -charset latin-1|2)
+
+ The export filters allow saving pages in different
+ formats. At the moment there's ascii (with and with-
+ out color), html, png, and ppm. The png filter
+ requires libpng. If you don't have it (or don't want
+ png support) just remove the WITH_PNG from the
+ Makefile. To save the currently displayed page just
+ press 's'. See alevt-cap(1) for the format string.
+
+ Preview: 1.5.1 will have the FreeBSD patches and
+ any bug fixes. (But not more *g*).
+
+Fri Oct 8 02:06:35 MEST 1999 (1.5.0-pre4)
+
+ Finally I could get away from my Playstation and
+ work a little bit on alevt *g*
+
+ - Tried to change alevt-date with freebsd patches from
+ Thomas Runge <runge@rostock.zgdv.de>. They do not
+ have the timezone and daylight variables. But I do
+ not have tm_gmtoff. So it's commented out for the
+ moment.
+ - Made font.[ch] so that only one copy of the fonts is
+ in the executable when including export modules
+ (exp-gfx.c uses them). Had to tweak the makefile.
+ - Added 's' for saving pages to files. Prompts for
+ a format string and a filename and saves the
+ currently displayed page.
+ (Formerly, 's' and 'S' were aliases for '/' and '?'
+ (searching))
+ - Found a bug in export.c regarding double height lines.
+ - Added a patch to the contrib dir to pass the URL you
+ click on to netscape.
+
+ The documentation updates are still missing. That's
+ the last thing to do for 1.5.0. But that's so boring...
+
+Fri Aug 20 21:28:18 MEST 1999
+
+ Back from holidays and time for alevt...
+
+ - Added html, png, and ppm export modules from Paul.
+ - Fixed the return status for export_output.
+ - Tweaked the makefile for libpng support.
+ - Added the export howto to the contrib dir.
+ - Added Paul's fmt_page routine to contrib as a patch
+ to export.c
+ - Added "-format help" to list all output formats and
+ its options.
+
+ Still to do: update man page of alevt-cap, add export
+ to alevt, add erc to alevt-cap.
+
+ Oh, btw, alevt is running on FreeBSD with the bt848
+ driver from Roger Hardiman <roger@cs.strath.ac.uk> *g*.
+ I wonder if it's possible to port his driver to linux.
+ Maybe it runs better then bttv... (I still get reports
+ with stuck xawtvs ...)
+
+Mon Jul 19 01:15:50 MEST 1999 (1.5.0-pre3)
+
+ - Added export modules. It's gotten much to complex.
+
+ A lot of things still to do: add other formats [Paul?],
+ add documentation, add format-help, add export to alevt,
+ add erc to alevt-cap, ...
+
+Mon Jul 12 00:09:03 MEST 1999
+
+ - Added an incomplete 20x24 font to the contrib dir.
+
+Tue Jun 29 00:46:03 MEST 1999 (1.5.0-pre2)
+
+ - Added lanugage tables from Radoslaw.
+ - Added new latin-2 font from Radoslaw.
+ - Fixed a bug with hold graphics. There's still one bug
+ on CNN's page 100 (has to do with set-after behaviour of
+ color select in hold graphics mode). The last line of the
+ earth should be blue-blue-green not blue-green-green.
+ AleVT always uses set-at behaviour. Afaik, this combination
+ (hold + set-after) is the only way to see the difference
+ between set-at and set-after. Set-after will blow up the
+ code so I will leave it as it is.
+ - vbi now collects all pkt26 and enhances the page before
+ it is passed on. Seem's to work.
+
+Tue Jun 22 22:13:45 MEST 1999 (1.5.0-pre1)
+
+ - Fixed hamm24. And, it should be fast now *g*
+ - Moved the language conversion parts to lang.c
+ - Added additional lang_chars for use with the latin-2 charset.
+ - Added -charset latin-1/2 option.
+ - Added pkt x/26 decoding. ... and noticed, that these packets
+ are sent between line 0 and 1. FUCK. Now I have to save
+ all x/26 until the page is complete. But not today... :-(
+
+ Things are getting more and more uglier. The right thing
+ to do would be to make a big font with all possible chars
+ (including cyrillic, arabic, smoothed graphics, ...).
+ That would mean to make each char in vtp->data 16 bit.
+ And then add an attribute word for each char so that the
+ enhanced attributes work, too. Searching and cut & paste
+ would be more complicated... but the worst, the pages
+ will be much bigger (4 times larger). Really bad for
+ the cache and god knows for what else...
+ Is it worth all the trouble??? I don't need that!
+
+Tue Jun 15 01:25:40 MEST 1999
+
+ - Changed .specs file again. I previously changed alevt.spec
+ instead of alevt.spec.in :-(
+
+Mon Jun 14 23:45:48 MEST 1999 (1.4.9)
+
+ - Made a very simple capture program (alevt-cap). Just collects
+ the given pages and writes them to disk in ASCII.
+ I will only accept bug reports/fixes, no enhancement requests
+ at the moment *g*
+ (I can't believe it; I even wrote a man page...)
+ - Changed the subpage delimiter on the command line from '/' to '.'
+ The old one ('/') is still accepted. (Reason: alevt-cap uses
+ the page number as part of the filename and a / is inconvenient.
+ And I already wanted to let you enter subpages with the keypad
+ and the '.' would be a nice key for that.)
+ - Tweaked the .specs file... (Btw, alevt-date and alevt-cap should
+ not be installed in the X11 tree.)
+
+Thu Jun 10 22:13:40 MEST 1999
+
+ - moved the hamming decoding and associated table to hamm.c
+ - played with pkt26 to support polish stations. not finished.
+
+Tue Jun 8 21:00:42 MEST 1999
+
+ - Added -[no]bell option. And the 'b' key.
+ - Replaced all xio_bell calls with appropriate status messages.
+
+Sat Jun 5 00:42:19 MEST 1999 (1.4.8)
+
+ - Shit. Just after the release I found a bug. The header line
+ isn't updated as it should :-( (Just affects parallel mode
+ transmission, so no new version, yet.)
+ - Created mailing list. Either go to http://alevt.listbot.com/
+ or write mail to alevt-subscribe@listbot.com.
+ - Added bttv-patch to the contrib dir for those who don't want
+ to wait for bttv-0.6.5.
+
+Fri Jun 4 17:19:41 MEST 1999 (1.4.7)
+
+ - Added autodetection of VBIBUF_SIZE (only with newer bttv, 0.6.5).
+ - Forgot to close vbi_fd in vbi_close :-/
+ - Made ERC on by default. If the page has no errors it
+ costs nothing and if it has you'll turn it on anyway.
+ - Changed parameters of EV_HEADER.
+ - Removed XAWTV_HACKS.
+ - Updated some docu.
+ - Modified the contrib samples to reflect previous API changes.
+
+Fri May 28 20:16:44 MEST 1999
+
+ - Added status messages.
+ - Added EV_TIMER event.
+ - Added channel change detection (only with newer bttv, 0.6.5).
+ Sends EV_RESET event. The XAWTV_HACKS can be removed *phww*.
+ Now the cache is automatically cleared if you switch to a
+ new channel. It even works with a SAT receiver connected to
+ Video-In.
+
+Thu May 27 23:54:32 MEST 1999 (1.4.6 unofficial)
+
+ - Cache reset didn't reset npages and hi_subno.
+ - Added XAWTV_HACKS, that is: alevt scans for a window with
+ the _XAWTV_STATION property and registers for property changes.
+ Result: when switching channels in xawtv, the cache is cleared.
+ (This is just an ugly hack. Xawtv must already be running
+ when alevt is started. If you quit and restart xawtv, it no
+ longer works. There's no method to detect if the monitored
+ xawtv is really the one controlling our /dev/vbi, etc...)
+ Added on request of Paul Ortyl <ortylp@key.net.pl>.
+ - Added error reduction circuit. It's part of the cache.
+ Errors in a new page are replaced by characters/lines from
+ an already cached (older) page. May be toggled by pressing
+ 'e' (editor is now on 'E'). It's not enabled by default
+ because it takes some CPU time. Idea by Paul Ortyl.
+ - TODO: clean up. document new features. add status messages.
+
+Sun May 23 19:13:07 MEST 1999 (1.4.5)
+
+ - New spec file from Karsten Hopp <karsten.hopp@delix.de>
+ - Changed it even further *g*
+ - Fixed a bug with graphics selection of double height lines.
+ - Documented the -oldbttv option in the man page. Now it's in
+ every page. This should finally halve the mails I get.
+ (For the other halve I have to write alevt-capture *g*)
+
+Sat May 8 02:41:21 MEST 1999
+
+ - Ehhh, changed u32 typedef from unsigned long to unsigned int.
+ Same for s32. The Alpha's longs are 64 bits.
+ Thanks to Sdruddin Rejeb <rejeb@dpmail.epfl.ch>.
+ (There's something strange with this in the X libs. They are
+ sometimes very lazy about ints and longs. Someone with an
+ Alpha should check the cut & paste, both, text and graphics
+ selections.)
+
+Thu Apr 29 22:38:37 MEST 1999
+
+ - Updated contrib/t1.c
+ - Added ':' as a subpage delimiter for clicking (2:7 is the same as 2/7)
+
+Mon Apr 19 19:40:09 MEST 1999
+
+ - Switched the scrolling direction of the wheel
+
+Mon Mar 29 01:23:06 MEST 1999 (1.4.4)
+
+ - fixed DST bug in alevt-date
+ - added crude latin-2 support. 'make FONT=latin-2' should be enough.
+ (found the stuff on the website http://www.penguin.cz/~marvin/ of
+ Daniel Smolik <smolikdan@email.cz>. I don't know if he is the one
+ who made the font).
+
+Wed Mar 17 20:53:59 MET 1999
+
+ - added timeout to alevt-date
+
+Fri Feb 19 18:22:53 MET 1999 (1.4.3>
+
+ - Makefile changes.
+
+Fri Jan 29 18:01:27 MET 1999
+
+ - fixed bug in dllist.h. dl_insert_first(h, dl_remove(n)) was only
+ working due to gcc implementation details.
+
+Mon Jan 25 18:33:42 MET 1999 (1.4.2)
+
+ - fixed 'clear cache'. no longer removes the help pages.
+ - made next/prev key/button to skip missing pages.
+ - added support for wheeled mice. (I heard it's really cool *g*)
+ - problem with subpages > 0xff fixed.
+
+Thu Jan 21 17:31:46 MET 1999 (1.4.1)
+
+ - added man pages from Thomas Schoepf <schoepf@usa.net>.
+ - added rpm-spec file from Mario Mikocevic <mozgy@times.hr>.
+ (looks a little bit odd, but I don't know very much about rpms)
+ - minor option fix in alevt-date (people are really using it!?!)
+
+Tue Jan 5 03:50:08 MET 1999 (1.4.0)
+
+ - should be 1.3.10 but that gives problems with the help pages :-(
+ - fixed varargs for alpha
+ - default is now -newbttv (aka -fuckbttv). use -oldbttv for v<0.5.20.
+
+Sat Jan 2 21:40:54 MET 1999
+
+ - small patches to alevt-date (-vbi options and tzset fix)
+ - played with pkt8/30. what a mess. MTV is 25:13 ahead *g*
+
+Wed Dec 30 19:30:14 MET 1998 (1.3.9)
+
+ - slightly modified the pll (may need further tuning)
+
+Wed Dec 30 05:27:26 MET 1998 (1.3.8)
+
+ - added pll (-finetune auto). try -debug for status msgs.
+
+Tue Dec 29 05:15:53 MET 1998 (1.3.7)
+
+ - added finetune option (see README)
+ - you may now type -newbttv instead of -fuckbttv *g*
+
+Mon Dec 28 19:36:32 MET 1998 (1.3.6)
+
+ - Makefile: R5 -> R6 :-(
+ - vbi.c now works without cache.c
+ - added alevt-date (set system time from teletext)
+ - bug in option parsing (error reporting)
+
+Thu Dec 17 19:56:16 MET 1998 (1.3.5)
+
+ - added -L/usr/X11R6/lib in Makefile
+ - put some blurb (in german) in contrib.
+
+Thu Dec 17 05:01:34 MET 1998 (1.3.4)
+
+ - added class hints on (invisible) leader window to make docking
+ in wmaker easier. instant name for leader is "VTLeader" and for
+ the viewing windows "VTPage"
+ - made the icon a little bit smaller
+
+Mon Dec 14 23:05:41 MET 1998 (1.3.3)
+
+ Release 1.3.3
+
+ - added spanish/portuguese charset decoding
+ - added similar looking glyphs for czech
+ - minor changes on the font
+ - middle click on current page number opens new parent window
+ - case dependant search if the pattern begins with a '!'
+ - line editing may be aborted with ^C
+
+Sun Dec 13 17:55:32 MET 1998 (1.3.2)
+
+ - when there were multiple windows of the same page, cycling through
+ the subpages changed all windows. fixed.
+ - hilight the found text (make it the selection).
+ - slightly modified the hilight colors.
+ - default window size set to 41x25 (looks better).
+ - rewrote the editor.
+
+Sun Dec 13 07:03:10 MET 1998 (1.3.1)
+
+ - fixed one command line option
+ - corrected bug in searching
+
+Sat Dec 12 20:27:03 MET 1998 (1.3.0)
+
+ Release 1.3.0
+
+ - searching is now ready (still need a status line for error msgs).
+ - set SIGPIPE to SIG_DFL. some shells (KDE) set it to SIG_IGN and then
+ the timer task won't be killed on exit.
+ - updated the help pages.
+ - I'm frustrated! BTTV_VERSION doesn't work on /dev/vbi. So no
+ autodetection of driver version. Added -fuckbttv option instead.
+
+Fri Dec 11 19:36:03 MET 1998 (1.2.5)
+
+ - reworked national charset (lang) handling. everthing now done in vbi.c.
+ the rest just deals with latin-1.
+ - first version of searching (functional, but dirty. needs more work.)
+
+Thu Dec 10 20:06:27 MET 1998 (1.2.4)
+
+ - new file edline.c (line editor for the menu line. start for searching...)
+ - blinking cursor
+ - added an 48x48 icon from Ulf Rompe
+ - added pasting into the line editor (insert key).
+ - release ownership of XA_PRIMARY when deselecting selection.
+
+Tue Dec 8 21:26:26 MET 1998 (1.2.3)
+
+ - new file ui.c (most user interface stuff from main.c)
+ - rewrote option parsing
+ - allow specification of child windows on command line. now
+ it's possible to regenerate the complete window layout by
+ the commandline (may be of some use for session management).
+ - some spelling fixes in the help pages from Mark Bryars
+
+Mon Dec 7 16:59:28 MET 1998 (1.2.2)
+
+ - reworked hidden handling in xio.c
+
+Sun Dec 6 19:54:10 MET 1998 (1.2.1)
+
+ - class name changed! from Alevt to AleVT.
+ - window/icon title shows current page number
+ - changed the icon to a 64 pixel width one. not nice but ...
+ - added a small mini icon for the title bar. is there a property I can set?
+ - pressing on the CPN puts the page on hold
+ - pressing on the violet * reveals concealed text
+ - added simple menu if no FastText menu is present
+ - allow subpages to be specified on the command line (eg 100/4)
+
+Sat Dec 5 20:59:51 MET 1998 (1.2.0)
+
+ Release 1.2.0
+
+ - finished the help pages.
+ - added command line handling
+ - added user geometry handling in xio.c
+
+Sat Dec 5 02:28:16 MET 1998 (1.1.2)
+
+ - allow magazin 9 (help system)
+ - start box char after a pagenumber selects subpage 1 (hack)
+ - added a crude page editor (just to create the help pages. not for users.)
+ - started with the online help system (sounds great, hehe)
+
+Tue Dec 1 20:19:53 MET 1998 (1.1.1)
+
+ - added concept of parent and child windows. now, the middle mouse
+ button changes the contens of the child window. if there isn't
+ one, it is created.
+ - Middle mouse button on x/y (subpage cycling) selects the previous
+ subpage. (updating the child with subpages is hairy...)
+
+Sun Nov 29 23:34:18 MET 1998 (1.1.0)
+
+ Release 1.1.0
+
+ - removed most of the recovery for single bad lines (does too much harm)
+ - changed handling of parallel mode transmission (untested. unused in .de)
+ - added selection (text & graphic!). try pasting into xpaint :-)
+ - added cache-clear function ('c')
+ - click on x/y selects the next subpage
+ - some minor tweaks
+ - added an icon bitmap.
+
+Wed Nov 24 23:33:34 MET 1998 (1.0.0)
+
+ First Release 1.0.0
diff --git a/util/alevt/EXPORT.HOWTO b/util/alevt/EXPORT.HOWTO
new file mode 100644
index 0000000..b9fba67
--- /dev/null
+++ b/util/alevt/EXPORT.HOWTO
@@ -0,0 +1,84 @@
+HOW TO IMPLEMENT A NEW EXPORT MODULE:
+
+As an example look at exp-txt.c (it implements two modules which
+are pretty similar).
+
+You have to create one exported structure (struct export_module).
+This structure holds the following data:
+
+1. The name of the format (example: "ascii").
+
+2. The default extension to use for building filenames ("txt").
+
+3. A list of module options. It's a 0 terminated array of char
+pointers, one for each option (similar to argv of main).
+If an option string contains a '=', it is an option that
+requires an argument. The part after the '=' is ignored at
+the moment. Later, I want to add help messages that show
+these options strings and then the part after the '=' becomes
+useful.
+If you do not have local options, set this field to 0.
+
+4. The number of bytes for local data in the export structure.
+There you may store data collected during option parsing or
+for whatever you want.
+Don't use global variables for storing this data! With
+alevt-cap you may give:
+
+alevt-cap -format ascii,color 100 -format ascii 100
+
+to save the page in two different formats. Using global
+vars would inhibit this. The data area in struct export
+starts at the 'data' field. You have to cast it to the
+appropriate type (see the D macro in exp-txt.c).
+If you do not need local data, set this field to 0.
+
+5. An open function (or call it constructor). It is called
+when your module is needed and it is passed a struct export
+(the instance). This function may be used to initialize
+the local data in the export struct.
+If all goes well return 0. Else call export_error (see
+below) and return -1.
+If you do not need an open function, set this field to 0.
+
+6. A close function (or call it destructor). It is called
+when your module is no longer needed. If you allocated
+memory in the open func, this is the place to free it.
+If you do not need a close function, set it to 0.
+
+7. An option function. It is called for each module option
+the user has given. It is passed an option number (first
+option in the option-array gives 1, ...) and a char pointer
+to the argument for that option (0 if the option does not
+need an arg). The argument pointer keeps valid until the
+close function is called.
+If all goes well, return 0. Else call export_error and
+return -1.
+If you gave an option list at point 3 you have to specify
+this function. Else set it to 0.
+
+8. An output function. It is called to produce the output.
+It is given the file name to use and a fmt_page pointer.
+The fmt_page contains an interpreted image of the page.
+There are no control chars in it. It uses the character
+set defined by the two fonts.
+These function may be called consecutive for multiple
+pages. Don't expect one output for one open/close.
+Return codes as above... (0: ok, -1: error).
+
+The export_error function: If one of your functions wants to
+report an error, it has to use the export_error function.
+It's a printf like function to set error messages. In alevt-cap
+these messages are printed to stderr, in alevt they will be
+shown in the status line (so don't make them too long).
+
+The last step is to add your export_module structure to the
+list of modules in export.c (at the top).
+Please, make sure that this structure is the only exported
+symbol. All other things should be static.
+
+That's all. A structure describing your module and 4 functions
+(open, close, option, output) to implement it. Shouldn't be too
+complicated.
+
+Ciao, ET.
diff --git a/util/alevt/Makefile b/util/alevt/Makefile
new file mode 100644
index 0000000..2f7c8da
--- /dev/null
+++ b/util/alevt/Makefile
@@ -0,0 +1,130 @@
+VER=1.7.0
+OPT=-O -g -w
+DEFS=-DWITH_PNG
+DEFS+=-DUSE_LIBZVBI
+FONT=vtxt
+MAN_DIR=man
+DESTDIR=
+PREFIX=/usr
+HOSTCC=$(CC)
+CFLAGS=$(OPT) -DVERSION=\"$(VER)\" $(DEFS) -I$(USR_X11R6)/include
+EXPOBJS=export.o exp-txt.o exp-html.o exp-gfx.o font.o
+OBJS=main.o ui.o xio.o fdset.o vbi.o cache.o help.o search.o misc.o hamm.o lang.o $(EXPOBJS)
+TOBJS=alevt-date.o vbi.o fdset.o misc.o hamm.o lang.o
+COBJS=alevt-cap.o vbi.o fdset.o misc.o hamm.o lang.o $(EXPOBJS)
+
+ifneq ($(findstring WITH_PNG,$(DEFS)),)
+EXPLIBS=-lpng -lz -lm
+endif
+
+ifneq ($(findstring USE_LIBZVBI,$(DEFS)),)
+ZVBILIB=-lzvbi -lpthread
+EXPLIBS+=$(ZVBILIB)
+endif
+
+all: alevt alevt-date alevt-cap alevt.1 alevt-date.1 alevt-cap.1
+
+alevt: $(OBJS)
+ $(CC) $(OPT) $(OBJS) -o alevt -L$(PREFIX)/lib -L$(PREFIX)/lib64 -lX11 $(EXPLIBS)
+
+alevt-date: $(TOBJS)
+ $(CC) $(OPT) $(TOBJS) -o alevt-date $(ZVBILIB)
+
+alevt-cap: $(COBJS)
+ $(CC) $(OPT) $(COBJS) -o alevt-cap $(EXPLIBS)
+
+font.o: font1.xbm font2.xbm font3.xbm font4.xbm
+fontsize.h: font1.xbm font2.xbm font3.xbm font4.xbm
+ fgrep -h "#define" font1.xbm font2.xbm font3.xbm font4.xbm >fontsize.h
+
+font1.xbm: bdf2xbm $(FONT)-latin-1.bdf
+ ./bdf2xbm font1 <$(FONT)-latin-1.bdf >font1.xbm
+
+font2.xbm: bdf2xbm $(FONT)-latin-2.bdf
+ ./bdf2xbm font2 <$(FONT)-latin-2.bdf >font2.xbm
+
+font3.xbm: bdf2xbm vtxt-koi8.bdf
+ ./bdf2xbm font3 <vtxt-koi8.bdf >font3.xbm
+
+font4.xbm: bdf2xbm vtxt-iso8859-7.bdf
+ ./bdf2xbm font4 <vtxt-iso8859-7.bdf >font4.xbm
+
+bdf2xbm: bdf2xbm.c
+ $(HOSTCC) bdf2xbm.c -o bdf2xbm
+
+clean:
+ rm -f *.o page*.txt a.out core bdf2xbm font?.xbm fontsize.h
+ rm -f alevt alevt-date alevt-cap
+
+rpm-install: all
+ install -m 0755 alevt ${RPM_BUILD_ROOT}$(USR_X11R6)/bin
+ install -m 0755 alevt-date ${RPM_BUILD_ROOT}$(USR_X11R6)/bin
+ install -m 0755 alevt-cap ${RPM_BUILD_ROOT}$(USR_X11R6)/bin
+ install -m 0644 alevt.1 ${RPM_BUILD_ROOT}$(USR_X11R6)/$(MAN)/man1
+ install -m 0644 alevt-date.1 ${RPM_BUILD_ROOT}$(USR_X11R6)/$(MAN)/man1
+ install -m 0644 alevt-cap.1 ${RPM_BUILD_ROOT}$(USR_X11R6)/$(MAN)/man1
+ install -d 0755 $(RPM_BUILD_ROOT)$(USR_X11R6)/include/X11/pixmaps
+ install -m 0644 alevt.png $(RPM_BUILD_ROOT)$(USR_X11R6)/include/X11/pixmaps
+
+install: all
+ install -m 0755 alevt $(DESTDIR)$(PREFIX)/bin
+ install -m 0755 alevt-date $(DESTDIR)$(PREFIX)/bin
+ install -m 0755 alevt-cap $(DESTDIR)$(PREFIX)/bin
+ install -m 0644 alevt.1 $(DESTDIR)$(PREFIX)/share/man/man1
+ install -m 0644 alevt-date.1 $(DESTDIR)$(PREFIX)/share/man/man1
+ install -m 0644 alevt-cap.1 $(DESTDIR)$(PREFIX)/share/man/man1
+ install -m 0644 alevt.png $(DESTDIR)$(PREFIX)/share/pixmaps
+ install -m 0644 alevt.desktop $(DESTDIR)$(PREFIX)/share/applications
+
+uninstall: clean
+ rm -f /usr/bin/alevt /usr/bin/alevt-cap /usr/bin/alevt-date \
+ /usr/share/pixmaps/alevt.png /usr/share/applications/alevt.desktop \
+ /usr/share/man/man1/alevt.1 /usr/share/man/man1/alevt-cap.1 \
+ /usr/share/man/man1/alevt-date.1
+
+depend:
+ makedepend -Y -- $(CFLAGS_none) -- *.c 2>/dev/null
+
+tar-html: alevt.1 alevt-date.1 alevt-cap.1
+ for i in alevt.1 alevt-date.1 alevt-cap.1 ; do \
+ j=`basename $$i .1` ; \
+ j=`basename $$j .1x` ; \
+ nroff -man $$i | { \
+ echo "<HTML><HEAD><TITLE>AleVT</TITLE></HEAD><BODY>" ; \
+ man2html -bare -uelem U -nodepage ; \
+ echo "</B0DY></HTML>" ; \
+ } | sed -e "s,</B> <B>, ,g" -e "s,</U> <U>, ,g" >~/exit/alevt/$$j.html ;\
+ done
+
+tar: tar-html clean
+ sed s/VERSION/$(VER)/g <alevt.lsm.in >~/exit/alevt/alevt-$(VER).lsm
+ sed s/VERSION/$(VER)/g <alevt.spec.in >alevt.spec
+ cd .. ;\
+ ln -s alevt alevt-$(VER) ;\
+ tar vcfz ~/exit/alevt/alevt-$(VER).tar.gz alevt-$(VER)/* ;\
+ rm alevt-$(VER)
+ cat <CHANGELOG >~/exit/alevt/changes
+
+# DO NOT DELETE
+
+alevt-cap.o: vt.h misc.h fdset.h dllist.h vbi.h cache.h lang.h export.h
+alevt-date.o: os.h vt.h misc.h fdset.h dllist.h vbi.h cache.h lang.h
+cache.o: misc.h dllist.h cache.h vt.h help.h
+exp-gfx.o: lang.h misc.h vt.h export.h font.h fontsize.h
+exp-html.o: lang.h misc.h vt.h export.h
+exp-txt.o: os.h export.h vt.h misc.h
+export.o: vt.h misc.h export.h
+fdset.o: dllist.h misc.h fdset.h
+font.o: font1.xbm font2.xbm font3.xbm font4.xbm
+hamm.o: vt.h misc.h hamm.h
+help.o: vt.h misc.h vt900.out vt901.out vt902.out vt903.out vt904.out vt905.out
+help.o: vt906.out vt907.out vt908.out vt909.out vt910.out vt911.out vt912.out
+lang.o: misc.h vt.h lang.h
+main.o: vt.h misc.h fdset.h dllist.h xio.h vbi.h cache.h lang.h ui.h
+main.o: search.h
+misc.o: misc.h
+search.o: vt.h misc.h cache.h dllist.h search.h
+ui.o: vt.h misc.h xio.h dllist.h vbi.h cache.h lang.h fdset.h
+ui.o: search.h export.h ui.h
+vbi.o: os.h vt.h misc.h vbi.h dllist.h cache.h lang.h fdset.h hamm.h
+xio.o: vt.h misc.h dllist.h xio.h fdset.h lang.h icon.xbm font.h fontsize.h
diff --git a/util/alevt/README b/util/alevt/README
new file mode 100644
index 0000000..83985f0
--- /dev/null
+++ b/util/alevt/README
@@ -0,0 +1,72 @@
+Hi,
+
+this software is not just a program, it's moreover a legend.
+It is THE protagonist of all videotext applications under Linux.
+
+During the past 10 years the video standards, the APIs, the kernel
+have seen lots of changes.
+But unfortunately this program has NOT seen much maintenance.
+The results of that misfit appearance are:
+
+1. lots of forks flying around in the Internet
+2. lots of patches flying around, some good, some disgusting, some out of time
+3. lots of cruft which is completely outdated or obsolete for other reasons
+
+To handle all that in one big effort I decided to redesign the program
+completely, enlarging its capabilities for DVB-S at the same time.
+
+So here are the changes:
+
+1. Erasure of old help pages and rename / reorganize / update the rest
+-> redesign of the online help system / implying alevt-date and alevt-cap
+
+2. Erasure of old outdated integers, functions, parameters:
+
+- bell, big_buf, debug, display, editor, erc, fine_tune, newbttv,
+- oldbttv
+
+3. Coding style cleanups (no superfluous comments, not more than
+ 80 characters per column, no uncommented code.
+
+4. No strange characters in the outfile, latin alphabet in purity instead.
+
+5. Alevt can be started in 4 modes now if you are running it in DVB mode:
+
+- by service id (sid)
+- by teletext pid (ttpid)
+- by channel name
+- without parameter
+
+6. Starting it in DVB mode on the command line it presents you
+a table with human readable values such as sid, teletext pid,
+PMT (Program Map Table), provider name, service name, language, service type.
+This makes it easier for you to start multiple teletext windows
+in multiple console sessions manually.
+
+If working with a script and the option -o (outfile) you can
+also start multiple teletext windows of all channels in a transponder.
+I develop a GUI using TCL / TK 8.5 and Iwidgets 4.01 to do that and other
+tasks graphically (i. e. by mouse click).
+
+7. If you install the program on the command line by typing "make &
+ make install" there is an uninstaller now to revert the installation:
+ "make uninstall".
+
+ENJOY IT!
+
+Uwe Bugla, February 11th, 2010.
+
+External dependencies
+
+AleVT needs some system libraries to be installed in your system.
+They are zlib, libX11, libpng and libzvbi.
+
+Credits go to:
+- Andreas Rottmann from debian.org for compiler fixes and
+ other kinds of investigation.
+- Francesco Lavra for supplying a kernel patch to avoid kernel demux
+ incompatibilities with kernels >= 2.6.32
+- Andy Walls for helpful investigation in kernelspace
+- Edgar Toernig for providing the source version 1.6.2 and doing all the
+ development for the basic versions
+- Tom Zoerner for the implementation of libzvbi
diff --git a/util/alevt/README.OLD b/util/alevt/README.OLD
new file mode 100644
index 0000000..4fb0e41
--- /dev/null
+++ b/util/alevt/README.OLD
@@ -0,0 +1,78 @@
+Hi, Menden, 21 Sep 2000
+
+ This program decodes and displays Videotext/Teletext from a
+ /dev/vbi device.
+
+
+COMPILE & INSTALL:
+
+ There's nothing to configure. A simple 'make' is all.
+ If you do not want png support remove the WITH_PNG in
+ the Makefile. Additionally, if you want a smaller font
+ uncomment the "FONT=neep9" line.
+
+ It gives you 'alevt', 'alevt-date', and 'alevt-cap' and
+ their man pages 'alevt.1x', 'alevt-date.1', and 'alevt-cap.1'.
+
+ You can install them where ever you want (i.e. /usr/local/bin).
+ The programs are self-contained and require no other files.
+
+ NOTE: Be careful with 'make install'. It's just for me :-)
+
+
+PROBLEMS:
+
+ If you have a lot of decoding errors (lot of these lightning symbols)
+ you may try pressing the 'f' and 'F' key. This allows fine tuning of
+ the decoder circuit. There's also a -finetune command line option.
+ This should only be necessary on really bad signals.
+
+ Maybe, I add autotuning later...
+
+ UPDATE: added autotuning. It's the default. If you add -debug the
+ the actions of the pll are printed to stdout.
+
+ To get the old (pre finetune) behaviour start it with -finetune 0.
+
+ UPDATE: disabled autotuning *g* sometimes it's too jumpy...
+
+
+ALEVT-DATE:
+ I added a little tool to set the system time from the videotext
+ time. The date is not interpreted (not even transmitted on some
+ channels). So it allows only adjustment of +/-12 hours.
+ The default allowed adjustment is limited to +/-2 hours (use
+ -delta to change). Without the -set option it just display
+ the date in the format of the date command. Look at strftime(3)
+ for possible control sequences you may use in the -format option.
+
+
+HACKING:
+
+ If you want to play with the font size, you may resize it with
+ xv (xv font1.xbm). Just make sure, that its width is a multiple of
+ 32 and its height a multiple of 8. A simple make will create
+ a version of AleTV with the new font. Warning: a make clean
+ will erase font1.xbm. The next make will recreate font.xbm from
+ vtxt.bdf.
+
+ AleVT has a built in page editor. If you start it with -editor
+ you may press 'E' to invoke it. For the usage you have to consult
+ the sources. (It's very crude!)
+
+
+TODO: (no specific order)
+
+ - Error correction in alevt-cap
+ - Better language support. Internal 16-bit charset.
+ - Separated graphics.
+ - Rewrite the whole stuff. A networked teletext daemon and clients
+ that connect to it for display, capture, cgi, ...
+
+
+NEWER VERSIONS:
+
+ The primary site of AleVT is http://goron.de/~froese
+
+Have fun,
+Edgar Toernig (froese@gmx.de)
diff --git a/util/alevt/ReadmeGR b/util/alevt/ReadmeGR
new file mode 100644
index 0000000..68d32c2
--- /dev/null
+++ b/util/alevt/ReadmeGR
@@ -0,0 +1,28 @@
+29-9-2003
+
+ÅëëçíéêÜ ãéá ôï ALEVT
+Ç ðñïóèÞêç Åëëçíéêþí Ýãéíå ôñïðïðïéþíôáò ôï patch alevt-1.6.3.rus.diff ðïõ âñßóêåôå óôï öÜêåëï
+contrib óôá sources ôïõ alevt-1.6.3
+
+ÎåêéíÞóôå ôï ðñüãñáììá ìå ôçí ðáñÜìåôñï
+
+alevt -charset iso8859-7
+
+
+alevt -charset el
+
+ÄïõëåéÝò ðïõ Ý÷ïõí íá ãßíïõí:
+Êáëýôåñïò ó÷åäéáóìüò ôïõ font file vtxt-iso8859-7.bdf
+ïé Áããëéêïß ÷áñáêôÞñåò ìïéÜæïõí óáí bold óå ó÷Ýóç ìå ôïõò Åëëçíéêïýò êáé õðÜñ÷ïõí
+êÜðïéá ìéêñÜ ðñïâëçìáôÜêéá ìå ôïõò graphics (0x01 -0x1f)
+
+¸ëåã÷ïò ãéá ôï áí áðåéêïíßæïíôáé óùóôÜ üëïé ïé ÷áñáêôÞñåò
+
+¼ðïéïò èÝëåé íá âïçèÞóåé ðáñáêáëþ íá ìïõ óôåßëåé ôçò áëëáãÝò ôïõ óôï sl45sms@yahoo.gr
+Áí êÜðïéïò êÜíåé åêôåôáìÝíåò áëëáãÝò ðïõ äåí áöïñïýí ôá ÅëëçíéêÜ èá ðñÝðåé íá ôéò óôåßëåé êáé
+óôïí óõããñáöÝá ôïõ ðñïãñÜììáôïò
+
+ÍåüôåñÜ áñ÷åßá ôïõ ðáñüíôïò èá ìðïñåßôå íá âñßóêåôå óôï http://go.to/sl45sms/alevt/index.html
+
+ÓêáñâÝëçò Ðáíáãéþôçò
diff --git a/util/alevt/TODO b/util/alevt/TODO
new file mode 100644
index 0000000..4b56676
--- /dev/null
+++ b/util/alevt/TODO
@@ -0,0 +1,12 @@
+Hi, these are issues that I unfortunately cannot resolve myself:
+
+1. graphical menu written in GKT2, to be used in general connection with
+ the outfile (-o) option.
+
+2. for usage without script and outfile option:
+ DVB monitoring demon helping the program to rewrite the PAT when the
+ external player software has chosen a channel which is part of a
+ new transponder.
+ At the moment alevt hangs when the transponder is changed.
+
+Uwe Bugla, February 11th, 2010.
diff --git a/util/alevt/alevt-cap.1 b/util/alevt/alevt-cap.1
new file mode 100644
index 0000000..2af1879
--- /dev/null
+++ b/util/alevt/alevt-cap.1
@@ -0,0 +1,53 @@
+.TH alevt-cap 1 "February 07, 2010"
+.SH NAME
+alevt-cap \- capture teletext windows.
+.SH SYNOPSIS
+.B alevt-cap
+.RI [ options ]
+.br
+.SH DESCRIPTION
+This manual page documents briefly the
+.B alevt-cap
+commands.
+.PP
+\fBalevt-cap\fP is a program to capture teletext pages.
+.SH OPTIONS
+.TP
+.B \-cs -charset <latin-1/2/koi8-r/iso-8859-7>
+character set
+.TP
+.B \-f -format <fmt[,options]>
+format to save
+.TP
+.B \-f help -format help
+lists available storage formats
+.TP
+.B \-h -help
+print this page
+.TP
+.B \-n -name <filename>
+page name to save
+.B \-t -timeout <secs>
+timeout
+.TP
+.B \-s -sid <sid>
+service pid
+.TP
+.B \-t -ttpid <ttpid>
+teletext pid
+.TP
+.B \-v -vbi <vbidev>
+vbi device
+.TP
+Sequence: /dev/vbi; /dev/vbi0; /dev/video0; /dev/dvb/adapter0/demux0
+.TP
+ppp.ss stands for a page number and an optional
+subpage number (example: 123.4).
+.TP
+.SH SEE ALSO
+.BR alevt-date (1) , alevt (1).
+.br
+.SH AUTHOR
+alevt-cap was written by Edgar Toernig <froese@gmx.de>.
+.PP
+This manual page was written by Uwe Bugla <uwe.bugla@gmx.de>.
diff --git a/util/alevt/alevt-cap.c b/util/alevt/alevt-cap.c
new file mode 100644
index 0000000..9e0c3bd
--- /dev/null
+++ b/util/alevt/alevt-cap.c
@@ -0,0 +1,280 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <locale.h>
+#include <signal.h>
+#include <unistd.h>
+#include "vt.h"
+#include "misc.h"
+#include "fdset.h"
+#include "vbi.h"
+#include "lang.h"
+#include "dllist.h"
+#include "export.h"
+
+static volatile int timed_out = 0;
+static char *channel;
+char *outfile = "";
+u_int16_t sid;
+
+
+struct req
+{
+ struct dl_node node[1];
+ char *name; // file name
+ char *pgno_str; // the pgno as given on the cmdline
+ int pgno, subno; // decoded pgno
+ struct export *export; // export data
+ struct vt_page vtp[1]; // the capture page data
+};
+
+
+static void usage(FILE *fp, int exitval)
+{
+ fprintf(fp, "\nUsage: %s [options] ppp.ss...\n", prgname);
+ fprintf(fp,
+ "\n"
+ " Valid options:\t\tDefault:\n"
+ " -cs -charset\t\tlatin-1\n"
+ " <latin-1/2/koi8-r/iso8859-7>\n"
+ " -f -format <fmt,options>\tascii\n"
+ " -f help -format help\n"
+ " -h -help\n"
+ " -n -name <filename>\t\tttext-%%s.%%e\n"
+ " -s -sid <sid>\t\t(none;dvb only)\n"
+ " -to -timeout <secs>\t\t(none)\n"
+ " -t -ttpid <ttpid>\t\t(none;dvb only)\n"
+ " -v -vbi <vbidev>\t\t/dev/vbi\n"
+ " \t\t/dev/vbi0\n"
+ " \t\t/dev/video0\n"
+ " \t\t/dev/dvb/adapter0/demux0\n"
+ "\n"
+ " ppp.ss stands for a page number and an\n"
+ " optional subpage number (ie 123.4).\n"
+ );
+ exit(exitval);
+}
+
+
+static void exp_help(FILE *fp)
+{
+ struct export_module **ep;
+ char **cp, c;
+
+ fprintf(fp,
+ "\nSyntax: -format Name[,Options]\n"
+ "\n"
+ " Name\tExt.\tOptions\n"
+ " --------------------------------\n"
+ );
+ for (ep = modules; *ep; ep++)
+ {
+ fprintf(fp, " %-7s\t.%-4s", (*ep)->fmt_name, (*ep)->extension);
+ for (c = '\t', cp = (*ep)->options; cp && *cp; cp++, c = ',')
+ fprintf(fp, "%c%s", c, *cp);
+ fprintf(fp, "\n");
+ }
+ fprintf(fp,
+ "\n"
+ "Common options: reveal,hide\n"
+ "Example: -format ansi,reveal,bg=none\n"
+ "\n"
+ );
+ exit(0);
+}
+
+
+static int arg_pgno(char *p, int *subno)
+{
+ char *end;
+ int pgno;
+
+ *subno = ANY_SUB;
+ if (*p)
+ {
+ pgno = strtol(p, &end, 16);
+ if ((*end == ':' || *end == '/' || *end == '.') && end[1])
+ *subno = strtol(end + 1, &end, 16);
+ if (*end == 0)
+ if (pgno >= 0x100 && pgno <= 0x899)
+ if (*subno == ANY_SUB || (*subno >= 0x00 && *subno <= 0x3f7f))
+ return pgno;
+ }
+ fatal("%s: invalid page number", p);
+}
+
+
+static int option(int argc, char **argv, int *ind, char **arg)
+{
+ static struct { char *nam, *altnam; int arg; } opts[] = {
+ { "-charset", "-cs", 1 },
+ { "-format", "-f", 1 },
+ { "-help", "-h", 0 },
+ { "-name", "-n", 1 },
+ { "-sid", "-s", 1 },
+ { "-timeout", "-to", 1 },
+ { "-ttpid", "-t", 1 },
+ { "-vbi", "-v", 1 },
+ };
+ int i;
+
+ if (*ind >= argc)
+ return 0;
+
+ *arg = argv[(*ind)++];
+ for (i = 0; i < NELEM(opts); ++i)
+ if (streq(*arg, opts[i].nam) || streq(*arg, opts[i].altnam))
+ {
+ if (opts[i].arg)
+ if (*ind < argc)
+ *arg = argv[(*ind)++];
+ else
+ fatal("option %s requires an argument", *arg);
+ return i+1;
+ }
+
+ if (**arg == '-')
+ {
+ fatal("%s: invalid option", *arg);
+ usage(stderr, 2);
+ }
+
+ return -1;
+}
+
+
+static void event(struct dl_head *reqs, struct vt_event *ev)
+{
+ struct req *req, *nxt;
+
+ switch (ev->type)
+ {
+ case EV_PAGE: // new page
+ {
+ struct vt_page *vtp = ev->p1;
+
+ for (req = PTR reqs->first; nxt = PTR req->node->next; req = nxt)
+ if (req->pgno == vtp->pgno)
+ if (req->subno == ANY_SUB || req->subno == vtp->subno)
+ {
+ *req->vtp = *vtp;
+ dl_insert_last(reqs + 1, dl_remove(req->node));
+ }
+ }
+ }
+}
+
+
+int main(int argc, char **argv)
+{
+ char *vbi_name = NULL;
+ int timeout = 0;
+ char *fname = "ttext-%s.%e";
+ char *out_fmt = "ascii";
+ struct export *fmt = 0;
+ int opt, ind;
+ char *arg;
+ struct vbi *vbi;
+ struct req *req;
+ struct dl_head reqs[2]; // simple linear lists of requests & captures
+ int ttpid = -1;
+
+ setlocale (LC_CTYPE, "");
+ setprgname(argv[0]);
+
+ fdset_init(fds);
+ dl_init(reqs); // the requests
+ dl_init(reqs+1); // the captured pages
+
+ ind = 1;
+ while (opt = option(argc, argv, &ind, &arg))
+ switch (opt)
+ {
+ case 1: // charset
+ if (streq(arg, "latin-1") || streq(arg, "1"))
+ latin1 = 1;
+ else if (streq(arg, "latin-2") || streq(arg, "2"))
+ latin1 = 0;
+ else if (streq(arg, "koi8-r") || streq(arg, "koi"))
+ latin1 = KOI8;
+ else if (streq(arg, "iso8859-7") || streq(arg, "el"))
+ latin1 = GREEK;
+ else
+ fatal("bad charset (not latin-1/2/koi8-r/iso8859-7)");
+ break;
+ case 2: // format
+ if (streq(arg, "help") || streq(arg, "?") || streq(arg, "list"))
+ exp_help(stdout);
+ out_fmt = arg;
+ fmt = 0;
+ break;
+ case 3: // help
+ usage(stdout, 0);
+ break;
+ case 4: // name
+ fname = arg;
+ break;
+ case 5: // timeout
+ timeout = strtol(arg, 0, 10);
+ if (timeout < 1 || timeout > 999999)
+ fatal("bad timeout value", timeout);
+ break;
+ case 6: // service id
+ sid = strtoul(arg, NULL, 0);
+ break;
+ case 7: // teletext pid
+ ttpid = strtoul(arg, NULL, 0);
+ break;
+ case 8: // vbi
+ vbi_name = arg;
+ break;
+ case -1: // non-option arg
+ if (not fmt)
+ fmt = export_open(out_fmt);
+ if (not fmt)
+ fatal("%s", export_errstr());
+ if (not(req = malloc(sizeof(*req))))
+ out_of_mem(sizeof(*req));
+ req->name = fname;
+ req->pgno_str = arg;
+ req->pgno = arg_pgno(arg, &req->subno);
+ req->export = fmt;
+ dl_insert_last(reqs, req->node);
+ break;
+ }
+
+ if (dl_empty(reqs))
+ fatal("no pages requested");
+
+ // setup device
+ if (not(vbi = vbi_open(vbi_name, 0, channel, outfile, sid, ttpid)))
+ fatal("cannot open %s", vbi_name);
+ vbi_add_handler(vbi, event, reqs); // register event handler
+
+ if (timeout)
+ alarm(timeout);
+
+ // capture pages (moves requests from reqs[0] to reqs[1])
+ while (not dl_empty(reqs) && not timed_out)
+ if (fdset_select(fds, 30000) == 0) // 30sec select time out
+ {
+ error("no signal.");
+ break;
+ }
+
+ alarm(0);
+ vbi_del_handler(vbi, event, reqs);
+ vbi_close(vbi);
+ if (not dl_empty(reqs))
+ error("capture aborted. Some pages are missing.");
+
+ for (req = PTR reqs[1].first; req->node->next; req = PTR req->node->next)
+ {
+ fname = export_mkname(req->export, req->name, req->vtp, req->pgno_str);
+ if (not fname || export(req->export, req->vtp, fname))
+ error("error saving page %s: %s", req->pgno_str, export_errstr());
+ if (fname)
+ free(fname);
+ }
+ exit(dl_empty(reqs) ? 0 : 1);
+}
diff --git a/util/alevt/alevt-date.1 b/util/alevt/alevt-date.1
new file mode 100644
index 0000000..69d2f6f
--- /dev/null
+++ b/util/alevt/alevt-date.1
@@ -0,0 +1,41 @@
+.TH alevt-date 1 "February 07, 2010"
+.SH NAME
+alevt-date \- print out UTC date.
+.SH SYNOPSIS
+.B alevt-date
+.RI [ options ]
+.br
+.SH DESCRIPTION
+This manual page documents briefly the
+.B alevt-date
+commands.
+.PP
+\fBalevt-date\fP is a program to print the UTC date.
+.SH OPTIONS
+.TP
+.B \-d -delta <max_secs>
+maximum delta
+.TP
+.B \-f -format <fmtstr>
+time format
+.TP
+.B \-h -help
+print this page
+.TP
+.B \-s -set
+set the system clock
+.TP
+.B \-t -timeout <seconds>
+timeout
+.TP
+.B \-v -vbi <vbidev>
+vbi device /dev/vbi; /dev/vbi0; /dev/video0; /dev/dvb/adapter0/demux0
+.TP
+.br
+.SH SEE ALSO
+.BR alevt-cap (1) , alevt (1).
+.br
+.SH AUTHOR
+alevt-date was written by Edgar Toernig <froese@gmx.de>.
+.PP
+This manual page was written by Uwe Bugla <uwe.bugla@gmx.de>.
diff --git a/util/alevt/alevt-date.c b/util/alevt/alevt-date.c
new file mode 100644
index 0000000..5496937
--- /dev/null
+++ b/util/alevt/alevt-date.c
@@ -0,0 +1,225 @@
+#include <stdio.h>
+#include <string.h>
+#include <sys/time.h>
+#include <time.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <signal.h>
+#include "os.h"
+#include "vt.h"
+#include "fdset.h"
+#include "vbi.h"
+#include "lang.h"
+#include "misc.h"
+
+char *fmt = "%a %b %d %H:%M:%S %Z %Y";
+int max_diff = 2*60*60; // default: 2 hours
+int set_time = 0;
+char *outfile = "";
+static char *channel;
+u_int16_t sid;
+
+
+static void chk_time(int t)
+{
+ struct tm *tm;
+ time_t sys_t;
+ int dt;
+ char buf[256];
+
+ if (t < 0 || t > 235959 || t%100 > 59 || t/100%100 > 59)
+ return;
+
+ sys_t = time(0);
+ tm = localtime(&sys_t);
+
+ // Now convert to UTC seconds
+ t = t/100/100 * 60*60 + t/100%100 * 60 + t%100;
+#ifdef BSD
+ t -= tm->tm_gmtoff; // dst already included...
+#else
+ t += timezone;
+ if (tm->tm_isdst)
+ t -= 60*60;
+#endif
+
+ dt = t - sys_t % (24*60*60);
+ if (dt <= -12*60*60)
+ dt += 24*60*60;
+
+ if (dt <= -max_diff || dt >= max_diff)
+ fatal("time diff too big (%2d:%02d:%02d)", dt/60/60, abs(dt)/60%60, abs(dt)%60);
+
+ sys_t += dt;
+
+ if (set_time)
+ {
+ struct timeval tv[1];
+
+ tv->tv_sec = sys_t;
+ tv->tv_usec = 500000;
+ if (settimeofday(tv, 0) == -1)
+ ioerror("settimeofday");
+ }
+ if (*fmt)
+ {
+ tm = localtime(&sys_t);
+ if (strftime(buf, sizeof(buf), fmt, tm))
+ puts(buf);
+ }
+ exit(0);
+}
+
+
+static void event(void *_, struct vt_event *ev)
+{
+ switch (ev->type)
+ {
+ /* vbi may generate EV_PAGE, EV_HEADER, EV_XPACKET */
+ /* for event arguments see vt.h */
+
+ case EV_HEADER: // a new title line (for running headers)
+ {
+ static int last_t = -1;
+ u8 *s = ev->p1;
+ int i, t = 1;
+
+ if (ev->i2 & PG_OUTOFSEQ)
+ break;
+
+ for (i = 32; i < 40; ++i)
+ if (s[i] >= '0' && s[i] <= '9')
+ t = t * 10+ s[i] - '0';
+ if (t >= 1000000 && t <= 1235959)
+ if (t == last_t || t - last_t == 1)
+ chk_time(t - 1000000);
+ last_t = t;
+ break;
+ }
+ }
+}
+
+
+static void usage(FILE *fp, int exit_val)
+{
+ fprintf(fp, "usage: %s [options]\n", prgname);
+ fprintf(fp,
+ "\n"
+ " Valid options:\t\tDefault:\n"
+ " -d -delta <max_secs>\t7200 (2 hours)\n"
+ " -f -format <fmtstr>\t\t%%c\n"
+ " -h -help\n"
+ " -s -set\t\t\toff\n"
+ " -to -timeout <seconds>\t(none)\n"
+ " -v -vbi <vbidev>\t\t/dev/vbi\n"
+ " \t\t/dev/vbi0\n"
+ " \t\t/dev/video0\n"
+ " \t\t/dev/dvb/adapter0/demux0\n"
+ );
+ exit(exit_val);
+}
+
+
+static int option(int argc, char **argv, int *ind, char **arg)
+{
+ static struct { char *nam, *altnam; int arg; } opts[] = {
+ { "-delta", "-d", 1 },
+ { "-format", "-f", 1 },
+ { "-help", "-h", 0 },
+ { "-set", "-s", 0 },
+ { "-timeout", "-to", 1 },
+ { "-vbi", "-v", 1 },
+ };
+ int i;
+
+ if (*ind >= argc)
+ return 0;
+
+ *arg = argv[(*ind)++];
+ for (i = 0; i < NELEM(opts); ++i)
+ if (streq(*arg, opts[i].nam) || streq(*arg, opts[i].altnam))
+ {
+ if (opts[i].arg)
+ if (*ind < argc)
+ *arg = argv[(*ind)++];
+ else
+ fatal("option %s requires an argument", *arg);
+ return i+1;
+ }
+
+ if (**arg == '-')
+ {
+ fatal("%s: invalid option", *arg);
+ usage(stderr, 1);
+ }
+
+ return -1;
+}
+
+
+int main(int argc, char **argv)
+{
+ char *vbi_name = NULL;
+ int timeout = 0;
+ struct vbi *vbi;
+ int opt, ind;
+ char *arg;
+ int ttpid = -1;
+
+ setprgname(argv[0]);
+ ind = 1;
+ while (opt = option(argc, argv, &ind, &arg))
+ switch (opt)
+ {
+ case 1: // -delta
+ max_diff = atoi(arg);
+ if (max_diff < 1)
+ fatal("-delta: illegal value '%s'", arg);
+ if (max_diff > 12*60*60)
+ {
+ max_diff = 12*60*60;
+ error("-delta: %d too big. Assuming %d", arg, max_diff);
+ }
+ break;
+ case 2: // -format
+ fmt = arg;
+ break;
+ case 3: // help
+ usage(stdout, 0);
+ break;
+ case 4: // -set
+ set_time = 1;
+ break;
+ case 5: // -timeout
+ timeout = atoi(arg);
+ if (timeout < 1 || timeout > 60*60)
+ fatal("-timeout: illegal value '%s'", arg);
+ break;
+ case 6: // -vbi
+ vbi_name = arg;
+ break;
+ case -1:
+ usage(stderr, 1);
+ break;
+ }
+
+ fdset_init(fds);
+
+ if (timeout)
+ {
+ signal(SIGALRM, SIG_DFL); // kill me
+ alarm(timeout);
+ }
+ vbi = vbi_open(vbi_name, 0, channel, outfile, sid, ttpid); // open device
+ if (not vbi)
+ fatal_ioerror(vbi_name);
+ vbi_add_handler(vbi, event, 0); // register event handler
+
+ for (;;)
+ fdset_select(fds, -1); // call scheduler
+
+ /* never reached */
+ vbi_del_handler(vbi, event, 0);
+ vbi_close(vbi);
+ exit(0);
+}
diff --git a/util/alevt/alevt.1 b/util/alevt/alevt.1
new file mode 100644
index 0000000..68bff45
--- /dev/null
+++ b/util/alevt/alevt.1
@@ -0,0 +1,60 @@
+.TH alevt 1 "February 07, 2010"
+.SH NAME
+alevt \- a teletext browser for analogue and DVB channels.
+.SH SYNOPSIS
+.B alevt
+.RI [ options ]
+.br
+.SH DESCRIPTION
+This manual page documents briefly the
+.B alevt
+commands.
+.PP
+\fBalevt\fP is a program to read teletext from analogue or DVB channels.
+.SH OPTIONS
+.TP
+.B \-c <channel>
+channel name (dvb only)
+.TP
+.B \-ch -child <ppp.ss>
+child window
+.TP
+.B \-cs -charset <latin-1/2/koi8-r/iso8859-7>
+character set
+.TP
+.B \-h -help
+print this page
+.TP
+.B \-o <outfile>
+path + file for all services (dvb only)
+.TP
+.B \-p -parent <ppp.ss>
+parent window
+.TP
+.B \-s -sid <sid>
+service id (dvb only)
+.TP
+.B \-t -ttpid <ttpid>
+teletext pid (dvb only)
+.TP
+.B \-v -vbi <vbidev>
+vbi device
+.TP
+Sequence: /dev/vbi; /dev/vbi0; /dev/video0; /dev/dvb/adapter0/demux0
+.TP
+Order is important! Each page number opens a new window
+with the previously given geometry, device, and display.
+.TP
+ppp.ss stands for a page number and an optional
+subpage number (example: 123.4).
+.TP
+The -child option requires a parent window. So it must
+be preceded by a parent or another child window.
+.TP
+.SH SEE ALSO
+.BR alevt-cap (1), alevt-date (1).
+.br
+.SH AUTHOR
+alevt was written by Edgar Toernig <froese@gmx.de>.
+.PP
+This manual page was written by Uwe Bugla <uwe.bugla@gmx.de>.
diff --git a/util/alevt/alevt.desktop b/util/alevt/alevt.desktop
new file mode 100644
index 0000000..c125bb9
--- /dev/null
+++ b/util/alevt/alevt.desktop
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=alevt
+Comment=Teletext Browser
+Exec=alevt
+Icon=alevt
+Terminal=false
+Type=Application
+Categories=GNOME;GTK;AudioVideo;Video;
diff --git a/util/alevt/bdf2xbm.c b/util/alevt/bdf2xbm.c
new file mode 100644
index 0000000..74d238e
--- /dev/null
+++ b/util/alevt/bdf2xbm.c
@@ -0,0 +1,212 @@
+/*
+ Simple program to convert a bdf-font to a bitmap.
+ The characters are arranged in a 32x8 matrix.
+ usage: bdf2xbm [identifier] <bdf >xbm
+ Copyright 1998,1999 by E. Toernig (froese@gmx.de)
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <stdarg.h>
+
+#define not !
+#define streq(a,b) (strcmp((a),(b)) == 0)
+
+int lineno;
+char *word[64];
+int nword;
+
+char *font = "font%dx%d";
+int w, h, bpl;
+unsigned char *bmap;
+
+
+static void error(char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ fprintf(stderr, "bdf2xbm");
+ if (lineno)
+ fprintf(stderr, ":%d", lineno);
+ fprintf(stderr, ": ");
+ vfprintf(stderr, fmt, args);
+ fputc('\n', stderr);
+ exit(1);
+}
+
+
+static int nextline()
+{
+ static char buf[256];
+ char *p;
+ int i;
+
+ do
+ {
+ nword = 0;
+ if (fgets(buf, sizeof(buf), stdin) == 0)
+ return nword;
+ lineno++;
+
+ p = buf;
+ for (;;)
+ {
+ while (isspace(*p))
+ p++;
+ if (*p == 0)
+ break;
+ word[nword++] = p;
+ while (*p && not isspace(*p))
+ *p = toupper(*p), p++;
+ if (*p == 0)
+ break;
+ *p++ = 0;
+ }
+ } while (nword == 0);
+
+ for (i = nword; i < 64; ++i)
+ word[i] = "";
+ return nword;
+}
+
+
+static inline void setbit(int ch, int x, int y)
+{
+
+ int yo = ch / 32 * h + y;
+ int xo = ch % 32 * w + x;
+
+ bmap[yo * bpl + xo / 8] |= 1 << (xo % 8);
+}
+
+
+static void dobitmap(int ch, int x, int y)
+{
+ int i, j;
+
+ for (i = 0; i < y; ++i)
+ {
+ nextline();
+ if (nword > 1 || strlen(word[0]) != (x + 7) / 8 * 2)
+ error("bad BITMAP");
+ for (j = 0; j < x; ++j)
+ {
+ int c = word[0][j / 4];
+ if (c >= '0' && c <= '9')
+ c -= '0';
+ else if (c >= 'A' && c <= 'F')
+ c -= 'A' - 10;
+ else
+ error("bad hexchar in BITMAP");
+ if (c & (8 >> (j % 4)))
+ setbit(ch, j, i);
+ }
+ }
+}
+
+
+static void dochar()
+{
+ int ch = -1, x = -1, y = -1;
+
+ while (nextline())
+ {
+ if (streq(word[0], "ENDCHAR"))
+ return;
+ else if (streq(word[0], "ENCODING") && nword == 2)
+ {
+ ch = atoi(word[1]);
+ if (ch < 0 || ch > 255)
+ error("bad character code %d", ch);
+ }
+ else if (streq(word[0], "BBX") && nword == 5)
+ {
+ x = atoi(word[1]), y = atoi(word[2]);
+ if (x < 1 || x > 64 || y < 1 || y > 64)
+ error("bad BBX (%dx%d)", x, y);
+ }
+ else if (streq(word[0], "BITMAP"))
+ {
+ if (x < 0)
+ error("missing BBX");
+ if (ch < 0)
+ error("missing ENDCODING");
+ dobitmap(ch, x, y);
+ }
+ }
+ error("unexpected EOF (missing ENDCHAR)");
+}
+
+
+static void dofile()
+{
+ lineno = 0;
+ w = h = 0;
+ bmap = 0;
+
+ nextline();
+ if (nword != 2 || not streq(word[0], "STARTFONT"))
+ error("not a bdf-file");
+
+ while (nextline())
+ {
+ if (streq(word[0], "ENDFONT"))
+ return;
+ else if (streq(word[0], "FONTBOUNDINGBOX") && nword == 5)
+ {
+ if (bmap)
+ error("multiple FONTBOUNDINGBOXes!?!");
+ w = atoi(word[1]), h = atoi(word[2]);
+ if (w < 1 || w > 64 || h < 1 || h > 64)
+ error("bad bounding box %dx%d\n", w, h);
+ bpl = (w*32+7)/8; // rounding is unnecessary
+ bmap = calloc(1, bpl * h*8);
+ if (bmap == 0)
+ error("out of memory");
+ }
+ else if (streq(word[0], "STARTCHAR"))
+ {
+ if (not bmap)
+ error("no FONTBOUNDINGBOX");
+ dochar();
+ }
+ }
+ error("unexpected EOF (missing ENDFONT)");
+}
+
+
+static void writexbm()
+{
+ char buf[256];
+ int i, j;
+ unsigned char *p = bmap;
+
+ if (not bmap)
+ return;
+
+ sprintf(buf, font, w, h);
+
+ printf("#define %s_width %d\n", buf, 32 * w);
+ printf("#define %s_height %d\n", buf, 8 * h);
+ printf("static unsigned char %s_bits[] = {\n", buf);
+ for (i = 0; i < 16 * h * w / 8; ++i)
+ {
+ for (j = 0; j < 16; ++j)
+ printf("0x%02x,", *p++);
+ printf("\n");
+ }
+ printf("};\n");
+}
+
+
+int main(int argc, char **argv)
+{
+ if (argc > 1)
+ font = argv[1];
+ dofile();
+ writexbm();
+ exit(0);
+}
diff --git a/util/alevt/cache.c b/util/alevt/cache.c
new file mode 100644
index 0000000..c747448
--- /dev/null
+++ b/util/alevt/cache.c
@@ -0,0 +1,229 @@
+#include <stdlib.h>
+#include <string.h>
+#include "misc.h"
+#include "dllist.h"
+#include "cache.h"
+#include "help.h"
+
+
+static inline int hash(int pgno)
+{
+ // very simple...
+ return pgno % HASH_SIZE;
+}
+
+
+static void do_erc(struct vt_page *ovtp, struct vt_page *nvtp)
+{
+ int l, c;
+
+ if (nvtp->errors == 0 && ovtp->lines == nvtp->lines)
+ return;
+
+ for (l = 0; l < H; ++l)
+ {
+ if (~nvtp->lines & (1 << l))
+ memcpy(nvtp->data[l], ovtp->data[l], W);
+ else if (ovtp->lines & (1 << l))
+ for (c = 0; c < W; ++c)
+ if (nvtp->data[l][c] == BAD_CHAR)
+ nvtp->data[l][c] = ovtp->data[l][c];
+ }
+ nvtp->lines |= ovtp->lines;
+}
+
+
+static void cache_close(struct cache *ca)
+{
+ struct cache_page *cp;
+ int i;
+
+ for (i = 0; i < HASH_SIZE; ++i)
+ while (not dl_empty(ca->hash + i))
+ {
+ cp = PTR ca->hash[i].first;
+ dl_remove(cp->node);
+ free(cp);
+ }
+ free(ca);
+}
+
+
+static void cache_reset(struct cache *ca)
+{
+ struct cache_page *cp, *cpn;
+ int i;
+
+ for (i = 0; i < HASH_SIZE; ++i)
+ for (cp = PTR ca->hash[i].first; cpn = PTR cp->node->next; cp = cpn)
+ if (cp->page->pgno / 256 != 9) // don't remove help pages
+ {
+ dl_remove(cp->node);
+ free(cp);
+ ca->npages--;
+ }
+ memset(ca->hi_subno, 0, sizeof(ca->hi_subno[0]) * 0x900);
+}
+
+/* Get a page from the cache.
+ If subno is SUB_ANY, the newest subpage of that page is returned */
+
+
+static struct vt_page * cache_get(struct cache *ca, int pgno, int subno)
+{
+ struct cache_page *cp;
+ int h = hash(pgno);
+
+ for (cp = PTR ca->hash[h].first; cp->node->next; cp = PTR cp->node->next)
+ if (cp->page->pgno == pgno)
+ if (subno == ANY_SUB || cp->page->subno == subno)
+ {
+ // found, move to front (make it 'new')
+ dl_insert_first(ca->hash + h, dl_remove(cp->node));
+ return cp->page;
+ }
+ return 0;
+}
+
+/* Put a page in the cache.
+ If it's already there, it is updated. */
+
+
+static struct vt_page * cache_put(struct cache *ca, struct vt_page *vtp)
+{
+ struct cache_page *cp;
+ int h = hash(vtp->pgno);
+
+ for (cp = PTR ca->hash[h].first; cp->node->next; cp = PTR cp->node->next)
+ if (cp->page->pgno == vtp->pgno && cp->page->subno == vtp->subno)
+ break;
+
+ if (cp->node->next)
+ {
+ // move to front.
+ dl_insert_first(ca->hash + h, dl_remove(cp->node));
+ if (ca->erc)
+ do_erc(cp->page, vtp);
+ }
+ else
+ {
+ cp = malloc(sizeof(*cp));
+ if (cp == 0)
+ return 0;
+ if (vtp->subno >= ca->hi_subno[vtp->pgno])
+ ca->hi_subno[vtp->pgno] = vtp->subno + 1;
+ ca->npages++;
+ dl_insert_first(ca->hash + h, cp->node);
+ }
+
+ *cp->page = *vtp;
+ return cp->page;
+}
+
+/* Same as cache_get but doesn't make the found entry new */
+
+
+static struct vt_page * cache_lookup(struct cache *ca, int pgno, int subno)
+{
+ struct cache_page *cp;
+ int h = hash(pgno);
+
+ for (cp = PTR ca->hash[h].first; cp->node->next; cp = PTR cp->node->next)
+ if (cp->page->pgno == pgno)
+ if (subno == ANY_SUB || cp->page->subno == subno)
+ return cp->page;
+ return 0;
+}
+
+
+static struct vt_page * cache_foreach_pg(struct cache *ca, int pgno, int subno,
+ int dir, int (*func)(), void *data)
+{
+ struct vt_page *vtp, *s_vtp = 0;
+
+ if (ca->npages == 0)
+ return 0;
+
+ if (vtp = cache_lookup(ca, pgno, subno))
+ subno = vtp->subno;
+ else if (subno == ANY_SUB)
+ subno = dir < 0 ? 0 : 0xffff;
+
+ for (;;)
+ {
+ subno += dir;
+ while (subno < 0 || subno >= ca->hi_subno[pgno])
+ {
+ pgno += dir;
+ if (pgno < 0x100)
+ pgno = 0x9ff;
+ if (pgno > 0x9ff)
+ pgno = 0x100;
+ subno = dir < 0 ? ca->hi_subno[pgno] - 1 : 0;
+ }
+ if (vtp = cache_lookup(ca, pgno, subno))
+ {
+ if (s_vtp == vtp)
+ return 0;
+ if (s_vtp == 0)
+ s_vtp = vtp;
+ if (func(data, vtp))
+ return vtp;
+ }
+ }
+}
+
+
+static int cache_mode(struct cache *ca, int mode, int arg)
+{
+ int res = -1;
+
+ switch (mode)
+ {
+ case CACHE_MODE_ERC:
+ res = ca->erc;
+ ca->erc = arg ? 1 : 0;
+ break;
+ }
+ return res;
+}
+
+
+static struct cache_ops cops =
+{
+ cache_close,
+ cache_get,
+ cache_put,
+ cache_reset,
+ cache_foreach_pg,
+ cache_mode,
+};
+
+
+struct cache * cache_open(void)
+{
+ struct cache *ca;
+ struct vt_page *vtp;
+ int i;
+
+ if (not(ca = malloc(sizeof(*ca))))
+ goto fail1;
+
+ for (i = 0; i < HASH_SIZE; ++i)
+ dl_init(ca->hash + i);
+
+ memset(ca->hi_subno, 0, sizeof(ca->hi_subno));
+ ca->erc = 1;
+ ca->npages = 0;
+ ca->op = &cops;
+
+ for (vtp = help_pages; vtp < help_pages + nr_help_pages; vtp++)
+ cache_put(ca, vtp);
+
+ return ca;
+
+fail2:
+ free(ca);
+fail1:
+ return 0;
+}
diff --git a/util/alevt/cache.h b/util/alevt/cache.h
new file mode 100644
index 0000000..934ef9a
--- /dev/null
+++ b/util/alevt/cache.h
@@ -0,0 +1,41 @@
+#ifndef CACHE_H
+#define CACHE_H
+
+#include "vt.h"
+#include "misc.h"
+#include "dllist.h"
+
+#define HASH_SIZE 113
+
+
+struct cache
+{
+ struct dl_head hash[HASH_SIZE];
+ int erc; // error reduction circuit on
+ int npages;
+ u16 hi_subno[0x9ff + 1]; // 0:pg not in cache, 1-3f80:highest subno + 1
+ struct cache_ops *op;
+};
+
+
+struct cache_page
+{
+ struct dl_node node[1];
+ struct vt_page page[1];
+};
+
+
+struct cache_ops
+{
+ void (*close)(struct cache *ca);
+ struct vt_page *(*get)(struct cache *ca, int pgno, int subno);
+ struct vt_page *(*put)(struct cache *ca, struct vt_page *vtp);
+ void (*reset)(struct cache *ca);
+ struct vt_page *(*foreach_pg)(struct cache *ca, int pgno, int subno, int dir,
+ int (*func)(), void *data);
+ int (*mode)(struct cache *ca, int mode, int arg);
+};
+
+struct cache *cache_open(void);
+#define CACHE_MODE_ERC 1
+#endif
diff --git a/util/alevt/dllist.h b/util/alevt/dllist.h
new file mode 100644
index 0000000..f925506
--- /dev/null
+++ b/util/alevt/dllist.h
@@ -0,0 +1,55 @@
+#ifndef DLLIST_H
+#define DLLIST_H
+
+
+struct dl_node
+{
+ struct dl_node *next;
+ struct dl_node *prev;
+};
+
+
+struct dl_head
+{
+ struct dl_node *first;
+ struct dl_node *null;
+ struct dl_node *last;
+};
+
+
+static inline struct dl_head * dl_init(struct dl_head *h)
+{
+ h->first = (struct dl_node *)&h->null;
+ h->null = 0;
+ h->last = (struct dl_node *)&h->first;
+ return h;
+}
+
+
+static inline struct dl_node * dl_remove(struct dl_node *n)
+{
+ n->prev->next = n->next;
+ n->next->prev = n->prev;
+ return n;
+}
+
+
+static inline struct dl_node *
+ dl_insert_after(struct dl_node *p, struct dl_node *n)
+{
+ n->next = p->next;
+ n->prev = p;
+ p->next = n;
+ n->next->prev = n;
+ return n;
+}
+
+#define dl_empty(h) ((h)->first->next == 0)
+#define dl_insert_before(p, n) dl_insert_after((p)->prev, (n))
+#define dl_insert_first(h, n) ({ struct dl_node *_n = (n); \
+ dl_insert_before((h)->first, _n); })
+#define dl_insert_last(h, n) ({ struct dl_node *_n = (n); \
+ dl_insert_after((h)->last, _n); })
+#define dl_remove_first(h) dl_remove((h)->first) // mustn't be empty!
+#define dl_remove_last(h) dl_remove((h)->last) // mustn't be empty!
+#endif
diff --git a/util/alevt/exp-gfx.c b/util/alevt/exp-gfx.c
new file mode 100644
index 0000000..82ab218
--- /dev/null
+++ b/util/alevt/exp-gfx.c
@@ -0,0 +1,258 @@
+/* Copyright 1999 by Paul Ortyl <ortylp@from.pl> */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "lang.h"
+#include "export.h"
+#include "font.h"
+#define WW (W*CW) /* pixel width of window */
+#define WH (H*CH) /* pixel hegiht of window */
+
+
+static inline void draw_char(unsigned char * colour_matrix, int fg, int bg,
+ int c, int dbl, int _x, int _y, int sep)
+{
+ int x,y;
+ unsigned char* src= (latin1==LATIN1 ? font1_bits : font2_bits);
+ int dest_x=_x*CW;
+ int dest_y=_y*CH;
+
+ for(y=0;y<(CH<<dbl); y++)
+ {
+ for(x=0;x<CW; x++)
+ {
+ int bitnr, bit, maskbitnr, maskbit;
+ bitnr=(c/32*CH + (y>>dbl))*CW*32+ c%32*CW +x;
+ bit=(*(src+bitnr/8))&(1<<bitnr%8);
+ if (sep)
+ {
+ maskbitnr=(0xa0/32*CH + (y>>dbl))*CW*32+ 0xa0%32*CW +x;
+ maskbit=(*(src+maskbitnr/8))&(1<<maskbitnr%8);
+ *(colour_matrix+WW*(dest_y+y)+dest_x+x)=
+ (char)((bit && (!maskbit)) ? fg : bg);
+ }
+ else
+ *(colour_matrix+WW*(dest_y+y)+dest_x+x)=
+ (char)(bit ? fg : bg);
+ }
+ }
+ return;
+}
+
+
+static void prepare_colour_matrix(/*struct export *e,*/
+ struct fmt_page *pg,
+ unsigned char *colour_matrix)
+{
+ int x, y;
+ for (y = 0; y < H; ++y)
+ {
+ for (x = 0; x < W; ++x)
+ {
+ if (pg->dbl & (1<<(y-1)))
+ {
+ if (pg->data[y-1][x].attr & EA_HDOUBLE)
+ draw_char(colour_matrix, pg->data[y][x].fg,
+ pg->data[y][x].bg, pg->data[y][x].ch,
+ (0),
+ x, y,
+ ((pg->data[y][x].attr & EA_SEPARATED) ? 1 : 0)
+ );
+ }
+ else
+ {
+ draw_char(colour_matrix, pg->data[y][x].fg,
+ pg->data[y][x].bg, pg->data[y][x].ch,
+ ((pg->data[y][x].attr & EA_DOUBLE) ? 1 : 0),
+ x, y,
+ ((pg->data[y][x].attr & EA_SEPARATED) ? 1 : 0)
+ );
+ }
+ }
+ }
+ return;
+}
+
+
+static int ppm_output(struct export *e, char *name, struct fmt_page *pg);
+
+struct export_module export_ppm = // exported module definition
+{
+ "ppm", // id
+ "ppm", // extension
+ 0, // options
+ 0, // size
+ 0, // open
+ 0, // close
+ 0, // option
+ ppm_output // output
+};
+
+
+static int ppm_output(struct export *e, char *name, struct fmt_page *pg)
+{
+ FILE *fp;
+ long n;
+ static u8 rgb1[][3]={{0,0,0},
+ {1,0,0},
+ {0,1,0},
+ {1,1,0},
+ {0,0,1},
+ {1,0,1},
+ {0,1,1},
+ {1,1,1}};
+ unsigned char *colour_matrix;
+
+ if (!(colour_matrix=malloc(WH*WW)))
+ {
+ export_error("cannot allocate memory");
+ return 0;
+ }
+
+ prepare_colour_matrix(/*e,*/ pg, (unsigned char *)colour_matrix);
+ if (not(fp = fopen(name, "w")))
+ {
+ free(colour_matrix);
+ export_error("cannot create file");
+ return -1;
+ }
+ fprintf(fp,"P6 %d %d 1\n", WW, WH);
+
+ for(n=0;n<WH*WW;n++)
+ {
+ if (!fwrite(rgb1[(int) *(colour_matrix+n)], 3, 1, fp))
+ {
+ export_error("error while writting to file");
+ free(colour_matrix);
+ fclose(fp);
+ return -1;
+ }
+ }
+ free(colour_matrix);
+ fclose(fp);
+ return 0;
+}
+
+
+#ifdef WITH_PNG
+
+#include <png.h>
+static int png_open(struct export *e);
+static int png_option(struct export *e, int opt, char *arg);
+static int png_output(struct export *e, char *name, struct fmt_page *pg);
+static char *png_opts[] = // module options
+{
+ "compression=<0-9>", // set compression level
+ 0
+};
+
+struct png_data // private data in struct export
+{
+ int compression;
+};
+
+struct export_module export_png = // exported module definition
+{
+ "png", // id
+ "png", // extension
+ png_opts, // options
+ sizeof(struct png_data), // size
+ png_open, // open
+ 0, // close
+ png_option, // option
+ png_output // output
+};
+
+#define D ((struct png_data *)e->data)
+
+
+static int png_open(struct export *e)
+{
+ D->compression = Z_DEFAULT_COMPRESSION;
+ return 0;
+}
+
+
+static int png_option(struct export *e, int opt, char *arg)
+{
+ switch (opt)
+ {
+ case 1: // compression=
+ if (*arg >= '0' && *arg <= '9')
+ D->compression = *arg - '0';
+ break;
+ }
+ return 0;
+}
+
+
+static int png_output(struct export *e, char *name, struct fmt_page *pg)
+{
+ FILE *fp;
+ int x;
+ png_structp png_ptr;
+ png_infop info_ptr;
+ png_byte *row_pointers[WH];
+ static u8 rgb8[][3]={{ 0, 0, 0},
+ {255, 0, 0},
+ { 0,255, 0},
+ {255,255, 0},
+ { 0, 0,255},
+ {255, 0,255},
+ { 0,255,255},
+ {255,255,255}};
+ unsigned char *colour_matrix;
+
+ if (!(colour_matrix=malloc(WH*WW)))
+ {
+ export_error("cannot allocate memory");
+ return -1;
+ }
+ prepare_colour_matrix(/*e,*/ pg, (unsigned char *)colour_matrix);
+ if (not(fp = fopen(name, "w")))
+ {
+ free(colour_matrix);
+ export_error("cannot create file");
+ return -1;
+ }
+ png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,
+ NULL, NULL, NULL);
+ if (!png_ptr)
+ {
+ free(colour_matrix);
+ fclose(fp);
+ export_error("libpng init error");
+ return -1;
+ }
+ info_ptr = png_create_info_struct(png_ptr);
+ if (!info_ptr)
+ {
+ png_destroy_write_struct(&png_ptr,
+ (png_infopp)NULL);
+ free(colour_matrix);
+ fclose(fp);
+ export_error("libpng init error");
+ return -1;
+ }
+ png_init_io(png_ptr, fp);
+ png_set_compression_level(png_ptr, D->compression);
+ png_set_compression_mem_level(png_ptr, 9);
+ png_set_compression_window_bits(png_ptr, 15);
+ png_set_IHDR(png_ptr, info_ptr, WW, WH,
+ 8, PNG_COLOR_TYPE_PALETTE , PNG_INTERLACE_NONE,
+ PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
+ png_set_PLTE(png_ptr, info_ptr,(png_color*) rgb8 , 8);
+ png_write_info(png_ptr, info_ptr);
+ for(x=0; x<WH; x++)
+ { row_pointers[x]=colour_matrix+x*WW; }
+ png_write_image(png_ptr, row_pointers);
+ png_write_end(png_ptr, info_ptr);
+ png_destroy_write_struct(&png_ptr, &info_ptr);
+ free(colour_matrix);
+ fclose(fp);
+ return 0;
+}
+
+#endif
+
diff --git a/util/alevt/exp-html.c b/util/alevt/exp-html.c
new file mode 100644
index 0000000..6c9312a
--- /dev/null
+++ b/util/alevt/exp-html.c
@@ -0,0 +1,299 @@
+/* Copyright 1999 by Paul Ortyl <ortylp@from.pl> */
+
+#include <stdio.h>
+#include <string.h>
+#include "lang.h"
+#include "export.h"
+
+static int html_open(struct export *e);
+static int html_option(struct export *e, int opt, char *arg);
+static int html_output(struct export *e, char *name, struct fmt_page *pg);
+static char *html_opts[] = // module options
+{
+ "gfx-chr=<char>", // substitute <char> for gfx-symbols
+ "bare", // no headers
+ 0
+};
+
+struct html_data // private data in struct export
+{
+ u8 gfx_chr;
+ u8 bare;
+};
+
+
+struct export_module export_html = // exported module definition
+{
+ "html", // id
+ "html", // extension
+ html_opts, // options
+ sizeof(struct html_data), // size
+ html_open, // open
+ 0, // close
+ html_option, // option
+ html_output // output
+};
+
+#define D ((struct html_data *)e->data)
+
+
+static int html_open(struct export *e)
+{
+ D->gfx_chr = '#';
+ D->bare = 0;
+ //e->reveal=1; // the default should be the same for all formats.
+ return 0;
+}
+
+
+static int html_option(struct export *e, int opt, char *arg)
+{
+ switch (opt)
+ {
+ case 1: // gfx-chr=
+ D->gfx_chr = *arg ?: ' ';
+ break;
+ case 2: // bare (no headers)
+ D->bare=1;
+ break;
+ }
+ return 0;
+}
+
+#define HTML_BLACK "#000000"
+#define HTML_RED "#FF0000"
+#define HTML_GREEN "#00FF00"
+#define HTML_YELLOW "#FFFF00"
+#define HTML_BLUE "#0000FF"
+#define HTML_MAGENTA "#FF00FF"
+#define HTML_CYAN "#00FFFF"
+#define HTML_WHITE "#FFFFFF"
+
+#undef UNREADABLE_HTML //no '\n'
+#define STRIPPED_HTML //only necessary fields in header
+
+static int html_output(struct export *e, char *name, struct fmt_page *pg)
+{
+
+ const char* html_colours[]={ HTML_BLACK,
+ HTML_RED,
+ HTML_GREEN,
+ HTML_YELLOW,
+ HTML_BLUE,
+ HTML_MAGENTA,
+ HTML_CYAN,
+ HTML_WHITE};
+ FILE *fp;
+ int x, y;
+
+#ifdef UNREADABLE_HTML
+#define HTML_NL
+#else
+#define HTML_NL fputc('\n',fp);
+#endif
+
+ if (not(fp = fopen(name, "w")))
+ {
+ export_error("cannot create file");
+ return -1;
+ }
+
+if (!D->bare)
+ {
+#ifndef STRIPPED_HTML
+ fputs("<!doctype html public \"-//w3c//dtd html 4.0 transitional//en\">",fp);
+ HTML_NL
+#endif
+ fputs("<html><head>",fp);
+ HTML_NL
+#ifndef STRIPPED_HTML
+ fputs("<meta http-equiv=\"Content-Type\" content=\"text/html;",fp);
+ switch(latin1) {
+ case LATIN1: fprintf(fp,"charset=iso-8859-1\">"); break;
+ case LATIN2: fprintf(fp,"charset=iso-8859-2\">"); break;
+ case KOI8: fprintf(fp,"charset=koi8-r\">"); break;
+ case GREEK: fprintf(fp,"charset=iso-8859-7\">"); break;
+ }
+ HTML_NL
+ fputs("<meta name=\"GENERATOR\" content=\"alevt-cap\">",fp);
+ HTML_NL
+#else
+ switch(latin1) {
+ case LATIN1: fprintf(fp,"<meta charset=iso-8859-1\">"); break;
+ case LATIN2: fprintf(fp,"<meta charset=iso-8859-2\">"); break;
+ case KOI8: fprintf(fp,"<meta charset=koi8-r\">"); break;
+ case GREEK: fprintf(fp,"<meta charset=iso-8859-7\">"); break;
+ }
+ HTML_NL
+#endif
+ fputs("</head>",fp);
+ fputs("<body text=\"#FFFFFF\" bgcolor=\"#000000\">",fp);
+ HTML_NL
+ } //bare
+
+ fputs("<tt><b>",fp);
+ HTML_NL
+
+ // write tables in form of HTML format
+ for (y = 0; y < 25; ++y)
+ {
+ int last_nonblank=0;
+ int first_unprinted=0;
+ int last_space=1;
+ // previous char was &nbsp;
+ // is used for deciding to put semicolon or not
+ int nbsp=0;
+
+ // for output filled with ' ' up to 40 chars
+ // set last_nonblank=39
+ for (x = 0 ; x < 40; ++x)
+ {
+ if (pg->data[y][x].attr & EA_GRAPHIC)
+ {pg->data[y][x].ch= D->gfx_chr;}
+
+ if (pg->data[y][x].ch!=' ')
+ {
+ last_nonblank=x;
+ }
+ }
+
+ for (x = 0 ; x <= last_nonblank ; ++x)
+ {
+ if (pg->data[y][x].ch==' ')
+ {
+ // if single space between blinking/colour words
+ // then make the space blinking/colour too
+ if ((x)&&(x<39))
+ {
+ if ((pg->data[y][x-1].ch!=' ')
+ &&(pg->data[y][x+1].ch!=' ')
+ &&(pg->data[y][x-1].attr & EA_BLINK)
+ &&(pg->data[y][x+1].attr & EA_BLINK))
+ {pg->data[y][x].attr |= EA_BLINK;}
+ else
+ {pg->data[y][x].attr &= ~EA_BLINK;}
+
+ if ((pg->data[y][x-1].ch!=' ')
+ &&(pg->data[y][x+1].ch!=' ')
+ &&(pg->data[y][x-1].fg==pg->data[y][x+1].fg))
+ {pg->data[y][x].fg=pg->data[y][x-1].fg;}
+ else
+ pg->data[y][x].fg=7;
+ }
+ else
+ {
+ pg->data[y][x].attr &= ~EA_BLINK;
+ pg->data[y][x].fg=7;
+ }
+ }
+ else
+ {
+ // if foreground is black set the foreground to previous
+ // background colour to let it be visible
+ if (!pg->data[y][x].fg)
+ {pg->data[y][x].fg=pg->data[y][x].bg;}
+ }
+ //check if attributes changed,
+ //if yes then print chars and update first_unprinted
+ //if not then go to next char
+ if (x)
+ {
+ if (((
+ (pg->data[y][x].attr & EA_BLINK)
+ ==
+ (pg->data[y][x-1].attr & EA_BLINK)
+ )
+ &&
+ (
+ pg->data[y][x].fg == pg->data[y][x-1].fg
+ ))
+ &&(x!=last_nonblank))
+
+ { continue; }
+ }
+ else continue;
+
+ {
+ int z=first_unprinted;
+ for(;(pg->data[y][z].ch==' ') && (z<x);z++)
+ {
+ if (last_space)
+ {
+ fprintf(fp,"&nbsp");
+ last_space=0;
+ nbsp=1;
+ }
+ else
+ {
+ fputc(' ',fp);
+ last_space=1;
+ nbsp=0;
+ }
+ }
+
+ first_unprinted=z;
+
+ if (z==x) continue;
+
+ if (pg->data[y][first_unprinted].attr & EA_BLINK)
+ {
+ fprintf(fp,"<blink>");
+ nbsp=0;
+ }
+
+ if (pg->data[y][first_unprinted].fg!=7)
+ {
+ fprintf(fp,"<font color=\"%s\">",
+ html_colours[pg->data[y][first_unprinted].fg]);
+ nbsp=0;
+ }
+ for(;(z<x)||(z==last_nonblank);z++)
+ {
+
+ if (pg->data[y][z].ch==' ')
+ {
+ for(;(pg->data[y][z].ch==' ') && (z<x);z++)
+ {
+ if (last_space)
+ {
+ fprintf(fp,"&nbsp");
+ last_space=0;
+ nbsp=1;
+ }
+ else
+ {
+ fputc(' ',fp);
+ last_space=1;
+ nbsp=0;
+ }
+ }
+ z--;
+ }
+ else
+ {
+ //if previous nbsp --> put semicolon!!!
+ if (nbsp) fputc(';',fp);
+ fputc(pg->data[y][z].ch,fp);
+ last_space=0;
+ nbsp=0;
+ }
+ }
+ if (pg->data[y][first_unprinted].fg!=7)
+ {
+ fprintf(fp,"</font>");
+ }
+ if (pg->data[y][first_unprinted].attr & EA_BLINK)
+ fprintf(fp,"</blink>");
+
+ first_unprinted=z;
+ }
+ }
+ fputs("<br>",fp);
+ HTML_NL
+ }
+ fputs("</b></tt>",fp);
+ if (!D->bare)
+ fputs("</body></html>",fp);
+ fclose(fp);
+ return 0;
+}
diff --git a/util/alevt/exp-txt.c b/util/alevt/exp-txt.c
new file mode 100644
index 0000000..8009c17
--- /dev/null
+++ b/util/alevt/exp-txt.c
@@ -0,0 +1,226 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "os.h"
+#include "export.h"
+
+static int txt_open(struct export *e);
+static int txt_option(struct export *e, int opt, char *arg);
+static int txt_output(struct export *e, char *name, struct fmt_page *pg);
+static char *txt_opts[] = // module options
+{
+ "color", // generate ansi color codes (and attributes)
+ "gfx-chr=<char>", // substitute <char> for gfx-symbols
+ "fg=<0-7|none>", // assume term has <x> as foreground color
+ "bg=<0-7|none>", // assume term has <x> as background color
+ "lines=<1-25>", // output 24 or 25 lines
+ 0
+};
+
+
+struct txt_data // private data in struct export
+{
+ u8 color;
+ u8 gfx_chr;
+ u8 def_fg;
+ u8 def_bg;
+ int endline;
+ struct fmt_char curr[1];
+ FILE *fp;
+};
+
+
+struct export_module export_txt = // exported module definition
+{
+ "ascii", // id
+ "txt", // extension
+ txt_opts, // options
+ sizeof(struct txt_data), // data size
+ txt_open, // open
+ 0, // close
+ txt_option, // option
+ txt_output, // output
+};
+
+
+struct export_module export_ansi = // exported module definition
+{
+ "ansi", // id
+ "txt", // extension
+ txt_opts, // options
+ sizeof(struct txt_data), // data size
+ txt_open, // open
+ 0, // close
+ txt_option, // option
+ txt_output, // output
+};
+
+#define D ((struct txt_data *)e->data)
+
+
+char * my_stpcpy(char *dst, const char *src)
+{
+ while (*dst = *src++)
+ dst++;
+ return dst;
+}
+
+
+static int txt_open(struct export *e)
+{
+ D->gfx_chr = '#';
+ D->def_fg = -1;
+ D->def_bg = -1;
+ D->endline = H;
+ if (e->mod == &export_ansi)
+ D->color = 1;
+ return 0;
+}
+
+
+static int txt_option(struct export *e, int opt, char *arg)
+{
+ switch (opt)
+ {
+ case 1: // color
+ D->color = 1;
+ break;
+ case 2: // gfx-chr=
+ D->gfx_chr = *arg ?: ' ';
+ break;
+ case 3: // fg=
+ D->def_fg = *arg - '0';
+ break;
+ case 4: // bg=
+ D->def_bg = *arg - '0';
+ break;
+ case 5: // lines=
+ D->endline = atoi(arg);
+ if (D->endline < 1 || D->endline > H)
+ {
+ export_error("lines: invalid number");
+ return 1;
+ }
+ }
+ return 0;
+}
+
+
+static void put_attr(struct export *e, struct fmt_char *new)
+{
+ char buf[512];
+ char *p = buf;
+ int fg, bg, attr;
+ int reset = 0;
+
+ if (D->color)
+ {
+ fg = D->curr->fg ^ new->fg;
+ bg = D->curr->bg ^ new->bg;
+ attr = (D->curr->attr ^ new->attr) & (EA_BLINK | EA_DOUBLE);
+
+ if (fg | bg | attr)
+ {
+ if (~new->attr & attr) // reset some attributes -> reset all.
+ reset = 1;
+ if (fg && new->fg == D->def_fg) // switch to def fg -> reset all
+ reset = 1;
+ if (bg && new->bg == D->def_bg) // switch to def bg -> reset all
+ reset = 1;
+
+ p = my_stpcpy(buf, "\e[");
+ if (reset)
+ {
+ p = my_stpcpy(p, ";"); // "0;" but 0 isn't neccesary
+ attr = -1; // set all attributes
+ fg = new->fg ^ D->def_fg; // set fg if != default fg
+ bg = new->bg ^ D->def_bg; // set bg if != default bg
+ }
+ if (attr & new->attr & EA_BLINK)
+ p = my_stpcpy(p, "5;"); // blink
+ if (attr & new->attr & EA_DOUBLE)
+ p = my_stpcpy(p, "1;"); // bold
+ if (fg)
+ p += sprintf(p, "%d;", new->fg + 30); // fg-color
+ if (bg)
+ p += sprintf(p, "%d;", new->bg + 40); // bg-color
+ p[-1] = 'm'; // replace last ;
+ *D->curr = *new;
+ }
+ }
+ *p++ = new->ch;
+ *p = 0;
+ fputs(buf, D->fp);
+}
+
+
+static int txt_output(struct export *e, char *name, struct fmt_page *pg)
+{
+ struct fmt_char def_c[1];
+ struct fmt_char l[W+2];
+ #define L (l+1)
+ int x, y;
+
+ D->fp = fopen(name, "w");
+ if (not D->fp)
+ {
+ export_error("cannot create file");
+ return -1;
+ }
+
+ /* initialize default colors. These have to be restored at EOL. */
+ def_c->ch = '\n';
+ def_c->fg = D->def_fg;
+ def_c->bg = D->def_bg;
+ def_c->attr = E_DEF_ATTR;
+ *D->curr = *def_c;
+ L[-1] = L[W] = *def_c;
+
+ for (y = 0; y < D->endline; y++)
+ if (~pg->hid & (1 << y)) // not hidden
+ {
+ // character conversion
+ for (x = 0; x < W; ++x)
+ {
+ struct fmt_char c = pg->data[y][x];
+
+ switch (c.ch)
+ {
+ case 0x00: case 0xa0: c.ch = ' '; break;
+ case 0x7f: c.ch = '*'; break;
+ case BAD_CHAR: c.ch = '?'; break;
+ default:
+ if (c.attr & EA_GRAPHIC)
+ c.ch = D->gfx_chr;
+ break;
+ }
+ L[x] = c;
+ }
+
+ if (D->color)
+ {
+ // optimize color and attribute changes
+ // delay fg and attr changes as far as possible
+ for (x = 0; x < W; ++x)
+ if (L[x].ch == ' ')
+ {
+ L[x].fg = L[x-1].fg;
+ l[x].attr = L[x-1].attr;
+ }
+
+ // move fg and attr changes to prev bg change point
+ for (x = W-1; x >= 0; x--)
+ if (L[x].ch == ' ' && L[x].bg == L[x+1].bg)
+ {
+ L[x].fg = L[x+1].fg;
+ L[x].attr = L[x+1].attr;
+ }
+ }
+
+ // now emit the whole line (incl EOL)
+ for (x = 0; x < W+1; ++x)
+ put_attr(e, L + x);
+ }
+ fclose(D->fp);
+ return 0;
+}
diff --git a/util/alevt/export.c b/util/alevt/export.c
new file mode 100644
index 0000000..1eb8ea9
--- /dev/null
+++ b/util/alevt/export.c
@@ -0,0 +1,364 @@
+#include <stdarg.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include "vt.h"
+#include "misc.h"
+#include "export.h"
+
+extern struct export_module export_txt;
+extern struct export_module export_ansi;
+extern struct export_module export_html;
+extern struct export_module export_png;
+extern struct export_module export_ppm;
+struct export_module *modules[] =
+{
+ &export_txt,
+ &export_ansi,
+ &export_html,
+ &export_ppm,
+#ifdef WITH_PNG
+ &export_png,
+#endif
+ 0
+};
+
+
+static char *glbl_opts[] =
+{
+ "reveal", // show hidden text
+ "hide", // don't show hidden text (default)
+ 0
+};
+
+static char errbuf[64];
+
+
+void export_error(char *str, ...)
+{
+ va_list args;
+
+ va_start(args, str);
+ vsnprintf(errbuf, sizeof(errbuf)-1, str, args);
+}
+
+
+char * export_errstr(void)
+{
+ return errbuf;
+}
+
+
+static int find_opt(char **opts, char *opt, char *arg)
+{
+ int err = 0;
+ char buf[256];
+ char **oo, *o, *a;
+
+ if (oo = opts)
+ while (o = *oo++)
+ {
+ if (a = strchr(o, '='))
+ {
+ a = buf + (a - o);
+ o = strcpy(buf, o);
+ *a++ = 0;
+ }
+ if (strcasecmp(o, opt) == 0)
+ {
+ if ((a != 0) == (arg != 0))
+ return oo - opts;
+ err = -1;
+ }
+ }
+ return err;
+}
+
+
+struct export * export_open(char *fmt)
+{
+ struct export_module **eem, *em;
+ struct export *e;
+ char *opt, *optend, *optarg;
+ int opti;
+
+ if (fmt = strdup(fmt))
+ {
+ if (opt = strchr(fmt, ','))
+ *opt++ = 0;
+ for (eem = modules; em = *eem; eem++)
+ if (strcasecmp(em->fmt_name, fmt) == 0)
+ break;
+ if (em)
+ {
+ if (e = malloc(sizeof(*e) + em->local_size))
+ {
+ e->mod = em;
+ e->fmt_str = fmt;
+ e->reveal = 0;
+ memset(e + 1, 0, em->local_size);
+ if (not em->open || em->open(e) == 0)
+ {
+ for (; opt; opt = optend)
+ {
+ if (optend = strchr(opt, ','))
+ *optend++ = 0;
+ if (not *opt)
+ continue;
+ if (optarg = strchr(opt, '='))
+ *optarg++ = 0;
+ if ((opti = find_opt(glbl_opts, opt, optarg)) > 0)
+ {
+ if (opti == 1) // reveal
+ e->reveal = 1;
+ else if (opti == 2) // hide
+ e->reveal = 0;
+ }
+ else if (opti == 0 &&
+ (opti = find_opt(em->options, opt, optarg)) > 0)
+ {
+ if (em->option(e, opti, optarg))
+ break;
+ }
+ else
+ {
+ if (opti == 0)
+ export_error("%s: unknown option", opt);
+ else if (optarg)
+ export_error("%s: takes no arg", opt);
+ else
+ export_error("%s: missing arg", opt);
+ break;
+ }
+ }
+ if (opt == 0)
+ return e;
+
+ if (em->close)
+ em->close(e);
+ }
+ free(e);
+ }
+ else
+ export_error("out of memory");
+ }
+ else
+ export_error("unknown format: %s", fmt);
+ free(fmt);
+ }
+ else
+ export_error("out of memory");
+ return 0;
+}
+
+
+void export_close(struct export *e)
+{
+ if (e->mod->close)
+ e->mod->close(e);
+ free(e->fmt_str);
+ free(e);
+}
+
+
+static char * hexnum(char *buf, unsigned int num)
+{
+ char *p = buf + 5;
+
+ num &= 0xffff;
+ *--p = 0;
+ do
+ {
+ *--p = "0123456789abcdef"[num % 16];
+ num /= 16;
+ } while (num);
+ return p;
+}
+
+
+static char * adjust(char *p, char *str, char fill, int width)
+{
+ int l = width - strlen(str);
+
+ while (l-- > 0)
+ *p++ = fill;
+ while (*p = *str++)
+ p++;
+ return p;
+}
+
+
+char * export_mkname(struct export *e, char *fmt, struct vt_page *vtp, char *usr)
+{
+ char bbuf[1024];
+ char *p = bbuf;
+
+ while (*p = *fmt++)
+ if (*p++ == '%')
+ {
+ char buf[32], buf2[32];
+ int width = 0;
+
+ p--;
+ while (*fmt >= '0' && *fmt <= '9')
+ width = width*10 + *fmt++ - '0';
+
+ switch (*fmt++)
+ {
+ case '%':
+ p = adjust(p, "%", '%', width);
+ break;
+ case 'e': // extension
+ p = adjust(p, e->mod->extension, '.', width);
+ break;
+ case 'p': // pageno[.subno]
+ if (vtp->subno)
+ p = adjust(p,strcat(strcat(hexnum(buf, vtp->pgno),
+ "."), hexnum(buf2, vtp->subno)), ' ', width);
+ else
+ p = adjust(p, hexnum(buf, vtp->pgno), ' ', width);
+ break;
+ case 'S': // subno
+ p = adjust(p, hexnum(buf, vtp->subno), '0', width);
+ break;
+ case 'P': // pgno
+ p = adjust(p, hexnum(buf, vtp->pgno), '0', width);
+ break;
+ case 's': // user strin
+ p = adjust(p, usr, ' ', width);
+ break;
+ //TODO: add date, channel name, ...
+ }
+ }
+ p = strdup(bbuf);
+ if (not p)
+ export_error("out of memory");
+ return p;
+}
+
+
+static void fmt_page(struct export *e, struct fmt_page *pg, struct vt_page *vtp)
+{
+ char buf[16];
+ int x, y;
+ u8 *p = vtp->data[0];
+
+ pg->dbl = 0;
+
+ sprintf(buf, "\2%x.%02x\7", vtp->pgno, vtp->subno & 0xff);
+
+ for (y = 0; y < H; y++)
+ {
+ struct fmt_char c;
+ int last_ch = ' ';
+ int dbl = 0, hold = 0;
+
+ c.fg = 7;
+ c.bg = 0;
+ c.attr = 0;
+
+ for (x = 0; x < W; ++x)
+ {
+ c.ch = *p++;
+ if (y == 0 && x < 8)
+ c.ch = buf[x];
+ switch (c.ch)
+ {
+ case 0x00 ... 0x07: /* alpha + fg color */
+ c.fg = c.ch & 7;
+ c.attr &= ~(EA_GRAPHIC | EA_CONCEALED);
+ goto ctrl;
+ case 0x08: /* flash */
+ c.attr |= EA_BLINK;
+ goto ctrl;
+ case 0x09: /* steady */
+ c.attr &= ~EA_BLINK;
+ goto ctrl;
+ case 0x0a: /* end box */
+ case 0x0b: /* start box */
+ goto ctrl;
+ case 0x0c: /* normal height */
+ c.attr &= EA_DOUBLE;
+ goto ctrl;
+ case 0x0d: /* double height */
+ if (y < H-2) /* ignored on last 2 lines */
+ {
+ c.attr |= EA_DOUBLE;
+ dbl = 1;
+ }
+ goto ctrl;
+ case 0x10 ... 0x17: /* gfx + fg color */
+ c.fg = c.ch & 7;
+ c.attr |= EA_GRAPHIC;
+ c.attr &= ~EA_CONCEALED;
+ goto ctrl;
+ case 0x18: /* conceal */
+ c.attr |= EA_CONCEALED;
+ goto ctrl;
+ case 0x19: /* contiguous gfx */
+ c.attr &= ~EA_SEPARATED;
+ goto ctrl;
+ case 0x1a: /* separate gfx */
+ c.attr |= EA_SEPARATED;
+ goto ctrl;
+ case 0x1c: /* black bg */
+ c.bg = 0;
+ goto ctrl;
+ case 0x1d: /* new bg */
+ c.bg = c.fg;
+ goto ctrl;
+ case 0x1e: /* hold gfx */
+ hold = 1;
+ goto ctrl;
+ case 0x1f: /* release gfx */
+ hold = 0;
+ goto ctrl;
+
+ case 0x0e: /* SO */
+ case 0x0f: /* SI */
+ case 0x1b: /* ESC */
+ c.ch = ' ';
+ break;
+
+ ctrl:
+ c.ch = ' ';
+ if (hold && (c.attr & EA_GRAPHIC))
+ c.ch = last_ch;
+ break;
+ }
+ if (c.attr & EA_GRAPHIC)
+ if ((c.ch & 0xa0) == 0x20)
+ {
+ last_ch = c.ch;
+ c.ch += (c.ch & 0x40) ? 32 : -32;
+ }
+ if (c.attr & EA_CONCEALED)
+ if (not e->reveal)
+ c.ch = ' ';
+ pg->data[y][x] = c;
+ }
+ if (dbl)
+ {
+ pg->dbl |= 1 << y;
+ for (x = 0; x < W; ++x)
+ {
+ if (~pg->data[y][x].attr & EA_DOUBLE)
+ pg->data[y][x].attr |= EA_HDOUBLE;
+ pg->data[y+1][x] = pg->data[y][x];
+ pg->data[y+1][x].ch = ' ';
+ }
+ y++;
+ p += W;
+ }
+ }
+ pg->hid = pg->dbl << 1;
+}
+
+
+int export(struct export *e, struct vt_page *vtp, char *name)
+{
+ struct fmt_page pg[1];
+
+ fmt_page(e, pg, vtp);
+ return e->mod->output(e, name, pg);
+}
diff --git a/util/alevt/export.h b/util/alevt/export.h
new file mode 100644
index 0000000..a08875c
--- /dev/null
+++ b/util/alevt/export.h
@@ -0,0 +1,66 @@
+#ifndef EXPORT_H
+#define EXPORT_H
+
+#include "vt.h"
+#include "misc.h"
+
+
+struct fmt_char
+{
+ u8 ch, fg, bg, attr;
+};
+
+#define EA_DOUBLE 1 // double height char
+#define EA_HDOUBLE 2 // single height char in double height line
+#define EA_BLINK 4 // blink
+#define EA_CONCEALED 8 // concealed
+#define EA_GRAPHIC 16 // graphic symbol
+#define EA_SEPARATED 32 // use separated graphic symbol
+
+#define E_DEF_FG 7
+#define E_DEF_BG 0
+#define E_DEF_ATTR 0
+
+
+struct fmt_page
+{
+ struct vt_page *vtp;
+ u32 dbl, hid;
+ struct fmt_char data[H][W];
+};
+
+
+struct export
+{
+ struct export_module *mod; // module type
+ char *fmt_str; // saved option string (splitted)
+ // global options
+ int reveal; // reveal hidden chars
+ // local data for module's use. initialized to 0.
+ struct { int dummy; } data[0];
+};
+
+
+struct export_module
+{
+ char *fmt_name; // the format type name (ASCII/HTML/PNG/...)
+ char *extension; // the default file name extension
+ char **options; // module options
+ int local_size;
+ int (*open)(struct export *fmt);
+ void (*close)(struct export *fmt);
+ int (*option)(struct export *fmt, int opt, char *arg);
+ int (*output)(struct export *fmt, char *name, struct fmt_page *pg);
+};
+
+
+extern struct export_module *modules[]; // list of modules (for help msgs)
+void export_error(char *str, ...); // set error
+char *export_errstr(void); // return last error
+char *export_mkname(struct export *e, char *fmt, struct vt_page *vtp, char *usr);
+
+
+struct export *export_open(char *fmt);
+void export_close(struct export *e);
+int export(struct export *e, struct vt_page *vtp, char *user_str);
+#endif
diff --git a/util/alevt/fdset.c b/util/alevt/fdset.c
new file mode 100644
index 0000000..99edac4
--- /dev/null
+++ b/util/alevt/fdset.c
@@ -0,0 +1,97 @@
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/time.h>
+#include "dllist.h"
+#include "misc.h"
+#include "fdset.h"
+
+struct fdset fds[1]; /* global fd list */
+
+
+int fdset_init(struct fdset *fds)
+{
+ dl_init(fds->list);
+ fds->del_count = 0;
+ return 0;
+}
+
+
+int fdset_add_fd(struct fdset *fds, int fd, void *handler, void *data)
+{
+ struct fdset_node *fn;
+
+ if (fd < 0)
+ return -1;
+ if (handler == 0)
+ return -1;
+
+ for (fn = PTR fds->list->first; fn->node->next; fn = PTR fn->node->next)
+ if (fn->fd == fd)
+ return -1;
+
+ if (not(fn = malloc(sizeof(*fn))))
+ return -1;
+ fn->fd = fd;
+ fn->handler = handler;
+ fn->data = data;
+ dl_insert_last(fds->list, fn->node);
+ return 0;
+}
+
+
+int fdset_del_fd(struct fdset *fds, int fd)
+{
+ struct fdset_node *fn;
+
+ for (fn = PTR fds->list->first; fn->node->next; fn = PTR fn->node->next)
+ if (fn->fd == fd)
+ {
+ dl_remove(fn->node);
+ free(fn);
+ fds->del_count++;
+ return 0;
+ }
+ return -1;
+}
+
+
+int fdset_select(struct fdset *fds, int timeout)
+{
+ struct fdset_node *fn;
+ fd_set rfds[1];
+ struct timeval tv[1], *tvp = 0;
+ int max_fd, x, del_count;
+
+ FD_ZERO(rfds);
+ max_fd = 0;
+ for (fn = PTR fds->list->first; fn->node->next; fn = PTR fn->node->next)
+ {
+ FD_SET(fn->fd, rfds);
+ if (fn->fd >= max_fd)
+ max_fd = fn->fd + 1;
+ }
+
+ if (timeout >= 0)
+ {
+ tv->tv_sec = timeout/1000;
+ tv->tv_usec = timeout%1000*1000;
+ tvp = tv;
+ }
+
+ x = select(max_fd, rfds, 0, 0, tvp);
+ if (x <= 0)
+ return x;
+
+ /* A little bit complicated. A called handler may modify the fdset... */
+restart:
+ del_count = fds->del_count;
+ for (fn = PTR fds->list->first; fn->node->next; fn = PTR fn->node->next)
+ if (FD_ISSET(fn->fd, rfds))
+ {
+ FD_CLR(fn->fd, rfds);
+ fn->handler(fn->data, fn->fd);
+ if (fds->del_count != del_count)
+ goto restart;
+ }
+ return 1;
+}
diff --git a/util/alevt/fdset.h b/util/alevt/fdset.h
new file mode 100644
index 0000000..4b786e6
--- /dev/null
+++ b/util/alevt/fdset.h
@@ -0,0 +1,28 @@
+#ifndef FDSET_H
+#define FDSET_H
+
+#include "dllist.h"
+
+
+struct fdset
+{
+ struct dl_head list[1];
+ int del_count;
+};
+
+
+struct fdset_node /*internal*/
+{
+ struct dl_node node[1];
+ int fd;
+ void (*handler)(void *data, int fd);
+ void *data;
+};
+
+extern struct fdset fds[1]; /* global fd list */
+
+int fdset_init(struct fdset *fds);
+int fdset_add_fd(struct fdset *fds, int fd, void *handler, void *data);
+int fdset_del_fd(struct fdset *fds, int fd);
+int fdset_select(struct fdset *fds, int timeout /*millisec*/);
+#endif
diff --git a/util/alevt/font.c b/util/alevt/font.c
new file mode 100644
index 0000000..da0e448
--- /dev/null
+++ b/util/alevt/font.c
@@ -0,0 +1,5 @@
+#define static /* I want them global */
+#include "font1.xbm"
+#include "font2.xbm"
+#include "font3.xbm"
+#include "font4.xbm"
diff --git a/util/alevt/font.h b/util/alevt/font.h
new file mode 100644
index 0000000..c17c4bc
--- /dev/null
+++ b/util/alevt/font.h
@@ -0,0 +1,19 @@
+#ifndef FONT_H
+#define FONT_H
+
+#include "fontsize.h" /* the #defines from font?.xbm */
+
+#if font1_width != font2_width || font1_height != font2_height
+#error different font sizes.
+#endif
+
+extern unsigned char font1_bits[];
+extern unsigned char font2_bits[];
+extern unsigned char font3_bits[];
+extern unsigned char font4_bits[];
+
+#define font_width font1_width
+#define font_height font1_height
+#define CW (font_width/32) /* pixel width of a character */
+#define CH (font_height/8) /* pixel height of a character */
+#endif
diff --git a/util/alevt/hamm.c b/util/alevt/hamm.c
new file mode 100644
index 0000000..c44a902
--- /dev/null
+++ b/util/alevt/hamm.c
@@ -0,0 +1,229 @@
+#include "vt.h"
+#include "hamm.h"
+
+// table to decode hamm8/4 encoded bytes.
+// the low 4 bits are the (corrected) data bits
+// bit 8 is set if there was a single bit error
+// bit 12 is set if there was an uncorrectable error
+
+// the idea: you may add up to 15 words and get the
+// number of single bit errors in b8-b11 and the number
+// of double errors in b12-b15
+
+
+static unsigned short hammtab[256] =
+{
+ 0x0101, 0x100f, 0x0001, 0x0101, 0x100f, 0x0100, 0x0101, 0x100f,
+ 0x100f, 0x0102, 0x0101, 0x100f, 0x010a, 0x100f, 0x100f, 0x0107,
+ 0x100f, 0x0100, 0x0101, 0x100f, 0x0100, 0x0000, 0x100f, 0x0100,
+ 0x0106, 0x100f, 0x100f, 0x010b, 0x100f, 0x0100, 0x0103, 0x100f,
+ 0x100f, 0x010c, 0x0101, 0x100f, 0x0104, 0x100f, 0x100f, 0x0107,
+ 0x0106, 0x100f, 0x100f, 0x0107, 0x100f, 0x0107, 0x0107, 0x0007,
+ 0x0106, 0x100f, 0x100f, 0x0105, 0x100f, 0x0100, 0x010d, 0x100f,
+ 0x0006, 0x0106, 0x0106, 0x100f, 0x0106, 0x100f, 0x100f, 0x0107,
+ 0x100f, 0x0102, 0x0101, 0x100f, 0x0104, 0x100f, 0x100f, 0x0109,
+ 0x0102, 0x0002, 0x100f, 0x0102, 0x100f, 0x0102, 0x0103, 0x100f,
+ 0x0108, 0x100f, 0x100f, 0x0105, 0x100f, 0x0100, 0x0103, 0x100f,
+ 0x100f, 0x0102, 0x0103, 0x100f, 0x0103, 0x100f, 0x0003, 0x0103,
+ 0x0104, 0x100f, 0x100f, 0x0105, 0x0004, 0x0104, 0x0104, 0x100f,
+ 0x100f, 0x0102, 0x010f, 0x100f, 0x0104, 0x100f, 0x100f, 0x0107,
+ 0x100f, 0x0105, 0x0105, 0x0005, 0x0104, 0x100f, 0x100f, 0x0105,
+ 0x0106, 0x100f, 0x100f, 0x0105, 0x100f, 0x010e, 0x0103, 0x100f,
+ 0x100f, 0x010c, 0x0101, 0x100f, 0x010a, 0x100f, 0x100f, 0x0109,
+ 0x010a, 0x100f, 0x100f, 0x010b, 0x000a, 0x010a, 0x010a, 0x100f,
+ 0x0108, 0x100f, 0x100f, 0x010b, 0x100f, 0x0100, 0x010d, 0x100f,
+ 0x100f, 0x010b, 0x010b, 0x000b, 0x010a, 0x100f, 0x100f, 0x010b,
+ 0x010c, 0x000c, 0x100f, 0x010c, 0x100f, 0x010c, 0x010d, 0x100f,
+ 0x100f, 0x010c, 0x010f, 0x100f, 0x010a, 0x100f, 0x100f, 0x0107,
+ 0x100f, 0x010c, 0x010d, 0x100f, 0x010d, 0x100f, 0x000d, 0x010d,
+ 0x0106, 0x100f, 0x100f, 0x010b, 0x100f, 0x010e, 0x010d, 0x100f,
+ 0x0108, 0x100f, 0x100f, 0x0109, 0x100f, 0x0109, 0x0109, 0x0009,
+ 0x100f, 0x0102, 0x010f, 0x100f, 0x010a, 0x100f, 0x100f, 0x0109,
+ 0x0008, 0x0108, 0x0108, 0x100f, 0x0108, 0x100f, 0x100f, 0x0109,
+ 0x0108, 0x100f, 0x100f, 0x010b, 0x100f, 0x010e, 0x0103, 0x100f,
+ 0x100f, 0x010c, 0x010f, 0x100f, 0x0104, 0x100f, 0x100f, 0x0109,
+ 0x010f, 0x100f, 0x000f, 0x010f, 0x100f, 0x010e, 0x010f, 0x100f,
+ 0x0108, 0x100f, 0x100f, 0x0105, 0x100f, 0x010e, 0x010d, 0x100f,
+ 0x100f, 0x010e, 0x010f, 0x100f, 0x010e, 0x000e, 0x100f, 0x010e,
+};
+
+#if 0 // this information is contained in hamm24par bit 5
+// simple parity table (sum of 1 bits modulo 2)
+
+
+static char odd_parity[256] =
+{
+ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
+ 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
+ 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
+ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
+ 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
+ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
+ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
+ 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
+ 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
+ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
+ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
+ 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
+ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0,
+ 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
+ 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1,
+ 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0
+};
+#endif
+
+// this table generates the parity checks for hamm24/18 decoding.
+// bit 0 is for test A, 1 for B, ...
+// thanks to R. Gancarz for this fine table *g*
+
+
+static char hamm24par[3][256] =
+{
+ { // parities of first byte
+ 0, 33, 34, 3, 35, 2, 1, 32, 36, 5, 6, 39, 7, 38, 37, 4,
+ 37, 4, 7, 38, 6, 39, 36, 5, 1, 32, 35, 2, 34, 3, 0, 33,
+ 38, 7, 4, 37, 5, 36, 39, 6, 2, 35, 32, 1, 33, 0, 3, 34,
+ 3, 34, 33, 0, 32, 1, 2, 35, 39, 6, 5, 36, 4, 37, 38, 7,
+ 39, 6, 5, 36, 4, 37, 38, 7, 3, 34, 33, 0, 32, 1, 2, 35,
+ 2, 35, 32, 1, 33, 0, 3, 34, 38, 7, 4, 37, 5, 36, 39, 6,
+ 1, 32, 35, 2, 34, 3, 0, 33, 37, 4, 7, 38, 6, 39, 36, 5,
+ 36, 5, 6, 39, 7, 38, 37, 4, 0, 33, 34, 3, 35, 2, 1, 32,
+ 40, 9, 10, 43, 11, 42, 41, 8, 12, 45, 46, 15, 47, 14, 13, 44,
+ 13, 44, 47, 14, 46, 15, 12, 45, 41, 8, 11, 42, 10, 43, 40, 9,
+ 14, 47, 44, 13, 45, 12, 15, 46, 42, 11, 8, 41, 9, 40, 43, 10,
+ 43, 10, 9, 40, 8, 41, 42, 11, 15, 46, 45, 12, 44, 13, 14, 47,
+ 15, 46, 45, 12, 44, 13, 14, 47, 43, 10, 9, 40, 8, 41, 42, 11,
+ 42, 11, 8, 41, 9, 40, 43, 10, 14, 47, 44, 13, 45, 12, 15, 46,
+ 41, 8, 11, 42, 10, 43, 40, 9, 13, 44, 47, 14, 46, 15, 12, 45,
+ 12, 45, 46, 15, 47, 14, 13, 44, 40, 9, 10, 43, 11, 42, 41, 8
+ }, { // parities of second byte
+ 0, 41, 42, 3, 43, 2, 1, 40, 44, 5, 6, 47, 7, 46, 45, 4,
+ 45, 4, 7, 46, 6, 47, 44, 5, 1, 40, 43, 2, 42, 3, 0, 41,
+ 46, 7, 4, 45, 5, 44, 47, 6, 2, 43, 40, 1, 41, 0, 3, 42,
+ 3, 42, 41, 0, 40, 1, 2, 43, 47, 6, 5, 44, 4, 45, 46, 7,
+ 47, 6, 5, 44, 4, 45, 46, 7, 3, 42, 41, 0, 40, 1, 2, 43,
+ 2, 43, 40, 1, 41, 0, 3, 42, 46, 7, 4, 45, 5, 44, 47, 6,
+ 1, 40, 43, 2, 42, 3, 0, 41, 45, 4, 7, 46, 6, 47, 44, 5,
+ 44, 5, 6, 47, 7, 46, 45, 4, 0, 41, 42, 3, 43, 2, 1, 40,
+ 48, 25, 26, 51, 27, 50, 49, 24, 28, 53, 54, 31, 55, 30, 29, 52,
+ 29, 52, 55, 30, 54, 31, 28, 53, 49, 24, 27, 50, 26, 51, 48, 25,
+ 30, 55, 52, 29, 53, 28, 31, 54, 50, 27, 24, 49, 25, 48, 51, 26,
+ 51, 26, 25, 48, 24, 49, 50, 27, 31, 54, 53, 28, 52, 29, 30, 55,
+ 31, 54, 53, 28, 52, 29, 30, 55, 51, 26, 25, 48, 24, 49, 50, 27,
+ 50, 27, 24, 49, 25, 48, 51, 26, 30, 55, 52, 29, 53, 28, 31, 54,
+ 49, 24, 27, 50, 26, 51, 48, 25, 29, 52, 55, 30, 54, 31, 28, 53,
+ 28, 53, 54, 31, 55, 30, 29, 52, 48, 25, 26, 51, 27, 50, 49, 24
+ }, { // parities of third byte
+ 63, 14, 13, 60, 12, 61, 62, 15, 11, 58, 57, 8, 56, 9, 10, 59,
+ 10, 59, 56, 9, 57, 8, 11, 58, 62, 15, 12, 61, 13, 60, 63, 14,
+ 9, 56, 59, 10, 58, 11, 8, 57, 61, 12, 15, 62, 14, 63, 60, 13,
+ 60, 13, 14, 63, 15, 62, 61, 12, 8, 57, 58, 11, 59, 10, 9, 56,
+ 8, 57, 58, 11, 59, 10, 9, 56, 60, 13, 14, 63, 15, 62, 61, 12,
+ 61, 12, 15, 62, 14, 63, 60, 13, 9, 56, 59, 10, 58, 11, 8, 57,
+ 62, 15, 12, 61, 13, 60, 63, 14, 10, 59, 56, 9, 57, 8, 11, 58,
+ 11, 58, 57, 8, 56, 9, 10, 59, 63, 14, 13, 60, 12, 61, 62, 15,
+ 31, 46, 45, 28, 44, 29, 30, 47, 43, 26, 25, 40, 24, 41, 42, 27,
+ 42, 27, 24, 41, 25, 40, 43, 26, 30, 47, 44, 29, 45, 28, 31, 46,
+ 41, 24, 27, 42, 26, 43, 40, 25, 29, 44, 47, 30, 46, 31, 28, 45,
+ 28, 45, 46, 31, 47, 30, 29, 44, 40, 25, 26, 43, 27, 42, 41, 24,
+ 40, 25, 26, 43, 27, 42, 41, 24, 28, 45, 46, 31, 47, 30, 29, 44,
+ 29, 44, 47, 30, 46, 31, 28, 45, 41, 24, 27, 42, 26, 43, 40, 25,
+ 30, 47, 44, 29, 45, 28, 31, 46, 42, 27, 24, 41, 25, 40, 43, 26,
+ 43, 26, 25, 40, 24, 41, 42, 27, 31, 46, 45, 28, 44, 29, 30, 47
+ }
+};
+
+// table to extract the lower 4 bit from hamm24/18 encoded bytes
+
+
+static char hamm24val[256] =
+{
+ 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
+ 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3,
+ 4, 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, 4, 5, 5, 5, 5,
+ 6, 6, 6, 6, 7, 7, 7, 7, 6, 6, 6, 6, 7, 7, 7, 7,
+ 8, 8, 8, 8, 9, 9, 9, 9, 8, 8, 8, 8, 9, 9, 9, 9,
+ 10, 10, 10, 10, 11, 11, 11, 11, 10, 10, 10, 10, 11, 11, 11, 11,
+ 12, 12, 12, 12, 13, 13, 13, 13, 12, 12, 12, 12, 13, 13, 13, 13,
+ 14, 14, 14, 14, 15, 15, 15, 15, 14, 14, 14, 14, 15, 15, 15, 15,
+ 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1,
+ 2, 2, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 3,
+ 4, 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, 4, 5, 5, 5, 5,
+ 6, 6, 6, 6, 7, 7, 7, 7, 6, 6, 6, 6, 7, 7, 7, 7,
+ 8, 8, 8, 8, 9, 9, 9, 9, 8, 8, 8, 8, 9, 9, 9, 9,
+ 10, 10, 10, 10, 11, 11, 11, 11, 10, 10, 10, 10, 11, 11, 11, 11,
+ 12, 12, 12, 12, 13, 13, 13, 13, 12, 12, 12, 12, 13, 13, 13, 13,
+ 14, 14, 14, 14, 15, 15, 15, 15, 14, 14, 14, 14, 15, 15, 15, 15
+};
+
+// mapping from parity checks made by table hamm24par to error
+// results return by hamm24.
+// (0 = no error, 0x0100 = single bit error, 0x1000 = double error)
+
+
+static short hamm24err[64] =
+{
+ 0x0000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
+ 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
+ 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
+ 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000, 0x1000,
+};
+
+// mapping from parity checks made by table hamm24par to faulty bit
+// in the decoded 18 bit word.
+
+
+static int hamm24cor[64] =
+{
+ 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000,
+ 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000,
+ 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000,
+ 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000,
+ 0x00000, 0x00000, 0x00000, 0x00001, 0x00000, 0x00002, 0x00004, 0x00008,
+ 0x00000, 0x00010, 0x00020, 0x00040, 0x00080, 0x00100, 0x00200, 0x00400,
+ 0x00000, 0x00800, 0x01000, 0x02000, 0x04000, 0x08000, 0x10000, 0x20000,
+ 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000, 0x00000,
+};
+
+
+int hamm8(u8 *p, int *err)
+{
+ int a = hammtab[p[0]];
+ *err += a;
+ return a & 15;
+}
+
+
+int hamm16(u8 *p, int *err)
+{
+ int a = hammtab[p[0]];
+ int b = hammtab[p[1]];
+ *err += a;
+ *err += b;
+ return (a & 15) | (b & 15) * 16;
+}
+
+
+int hamm24(u8 *p, int *err)
+{
+ int e = hamm24par[0][p[0]] ^ hamm24par[1][p[1]] ^ hamm24par[2][p[2]];
+ int x = hamm24val[p[0]] + p[1] % 128 * 16 + p[2] % 128 * 2048;
+ *err += hamm24err[e];
+ return x ^ hamm24cor[e];
+}
+
+
+int chk_parity(u8 *p, int n)
+{
+ int err;
+ for (err = 0; n--; p++)
+ if (hamm24par[0][*p] & 32)
+ *p &= 0x7f;
+ else
+ *p = BAD_CHAR, err++;
+ return err;
+}
diff --git a/util/alevt/hamm.h b/util/alevt/hamm.h
new file mode 100644
index 0000000..3b8c8ad
--- /dev/null
+++ b/util/alevt/hamm.h
@@ -0,0 +1,7 @@
+#ifndef HAMM_H
+#define HAMM_H
+int hamm8(u8 *p, int *err);
+int hamm16(u8 *p, int *err);
+int hamm24(u8 *p, int *err);
+int chk_parity(u8 *p, int n);
+#endif
diff --git a/util/alevt/help.c b/util/alevt/help.c
new file mode 100644
index 0000000..b867855
--- /dev/null
+++ b/util/alevt/help.c
@@ -0,0 +1,83 @@
+#include "vt.h"
+#include "misc.h"
+
+#define VFILL " "
+#define HELP_HEADER \
+"........\6AleVT Online Help System ", \
+" \22`p0`0 p `0pppp ", \
+"\4\35\22\177 \177j5`p \177 j5 j5 \7 Version \34", \
+"\4\35\22\177,\177j5\177.! +t>! j5 \7"VFILL VERSION" \34", \
+" \22# #\42!\42# \42 \42! ",
+#define FLOF_DATA \
+ 1, { {0x100,ANY_SUB}, {0x200,ANY_SUB}, {0x300,ANY_SUB}, \
+ {0x400,ANY_SUB}, {0x0ff,ANY_SUB}, {0x100,ANY_SUB} }
+
+
+struct vt_page help_pages[] =
+{
+ { 0x900, 0, -1, 0, 0, (1<<26)-1, {
+#include "vt900.out"
+ }, FLOF_DATA },
+
+ { 0x901, 1, -1, 0, 0, (1<<26)-1, {
+#include "vt901.out"
+ }, FLOF_DATA },
+
+ { 0x902, 1, -1, 0, 0, (1<<26)-1, {
+#include "vt902.out"
+ }, FLOF_DATA },
+
+ { 0x903, 1, -1, 0, 0, (1<<26)-1, {
+#include "vt903.out"
+ }, FLOF_DATA },
+
+ { 0x904, 1, -1, 0, 0, (1<<26)-1, {
+#include "vt904.out"
+ }, FLOF_DATA },
+
+ { 0x905, 2, -1, 0, 0, (1<<26)-1, {
+#include "vt905.out"
+ }, FLOF_DATA },
+
+ { 0x906, 1, -1, 0, 0, (1<<26)-1, {
+#include "vt906.out"
+ }, FLOF_DATA },
+
+ { 0x907, 2, -1, 0, 0, (1<<26)-1, {
+#include "vt907.out"
+ }, FLOF_DATA },
+
+ { 0x908, 1, -1, 0, 0, (1<<26)-1, {
+#include "vt908.out"
+ }, FLOF_DATA },
+
+ { 0x909, 0, -1, 0, 0, (1<<26)-1, {
+#include "vt909.out"
+ }, FLOF_DATA },
+
+ { 0x910, 2, -1, 0, 0, (1<<26)-1, {
+#include "vt910.out"
+ }, FLOF_DATA },
+
+ { 0x911, 1, -1, 0, 0, (1<<26)-1, {
+#include "vt911.out"
+ }, FLOF_DATA },
+
+ { 0x912, 2, -1, 0, 0, (1<<26)-1, {
+#include "vt912.out"
+ }, FLOF_DATA },
+
+ { 0x913, 1, -1, 0, 0, (1<<26)-1, {
+#include "vt913.out"
+ }, FLOF_DATA },
+
+ { 0x914, 0, -1, 0, 0, (1<<26)-1, {
+#include "vt914.out"
+ }, FLOF_DATA },
+
+ { 0x915, 0, -1, 0, 0, (1<<26)-1, {
+#include "vt915.out"
+ }, FLOF_DATA },
+};
+
+const int nr_help_pages = NELEM(help_pages);
diff --git a/util/alevt/help.h b/util/alevt/help.h
new file mode 100644
index 0000000..5df47fc
--- /dev/null
+++ b/util/alevt/help.h
@@ -0,0 +1,8 @@
+#ifndef HELP_H
+#define HELP_H
+
+#include "vt.h"
+
+extern struct vt_page help_pages[];
+extern const int nr_help_pages;
+#endif
diff --git a/util/alevt/icon.xbm b/util/alevt/icon.xbm
new file mode 100644
index 0000000..27255a4
--- /dev/null
+++ b/util/alevt/icon.xbm
@@ -0,0 +1,17 @@
+#define icon_width 58
+#define icon_height 20
+static unsigned char icon_bits[] = {
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x03, 0x0f, 0x30, 0xfe, 0xff, 0xf8, 0x11, 0x00, 0x03,
+ 0x0f, 0x30, 0xfe, 0xff, 0xf8, 0x11, 0x00, 0x03, 0xc5, 0x23, 0xaa, 0xaa,
+ 0xa8, 0xf1, 0xf1, 0x03, 0xc6, 0x22, 0xfe, 0xd5, 0x58, 0xb1, 0xb1, 0x02,
+ 0x45, 0x23, 0x06, 0xaa, 0xa8, 0x51, 0x51, 0x01, 0xc6, 0x22, 0x06, 0xd6,
+ 0x58, 0xb1, 0xb1, 0x02, 0x45, 0x23, 0x62, 0xac, 0xa8, 0x51, 0x51, 0x01,
+ 0xc6, 0x22, 0x62, 0xd4, 0x58, 0xb1, 0xb1, 0x02, 0x45, 0x23, 0x62, 0xac,
+ 0xa8, 0x51, 0x51, 0x01, 0xc6, 0x23, 0x62, 0xd4, 0xf8, 0xb1, 0xb1, 0x02,
+ 0x05, 0x20, 0x02, 0xae, 0x61, 0x58, 0x51, 0x01, 0x06, 0x20, 0x02, 0x56,
+ 0x61, 0xa8, 0xb1, 0x02, 0xc5, 0x23, 0xe2, 0xab, 0x06, 0x56, 0x51, 0x01,
+ 0x46, 0x22, 0xe2, 0x57, 0x05, 0xaa, 0xb1, 0x02, 0xc7, 0x23, 0x06, 0xfe,
+ 0x9f, 0xff, 0xf1, 0x03, 0xc7, 0x23, 0x06, 0xfe, 0x9f, 0xff, 0xf1, 0x03,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0x03, };
diff --git a/util/alevt/lang.c b/util/alevt/lang.c
new file mode 100644
index 0000000..3a49307
--- /dev/null
+++ b/util/alevt/lang.c
@@ -0,0 +1,393 @@
+#include <string.h>
+#include <ctype.h>
+#include "misc.h"
+#include "vt.h"
+#include "lang.h"
+
+int latin1 = -1;
+
+
+static u8 lang_char[256];
+static u8 lang_chars[1+8+8][16] =
+{
+ { 0, 0x23,0x24,0x40,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x7b,0x7c,0x7d,0x7e },
+
+ // for latin-1 font
+ // English (100%)
+ { 0, '£', '$', '@', '«', '½', '»', '¬', '#', '­', '¼', '¦', '¾', '÷' },
+ // German (100%)
+ { 0, '#', '$', '§', 'Ä', 'Ö', 'Ü', '^', '_', '°', 'ä', 'ö', 'ü', 'ß' },
+ // Swedish/Finnish/Hungarian (100%)
+ { 0, '#', '¤', 'É', 'Ä', 'Ö', 'Å', 'Ü', '_', 'é', 'ä', 'ö', 'å', 'ü' },
+ // Italian (100%)
+ { 0, '£', '$', 'é', '°', 'ç', '»', '¬', '#', 'ù', 'à', 'ò', 'è', 'ì' },
+ // French (100%)
+ { 0, 'é', 'ï', 'à', 'ë', 'ê', 'ù', 'î', '#', 'è', 'â', 'ô', 'û', 'ç' },
+ // Portuguese/Spanish (100%)
+ { 0, 'ç', '$', '¡', 'á', 'é', 'í', 'ó', 'ú', '¿', 'ü', 'ñ', 'è', 'à' },
+ // Czech/Slovak (60%)
+ { 0, '#', 'u', 'c', 't', 'z', 'ý', 'í', 'r', 'é', 'á', 'e', 'ú', 's' },
+ // reserved (English mapping)
+ { 0, '£', '$', '@', '«', '½', '»', '¬', '#', '­', '¼', '¦', '¾', '÷' },
+
+ // for latin-2 font
+ // Polish (100%)
+ { 0, '#', 'ñ', '±', '¯', '¦', '£', 'æ', 'ó', 'ê', '¿', '¶', '³', '¼' },
+ // German (100%)
+ { 0, '#', '$', '§', 'Ä', 'Ö', 'Ü', '^', '_', '°', 'ä', 'ö', 'ü', 'ß' },
+ // Estonian (100%)
+ { 0, '#', 'õ', '©', 'Ä', 'Ö', '®', 'Ü', 'Õ', '¹', 'ä', 'ö', '¾', 'ü' },
+ // Lettish/Lithuanian (90%)
+ { 0, '#', '$', '©', 'ë', 'ê', '®', 'è', 'ü', '¹', '±', 'u', '¾', 'i' },
+ // French (90%)
+ { 0, 'é', 'i', 'a', 'ë', 'ì', 'u', 'î', '#', 'e', 'â', 'ô', 'u', 'ç' },
+ // Serbian/Croation/Slovenian (100%)
+ { 0, '#', 'Ë', 'È', 'Æ', '®', 'Ð', '©', 'ë', 'è', 'æ', '®', 'ð', '¹' },
+ // Czech/Slovak (100%)
+ { 0, '#', 'ù', 'è', '»', '¾', 'ý', 'í', 'ø', 'é', 'á', 'ì', 'ú', '¹' },
+ // Rumanian (95%)
+ { 0, '#', '¢', 'Þ', 'Â', 'ª', 'Ã', 'Î', 'i', 'þ', 'â', 'º', 'ã', 'î' },
+};
+
+/* Yankable latin charset :-)
+ !"#$%&'()*+,-./0123456789:;<=>?
+ @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
+ `abcdefghijklmnopqrstuvwxyz{|}~
+ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿
+ ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß
+ àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
+*/
+
+
+static struct mark { u8 *g0, *latin1, *latin2; } marks[16] =
+{
+ /* none */ { "#",
+ "¤",
+ "$" },
+ /* grave - ` */ { " aeiouAEIOU",
+ "`àèìòùÀÈÌÒÙ",
+ "`aeiouAEIOU" },
+ /* acute - ' */ { " aceilnorsuyzACEILNORSUYZ",
+ "'ácéílnórsúýzÁCÉÍLNÓRSÚÝZ",
+ "'áæéíåñóà¶úý¼ÁÆÉÍÅÑÓÀ¦Úݬ" },
+ /* cirumflex - ^ */ { " aeiouAEIOU",
+ "^âêîôûÂÊÎÔÛ",
+ "^âeîôuÂEÎÔU" },
+ /* tilde - ~ */ { " anoANO",
+ "~ãñõÃÑÕ",
+ "~anoANO" },
+ /* ??? - ¯ */ { "",
+ "",
+ "" },
+ /* breve - u */ { "aA",
+ "aA",
+ "ãÃ" },
+ /* abovedot - · */ { "zZ",
+ "zZ",
+ "¿¯" },
+ /* diaeresis ¨ */ { "aeiouAEIOU",
+ "äëïöüÄËÏÖÜ",
+ "äëiöüÄËIÖÜ" },
+ /* ??? - . */ { "",
+ "",
+ "" },
+ /* ringabove - ° */ { " auAU",
+ "°åuÅU",
+ "°aùAÙ" },
+ /* cedilla - ¸ */ { "cstCST",
+ "çstÇST",
+ "çºþǪÞ" },
+ /* ??? - _ */ { " ",
+ "_",
+ "_" },
+ /* dbl acute - " */ { " ouOU",
+ "\"ouOU",
+ "\"õûÕÛ" },
+ /* ogonek - \, */ { "aeAE",
+ "aeAE",
+ "±ê¡Ê" },
+ /* caron - v */ { "cdelnrstzCDELNRSTZ",
+ "cdelnrstzCDELNRSTZ",
+ "èïìµòø¹»¾ÈÏÌ¥ÒØ©«®" },
+};
+
+
+static u8 g2map_latin1[] =
+ /*0123456789abcdef*/
+ " ¡¢£$¥#§¤'\"« "
+ "°±²³×µ¶·÷'\"»¼½¾¿"
+ " `´^~ ¨.°¸_\" "
+ "_¹®© "
+ " ÆЪH ILLØ ºÞTNn"
+ "Kædðhiillø ßþtn\x7f";
+
+
+static u8 g2map_latin2[] =
+ /*0123456789abcdef*/
+ " icL$Y#§¤'\"< "
+ "° ×u ÷'\"> "
+ " `´^~ ¢ÿ¨.°¸_½²·"
+ "- RC "
+ " ÐaH iL£O opTNn"
+ "K ðdhiil³o ßptn\x7f";
+
+
+void lang_init(void)
+{
+ int i;
+
+ memset(lang_char, 0, sizeof(lang_char));
+ for (i = 1; i <= 13; i++)
+ lang_char[lang_chars[0][i]] = i;
+}
+
+
+void conv2latin(u8 *p, int n, int lang)
+{
+ int c, gfx = 0, lat=0;
+
+ if ((latin1 == KOI8) && lang==12) { /* russian */
+ while (n--) {
+ c=*p;
+
+ if(c==0x1b) lat = !lat; /* ESC switches languages inside page */
+
+ if ( is_koi(c)) {
+ if (not gfx || (c & 0xa0) != 0x20) {
+ if(!lat) conv2koi8(p);
+ }
+ }
+ else if ((c & 0xe8) == 0)
+ gfx = c & 0x10;
+ p++;
+ }
+ }
+else if ((latin1 == GREEK) && lang==15) { /* Hellas */
+ while (n--) {
+ c=*p;
+
+ if(c==0x1b) lat = !lat; /* ESC switches languages inside page */
+
+ if ( is_greek(c)) {
+ if (not gfx || (c & 0xa0) != 0x20) {
+ if(!lat) conv2greek(p);
+ }
+ }
+ else if ((c & 0xe8) == 0)
+ gfx = c & 0x10;
+ p++;
+ }
+ }
+
+ else {
+ while (n--)
+ {
+ if (lang_char[c = *p])
+ {
+ if (not gfx || (c & 0xa0) != 0x20)
+ *p = lang_chars[lang + 1][lang_char[c]];
+ }
+ else if ((c & 0xe8) == 0)
+ gfx = c & 0x10;
+ p++;
+ }
+ }
+}
+
+
+/* check for Greek chars - needs locale iso8859-7 set */
+int is_greek(int c)
+{
+ if( isalpha(c | 0x80)) return 1;
+ return 0;
+}
+
+
+/* check for russian chars - needs locale KOI8-R set */
+int is_koi(int c)
+{
+ if( isalpha(c | 0x80)) return 1;
+ if( c=='&' ) return 1;
+ return 0;
+}
+
+
+/* teletext to koi8-r conversion */
+void conv2koi8(u8 *p)
+{
+ u8 c;
+ static u8 l2koi[]={
+ 0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9,
+ 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF, 0xF0, 0xF1, 0xF2, 0xF3,
+ 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xFF, 0xFA, 0xFB, 0xFC, 0xFD,
+ 0xFE, 0xF9, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,
+ 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1,
+ 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xDB,
+ 0xDC, 0xDD, 0xDE, 0xDF
+ };
+
+ c= *p;
+ if ( (c >= 0x40) && (c <= 0x7f)) *p=l2koi[(c & 0x7f) - 0x40];
+ if (c=='&') *p='Ù';
+}
+
+
+/* teletext to iso8859-7 conversion */
+void conv2greek(u8 *p)
+{
+ u8 c;
+ static u8 l2greek[]={
+/* 1 @ 0x40->ú*/0xc0,
+/* 2 A 0x41->Á*/0xc1,
+/* 3 B 0x42->Â*/0xc2,
+/* 4 C 0x43->Ã*/0xc3,
+/* 5 D 0x44->Ä*/0xc4,
+/* 6 E 0x45->Å*/0xc5,
+/* 7 F 0x46->Æ*/0xc6,
+/* 8 G 0x47->Ç*/0xc7,
+/* 9 H 0x48->È*/0xc8,
+/*10 I 0x49->É*/0xc9,
+/*11 J 0x4a->Ê*/0xca,
+/*12 K 0x4b->Ë*/0xcb,
+/*13 L 0x4c->Ì*/0xcc,
+/*14 M 0x4d->Í*/0xcd,
+/*15 N 0x4e->Î*/0xce,
+/*16 O 0x4f->Ï*/0xcf,
+/*17 P 0x50->Ð*/0xd0,
+/*18 Q 0x51->Ñ*/0xd1,
+/*19 R 0x52->?*/0x52,
+/*20 S 0x53->Ó*/0xd3,
+/*21 T 0x54->Ô*/0xd4,
+/*22 U 0x55->Õ*/0xd5,
+/*23 V 0x56->Ö*/0xd6,
+/*24 W 0x57->÷*/0xd7,
+/*25 X 0x58->Ø*/0xd8,
+/*26 Y 0x59->Ù*/0xd9,
+/*27 Z 0x5a->?*/0x5a,
+/*28 [ 0x5b->?*/0x5b,
+/*!29 \ 0x5c->Ü*/0xdc,
+/*!30 ] 0x5d->Ý*/0xdd,
+/*!31 ^ 0x5e->Þ*/0xde,
+/*!32 _ 0x5f->ß*/0xdf,
+/*33 ` 0x60->?*/0x60,
+/*!34 a 0x61->á*/0xe1,
+/*!35 b 0x62->â*/0xe2,
+/*!36 c 0x63->ã*/0xe3,
+/*!37 d 0x64->ä*/0xe4,
+/*!38 e 0x65->å*/0xe5,
+/*!39 f 0x66->æ*/0xe6,
+/*!40 g 0x67->ç*/0xe7,
+/*!41 h 0x68->è*/0xe8,
+/*!42 i 0x69->é*/0xe9,
+/*!43 j 0x6a->ê*/0xea,
+/*!44 k 0x6b->ë*/0xeb,
+/*!45 l 0x6c->ì*/0xec,
+/*!46 m 0x6d->í*/0xed,
+/*!47 n 0x6e->î*/0xee,
+/*!48 o 0x6f->ï*/0xef,
+/*!49 p 0x70->ð*/0xf0,
+/*!50 q 0x71->ñ*/0xf1,
+/*!51 r 0x72->ò*/0xf2,
+/*!52 s 0x73->ó*/0xf3,
+/*!53 t 0x74->ô*/0xf4,
+/*!54 u 0x75->õ*/0xf5,
+/*!55 v 0x76->ö*/0xf6,
+/*!56 w 0x77->÷*/0xf7,
+/*!57 x 0x78->ø*/0xf8,
+/*!58 y 0x79->ù*/0xf9,
+/*59 z 0x7a->ú(ìå ôüíï)*/0xc0,
+/*60 { 0x7b->?*/0x7b,
+/*!61 | 0x7c->ü*/0xfc,
+/*!62 } 0x7d->ý*/0xfd,
+/*!63 ~ 0x7e->þ*/0xfe,
+/*64 0x7f->?*/0x7f
+ };
+ c= *p;
+ if ( (c >= 0x40) && (c <= 0x7f)) *p=l2greek[(c & 0x7f) - 0x40];
+}
+
+
+void init_enhance(struct enhance *eh)
+{
+ eh->next_des = 0;
+}
+
+
+void add_enhance(struct enhance *eh, int dcode, u32 *t)
+{
+
+ if (dcode == eh->next_des)
+ {
+ memcpy(eh->trip + dcode * 13, t, 13 * sizeof(*t));
+ eh->next_des++;
+ }
+ else
+ eh->next_des = -1;
+}
+
+
+void enhance(struct enhance *eh, struct vt_page *vtp)
+{
+ int row = 0;
+ u32 *p, *e;
+
+ if (eh->next_des < 1)
+ return;
+
+ for (p = eh->trip, e = p + eh->next_des * 13; p < e; p++)
+ if (*p % 2048 != 2047)
+ {
+ int adr = *p % 64;
+ int mode = *p / 64 % 32;
+ int data = *p / 2048 % 128;
+
+ if (adr < 40)
+ {
+ // col functions
+ switch (mode)
+ {
+ case 15: // char from G2 set
+ if (adr < W && row < H)
+ if (latin1==LATIN1)
+ vtp->data[row][adr] = g2map_latin1[data-32];
+ else if (latin1==LATIN2)
+ vtp->data[row][adr] = g2map_latin2[data-32];
+ break;
+ case 16 ... 31: // char from G0 set with diacritical mark
+ if (adr < W && row < H)
+ {
+ struct mark *mark = marks + (mode - 16);
+ u8 *x;
+
+ if (x = strchr(mark->g0, data))
+ if (latin1==LATIN1)
+ data = mark->latin1[x - mark->g0];
+ else if (latin1==LATIN2)
+ data = mark->latin2[x - mark->g0];
+ vtp->data[row][adr] = data;
+ }
+ break;
+ }
+ }
+ else
+ {
+ // row functions
+ if ((adr -= 40) == 0)
+ adr = 24;
+
+ switch (mode)
+ {
+ case 1: // full row color
+ row = adr;
+ break;
+ case 4: // set active position
+ row = adr;
+ break;
+ case 7: // address row 0 (+ full row color)
+ if (adr == 23)
+ row = 0;
+ break;
+ }
+ }
+ }
+}
diff --git a/util/alevt/lang.h b/util/alevt/lang.h
new file mode 100644
index 0000000..531f3b0
--- /dev/null
+++ b/util/alevt/lang.h
@@ -0,0 +1,28 @@
+#ifndef LANG_H
+#define LANG_H
+
+#include "misc.h"
+#include "vt.h"
+
+extern int latin1;
+
+#define LATIN1 1
+#define LATIN2 2
+#define KOI8 3
+#define GREEK 4
+
+
+struct enhance
+{
+ int next_des; // next expected designation code
+ u32 trip[13*16]; // tripplets
+};
+
+void lang_init(void);
+void conv2latin(u8 *p, int n, int lang);
+void conv2koi8(u8 *p);
+void conv2greek(u8 *p);
+void init_enhance(struct enhance *eh);
+void add_enhance(struct enhance *eh, int dcode, u32 *data);
+void enhance(struct enhance *eh, struct vt_page *vtp);
+#endif
diff --git a/util/alevt/main.c b/util/alevt/main.c
new file mode 100644
index 0000000..31fe9c3
--- /dev/null
+++ b/util/alevt/main.c
@@ -0,0 +1,221 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <locale.h>
+#include "vt.h"
+#include "misc.h"
+#include "fdset.h"
+#include "xio.h"
+#include "vbi.h"
+#include "lang.h"
+#include "cache.h"
+#include "ui.h"
+
+static char *geometry;
+static char *dpy_name;
+static char *vbi_name = NULL;
+static struct xio *xio;
+static struct vbi *vbi;
+static int erc = 1;
+char *outfile = "";
+static char *channel;
+static int ttpid = -1;
+u_int16_t sid = 0;
+
+
+static void usage(FILE *fp, int exitval)
+{
+ fprintf(fp, "\nUsage: %s [options]\n", prgname);
+ fprintf(fp,
+ "\n"
+ " Valid options:\t\tDefault:\n"
+ " -c <channel name>\t\t(none;dvb only)\n"
+ " -ch -child <ppp.ss>\t\t(none)\n"
+ " -cs -charset\t\tlatin-1\n"
+ " <latin-1/2/koi8-r/iso8859-7>\n"
+ " -h -help\n"
+ " -o <outfile>\t\t(none;dvb only)\n"
+ " -p -parent <ppp.ss>\t\t900\n"
+ " -s -sid <sid>\t\t(none;dvb only)\n"
+ " -t -ttpid <ttpid>\t\t(none;dvb only)\n"
+ " -v -vbi <vbidev>\t\t/dev/vbi\n"
+ " \t\t/dev/vbi0\n"
+ " \t\t/dev/video0\n"
+ " \t\t/dev/dvb/adapter0/demux0\n"
+ "\n"
+ " ppp.ss stands for a page number and an\n"
+ " optional subpage number (Example: 123.4).\n"
+ "\n"
+ " The -child option requires a parent\n"
+ " window. So it must be preceded by\n"
+ " a parent or another child window.\n"
+ );
+ exit(exitval);
+}
+
+
+static int arg_pgno(char *p, int *subno)
+{
+ char *end;
+ int pgno;
+
+ *subno = ANY_SUB;
+ if (*p)
+ {
+ pgno = strtol(p, &end, 16);
+ if ((*end == ':' || *end == '/' || *end == '.') && end[1])
+ *subno = strtol(end + 1, &end, 16);
+ if (*end == 0)
+ if (pgno >= 0x100 && pgno <= 0x999)
+ if (*subno == ANY_SUB || (*subno >= 0x00 && *subno <= 0x3f7f))
+ return pgno;
+ }
+ fatal("%s: invalid page number", p);
+}
+
+
+static struct vtwin * start(int argc, char **argv, struct vtwin *parent,
+ int pgno, int subno)
+{
+ static int valid_vbi_name = 1;
+
+ if (!valid_vbi_name)
+ return parent;
+
+ if (vbi == 0)
+ vbi = vbi_open(vbi_name, cache_open(), channel, outfile, sid, ttpid);
+ if (vbi == 0)
+ {
+ if (vbi_name)
+ error("cannot open device: %s", vbi_name);
+ valid_vbi_name = 0;
+ vbi = open_null_vbi(cache_open());
+ }
+ if (vbi->cache)
+ vbi->cache->op->mode(vbi->cache, CACHE_MODE_ERC, erc);
+
+ if (xio == 0)
+ xio = xio_open_dpy(dpy_name, argc, argv);
+ if (xio == 0)
+ fatal("cannot open display");
+
+ parent = vtwin_new(xio, vbi, geometry, parent, pgno, subno);
+ if (parent == 0)
+ fatal("cannot create window");
+
+ if (!valid_vbi_name)
+ {
+ if (vbi_name)
+ send_errmsg(vbi, "cannot open device: %s", vbi_name);
+ else
+ send_errmsg(vbi, "cannot open any device", vbi_name);
+ }
+
+ return parent;
+}
+
+
+static int option(int argc, char **argv, int *ind, char **arg)
+{
+ static struct { char *nam, *altnam; int arg; } opts[] = {
+ { "-channel", "-c", 1 },
+ { "-child", "-ch", 1 },
+ { "-charset", "-cs", 1 },
+ { "-help", "-h", 0 },
+ { "-outfile", "-o", 1 },
+ { "-parent", "-p", 1 },
+ { "-sid", "-s", 1 },
+ { "-ttpid", "-t", 1 },
+ { "-vbi", "-v", 1 },
+ };
+ int i;
+ if (*ind >= argc)
+ return 0;
+ *arg = argv[(*ind)++];
+ for (i = 0; i < NELEM(opts); ++i)
+ if (streq(*arg, opts[i].nam) || streq(*arg, opts[i].altnam))
+ {
+ if (opts[i].arg)
+ if (*ind < argc)
+ *arg = argv[(*ind)++];
+ else
+ fatal("option %s requires an argument", *arg);
+ return i+1;
+ }
+ if (**arg == '-')
+ {
+ fatal("%s: invalid option", *arg);
+ usage(stderr, 1);
+ }
+ return -1;
+}
+
+
+int main(int argc, char **argv)
+{
+ struct vtwin *parent = 0;
+ int pgno, subno;
+ int opt, ind;
+ char *arg;
+ sid = 0;
+
+ setprgname(argv[0]);
+ fdset_init(fds);
+
+ ind = 1;
+ while (opt = option(argc, argv, &ind, &arg))
+ switch (opt)
+ {
+
+ case 1: // channel
+ channel = arg;
+ break;
+ case 2: // child
+ if (parent == 0)
+ fatal("-child requires a parent window");
+ pgno = arg_pgno(arg, &subno);
+ parent = start(argc, argv, parent, pgno, subno);
+ geometry = 0;
+ break;
+ case 3: // charset
+ if (streq(arg, "latin-1") || streq(arg, "1"))
+ latin1 = LATIN1;
+ else if (streq(arg, "latin-2") || streq(arg, "2"))
+ latin1 = LATIN2;
+ else if (streq(arg, "koi8-r") || streq(arg, "koi"))
+ latin1 = KOI8;
+ else if (streq(arg, "iso8859-7") || streq(arg, "el"))
+ latin1 = GREEK;
+ else
+ fatal("bad charset (not latin-1/2/koi8-r/iso8859-7)");
+ break;
+ case 4: // help
+ usage(stdout, 0);
+ break;
+ case 5: // outfile
+ outfile = arg;
+ break;
+ case 6: // parent
+ case -1: // non-option arg
+ pgno = arg_pgno(arg, &subno);
+ parent = start(argc, argv, 0, pgno, subno);
+ geometry = 0;
+ break;
+ case 7: // sid
+ sid = strtoul(arg, NULL, 0);
+ break;
+ case 8: // ttpid
+ ttpid = strtoul(arg, NULL, 0);
+ break;
+ case 9: // vbi
+ vbi_name = arg;
+ vbi = 0;
+ parent = 0;
+ break;
+ }
+
+ if (parent == 0)
+ start(argc, argv, 0, 0x900, ANY_SUB);
+ xio_event_loop();
+ exit(0);
+}
diff --git a/util/alevt/misc.c b/util/alevt/misc.c
new file mode 100644
index 0000000..32d0595
--- /dev/null
+++ b/util/alevt/misc.c
@@ -0,0 +1,66 @@
+#include <stdio.h>
+#include <stdarg.h>
+#include "misc.h"
+
+char *prgname = 0;
+
+extern char *strrchr(const char *, int);
+NORETURN(exit(int));
+
+
+void setprgname(char *str)
+{
+ char *x = strrchr(str, '/');
+ prgname = x ? x+1 : str;
+}
+
+
+static void print_prgname(void)
+{
+ if (prgname && *prgname)
+ fprintf(stderr, "%s: ", prgname);
+}
+
+
+void error(const char *str, ...)
+{
+ va_list args;
+ va_start(args, str);
+ print_prgname();
+ vfprintf(stderr, str, args);
+ fputc('\n', stderr);
+}
+
+
+void ioerror(const char *str)
+{
+ print_prgname();
+ perror(str);
+}
+
+
+void fatal(const char *str, ...)
+{
+ va_list args;
+ va_start(args, str);
+ print_prgname();
+ vfprintf(stderr, str, args);
+ fputc('\n', stderr);
+ exit(2);
+}
+
+
+void fatal_ioerror(const char *str)
+{
+ print_prgname();
+ perror(str);
+ exit(2);
+}
+
+
+void out_of_mem(int size)
+{
+ if (size > 0)
+ fatal("out of memory allocating %d bytes.", size);
+ fatal("out of memory.");
+}
diff --git a/util/alevt/misc.h b/util/alevt/misc.h
new file mode 100644
index 0000000..00a71f8
--- /dev/null
+++ b/util/alevt/misc.h
@@ -0,0 +1,32 @@
+#ifndef MISC_H
+#define MISC_H
+#define PTR (void *)
+#define NELEM(x) ((int)(sizeof(x)/sizeof(*(x))))
+#define NORETURN(x) void x __attribute__((__noreturn__))
+#define DEFINE(x) typeof(x) x
+#define OFFSET_OF(type, elem) ((u8 *)&((type *)0)->elem - (u8 *)0)
+#define BASE_OF(type, elem, p) ((type *)((u8 *)(p) - OFFSET_OF(type, elem)))
+
+#define not !
+#define streq(a, b) (strcmp((a), (b)) == 0)
+#define min(a,b) ({ typeof(a) _a = a; typeof(b) _b = b; _a < _b ? _a : _b; })
+#define max(a,b) ({ typeof(a) _a = a; typeof(b) _b = b; _a > _b ? _a : _b; })
+#define bound(a,b,c) ({ typeof(a) _a = a; typeof(b) _b = b; typeof(c) _c = c; \
+ _b < _a ? _a : _b > _c ? _c : _b; })
+
+typedef unsigned char u8;
+typedef unsigned short u16;
+typedef unsigned int u32;
+typedef signed char s8;
+typedef signed short s16;
+typedef signed int s32;
+
+extern char *prgname;
+void setprgname(char *argv_0);
+
+NORETURN(fatal(const char *str, ...));
+NORETURN(fatal_ioerror(const char *str));
+NORETURN(out_of_mem(int size));
+void error(const char *str, ...);
+void ioerror(const char *str);
+#endif
diff --git a/util/alevt/os.h b/util/alevt/os.h
new file mode 100644
index 0000000..50b7662
--- /dev/null
+++ b/util/alevt/os.h
@@ -0,0 +1,7 @@
+#ifndef OS_H
+#define OS_H
+#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBsd__) \
+ || defined(__bsdi__)
+#define BSD
+#endif
+#endif
diff --git a/util/alevt/search.c b/util/alevt/search.c
new file mode 100644
index 0000000..082cefb
--- /dev/null
+++ b/util/alevt/search.c
@@ -0,0 +1,127 @@
+#include <sys/types.h> // for freebsd
+#include <stdlib.h>
+#include "vt.h"
+#include "misc.h"
+#include "cache.h"
+#include "search.h"
+
+
+static void convert(u8 *p, u8 *buf, int *line)
+{
+ int x, y, c, ch, gfx, hid = 0;
+
+ for (y = 1, p += 40; y < 25; ++y)
+ {
+ if (not hid)
+ {
+ gfx = 0;
+ for (x = 0; x < 40; ++x)
+ {
+ c = ' ';
+ switch (ch = *p++)
+ {
+ case 0x00 ... 0x07:
+ gfx = 0;
+ break;
+ case 0x10 ... 0x17:
+ gfx = 1;
+ break;
+ case 0x0c:
+ hid = 1;
+ break;
+ case 0x7f:
+ c = '*';
+ break;
+ case 0x20 ... 0x7e:
+ if (gfx && ch != ' ' && (ch & 0xa0) == 0x20)
+ ch = '#';
+ case 0xa0 ... 0xff:
+ c= ch;
+ }
+ *buf++ = c;
+ }
+ *buf++ = '\n';
+ *line++ = y;
+ }
+ else
+ {
+ p += 40;
+ hid = 0;
+ }
+ }
+ *line = y;
+ *buf = 0;
+}
+
+
+static int search_pg(struct search *s, struct vt_page *vtp)
+{
+ regmatch_t m[1];
+ u8 buf[H *(W+1) + 1];
+ int line[H];
+
+ convert(PTR vtp->data, buf, line);
+ if (regexec(s->pattern, buf, 1, m, 0) == 0)
+ {
+ s->len = 0;
+ if (m->rm_so >= 0)
+ {
+ s->y = line[m->rm_so / (W+1)];
+ s->x = m->rm_so % (W+1);
+ s->len = m->rm_eo - m->rm_so;
+ if (s->x + s->len > 40)
+ s->len = 40 - s->x;
+ }
+ return 1;
+ }
+ return 0;
+}
+
+
+struct search * search_start(struct cache *ca, u8 *pattern)
+{
+ struct search *s;
+ int f = 0;
+
+ if (not(s = malloc(sizeof(*s))))
+ goto fail1;
+
+ if (pattern[0] == '!')
+ pattern++;
+ else
+ f = REG_ICASE;
+
+ if (regcomp(s->pattern, pattern, f | REG_NEWLINE) != 0)
+ goto fail2;
+
+ s->cache = ca;
+ return s;
+
+fail2:
+ free(s);
+fail1:
+ return 0;
+}
+
+
+void search_end(struct search *s)
+{
+ regfree(s->pattern);
+ free(s);
+}
+
+
+int search_next(struct search *s, int *pgno, int *subno, int dir)
+{
+ struct vt_page *vtp = 0;
+
+ if (s->cache)
+ vtp = s->cache->op->foreach_pg(s->cache, *pgno, *subno, dir,
+ search_pg, s);
+ if (vtp == 0)
+ return -1;
+
+ *pgno = vtp->pgno;
+ *subno = vtp->subno ?: ANY_SUB;
+ return 0;
+}
diff --git a/util/alevt/search.h b/util/alevt/search.h
new file mode 100644
index 0000000..c7e813a
--- /dev/null
+++ b/util/alevt/search.h
@@ -0,0 +1,16 @@
+#ifndef SEARCH_H
+#define SEARCH_H
+
+#include <regex.h>
+
+struct search
+{
+ struct cache *cache;
+ regex_t pattern[1];
+ int x, y, len; // the position of the match
+};
+
+struct search *search_start(struct cache *ca, u8 *pattern);
+void search_end(struct search *s);
+int search_next(struct search *s, int *pgno, int *subno, int dir);
+#endif
diff --git a/util/alevt/ui.c b/util/alevt/ui.c
new file mode 100644
index 0000000..70391c7
--- /dev/null
+++ b/util/alevt/ui.c
@@ -0,0 +1,721 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <stdarg.h>
+#include "vt.h"
+#include "misc.h"
+#include "xio.h"
+#include "vbi.h"
+#include "fdset.h"
+#include "search.h"
+#include "export.h"
+#include "ui.h"
+
+static void vtwin_event(struct vtwin *w, struct vt_event *ev);
+static void msg(struct vtwin *w, u8 *str, ...);
+static void err(struct vtwin *w, u8 *str, ...);
+
+#define hist(w,o) ((w)->hist + (((w)->hist_top + (o)) & (N_HISTORY-1)))
+
+
+static int inc_hex(int i, int bcd_mode)
+{
+ i++;
+ if (bcd_mode)
+ {
+ if ((i & 0x000f) > 0x0009)
+ i = (i + 0x0010) & 0x0ff0;
+ if ((i & 0x00f0) > 0x090)
+ i = (i + 0x0100) & 0x0f00;
+ if ((i & 0x0f00) > 0x0900)
+ i = (i + 0x1000) & 0xf000;
+ }
+ return i;
+}
+
+
+static int dec_hex(int i, int bcd_mode)
+{
+ i--;
+ if (bcd_mode)
+ {
+ if ((i & 0x000f) > 0x0009)
+ i = (i & 0xfff0) + 0x0009;
+ if ((i & 0x00f0) > 0x0090)
+ i = (i & 0xff00) + 0x0099;
+ if ((i & 0x0f00) > 0x0900)
+ i = (i & 0xf000) + 0x0999;
+ }
+ return i;
+}
+
+
+static void set_title(struct vtwin *w)
+{
+ char buf[32], buf2[32];
+
+ if (w->subno == ANY_SUB)
+ sprintf(buf, "%x", w->pgno);
+ else
+ sprintf(buf, "%x/%x", w->pgno, w->subno);
+ if (w->searching)
+ sprintf(buf2, "(%s)", buf);
+ else
+ sprintf(buf2, "%s", buf);
+ xio_title(w->xw, buf2);
+}
+
+
+static void query_page(struct vtwin *w, int pgno, int subno)
+{
+ w->pgno = pgno;
+ w->subno = subno;
+ w->searching = 1;
+ w->hold = 0; //subno != ANY_SUB;
+ xio_set_concealed(w->xw, w->revealed = 0);
+
+ if (hist(w, 0)->pgno != pgno ||
+ (hist(w,0)->subno == ANY_SUB && subno != ANY_SUB))
+ w->hist_top++;
+ hist(w, 0)->pgno = pgno;
+ hist(w, 0)->subno = subno;
+ hist(w, 1)->pgno = 0; // end marker
+
+ xio_cancel_selection(w->xw);
+ if (vbi_query_page(w->vbi, pgno, subno) == 0)
+ {
+ w->vtp = 0;
+ }
+ set_title(w);
+}
+
+
+static void new_or_query(struct vtwin *w, int pgno, int subno, int new_win)
+{
+ if (new_win)
+ {
+ if (w->child)
+ query_page(w->child, pgno, subno);
+ else
+ vtwin_new(w->xw->xio, w->vbi, 0, w, pgno, subno);
+ }
+ else
+ query_page(w, pgno, subno);
+}
+
+static int _next_pgno(int *arg, struct vt_page *vtp)
+{
+ int pgno = vtp->pgno;
+
+ if (arg[0] == pgno) // want different page
+ return 0;
+ if (arg[1]) // and not a hex page
+ for (; pgno; pgno >>=4)
+ if ((pgno & 15) > 9)
+ return 0;
+ return 1;
+}
+
+
+static int _next_subno(int *arg, struct vt_page *vtp)
+{
+ return vtp->pgno == arg[0]; // only subpages of this page
+}
+
+
+static void do_next_pgno(struct vtwin *w, int dir, int bcd_mode, int subs,
+ int new_win)
+{
+ struct vt_page *vtp;
+ struct vtwin *cw = (new_win && w->child) ? w->child : w;
+ int pgno = cw->pgno;
+ int subno = cw->subno;
+
+ if (w->vbi->cache)
+ {
+ int arg[2];
+ arg[0] = pgno;
+ arg[1] = bcd_mode;
+ if (vtp = w->vbi->cache->op->foreach_pg(w->vbi->cache,
+ pgno, subno, dir, subs ? _next_subno:_next_pgno, &arg))
+ {
+ new_or_query(w, vtp->pgno, subs ? vtp->subno : ANY_SUB, new_win);
+ return;
+ }
+ }
+ err(w, "No page.");
+}
+
+#define notdigit(x) (not isdigit((x)))
+
+
+static int chk_screen_fromto(u8 *p, int x, int *n1, int *n2)
+{
+ p += x;
+
+ if (x >= 0 && x+5 < 42)
+ if (notdigit(p[1]) || notdigit(p[0]))
+ if (isdigit(p[2]))
+ if (p[3] == '/' || p[3] == ':')
+ if (isdigit(p[4]))
+ if (notdigit(p[5]) || notdigit(p[6])) /* p[6] is save here */
+ {
+ *n1 = p[2] % 16;
+ if (isdigit(p[1]))
+ *n1 += p[1] % 16 * 16;
+ *n2 = p[4] % 16;
+ if (isdigit(p[5]))
+ *n2 = *n2 * 16 + p[5] % 16;
+ return 1;
+ }
+ return 0;
+}
+
+
+static int chk_screen_pgno(u8 *p, int x, int *pgno, int *subno)
+{
+ p += x;
+
+ if (x >= 0 && x+4 < 42)
+ if (notdigit(p[0]) && notdigit(p[4]))
+ if (isdigit(p[1]) && isdigit(p[2]) && isdigit(p[3]))
+ {
+ *pgno = p[1] % 16 * 256 + p[2] % 16 * 16 + p[3] % 16;
+ if (*pgno >= 0x100 && *pgno <= 0x999)
+ {
+ *subno = ANY_SUB;
+ if (x+6 < 42)
+ if (p[4] == '.' || p[4] == '/')
+ if (isdigit(p[5]))
+ if (notdigit(p[6]) || notdigit(p[7])) /* p[7] is save here */
+ {
+ *subno = p[5] % 16;
+ if (isdigit(p[6]))
+ *subno = *subno * 16 + p[6] % 16;
+ }
+ // hackhackhack:
+ // pgno followed by start box gets subno 1
+ if (x+4 < 42 && p[4] == 11)
+ *subno = 1;
+ return 1;
+ }
+ }
+ return 0;
+}
+
+
+static void do_screen_pgno(struct vtwin *w, int x, int y, int new_win)
+{
+ u8 buf[42];
+ int n1, n2, i;
+
+ if (x >= 0 && x < 40)
+ {
+ if (xio_get_line(w->xw, y, buf+1) == 0)
+ {
+ buf[0] = buf[41] = ' ';
+ x++;
+
+ for (i = -6; i < 35; i++)
+ {
+ if (w->vtp == 0 || w->vtp->subno != 0)
+ if (chk_screen_fromto(buf, x+i, &n1, &n2))
+ {
+ // subno cycling works wrong with children.
+ // so middle button cycles backwards...
+ if (w->subno != ANY_SUB)
+ n1 = w->subno;
+ n1 = new_win ? dec_hex(n1, 1) : inc_hex(n1, 1);
+ if (n1 < 1)
+ n1 = n2;
+ if (n1 > n2)
+ n1 = 1;
+ new_or_query(w, w->pgno, n1, 0);
+ return;
+ }
+ if (i >= -4)
+ if (chk_screen_pgno(buf, x+i, &n1, &n2))
+ {
+ new_or_query(w, n1, n2, new_win);
+ return;
+ }
+ }
+ }
+ }
+ err(w, "No page.");
+}
+
+
+static void do_flof_pgno(struct vtwin *w, int button, int x, int new_win)
+{
+ struct vt_page *vtp = w->vtp;
+ int lk = 99, i, c;
+
+ if (vtp && vtp->flof)
+ {
+ switch (button)
+ {
+ case 1 ... 3:
+ for (i = 0; i <= x && i < 40; ++i)
+ if ((c = vtp->data[24][i]) < 8) // fg-color code
+ lk = c;
+ lk = "x\0\1\2\3x\3x"[lk]; // color -> link#
+ break;
+ case KEY_F(1): lk = 0; break;
+ case KEY_F(2): lk = 1; break;
+ case KEY_F(3): lk = 2; break;
+ case KEY_F(4): lk = 3; break;
+ case KEY_F(5): lk = 5; break;
+ }
+ if (lk < 6 && (vtp->link[lk].pgno & 0xff) != 0xff)
+ {
+ new_or_query(w, vtp->link[lk].pgno, vtp->link[lk].subno, new_win);
+ return;
+ }
+ }
+ else
+ {
+ switch (button)
+ {
+ case 1 ... 3: lk = x / 8; break;
+ case KEY_F(1): lk = 0; break;
+ case KEY_F(2): lk = 1; break;
+ case KEY_F(3): lk = 2; break;
+ case KEY_F(4): lk = 3; break;
+ case KEY_F(5): lk = 4; break;
+ }
+ switch (lk)
+ {
+ case 0: new_or_query(w, 0x100, ANY_SUB, new_win); return;
+ case 1: do_next_pgno(w, -1, 1, 0, new_win); return;
+ case 2: new_or_query(w, 0x900, ANY_SUB, new_win); return;
+ case 3: do_next_pgno(w, 1, 1, 0, new_win); return;
+ case 4: new_or_query(w, 0x999, ANY_SUB, new_win); return;
+ }
+ }
+ err(w, "No page.");
+}
+
+
+static void do_hist_pgno(struct vtwin *w)
+{
+ if (hist(w, -1)->pgno)
+ {
+ w->hist_top--;
+ query_page(w, hist(w, 0)->pgno, hist(w, 0)->subno);
+ }
+ else
+ err(w, "Empty history.");
+}
+
+
+static void put_head_line(struct vtwin *w, u8 *p)
+{
+ char buf[40];
+
+ if (p == 0)
+ xio_get_line(w->xw, 0, buf);
+ else
+ memcpy(buf + 8, p + 8, 32);
+
+ if (w->subno == ANY_SUB)
+ sprintf(buf, "\2%3x \5\xb7", w->pgno);
+ else
+ sprintf(buf, "\2S%02x \5\xb7", w->subno & 0xff);
+
+ if (w->searching)
+ buf[0] = 1;
+ if (w->hold)
+ buf[4] = 'H';
+ if (w->xw->concealed)
+ buf[6] = '*';
+ buf[7] = 7;
+
+ xio_put_line(w->xw, 0, buf);
+}
+
+
+static void put_menu_line(struct vtwin *w)
+{
+ if (w->status > 0)
+ xio_put_line(w->xw, 24, w->statusline);
+ else if (w->vtp && w->vtp->flof)
+ xio_put_line(w->xw, 24, w->vtp->data[24]);
+ else
+ xio_put_line(w->xw, 24, "\0 100 \4<< \6Help \4>>\0 999 ");
+}
+
+
+static void _msg(struct vtwin *w, u8 *str, va_list args)
+{
+ u8 buf[128];
+ int i;
+
+ i = vsprintf(buf, str, args);
+ if (i > W)
+ i = W;
+ memset(w->statusline, ' ', W);
+ memcpy(w->statusline + (W-i+1)/2, buf, i);
+ w->status = 6;
+ put_menu_line(w);
+}
+
+
+static void msg(struct vtwin *w, u8 *str, ...)
+{
+ va_list args;
+
+ va_start(args, str);
+ _msg(w, str, args);
+ va_end(args);
+}
+
+
+static void err(struct vtwin *w, u8 *str, ...)
+{
+ va_list args;
+
+ va_start(args, str);
+ _msg(w, str, args);
+ va_end(args);
+}
+
+
+static void next_search(struct vtwin *w, int rev)
+{
+ if (w->search)
+ {
+ int pgno = w->pgno;
+ int subno = w->subno;
+ int dir = rev ? -w->searchdir : w->searchdir;
+
+ if (search_next(w->search, &pgno, &subno, dir) == 0)
+ {
+ query_page(w, pgno, subno);
+ if (not w->searching && w->search->len)
+ xio_set_selection(w->xw, w->search->x, w->search->y,
+ w->search->x + w->search->len - 1, w->search->y);
+ return;
+ }
+ else
+ err(w, "Pattern not found.");
+ }
+ else
+ err(w, "No search pattern.");
+}
+
+
+static void start_search(struct vtwin *w, u8 *string)
+{
+ if (not string)
+ return;
+
+ if (*string)
+ {
+ if (w->search)
+ search_end(w->search);
+ w->search = search_start(w->vbi->cache, string);
+ if (w->search == 0)
+ {
+ err(w, "Bad search pattern.");
+ return;
+ }
+ }
+ next_search(w, 0);
+}
+
+
+static void start_save2(struct vtwin *w, u8 *name)
+{
+ if (name && *name)
+ if (export(w->export, w->vtp, name))
+ err(w, export_errstr());
+
+ export_close(w->export);
+ w->export = 0;
+ put_menu_line(w);
+}
+
+
+struct vtwin * vtwin_new(struct xio *xio, struct vbi *vbi, char *geom,
+ struct vtwin *parent, int pgno, int subno)
+{
+ struct vtwin *w;
+
+ if (not(w = malloc(sizeof(*w))))
+ goto fail1;
+
+ if (not (w->xw = xio_open_win(xio, geom)))
+ goto fail2;
+ w->vbi = vbi;
+ w->vtp = 0;
+ w->search = 0;
+ w->export = 0;
+ w->parent = parent;
+ w->child = 0;
+ if (parent && parent->child)
+ fatal("internal error: parent already has a child != 0");
+ if (parent)
+ parent->child = w;
+
+ w->hist_top = 1;
+ hist(w,0)->pgno = 0;
+ hist(w,1)->pgno = 0;
+ w->status = 0;
+ xio_set_handler(w->xw, vtwin_event, w);
+ vbi_add_handler(w->vbi, vtwin_event, w);
+ query_page(w, pgno, subno);
+ return w;
+
+fail2:
+ free(w);
+fail1:
+ return 0;
+}
+
+
+static void vtwin_close(struct vtwin *w)
+{
+ if (w->parent)
+ w->parent->child = w->child;
+ if (w->child)
+ w->child->parent = w->parent;
+
+ if (w->search)
+ search_end(w->search);
+ if (w->export)
+ export_close(w->export);
+
+ vbi_del_handler(w->vbi, vtwin_event, w);
+ xio_close_win(w->xw, 1);
+ free(w);
+}
+
+
+static void vtwin_event(struct vtwin *w, struct vt_event *ev)
+{
+ struct xio_win *xw = w->xw;
+ int i;
+
+ switch (ev->type)
+ {
+ case EV_CLOSE:
+ vtwin_close(w);
+ break;
+
+ case EV_TIMER:
+ if (w->status > 0 && --w->status == 0)
+ put_menu_line(w);
+ break;
+
+ case EV_KEY:
+ {
+ switch (ev->i1)
+ {
+ case '0' ... '9':
+ i = ev->i1 - '0';
+ if (w->pgno >= 0x100)
+ {
+ if (i == 0)
+ break;
+ w->pgno = i;
+ }
+ else
+ {
+ w->pgno = w->pgno * 16 + i;
+ if (w->pgno >= 0x100)
+ query_page(w, w->pgno, ANY_SUB);
+ }
+ break;
+ case 'q':
+ case '\e':
+ vtwin_close(w);
+ break;
+ case 'h':
+ query_page(w, 0x900, ANY_SUB);
+ break;
+ case 'e':
+ if (w->vbi->cache)
+ {
+ i = w->vbi->cache->op->mode(w->vbi->cache,
+ CACHE_MODE_ERC, 0);
+ w->vbi->cache->op->mode(w->vbi->cache,
+ CACHE_MODE_ERC, !i);
+ msg(w, "Error reduction %sabled.", i ? "dis" : "en");
+ }
+ break;
+ case 'o':
+ if (vtwin_new(xw->xio, w->vbi, 0, 0, w->pgno, w->subno) == 0)
+ err(w, "Unable to open new window.");
+ break;
+ case KEY_RIGHT:
+ do_next_pgno(w, 1, not ev->i2, 0, 0);
+ break;
+ case KEY_LEFT:
+ do_next_pgno(w, -1, not ev->i2, 0, 0);
+ break;
+ case KEY_UP:
+ do_next_pgno(w, -1, not ev->i2, 1, 0);
+ break;
+ case KEY_DOWN:
+ do_next_pgno(w, 1, not ev->i2, 1, 0);
+ break;
+ case '\b':
+ do_hist_pgno(w);
+ break;
+ case ' ':
+ w->hold = !w->hold;
+ break;
+ case 'c':
+ vbi_reset(w->vbi);
+ break;
+ case 'i':
+ if (w->vtp && w->vtp->flof &&
+ (w->vtp->link[5].pgno & 0xff) != 0xff)
+ query_page(w, w->vtp->link[5].pgno,
+ w->vtp->link[5].subno);
+ else
+ query_page(w, 0x100, ANY_SUB);
+ break;
+ case 'r':
+ xio_set_concealed(xw, w->revealed = !w->revealed);
+ break;
+ case KEY_F(1) ... KEY_F(5):
+ do_flof_pgno(w, ev->i1, 0, ev->i2);
+ break;
+ case 'n':
+ next_search(w, 0);
+ break;
+ case 'N':
+ next_search(w, 1);
+ break;
+ default:
+ err(w, "Unused key.");
+ break;
+ }
+ break;
+ }
+ case EV_RESET:
+ {
+ if (w->search)
+ search_end(w->search);
+ w->search = 0;
+
+ query_page(w, w->pgno, w->subno);
+ msg(w, "Cache cleared!");
+ break;
+ }
+ case EV_MOUSE:
+ {
+ if (ev->i1 == 3)
+ do_hist_pgno(w);
+ else if (ev->i1 == 5) // wheel mouse
+ do_next_pgno(w, 1, not ev->i2, 0, 0);
+ else if (ev->i1 == 4) // wheel mouse
+ do_next_pgno(w, -1, not ev->i2, 0, 0);
+ else if (ev->i1 == 7) // dual wheel mouse
+ do_next_pgno(w, 1, not ev->i2, 1, 0);
+ else if (ev->i1 == 6) // dual wheel mouse
+ do_next_pgno(w, -1, not ev->i2, 1, 0);
+ else if (ev->i4 == 24)
+ do_flof_pgno(w, ev->i1, ev->i3, ev->i1 == 2);
+ else if (ev->i4 == 0 && ev->i3 < 5)
+ {
+ if (ev->i1 == 1)
+ w->hold = !w->hold;
+ else
+ vtwin_new(xw->xio, w->vbi, 0, 0, w->pgno, w->subno);
+ }
+ else if (ev->i4 == 0 && ev->i3 < 8)
+ {
+ if (ev->i1 == 2 && w->child)
+ w = w->child;
+ xio_set_concealed(w->xw, w->revealed = !w->revealed);
+ }
+ else
+ do_screen_pgno(w, ev->i3, ev->i4, ev->i1 == 2);
+ break;
+ }
+ case EV_PAGE:
+ {
+ struct vt_page *vtp = ev->p1;
+
+ if (0)
+ if (vtp->errors)
+ printf("errors=%4d\n",vtp->errors);
+ if (w->searching || not(w->hold || ev->i1))
+ if (vtp->pgno == w->pgno)
+ if (w->subno == ANY_SUB || vtp->subno == w->subno)
+ {
+ w->searching = 0;
+ w->vtp = vtp;
+ put_head_line(w, vtp->data[0]);
+ for (i = 1; i < 24; ++i)
+ xio_put_line(w->xw, i, vtp->data[i]);
+ put_menu_line(w);
+ set_title(w);
+ }
+ break;
+ }
+ case EV_HEADER:
+ {
+ u8 *p = ev->p1;
+ int hdr_mag = ev->i1 / 256;
+ int flags = ev->i3;
+ int mag = w->pgno;
+ if (mag >= 0x10)
+ mag = mag >> 4;
+ if (mag >= 0x10)
+ mag = mag >> 4;
+ if (flags & PG_OUTOFSEQ)
+ p = 0;
+ else
+ if (~flags & PG_MAGSERIAL)
+ if (mag != hdr_mag)
+ p = 0;
+
+ put_head_line(w, p);
+ break;
+ }
+ case EV_XPACKET:
+ {
+#if 0 /* VPS data (seems to be unused in .de */
+ u8 *p = ev->p1;
+
+ if (ev->i1 == 8 && ev->i2 == 30 && p[0]/2 == 1)
+ {
+ int i;
+ int pil, cni, pty, misc;
+
+ for (i = 7; i < 20; ++i)
+ p[i] = hamm8(p+i, &ev->i3);
+ if (ev->i3 & 0xf000) /* uncorrectable errors */
+ break;
+ cni = p[9] + p[15]/4*16 + p[16]%4*64 + p[10]%4*256
+ + p[16]/4*1024 + p[17]*4096;
+ pty = p[18] + p[19]*16;
+ pil = p[10]/4 + p[11]*4 + p[12]*64 + p[13]*1024
+ + p[14]*16384 + p[15]%4*262144;
+ misc = p[7] + p[8]*16;
+ err(w, "%02x %04x %05x %02x: %.20s", misc, cni, pil, pty, p+20);
+ }
+#endif
+ break;
+ }
+ case EV_ERR:
+ {
+ char *errmsg = ev->p1;
+ if (errmsg != NULL && *errmsg != '\0')
+ {
+ err(w, errmsg);
+ w->status = 30;
+ ev->p1 = NULL;
+ free(errmsg);
+ }
+ break;
+ }
+ }
+}
diff --git a/util/alevt/ui.h b/util/alevt/ui.h
new file mode 100644
index 0000000..9efc791
--- /dev/null
+++ b/util/alevt/ui.h
@@ -0,0 +1,35 @@
+#ifndef UI_H
+#define UI_H
+
+#include "vt.h"
+#include "xio.h"
+#include "vbi.h"
+#include "search.h"
+
+#define N_HISTORY (1 << 6) // number of history entries
+
+struct vtwin
+{
+ struct vtwin *parent, *child;
+ struct xio_win *xw;
+ struct vbi *vbi;
+ struct {
+ int pgno;
+ int subno;
+ } hist[N_HISTORY];
+ int hist_top;
+ int searching;
+ int revealed;
+ int hold;
+ int pgno, subno;
+ struct vt_page *vtp;
+ struct search *search;
+ int searchdir;
+ int status;
+ u8 statusline[W+1];
+ struct export *export;
+};
+
+extern struct vtwin *vtwin_new(struct xio *xio, struct vbi *vbi, char *geom,
+ struct vtwin *parent, int pgno, int subno);
+#endif
diff --git a/util/alevt/vbi.c b/util/alevt/vbi.c
new file mode 100644
index 0000000..6a8a47e
--- /dev/null
+++ b/util/alevt/vbi.c
@@ -0,0 +1,942 @@
+#define _GNU_SOURCE
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <errno.h>
+#include <stdarg.h>
+#include <sys/ioctl.h>
+#include <sys/poll.h>
+#include "os.h"
+#include "vt.h"
+#include "misc.h"
+#include "vbi.h"
+#include "fdset.h"
+#include "hamm.h"
+#include "lang.h"
+#include <libzvbi.h>
+
+
+static vbi_capture * pZvbiCapt;
+static vbi_raw_decoder * pZvbiRawDec;
+static vbi_sliced * pZvbiData;
+static vbi_proxy_client * pProxy;
+
+#define ZVBI_BUFFER_COUNT 10
+#define ZVBI_TRACE 0
+
+
+static int vbi_dvb_open(struct vbi *vbi, const char *vbi_name,
+ const char *channel, char *outfile, u_int16_t sid, int ttpid);
+static void dvb_handler(struct vbi *vbi, int fd);
+
+#define FAC (1<<16) // factor for fix-point arithmetic
+
+static u8 *rawbuf; // one common buffer for raw vbi data
+static int rawbuf_size; // its current size
+u_int16_t sid;
+static char *vbi_names[]
+ = { "/dev/vbi", "/dev/vbi0", "/dev/video0", "/dev/dvb/adapter0/demux0",
+ NULL }; // default device names if none was given at the command line
+
+
+static void out_of_sync(struct vbi *vbi)
+{
+ int i; // discard all in progress pages
+ for (i = 0; i < 8; ++i)
+ vbi->rpage[i].page->flags &= ~PG_ACTIVE;
+}
+
+
+// send an event to all clients
+static void vbi_send(struct vbi *vbi, int type, int i1, int i2, int i3, void *p1)
+{
+ struct vt_event ev[1];
+ struct vbi_client *cl, *cln;
+ ev->resource = vbi;
+ ev->type = type;
+ ev->i1 = i1;
+ ev->i2 = i2;
+ ev->i3 = i3;
+ ev->p1 = p1;
+ for (cl = PTR vbi->clients->first; cln = PTR cl->node->next; cl = cln)
+ cl->handler(cl->data, ev);
+}
+
+
+static void vbi_send_page(struct vbi *vbi, struct raw_page *rvtp, int page)
+{
+ struct vt_page *cvtp = 0;
+
+ if (rvtp->page->flags & PG_ACTIVE)
+ {
+ if (rvtp->page->pgno % 256 != page)
+ {
+ rvtp->page->flags &= ~PG_ACTIVE;
+ enhance(rvtp->enh, rvtp->page);
+ if (vbi->cache)
+ cvtp = vbi->cache->op->put(vbi->cache, rvtp->page);
+ vbi_send(vbi, EV_PAGE, 0, 0, 0, cvtp ?: rvtp->page);
+ }
+ }
+}
+
+
+static void pll_add(struct vbi *vbi, int n, int err)
+{
+}
+
+
+// process one videotext packet
+static int vt_line(struct vbi *vbi, u8 *p)
+{
+ struct vt_page *cvtp;
+ struct raw_page *rvtp;
+ int hdr, mag, mag8, pkt, i;
+ int err = 0;
+
+ hdr = hamm16(p, &err);
+ if (err & 0xf000)
+ return -4;
+ mag = hdr & 7;
+ mag8 = mag?: 8;
+ pkt = (hdr >> 3) & 0x1f;
+ p += 2;
+ rvtp = vbi->rpage + mag;
+ cvtp = rvtp->page;
+ switch (pkt)
+ {
+ case 0:
+ {
+ int b1, b2, b3, b4;
+ b1 = hamm16(p, &err); // page number
+ b2 = hamm16(p+2, &err); // subpage number + flags
+ b3 = hamm16(p+4, &err); // subpage number + flags
+ b4 = hamm16(p+6, &err); // language code + more flags
+ if (vbi->ppage->page->flags & PG_MAGSERIAL)
+ vbi_send_page(vbi, vbi->ppage, b1);
+ vbi_send_page(vbi, rvtp, b1);
+
+ if (err & 0xf000)
+ return 4;
+
+ cvtp->errors = (err >> 8) + chk_parity(p + 8, 32);;
+ cvtp->pgno = mag8 * 256 + b1;
+ cvtp->subno = (b2 + b3 * 256) & 0x3f7f;
+ cvtp->lang = "\0\4\2\6\1\5\3\7"[b4 >> 5] + (latin1==LATIN1 ? 0 : 8);
+ cvtp->flags = b4 & 0x1f;
+ cvtp->flags |= b3 & 0xc0;
+ cvtp->flags |= (b2 & 0x80) >> 2;
+ cvtp->lines = 1;
+ cvtp->flof = 0;
+ vbi->ppage = rvtp;
+ pll_add(vbi, 1, cvtp->errors);
+ conv2latin(p + 8, 32, cvtp->lang);
+ vbi_send(vbi, EV_HEADER, cvtp->pgno, cvtp->subno, cvtp->flags, p);
+
+ if (b1 == 0xff)
+ return 0;
+ cvtp->flags |= PG_ACTIVE;
+ init_enhance(rvtp->enh);
+ memcpy(cvtp->data[0]+0, p, 40);
+ memset(cvtp->data[0]+40, ' ', sizeof(cvtp->data)-40);
+ return 0;
+ }
+
+ case 1 ... 24:
+ {
+ pll_add(vbi, 1, err = chk_parity(p, 40));
+
+ if (~cvtp->flags & PG_ACTIVE)
+ return 0;
+
+ cvtp->errors += err;
+ cvtp->lines |= 1 << pkt;
+ conv2latin(p, 40, cvtp->lang);
+ memcpy(cvtp->data[pkt], p, 40);
+ return 0;
+ }
+ case 26:
+ {
+ int d, t[13];
+
+ if (~cvtp->flags & PG_ACTIVE)
+ return 0;
+
+ d = hamm8(p, &err);
+ if (err & 0xf000)
+ return 4;
+
+ for (i = 0; i < 13; ++i)
+ t[i] = hamm24(p + 1 + 3*i, &err);
+ if (err & 0xf000)
+ return 4;
+
+ add_enhance(rvtp->enh, d, t);
+ return 0;
+ }
+ case 27:
+ {
+ int b1,b2,b3,x;
+ if (~cvtp->flags & PG_ACTIVE)
+ return 0; // -1 flushes all pages. We may never resync again
+
+ b1 = hamm8(p, &err);
+ b2 = hamm8(p + 37, &err);
+ if (err & 0xf000)
+ return 4;
+ if (b1 != 0 || not(b2 & 8))
+ return 0;
+
+ for (i = 0; i < 6; ++i)
+ {
+ err = 0;
+ b1 = hamm16(p+1+6*i, &err);
+ b2 = hamm16(p+3+6*i, &err);
+ b3 = hamm16(p+5+6*i, &err);
+ if (err & 0xf000)
+ return 1;
+ x = (b2 >> 7) | ((b3 >> 5) & 0x06);
+ cvtp->link[i].pgno = ((mag ^ x) ?: 8) * 256 + b1;
+ cvtp->link[i].subno = (b2 + b3 * 256) & 0x3f7f;
+ }
+ cvtp->flof = 1;
+ return 0;
+ }
+ case 30:
+ {
+ if (mag8 != 8)
+ return 0;
+ p[0] = hamm8(p, &err); // designation code
+ p[1] = hamm16(p+1, &err); // initial page
+ p[3] = hamm16(p+3, &err); // initial subpage + mag
+ p[5] = hamm16(p+5, &err); // initial subpage + mag
+ if (err & 0xf000)
+ return 4;
+ err += chk_parity(p+20, 20);
+ conv2latin(p+20, 20, 0);
+ vbi_send(vbi, EV_XPACKET, mag8, pkt, err, p);
+ return 0;
+ }
+ default:
+ return 0;
+ }
+ return 0;
+}
+
+
+// called when new vbi data is waiting
+static void vbi_handler(struct vbi *vbi, int fd)
+{
+ double timestamp;
+ struct timeval timeout;
+ int lineCount;
+ int line;
+ int res;
+
+ timeout.tv_sec = 0;
+ timeout.tv_usec = 25000;
+ res = vbi_capture_read_sliced(pZvbiCapt, pZvbiData, &lineCount, &timestamp,
+ &timeout);
+ if (res > 0)
+ {
+ for (line=0; line < lineCount; line++)
+ {
+ if ((pZvbiData[line].id & VBI_SLICED_TELETEXT_B) != 0)
+ {
+ vt_line(vbi, pZvbiData[line].data);
+ }
+ }
+ }
+ else if (res < 0)
+ {
+ }
+}
+
+
+int vbi_add_handler(struct vbi *vbi, void *handler, void *data)
+{
+ struct vbi_client *cl;
+
+ if (not(cl = malloc(sizeof(*cl))))
+ return -1;
+ cl->handler = handler;
+ cl->data = data;
+ dl_insert_last(vbi->clients, cl->node);
+ return 0;
+}
+
+
+void vbi_del_handler(struct vbi *vbi, void *handler, void *data)
+{
+ struct vbi_client *cl;
+
+ for (cl = PTR vbi->clients->first; cl->node->next; cl = PTR cl->node->next)
+ if (cl->handler == handler && cl->data == data)
+ {
+ dl_remove(cl->node);
+ break;
+ }
+ return;
+}
+
+
+struct vbi * vbi_open(char *vbi_name, struct cache *ca,
+ const char *channel, char *outfile, u_int16_t sid, int ttpid)
+{
+ static int inited = 0;
+ struct vbi *vbi;
+ char * pErrStr;
+ int services;
+
+ if (vbi_name == NULL)
+ {
+ int i;
+ char *tried_devices = NULL;
+ char *old_tried_devices = NULL;
+ for (i = 0; vbi_names[i] != NULL; i++)
+ {
+ vbi_name = vbi_names[i];
+ // collect device names for the error message below
+ if (old_tried_devices)
+ {
+ if (asprintf(&tried_devices, "%s, %s", old_tried_devices, vbi_name) < 0)
+ tried_devices = NULL;
+ free(old_tried_devices);
+ }
+ else if (asprintf(&tried_devices, "%s", vbi_name) < 0)
+ tried_devices = NULL;
+ if (tried_devices == NULL)
+ out_of_mem(-1);
+ old_tried_devices = tried_devices;
+ if (access(vbi_name, R_OK) != 0)
+ continue;
+ vbi = vbi_open(vbi_name, ca, channel, outfile, sid, ttpid);
+ if (vbi != NULL)
+ {
+ if (tried_devices != NULL)
+ free(tried_devices);
+ return vbi;
+ }
+ }
+
+ error("could not open any of the standard devices (%s)", tried_devices);
+ free(tried_devices);
+ return NULL;
+ }
+
+ if (not inited)
+ lang_init();
+ inited = 1;
+
+ if (not(vbi = malloc(sizeof(*vbi))))
+ {
+ error("out of memory");
+ goto fail1;
+ }
+ if (!vbi_dvb_open(vbi, vbi_name, channel, outfile, sid, ttpid)) {
+ vbi->cache = ca;
+ dl_init(vbi->clients);
+ out_of_sync(vbi);
+ vbi->ppage = vbi->rpage;
+ fdset_add_fd(fds, vbi->fd, dvb_handler, vbi);
+ return vbi;
+ }
+
+ services = VBI_SLICED_TELETEXT_B;
+ pErrStr = NULL;
+ vbi->fd = -1;
+
+ pProxy = vbi_proxy_client_create(vbi_name, "alevt",
+ VBI_PROXY_CLIENT_NO_STATUS_IND, &pErrStr, ZVBI_TRACE);
+ if (pProxy != NULL)
+ {
+ pZvbiCapt = vbi_capture_proxy_new(pProxy, ZVBI_BUFFER_COUNT, 0,
+ &services, 0, &pErrStr);
+ if (pZvbiCapt == NULL)
+ {
+ vbi_proxy_client_destroy(pProxy);
+ pProxy = NULL;
+ }
+ }
+ if (pZvbiCapt == NULL)
+ pZvbiCapt = vbi_capture_v4l2_new(vbi_name, ZVBI_BUFFER_COUNT,
+ &services, 0, &pErrStr, ZVBI_TRACE);
+ if (pZvbiCapt == NULL)
+ pZvbiCapt = vbi_capture_v4l_new(vbi_name, 0, &services, 0, &pErrStr,
+ ZVBI_TRACE);
+
+ if (pZvbiCapt != NULL)
+ {
+ pZvbiRawDec = vbi_capture_parameters(pZvbiCapt);
+ if ((pZvbiRawDec != NULL) && ((services & VBI_SLICED_TELETEXT_B) != 0))
+ {
+ pZvbiData = malloc((pZvbiRawDec->count[0] + pZvbiRawDec->count[1]) \
+ * sizeof(*pZvbiData));
+
+ vbi->fd = vbi_capture_fd(pZvbiCapt);
+ }
+ else
+ vbi_capture_delete(pZvbiCapt);
+ }
+
+ if (pErrStr != NULL)
+ {
+ fprintf(stderr, "libzvbi: %s\n", pErrStr);
+ free(pErrStr);
+ }
+
+ if (vbi->fd == -1)
+ goto fail2;
+ vbi->cache = ca;
+ dl_init(vbi->clients);
+ out_of_sync(vbi);
+ vbi->ppage = vbi->rpage;
+ fdset_add_fd(fds, vbi->fd, vbi_handler, vbi);
+ return vbi;
+
+fail3:
+ close(vbi->fd);
+fail2:
+ free(vbi);
+fail1:
+ return 0;
+}
+
+
+void vbi_close(struct vbi *vbi)
+{
+ fdset_del_fd(fds, vbi->fd);
+ if (vbi->cache)
+ vbi->cache->op->close(vbi->cache);
+
+ if (pZvbiData != NULL)
+ free(pZvbiData);
+ pZvbiData = NULL;
+
+ if (pZvbiCapt != NULL)
+ {
+ vbi_capture_delete(pZvbiCapt);
+ pZvbiCapt = NULL;
+ }
+ if (pProxy != NULL)
+ {
+ vbi_proxy_client_destroy(pProxy);
+ pProxy = NULL;
+ }
+ free(vbi);
+}
+
+
+struct vt_page * vbi_query_page(struct vbi *vbi, int pgno, int subno)
+{
+ struct vt_page *vtp = 0;
+ if (vbi->cache)
+ vtp = vbi->cache->op->get(vbi->cache, pgno, subno);
+ if (vtp == 0)
+ {
+ return 0;
+ }
+ vbi_send(vbi, EV_PAGE, 1, 0, 0, vtp);
+ return vtp;
+}
+
+
+void vbi_reset(struct vbi *vbi)
+{
+ if (vbi->cache)
+ vbi->cache->op->reset(vbi->cache);
+ vbi_send(vbi, EV_RESET, 0, 0, 0, 0);
+}
+
+
+/* Starting from here: DVB API */
+#include <linux/dvb/dmx.h>
+#include <linux/dvb/frontend.h>
+#include <linux/dvb/video.h>
+
+static int dvb_get_table(int fd, u_int16_t pid, u_int8_t tblid, u_int8_t *buf,
+ size_t bufsz)
+{
+ struct dmx_sct_filter_params sctFilterParams;
+ struct pollfd pfd;
+ int r;
+ memset(&sctFilterParams, 0, sizeof(sctFilterParams));
+ sctFilterParams.pid = pid;
+ sctFilterParams.timeout = 10000;
+ sctFilterParams.flags = DMX_ONESHOT | DMX_IMMEDIATE_START | DMX_CHECK_CRC;
+ sctFilterParams.filter.filter[0] = tblid;
+ sctFilterParams.filter.mask[0] = 0xff;
+ if (ioctl(fd, DMX_SET_FILTER, &sctFilterParams)) {
+ perror("DMX_SET_FILTER");
+ return -1;
+ }
+ pfd.fd = fd;
+ pfd.events = POLLIN;
+ r = poll(&pfd, 1, 10000);
+ if (r < 0) {
+ perror("poll");
+ goto out;
+ }
+ if (r > 0) {
+ r = read(fd, buf, bufsz);
+ if (r < 0) {
+ perror("read");
+ goto out;
+ }
+ }
+ out:
+ ioctl(fd, DMX_STOP, 0);
+ return r;
+}
+
+static const u_int8_t byterev8[256] = {
+ 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
+ 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
+ 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
+ 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
+ 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
+ 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
+ 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
+ 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
+ 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
+ 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
+ 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
+ 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
+ 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
+ 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
+ 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
+ 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
+ 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
+ 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
+ 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
+ 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
+ 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
+ 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
+ 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
+ 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
+ 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
+ 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
+ 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
+ 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
+ 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
+ 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
+ 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
+ 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
+};
+
+static void dvb_handle_pes_payload(struct vbi *vbi, const u_int8_t *buf,
+ unsigned int len)
+{
+ unsigned int p, i;
+ u_int8_t data[42];
+
+ if (buf[0] < 0x10 || buf[0] > 0x1f)
+ return; /* no EBU teletext data */
+ for (p = 1; p < len; p += /*6 + 40*/ 2 + buf[p + 1]) {
+#if 0
+ printf("Txt Line:\n"
+ " data_unit_id 0x%02x\n"
+ " data_unit_length 0x%02x\n"
+ " reserved_for_future_use 0x%01x\n"
+ " field_parity 0x%01x\n"
+ " line_offset 0x%02x\n"
+ " framing_code 0x%02x\n"
+ " magazine_and_packet_addr 0x%04x\n"
+ " data_block 0x%02x 0x%02x 0x%02x 0x%02x\n",
+ buf[p], buf[p+1],
+ buf[p+2] >> 6,
+ (buf[p+2] >> 5) & 1,
+ buf[p+2] & 0x1f,
+ buf[p+3],
+ (buf[p+4] << 8) | buf[p+5],
+ buf[p+6], buf[p+7], buf[p+8], buf[p+9]);
+#endif
+ for (i = 0; i < sizeof(data); i++)
+ data[i] = byterev8[buf[p+4+i]];
+ /* note: we should probably check for missing lines and then
+ * call out_of_sync(vbi); and/or vbi_reset(vbi); */
+ vt_line(vbi, data);
+ }
+}
+
+static unsigned int rawptr;
+
+static void dvb_handler(struct vbi *vbi, int fd)
+{
+ /* PES packet start code prefix and stream_id == private_stream_1 */
+ static const u_int8_t peshdr[4] = { 0x00, 0x00, 0x01, 0xbd };
+ u_int8_t *bp;
+ int n;
+ unsigned int p, i, len;
+ u_int16_t rpid;
+ u_int32_t crc, crccomp;
+
+ if (rawptr >= (unsigned int)rawbuf_size)
+ rawptr = 0;
+ n = read(vbi->fd, rawbuf + rawptr, rawbuf_size - rawptr);
+ if (n <= 0)
+ return;
+ rawptr += n;
+ if (rawptr < 6)
+ return;
+ if (memcmp(rawbuf, peshdr, sizeof(peshdr))) {
+ bp = memmem(rawbuf, rawptr, peshdr, sizeof(peshdr));
+ if (!bp)
+ return;
+ rawptr -= (bp - rawbuf);
+ memmove(rawbuf, bp, rawptr);
+ if (rawptr < 6)
+ return;
+ }
+ len = (rawbuf[4] << 8) | rawbuf[5];
+ if (len < 9) {
+ rawptr = 0;
+ return;
+ }
+ if (rawptr < len + 6)
+ return;
+ p = 9 + rawbuf[8];
+#if 0
+ for (i = 0; i < len - p; i++) {
+ if (!(i & 15))
+ printf("\n%04x:", i);
+ printf(" %02x", rawbuf[p + i]);
+ }
+ printf("\n");
+#endif
+ if (!dl_empty(vbi->clients))
+ dvb_handle_pes_payload(vbi, rawbuf + p, len - p);
+ rawptr -= len;
+ if (rawptr)
+ memmove(rawbuf, rawbuf + len, rawptr);
+}
+
+
+static int vbi_dvb_open(struct vbi *vbi, const char *vbi_name,
+ const char *channel, char *outfile, u_int16_t sid, int ttpid)
+{
+ struct {
+ u_int16_t pmtpid;
+ u_int16_t ttpid;
+ u_int16_t service_id;
+ u_int8_t service_type;
+ char service_provider_name[64];
+ char service_name[64];
+ u_int8_t txtlang[3];
+ u_int8_t txttype;
+ u_int8_t txtmagazine;
+ u_int8_t txtpage;
+ } progtbl[16], *progp;
+ u_int8_t tbl[4096];
+ u_int8_t * ppname, * psname, pncode, sncode, pnlen, snlen;
+ int r;
+ FILE *ofd;
+ unsigned int i, j, k, l, progcnt = 0;
+ struct dmx_pes_filter_params filterpar;
+
+ /* open DVB demux device */
+ if (!vbi_name)
+ vbi_name = "/dev/dvb/adapter0/demux0";
+ if ((vbi->fd = open(vbi_name, O_RDWR)) == -1) {
+ error("cannot open demux device %s", vbi_name);
+ return -1;
+ }
+ memset(progtbl, 0, sizeof(progtbl));
+ if (ttpid >= 0x15 && ttpid < 0x1fff) {
+ vbi->ttpid = ttpid;
+ printf("Using command line specified teletext PID 0x%x\n",
+ vbi->ttpid);
+ goto ttpidfound;
+ }
+ /* parse PAT to enumerate services and to find the PMT PIDs */
+ r = dvb_get_table(vbi->fd, 0, 0, tbl, sizeof(tbl));
+ if (r == -1)
+ goto outerr;
+ if (!(tbl[5] & 1)) {
+ error("PAT not active (current_next_indicator == 0)");
+ goto outerr;
+ }
+ if (tbl[6] != 0 || tbl[7] != 0) {
+ error("PAT has multiple sections");
+ goto outerr;
+ }
+ if (r < 13) {
+ error("PAT too short\n");
+ goto outerr;
+ }
+ r -= 13;
+ for (i = 0; i < (unsigned)r; i += 4) {
+ if (progcnt >= sizeof(progtbl)/sizeof(progtbl[0])) {
+ error("Program table overflow");
+ goto outerr;
+ }
+ progtbl[progcnt].service_id = (tbl[8 + i] << 8) | tbl[9 + i];
+ if (!progtbl[progcnt].service_id) /* this is the NIT pointer */
+ continue;
+ progtbl[progcnt].pmtpid = ((tbl[10 + i] << 8) | tbl[11 + i])
+ & 0x1fff;
+ progcnt++;
+ }
+ /* find the SDT to get the station names */
+ r = dvb_get_table(vbi->fd, 0x11, 0x42, tbl, sizeof(tbl));
+ if (r == -1)
+ goto outerr;
+ if (!(tbl[5] & 1)) {
+ error("SDT not active (current_next_indicator == 0)");
+ goto outerr;
+ }
+ if (tbl[6] != 0 || tbl[7] != 0) {
+ error("SDT has multiple sections");
+ goto outerr;
+ }
+ if (r < 12) {
+ error("SDT too short\n");
+ goto outerr;
+ }
+ i = 11;
+ while (i < (unsigned)r - 1) {
+ k = (tbl[i] << 8) | tbl[i+1]; /* service ID */
+ progp = NULL;
+ for (j = 0; j < progcnt; j++)
+ if (progtbl[j].service_id == k) {
+ progp = &progtbl[j];
+ break;
+ }
+ j = i + 5;
+ i = j + (((tbl[i+3] << 8) | tbl[i+4]) & 0x0fff);
+ if (!progp) {
+ error("SDT: service_id 0x%x not in PAT\n", k);
+ continue;
+ }
+ while (j < i) {
+ switch (tbl[j]) {
+ case 0x48: // service descriptor
+ k = j + 4 + tbl[j + 3];
+ progp->service_type = tbl[j+2];
+ ppname = tbl+j+4 ; // points to 1st byte of provider_name
+ pncode = *ppname ; // 1st byte of provider_name
+ pnlen = tbl[j+3]; // length of provider_name
+ psname = tbl+k+1 ; // points to 1st byte of service_name
+ sncode = *psname ; // 1st byte of service_name
+ snlen = tbl[k] ; // length of service_name
+ if (pncode >= 0x20) {
+ pncode = 0 ; // default character set Latin alphabet fig.A.1
+ } else {
+ ppname++ ; pnlen-- ;
+ // character code from table A.3 1st byte = ctrl-code
+ }
+ if (sncode >= 0x20) {
+ sncode = 0 ; // default character set Latin alphabet fig.A.1
+ } else {
+ psname++ ; snlen-- ;
+ // character code from table A.3 ; 1st byte = ctrl-code
+ }
+ snprintf(progp->service_provider_name,
+ sizeof(progp->service_provider_name), "%.*s", pnlen, ppname);
+ snprintf(progp->service_name,
+ sizeof(progp->service_name), "%.*s", snlen, psname); break;
+ }
+ j += 2 + tbl[j + 1]; // next descriptor
+ }
+ }
+ /* parse PMT's to find Teletext Services */
+ for (l = 0; l < progcnt; l++) {
+ progtbl[l].ttpid = 0x1fff;
+ if (progtbl[l].service_type != 0x01 || /* not digital TV */
+ progtbl[l].pmtpid < 0x15 || /* PMT PID sanity check */
+ progtbl[l].pmtpid >= 0x1fff)
+ continue;
+ r = dvb_get_table(vbi->fd, progtbl[l].pmtpid, 0x02, tbl,
+ sizeof(tbl));
+ if (r == -1)
+ goto outerr;
+ if (!(tbl[5] & 1)) { error \
+ ("PMT pid 0x%x not active (current_next_indicator == 0)",
+ progtbl[l].pmtpid);
+ goto outerr;
+ }
+ if (tbl[6] != 0 || tbl[7] != 0) {
+ error("PMT pid 0x%x has multiple sections",
+ progtbl[l].pmtpid);
+ goto outerr;
+ }
+ if (r < 13) {
+ error("PMT pid 0x%x too short\n", progtbl[l].pmtpid);
+ goto outerr;
+ }
+ i = 12 + (((tbl[10] << 8) | tbl[11]) & 0x0fff);
+ /* skip program info section */
+ while (i <= (unsigned)r-6) {
+ j = i + 5;
+ i = j + (((tbl[i + 3] << 8) | tbl[i + 4]) & 0x0fff);
+ if (tbl[j - 5] != 0x06)
+ /* teletext streams have type 0x06 */
+ continue;
+ k = ((tbl[j - 4] << 8) | tbl[j - 3]) & 0x1fff;
+ /* elementary PID - save until we know if it's teletext PID */
+ while (j < i) {
+ switch (tbl[j]) {
+ case 0x56: /* EBU teletext descriptor */
+ progtbl[l].txtlang[0] = tbl[j + 2];
+ progtbl[l].txtlang[1] = tbl[j + 3];
+ progtbl[l].txtlang[2] = tbl[j + 4];
+ progtbl[l].txttype = tbl[j + 5] >> 3;
+ progtbl[l].txtmagazine = tbl[j + 5] & 7;
+ progtbl[l].txtpage = tbl[j + 6];
+ progtbl[l].ttpid = k;
+ break;
+ }
+ j += 2 + tbl[j + 1];
+ }
+ }
+ }
+
+ printf \
+ ("sid:pmtpid:ttpid:type:provider:name:language:texttype:magazine:page\n\n");
+ for (i = 0; i < progcnt; i++) {
+ printf("%d:%d:%d:%d:%s:%s:lang=%.3s:type=%d:magazine=%1u:page=%3u\n",
+ progtbl[i].service_id, progtbl[i].pmtpid, progtbl[i].ttpid,
+ progtbl[i].service_type, progtbl[i].service_provider_name,
+ progtbl[i].service_name, progtbl[i].txtlang, progtbl[i].txttype,
+ progtbl[i].txtmagazine, progtbl[i].txtpage);
+ }
+
+ if (*outfile) {
+ ofd = fopen(outfile,"w") ;
+ if (ofd == NULL) { error("cannot open outfile\n"); goto outerr ; }
+ for (i = 0; i < progcnt; i++) {
+ if (progtbl[i].ttpid == 0x1fff) continue ; // service without teletext
+ fprintf(ofd,"%d:%d:%s:%s:lang=%.3s\n",
+ progtbl[i].service_id, progtbl[i].ttpid, progtbl[i].service_provider_name,
+ progtbl[i].service_name, progtbl[i].txtlang);
+ }
+ fclose(ofd) ;
+ }
+
+ progp = NULL;
+
+ if (channel) {
+ j = strlen(channel);
+ for (i = 0; i < progcnt; i++)
+ if (!strncmp(progtbl[i].service_name, channel, j)
+ && progtbl[i].ttpid != 0x1fff) { progp = &progtbl[i];
+ break ;
+ }
+ }
+
+ if (channel && !progp) {
+ j = strlen(channel);
+ for (i = 0; i < progcnt; i++)
+ if (!strncasecmp(progtbl[i].service_name, channel, j)
+ && progtbl[i].ttpid != 0x1fff) { progp = &progtbl[i];
+ break ;
+ }
+ }
+
+ if (sid) {
+ for (i = 0; i < progcnt; i++) {
+ if ((progtbl[i].service_id == sid) && (progtbl[i].ttpid != 0x1fff)) {
+ progp = &progtbl[i]; break ; }
+ }
+ }
+
+ if (!progp) {
+ for (i = 0; i < progcnt; i++)
+ if (progtbl[i].ttpid != 0x1fff) {
+ progp = &progtbl[i]; break ;
+ }
+ }
+
+ printf("\nUsing: Service ID = %d ; PMT PID = %d ; TXT PID = %d ;\n"
+ "Service type = %d ; Provider Name = %s ; Service name = %s ;\n"
+ "language = %.3s ; Text type = %d ; Text Magazine = %1u ; Text page = %3u\n",
+ progp->service_id, progp->pmtpid, progp->ttpid, progp->service_type,
+ progp->service_provider_name, progp->service_name, progp->txtlang,
+ progp->txttype, progp->txtmagazine, progp->txtpage);
+ vbi->ttpid = progp->ttpid;
+
+ ttpidfound:
+ rawbuf = malloc(rawbuf_size = 8192);
+ if (!rawbuf)
+ goto outerr;
+ rawptr = 0;
+#if 0
+ close(vbi->fd);
+ if ((vbi->fd = open(vbi_name, O_RDWR)) == -1) {
+ error("cannot open demux device %s", vbi_name);
+ return -1;
+ }
+#endif
+ memset(&filterpar, 0, sizeof(filterpar));
+ filterpar.pid = vbi->ttpid;
+ filterpar.input = DMX_IN_FRONTEND;
+ filterpar.output = DMX_OUT_TAP;
+ filterpar.pes_type = DMX_PES_OTHER;
+ filterpar.flags = DMX_IMMEDIATE_START;
+ if (ioctl(vbi->fd, DMX_SET_PES_FILTER, &filterpar) < 0) {
+ error("ioctl: DMX_SET_PES_FILTER %s (%u)", strerror(errno), errno);
+ goto outerr;
+ }
+ return 0;
+
+ outerr:
+ close(vbi->fd);
+ vbi->fd = -1;
+ return -1;
+}
+
+
+struct vbi *open_null_vbi(struct cache *ca)
+{
+ static int inited = 0;
+ struct vbi *vbi;
+
+ if (not inited)
+ lang_init();
+ inited = 1;
+
+ vbi = malloc(sizeof(*vbi));
+ if (!vbi)
+ {
+ error("out of memory");
+ goto fail1;
+ }
+
+ vbi->fd = open("/dev/null", O_RDONLY);
+ if (vbi->fd == -1)
+ {
+ error("cannot open null device");
+ goto fail2;
+ }
+
+ vbi->ttpid = -1;
+ out_of_sync(vbi);
+ vbi->ppage = vbi->rpage;
+ fdset_add_fd(fds, vbi->fd, vbi_handler, vbi);
+ return vbi;
+
+fail3:
+ close(vbi->fd);
+fail2:
+ free(vbi);
+fail1:
+ return 0;
+}
+
+
+void send_errmsg(struct vbi *vbi, char *errmsg, ...)
+{
+ va_list args;
+ if (errmsg == NULL || *errmsg == '\0')
+ return;
+ va_start(args, errmsg);
+ char *buff = NULL;
+ if (vasprintf(&buff, errmsg, args) < 0)
+ buff = NULL;
+ va_end(args);
+ if(buff == NULL)
+ out_of_mem(-1);
+ vbi_send(vbi, EV_ERR, 0, 0, 0, buff);
+}
diff --git a/util/alevt/vbi.h b/util/alevt/vbi.h
new file mode 100644
index 0000000..edb9dab
--- /dev/null
+++ b/util/alevt/vbi.h
@@ -0,0 +1,47 @@
+#ifndef VBI_H
+#define VBI_H
+
+#include "vt.h"
+#include "dllist.h"
+#include "cache.h"
+#include "lang.h"
+
+#define PLL_ADJUST 4
+
+struct raw_page
+{
+ struct vt_page page[1];
+ struct enhance enh[1];
+};
+
+struct vbi
+{
+ int fd;
+ struct cache *cache;
+ struct dl_head clients[1];
+ // page assembly
+ struct raw_page rpage[8]; // one for each magazin
+ struct raw_page *ppage; // points to page of previous pkt0
+ // DVB stuff
+ unsigned int ttpid;
+ u_int16_t sid;
+};
+
+struct vbi_client
+{
+ struct dl_node node[1];
+ void (*handler)(void *data, struct vt_event *ev);
+ void *data;
+};
+
+struct vbi *vbi_open(char *vbi_dev_name, struct cache *ca,
+ const char *channel, char *outfile, u_int16_t sid, int ttpid);
+void vbi_close(struct vbi *vbi);
+void vbi_reset(struct vbi *vbi);
+int vbi_add_handler(struct vbi *vbi, void *handler, void *data);
+void vbi_del_handler(struct vbi *vbi, void *handler, void *data);
+struct vt_page *vbi_query_page(struct vbi *vbi, int pgno, int subno);
+
+struct vbi *open_null_vbi(struct cache *ca);
+void send_errmsg(struct vbi *vbi, char *errmsg, ...);
+#endif
diff --git a/util/alevt/vt.h b/util/alevt/vt.h
new file mode 100644
index 0000000..75986e8
--- /dev/null
+++ b/util/alevt/vt.h
@@ -0,0 +1,62 @@
+#ifndef VT_H
+#define VT_H
+
+#include "misc.h"
+
+#define W 40
+#define H 25
+#define BAD_CHAR 0xb8 // substitute for chars with bad parity
+
+struct vt_event
+{
+ int type;
+ void *resource; /* struct xio_win *, struct vbi *, ... */
+ int i1, i2, i3, i4;
+ void *p1;
+};
+
+#define EV_CLOSE 1
+#define EV_KEY 2 // i1:KEY_xxx i2:shift-flag
+#define EV_MOUSE 3 // i1:button i2:shift-flag i3:x i4:y
+#define EV_SELECTION 4 // i1:len p1:data
+#define EV_PAGE 5 // p1:vt_page i1:query-flag
+#define EV_HEADER 6 // i1:pgno i2:subno i3:flags p1:data
+#define EV_XPACKET 7 // i1:mag i2:pkt i3:errors p1:data
+#define EV_RESET 8 // ./.
+#define EV_TIMER 9 // ./.
+#define EV_ERR 10 // p1: errmsg
+#define KEY_F(i) (1000+i)
+#define KEY_LEFT 2001
+#define KEY_RIGHT 2002
+#define KEY_UP 2003
+#define KEY_DOWN 2004
+#define KEY_PUP 2005
+#define KEY_PDOWN 2006
+#define KEY_DEL 2007
+#define KEY_INS 2008
+
+struct vt_page
+{
+ int pgno, subno; // the wanted page number
+ int lang; // language code
+ int flags; // misc flags (see PG_xxx below)
+ int errors; // number of single bit errors in page
+ u32 lines; // 1 bit for each line received
+ u8 data[25][40]; // page contents
+ int flof; // page has FastText links
+ struct {
+ int pgno;
+ int subno;
+ } link[6]; // FastText links (FLOF)
+};
+
+#define PG_SUPPHEADER 0x01 // C7 row 0 is not to be displayed
+#define PG_OUTOFSEQ 0x04 // C9 page out of numerical order
+#define PG_NODISPLAY 0x08 // C10 rows 1-24 is not to be displayed
+#define PG_MAGSERIAL 0x10 // C11 serial trans. (any pkt0 terminates page)
+#define PG_ERASE 0x20 // C4 clear previously stored lines
+#define PG_NEWSFLASH 0x40 // C5 box it and insert into normal video pict.
+#define PG_SUBTITLE 0x80 // C6 box it and insert into normal video pict.
+#define PG_ACTIVE 0x100 // currently fetching this page
+#define ANY_SUB 0x3f7f // universal subpage number
+#endif
diff --git a/util/alevt/vt900.out b/util/alevt/vt900.out
new file mode 100644
index 0000000..558ee67
--- /dev/null
+++ b/util/alevt/vt900.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Contents: ",
+"\6\15Contents: ",
+"\24 #################################### ",
+" ",
+" \3\177\6Starting alevt . . . . . . 902 ",
+" ",
+" \3\177\6Copying/Warranty . . . . . 904 ",
+" ",
+" \3\177\6The Status Line . . . . . 905 ",
+" ",
+" \3\177\6Selecting Pages . . . . . 907 ",
+" ",
+" \3\177\6QuickClick Page . . . . . 915 ",
+" ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" (Click to select a page) ",
+" ",
+"\4\35\7 Next 901 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt901.out b/util/alevt/vt901.out
new file mode 100644
index 0000000..1bde77c
--- /dev/null
+++ b/util/alevt/vt901.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Contents: ",
+"\6\15Contents: ",
+"\24 #################################### ",
+" ",
+"\6 \3\177\6FastText Menu . . . . . . 909 ",
+"\6 ",
+"\6 \3\177\6Keyboard Commands . . . . 910 ",
+"\6 ",
+"\6 \3\177\6Starting alevt-cap . . . . 912 ",
+"\6 ",
+"\6 \3\177\6Starting alevt-date . . . 914 ",
+"\6 ",
+"\6 \3\177\6QuickClick Page . . . . . 915 ",
+" ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" (Click to select a page) ",
+" ",
+"\4\35\7Back 900 Index 900 Next 902 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt902.out b/util/alevt/vt902.out
new file mode 100644
index 0000000..665b41d
--- /dev/null
+++ b/util/alevt/vt902.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7 Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Starting alevt: ",
+"\6\15Starting alevt: ",
+"\24 #################################### ",
+"\6 $\7alevt\6[options] Default: ",
+" ",
+" -c\6<channel name> (none;dvb only) ",
+" -ch -child\6<ppp.ss> (none) ",
+" -cs -charset \6latin-1 ",
+" \6<latin-1/2/koi8-r/ ",
+" \6iso8859-7> ",
+" -h -help ",
+" ",
+" ",
+" ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 901 Index 900 Next 903 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt903.out b/util/alevt/vt903.out
new file mode 100644
index 0000000..0df75c1
--- /dev/null
+++ b/util/alevt/vt903.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Starting alevt: ",
+"\6\15Starting alevt: ",
+"\24 #################################### ",
+"\6 $\7alevt\6[options] Default: ",
+" -o\6<outfile> (none;dvb only) ",
+" -p -parent\6<ppp.ss> 900 ",
+" -s -sid\6<sid> (none;dvb only) ",
+" -t -ttpid\6<ttpid> (none;dvb only) ",
+" -v -vbi\6<vbidev> /dev/vbi ",
+" \6/dev/vbi0 ",
+" \6/dev/video0 ",
+" \6/dev/dvb/adapter0/demux0 ",
+" ",
+" ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 902 Index 900 Next 904 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt904.out b/util/alevt/vt904.out
new file mode 100644
index 0000000..d13dcfd
--- /dev/null
+++ b/util/alevt/vt904.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Copying: ",
+"\6\15Copying: ",
+"\24 #################################### ",
+"\6 2002-07 Edgar Toernig (froese@gmx.de) ",
+"\6 All Rights Reserved. ",
+"\6 ",
+"\6 This program is free software; you ",
+"\6 can redistribute it and/or modify it ",
+"\6 under the terms of the GNU General ",
+"\6 Public License Version 2 as published ",
+"\6 by the Free Software Foundation. ",
+"\6 ",
+"\6 This program is distributed in the ",
+"\6 hope that it will be useful, but ",
+"\6\7without any warranty.\6See the GNU ",
+"\6 General Public License for details. ",
+" ",
+"\4\35\7Back 903 Index 900 Next 905 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt905.out b/util/alevt/vt905.out
new file mode 100644
index 0000000..b445ebb
--- /dev/null
+++ b/util/alevt/vt905.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Status Line: ",
+"\6\15Status Line: ",
+"\24 #################################### ",
+"\6 The top line of each window is the ",
+"\6 status line. On the left it shows ",
+"\6 the current page number (CPN) and ",
+"\6 some flags. The rest of the line ",
+"\6 is the running header sent by the ",
+"\6 TV station. ",
+"\6 ",
+"\6 If the CPN is red, the program is ",
+"\6 searching for that page. If it's ",
+"\6 green, it's the PN of the currently ",
+"\6 displayed page. ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 904 Index 900 Next 906 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt906.out b/util/alevt/vt906.out
new file mode 100644
index 0000000..156b481
--- /dev/null
+++ b/util/alevt/vt906.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Status Line: \14\5\30 ",
+"\6\15Status Line: \14\5\30 ",
+"\24 #################################### ",
+"\6 An\2H\6behind the CPN indicates that ",
+"\6 the page is on hold. This inhibits ",
+"\6 subpage cycling and page updates. A ",
+"\6 click on the CPN toggles the\2H\6flag.",
+" ",
+"\6 A\5*\6indicates that the page ",
+"\6 contains concealed text. Clicking on ",
+"\6 the\5*\6reveals that text. ",
+" ",
+"\6 A CPN in the form\2Sxx\6is shown if a ",
+"\6 specific subpage is selected. ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 905 Index 900 Next 907 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt907.out b/util/alevt/vt907.out
new file mode 100644
index 0000000..6aeb4e6
--- /dev/null
+++ b/util/alevt/vt907.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Selecting Pages: ",
+"\6\15Selecting Pages: ",
+"\24 #################################### ",
+"\6 To select a specific page, you may ",
+"\6 either enter the page number with ",
+"\6 the keyboard or click with the\7left ",
+"\6 mouse button on a page number ",
+"\6 somewhere on the screen. ",
+"\6 ",
+"\6 Clicking with the\7middle\6button will ",
+"\6 show the page in a child window. If ",
+"\6 there is no child window, a new one ",
+"\6 will be opened. ",
+"\6 ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 906 Index 900 Next 908 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt908.out b/util/alevt/vt908.out
new file mode 100644
index 0000000..851a9b5
--- /dev/null
+++ b/util/alevt/vt908.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Selecting Pages: ",
+"\6\15Selecting Pages: ",
+"\24 #################################### ",
+"\6 AleVT also recognizes something like ",
+"\3 3/7\6as a valid page number. Clicking ",
+"\6 with the\7left\6button will cycle to ",
+"\6 the next subpage of the current page. ",
+"\6 The\7middle\6buttons cycles backwards. ",
+"\6 ",
+"\6 For each window a history of ",
+"\6 recently visited pages is kept. ",
+"\6 Pressing the\7right\6mouse button will ",
+"\6 take you back to the previous page. ",
+"\6 ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 907 Index 900 Next 909 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt909.out b/util/alevt/vt909.out
new file mode 100644
index 0000000..0b28450
--- /dev/null
+++ b/util/alevt/vt909.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15FastText Menu: ",
+"\6\15FastText Menu: ",
+"\24 #################################### ",
+"\6 The last line of each window shows ",
+"\6 the FastText Menu (only if one is ",
+"\6 transmitted for that page). ",
+"\6 ",
+"\6 It consists of up to four colored ",
+"\6 labels. You may click on a label ",
+"\6 or press one of the function keys ",
+"\6 F1-F4 to go to the associated page. ",
+"\6 ",
+"\6 For the 5th (white) key present on ",
+"\6 some remote controls press F5. ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 908 Index 900 Next 910 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt910.out b/util/alevt/vt910.out
new file mode 100644
index 0000000..d3a2095
--- /dev/null
+++ b/util/alevt/vt910.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Keyboard Commands: ",
+"\6\15Keyboard Commands: ",
+"\24 #################################### ",
+" 0\6-\0079 \6Enter page number ",
+" q\6or\7ESC \6Close window ",
+" h \6Goto page 900 (help page) ",
+" i \6Goto page 100 (index page) ",
+" o \6Open a new window ",
+" SPACE \6Hold page ",
+" RIGHT \6Goto next page ",
+" LEFT \6Goto previous page ",
+" DOWN \6Goto next subpage ",
+" UP \6Goto previous subpage ",
+" BACKSPACE\6Previous page from history ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 909 Index 900 Next 911 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt911.out b/util/alevt/vt911.out
new file mode 100644
index 0000000..49e6cc1
--- /dev/null
+++ b/util/alevt/vt911.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7 Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \007 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Keyboard Commands: ",
+"\6\15Keyboard Commands: ",
+"\24 #################################### ",
+" s \6Save page to file ",
+" c \6Clear page cache ",
+" r \6Reveal concealed text ",
+" F1\6-\7F5 \6FastText keys ",
+" /\6and\7? \6Search forward/backward ",
+" n\6and\7N \6Search next/previous ",
+" f\6and\7F \6Fine tune the decoder ",
+" e \6Error reduction on/off ",
+" b \6Error bell on/off ",
+"\6 Holding the\7shift\6key while pressing ",
+"\6 one of the\7cursor\6keys allows ",
+"\6 selecting the 'hex' pages (Ex.: 1f1). ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+"\4\35\7Back 910 Index 900 Next 912 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt912.out b/util/alevt/vt912.out
new file mode 100644
index 0000000..6fd7d12
--- /dev/null
+++ b/util/alevt/vt912.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7 Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Starting alevt-cap: ",
+"\6\15Starting alevt-cap: ",
+"\24 #################################### ",
+"\6 $\7alevt-cap\6[options] Default: ",
+" ",
+" -cs -charset \6latin-1 ",
+" \6<latin-1/2/koi8-r/ ",
+" \6iso8859-7> ",
+" -f -format \6ascii ",
+" \6<fmt,options> ",
+" -f help -format help ",
+" -h -help ",
+" -n -name \6<filename> ttext-%s.%e ",
+" ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 911 Index 900 Next 913 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt913.out b/util/alevt/vt913.out
new file mode 100644
index 0000000..e0f4878
--- /dev/null
+++ b/util/alevt/vt913.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7 Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Starting alevt-cap: ",
+"\6\15Starting alevt-cap: ",
+"\24 #################################### ",
+"\6 $\7alevt-cap\6[options] Default: ",
+" ",
+" -s -sid\6<sid> (none;dvb only) ",
+" -t -ttpid\6<ttpid> (none;dvb only) ",
+" -to -timeout\6<secs> (none) ",
+" -v -vbi\6<vbidev> /dev/vbi ",
+" \6/dev/vbi0 ",
+" \6/dev/video0 ",
+" \6/dev/dvb/adapter0/demux0 ",
+" ",
+" ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 912 Index 900 Next 914 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt914.out b/util/alevt/vt914.out
new file mode 100644
index 0000000..a55eed1
--- /dev/null
+++ b/util/alevt/vt914.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7 Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15Starting alevt-date: ",
+"\6\15Starting alevt-date: ",
+"\24 #################################### ",
+"\6 $\7alevt-date\6[options] Default: ",
+" ",
+" -d -delta\6<max_secs> 7200 (2 hours) ",
+" -f -format\6<fmtstr> %c ",
+" -h -help ",
+" -s -set \6off ",
+" -to -timeout\6<seconds>(none) ",
+" -v -vbi\6<vbidev> /dev/vbi ",
+" \6/dev/vbi0 ",
+" \6/dev/video0 ",
+" \6/dev/dvb/adapter0/demux0 ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7Back 913 Index 900 Next 915 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vt915.out b/util/alevt/vt915.out
new file mode 100644
index 0000000..66041ac
--- /dev/null
+++ b/util/alevt/vt915.out
@@ -0,0 +1,29 @@
+#ifndef HELP_HEADER
+" \6AleVT Online Help System ",
+" \22`p0`0 p `0pppp ",
+"\4\35\22\177 \177j5`p \177 j5 j5 \7Version \34",
+"\4\35\22\177,\177j5\177.! +t>! j5 \7 1.7.0 \34",
+" \22# #\42!\42# \42 \42! ",
+#else
+HELP_HEADER
+#endif
+" ",
+"\6\15QuickClick: ",
+"\6\15QuickClick: ",
+"\24 #################################### ",
+"\6 100 200 300 400 500 600 700 800 ",
+"\6 101 201 301 401 501 601 701 801 ",
+"\6 110 210 310 410 510 610 710 810 ",
+"\6 120\006220 320 420 520 620 720 820 ",
+"\6 130 230 330 430 530 630 730 830 ",
+"\6 140\006240 340 440 540 640 740 840 ",
+"\6 150 250 350 450 550 650 750 850 ",
+"\6 160\006260 360 460 560 660 760 860 ",
+"\6 170 270 370 470 570 670 770 870 ",
+"\6 180\006280 380 480 580 680 780 880 ",
+"\6 190 290 390 490 590 690 790 890 ",
+"\24 pppppppppppppppppppppppppppppppppppp ",
+" ",
+" ",
+"\4\35\7 Index 900 \34",
+"\1Page 100 \2Page 200 \3Page 300 \6Page 400\34",
diff --git a/util/alevt/vtxt-iso8859-7.bdf b/util/alevt/vtxt-iso8859-7.bdf
new file mode 100644
index 0000000..7d62c95
--- /dev/null
+++ b/util/alevt/vtxt-iso8859-7.bdf
@@ -0,0 +1,5768 @@
+STARTFONT 2.1
+FONT -alevt-teletext-medium-r-normal--16-1-75-75-c-90-fontspecific-1
+SIZE 1 75 75
+FONTBOUNDINGBOX 9 16 0 -4
+STARTPROPERTIES 10
+POINT_SIZE 1
+PIXEL_SIZE 16
+RESOLUTION_X 75
+RESOLUTION_Y 75
+FONT_ASCENT 12
+FONT_DESCENT 4
+AVERAGE_WIDTH 90
+SPACING "C"
+_XMBDFED_INFO "Edited with xmbdfed 4.5."
+FONT "vtxt"
+ENDPROPERTIES
+CHARS 250
+STARTCHAR char0
+ENCODING 0
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 1
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 2
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 3
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 4
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 5
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 6
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 7
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 8
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 9
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 10
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 11
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 12
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 13
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 14
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 15
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 16
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 17
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 18
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 19
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 20
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 21
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 22
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 23
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 24
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 25
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 26
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 27
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 28
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 29
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 30
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 31
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+0000
+0000
+ENDCHAR
+STARTCHAR char32
+ENCODING 32
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char33
+ENCODING 33
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3C00
+3C00
+3C00
+1800
+1800
+1800
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char34
+ENCODING 34
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6600
+6600
+6600
+2400
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char35
+ENCODING 35
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3600
+3600
+7F00
+3600
+3600
+3600
+7F00
+3600
+3600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char36
+ENCODING 36
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+0C00
+3E00
+6300
+6100
+6000
+3E00
+0300
+0300
+4300
+6300
+3E00
+0C00
+0C00
+0000
+0000
+ENDCHAR
+STARTCHAR char37
+ENCODING 37
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+6100
+6300
+0600
+0C00
+1800
+3000
+6300
+4300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char38
+ENCODING 38
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+3600
+1C00
+3B00
+6E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char39
+ENCODING 39
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+3000
+3000
+6000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char40
+ENCODING 40
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0C00
+1800
+3000
+3000
+3000
+3000
+3000
+3000
+1800
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char41
+ENCODING 41
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3000
+1800
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+1800
+3000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char42
+ENCODING 42
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6600
+3C00
+FF00
+3C00
+6600
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char43
+ENCODING 43
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+7E00
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char44
+ENCODING 44
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+1800
+3000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char45
+ENCODING 45
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7F00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char46
+ENCODING 46
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char47
+ENCODING 47
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0100
+0300
+0600
+0C00
+1800
+3000
+6000
+4000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char48
+ENCODING 48
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+6600
+C300
+C300
+DB00
+DB00
+C300
+C300
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char49
+ENCODING 49
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3800
+7800
+1800
+1800
+1800
+1800
+1800
+1800
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char50
+ENCODING 50
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+0300
+0600
+0C00
+1800
+3000
+6000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char51
+ENCODING 51
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+0300
+0300
+1E00
+0300
+0300
+0300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char52
+ENCODING 52
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0E00
+1E00
+3600
+6600
+7F00
+0600
+0600
+0600
+0F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char53
+ENCODING 53
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+6000
+6000
+6000
+7E00
+0300
+0300
+0300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char54
+ENCODING 54
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3000
+6000
+6000
+7E00
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char55
+ENCODING 55
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+6300
+0300
+0300
+0600
+0C00
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char56
+ENCODING 56
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+3E00
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char57
+ENCODING 57
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+3F00
+0300
+0300
+0300
+0600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char58
+ENCODING 58
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char59
+ENCODING 59
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+1800
+1800
+1800
+3000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char60
+ENCODING 60
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0600
+0C00
+1800
+3000
+6000
+3000
+1800
+0C00
+0600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char61
+ENCODING 61
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7E00
+0000
+0000
+7E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char62
+ENCODING 62
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+6000
+3000
+1800
+0C00
+0600
+0C00
+1800
+3000
+6000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char63
+ENCODING 63
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+0600
+0C00
+0C00
+0C00
+0000
+0C00
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char64
+ENCODING 64
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3E00
+6300
+6300
+6F00
+6F00
+6F00
+6E00
+6000
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char65
+ENCODING 65
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char66
+ENCODING 66
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3300
+3300
+3300
+3300
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char67
+ENCODING 67
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6000
+6000
+6100
+3300
+1E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char68
+ENCODING 68
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7C00
+3600
+3300
+3300
+3300
+3300
+3300
+3300
+3600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char69
+ENCODING 69
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char70
+ENCODING 70
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char71
+ENCODING 71
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6F00
+6300
+6300
+3300
+1D00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char72
+ENCODING 72
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+6300
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char73
+ENCODING 73
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char74
+ENCODING 74
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0F00
+0600
+0600
+0600
+0600
+0600
+6600
+6600
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char75
+ENCODING 75
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7300
+3300
+3300
+3600
+3C00
+3C00
+3600
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char76
+ENCODING 76
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7800
+3000
+3000
+3000
+3000
+3000
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char77
+ENCODING 77
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+E700
+FF00
+FF00
+DB00
+C300
+C300
+C300
+C300
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char78
+ENCODING 78
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+7300
+7B00
+7F00
+6F00
+6700
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char79
+ENCODING 79
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char80
+ENCODING 80
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char81
+ENCODING 81
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6B00
+6F00
+3E00
+0600
+0700
+0000
+0000
+ENDCHAR
+STARTCHAR char82
+ENCODING 82
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3600
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char83
+ENCODING 83
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+3000
+1C00
+0600
+0300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char84
+ENCODING 84
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+DB00
+9900
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char85
+ENCODING 85
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char86
+ENCODING 86
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+C300
+C300
+C300
+C300
+6600
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char87
+ENCODING 87
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+C300
+C300
+DB00
+DB00
+FF00
+6600
+6600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char88
+ENCODING 88
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+6600
+3C00
+1800
+1800
+3C00
+6600
+C300
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char89
+ENCODING 89
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+6600
+3C00
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char90
+ENCODING 90
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+C300
+8600
+0C00
+1800
+3000
+6000
+C100
+C300
+FF00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char91
+ENCODING 91
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char92
+ENCODING 92
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+4000
+6000
+7000
+3800
+1C00
+0E00
+0700
+0300
+0100
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char93
+ENCODING 93
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char94
+ENCODING 94
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0800
+1C00
+3600
+6300
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char95
+ENCODING 95
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char96
+ENCODING 96
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3000
+3000
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char97
+ENCODING 97
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char98
+ENCODING 98
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3C00
+3600
+3300
+3300
+3300
+3300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char99
+ENCODING 99
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6000
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char100
+ENCODING 100
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+0600
+0600
+1E00
+3600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char101
+ENCODING 101
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char102
+ENCODING 102
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+3200
+3000
+7800
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char103
+ENCODING 103
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3B00
+6600
+6600
+6600
+6600
+6600
+3E00
+0600
+6600
+3C00
+0000
+ENDCHAR
+STARTCHAR char104
+ENCODING 104
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3600
+3B00
+3300
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char105
+ENCODING 105
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char106
+ENCODING 106
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0600
+0000
+0E00
+0600
+0600
+0600
+0600
+0600
+0600
+6600
+6600
+3C00
+0000
+ENDCHAR
+STARTCHAR char107
+ENCODING 107
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3300
+3600
+3C00
+3C00
+3600
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char108
+ENCODING 108
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char109
+ENCODING 109
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+E600
+FF00
+DB00
+DB00
+DB00
+DB00
+DB00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char110
+ENCODING 110
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char111
+ENCODING 111
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char112
+ENCODING 112
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3E00
+3000
+3000
+3000
+0000
+ENDCHAR
+STARTCHAR char113
+ENCODING 113
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3B00
+6600
+6600
+6600
+6600
+6600
+3E00
+0600
+0600
+0600
+0000
+ENDCHAR
+STARTCHAR char114
+ENCODING 114
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3B00
+3300
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char115
+ENCODING 115
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+3000
+1C00
+0600
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char116
+ENCODING 116
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1800
+1800
+7E00
+1800
+1800
+1800
+1800
+1B00
+0E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char117
+ENCODING 117
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char118
+ENCODING 118
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+C300
+C300
+C300
+6600
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char119
+ENCODING 119
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+C300
+C300
+DB00
+DB00
+FF00
+6600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char120
+ENCODING 120
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+6600
+3C00
+1800
+3C00
+6600
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char121
+ENCODING 121
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+3F00
+0300
+0600
+0C00
+0000
+ENDCHAR
+STARTCHAR char122
+ENCODING 122
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7F00
+6600
+0C00
+1800
+3000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char123
+ENCODING 123
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+1800
+1800
+1800
+7000
+1800
+1800
+1800
+1800
+0E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char124
+ENCODING 124
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char125
+ENCODING 125
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+1800
+1800
+1800
+0E00
+1800
+1800
+1800
+1800
+7000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char126
+ENCODING 126
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3B00
+6E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char127
+ENCODING 127
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 128
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 129
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 130
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 131
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 132
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 133
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 134
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 135
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 136
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 137
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 138
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 139
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 140
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 141
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 142
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 143
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 144
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 145
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 146
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 147
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 148
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 149
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 150
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 151
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 152
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 153
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 154
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 155
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 156
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 157
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 158
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 159
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR U+00A0 NO-BREAK SPACE
+ENCODING 160
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+02BD MODIFIER LETTER REVERSED COMMA
+ENCODING 161
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1800
+1000
+1000
+0800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+02BC MODIFIER LETTER APOSTROPHE
+ENCODING 162
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1800
+0800
+0800
+1000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00A3 POUND SIGN
+ENCODING 163
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+1000
+1000
+1000
+7C00
+1000
+1000
+1000
+3E00
+6100
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00A6 BROKEN BAR
+ENCODING 166
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+0800
+0800
+0800
+0000
+0000
+0800
+0800
+0800
+0800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00A7 SECTION SIGN
+ENCODING 167
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+4200
+4000
+3C00
+4200
+4200
+3C00
+0200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00A8 DIAERESIS
+ENCODING 168
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+2400
+2400
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00A9 COPYRIGHT SIGN
+ENCODING 169
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+4200
+9900
+A500
+A100
+A100
+A500
+9900
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+ENCODING 171
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+1200
+1200
+2400
+2400
+4800
+2400
+2400
+1200
+1200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00AC NOT SIGN
+ENCODING 172
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7E00
+0200
+0200
+0200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00AD SOFT HYPHEN
+ENCODING 173
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+2015 HORIZONTAL BAR
+ENCODING 175
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00B0 DEGREE SIGN
+ENCODING 176
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+2800
+2800
+1000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00B1 PLUS-MINUS SIGN
+ENCODING 177
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+0800
+0800
+7F00
+0800
+0800
+0800
+0000
+7F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00B2 SUPERSCRIPT TWO
+ENCODING 178
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1C00
+2200
+0200
+1C00
+2000
+2000
+3E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00B3 SUPERSCRIPT THREE
+ENCODING 179
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1C00
+2200
+0200
+1C00
+0200
+2200
+1C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0384 GREEK TONOS
+ENCODING 180
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+1000
+1000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0385 GREEK DIALYTIKA TONOS
+ENCODING 181
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+1000
+1000
+4400
+4400
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0386 GREEK CAPITAL LETTER ALPHA WITH TONOS
+ENCODING 182
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+4000
+4000
+0000
+1800
+2400
+2400
+4200
+4200
+7E00
+4200
+4200
+4200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00B7 MIDDLE DOT
+ENCODING 183
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0388 GREEK CAPITAL LETTER EPSILON WITH TONOS
+ENCODING 184
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+4000
+4000
+0000
+7E00
+4000
+4000
+4000
+7C00
+4000
+4000
+4000
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0389 GREEK CAPITAL LETTER ETA WITH TONOS
+ENCODING 185
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+4000
+4000
+0000
+4200
+4200
+4200
+4200
+7E00
+4200
+4200
+4200
+4200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+038A GREEK CAPITAL LETTER IOTA WITH TONOS
+ENCODING 186
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+4000
+4000
+0000
+3E00
+0800
+0800
+0800
+0800
+0800
+0800
+0800
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+ENCODING 187
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+4800
+4800
+2400
+2400
+1200
+2400
+2400
+4800
+4800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+038C GREEK CAPITAL LETTER OMICRON WITH TONOS
+ENCODING 188
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+4000
+4000
+0000
+3C00
+4200
+4200
+4200
+4200
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+00BD VULGAR FRACTION ONE HALF
+ENCODING 189
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+2200
+6200
+2400
+2800
+2800
+1400
+1A00
+2200
+4400
+4E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+038E GREEK CAPITAL LETTER UPSILON WITH TONOS
+ENCODING 190
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+4000
+4000
+0000
+4100
+4100
+2200
+2200
+1400
+0800
+0800
+0800
+0800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+038F GREEK CAPITAL LETTER OMEGA WITH TONOS
+ENCODING 191
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+4000
+4000
+0000
+3E00
+4100
+4100
+4100
+4100
+2200
+1400
+1400
+7700
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
+ENCODING 192
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1000
+5400
+4400
+0000
+1000
+1000
+1000
+1000
+1000
+1000
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0391 GREEK CAPITAL LETTER ALPHA
+ENCODING 193
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+2400
+2400
+4200
+4200
+7E00
+4200
+4200
+4200
+4200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0392 GREEK CAPITAL LETTER BETA
+ENCODING 194
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7C00
+4200
+4200
+4200
+7C00
+4200
+4200
+4200
+4200
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0393 GREEK CAPITAL LETTER GAMMA
+ENCODING 195
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+4000
+4000
+4000
+4000
+4000
+4000
+4000
+4000
+4000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0394 GREEK CAPITAL LETTER DELTA
+ENCODING 196
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+0800
+1400
+1400
+2200
+2200
+2200
+4100
+4100
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0395 GREEK CAPITAL LETTER EPSILON
+ENCODING 197
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+4000
+4000
+4000
+7C00
+4000
+4000
+4000
+4000
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0396 GREEK CAPITAL LETTER ZETA
+ENCODING 198
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+0200
+0200
+0400
+0800
+1000
+2000
+4000
+4000
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0397 GREEK CAPITAL LETTER ETA
+ENCODING 199
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+4200
+4200
+4200
+4200
+7E00
+4200
+4200
+4200
+4200
+4200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0398 GREEK CAPITAL LETTER THETA
+ENCODING 200
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+4200
+4200
+4200
+7E00
+4200
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+0399 GREEK CAPITAL LETTER IOTA
+ENCODING 201
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+0800
+0800
+0800
+0800
+0800
+0800
+0800
+0800
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+039A GREEK CAPITAL LETTER KAPPA
+ENCODING 202
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+4200
+4400
+4800
+5000
+6000
+6000
+5000
+4800
+4400
+4200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+039B GREEK CAPITAL LETTER LAMDA
+ENCODING 203
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+0800
+1400
+1400
+2200
+2200
+2200
+4100
+4100
+4100
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+039C GREEK CAPITAL LETTER MU
+ENCODING 204
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+4200
+4200
+6600
+6600
+5A00
+5A00
+4200
+4200
+4200
+4200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+039D GREEK CAPITAL LETTER NU
+ENCODING 205
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+4200
+6200
+6200
+5200
+5200
+4A00
+4A00
+4600
+4600
+4200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+039E GREEK CAPITAL LETTER XI
+ENCODING 206
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+0000
+0000
+0000
+3C00
+0000
+0000
+0000
+0000
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+039F GREEK CAPITAL LETTER OMICRON
+ENCODING 207
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+4200
+4200
+4200
+4200
+4200
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03A0 GREEK CAPITAL LETTER PI
+ENCODING 208
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+2200
+2200
+2200
+2200
+2200
+2200
+2200
+2200
+2200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03A1 GREEK CAPITAL LETTER RHO
+ENCODING 209
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7C00
+4200
+4200
+4200
+7C00
+4000
+4000
+4000
+4000
+4000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03A3 GREEK CAPITAL LETTER SIGMA
+ENCODING 211
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+4000
+2000
+1000
+0800
+0800
+1000
+2000
+4000
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03A4 GREEK CAPITAL LETTER TAU
+ENCODING 212
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+0800
+0800
+0800
+0800
+0800
+0800
+0800
+0800
+0800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03A5 GREEK CAPITAL LETTER UPSILON
+ENCODING 213
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+4100
+4100
+2200
+2200
+1400
+0800
+0800
+0800
+0800
+0800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03A6 GREEK CAPITAL LETTER PHI
+ENCODING 214
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+0800
+3E00
+4900
+4900
+4900
+4900
+3E00
+0800
+1C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03A7 GREEK CAPITAL LETTER CHI
+ENCODING 215
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+4200
+4200
+2400
+2400
+1800
+1800
+2400
+2400
+4200
+4200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03A8 GREEK CAPITAL LETTER PSI
+ENCODING 216
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+4900
+4900
+4900
+4900
+4900
+3E00
+0800
+0800
+0800
+0800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03A9 GREEK CAPITAL LETTER OMEGA
+ENCODING 217
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+4100
+4100
+4100
+4100
+4100
+2200
+1400
+1400
+7700
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03AA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
+ENCODING 218
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+2400
+2400
+0000
+3E00
+0800
+0800
+0800
+0800
+0800
+0800
+0800
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03AB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
+ENCODING 219
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+2400
+2400
+0000
+4100
+4100
+2200
+2200
+1400
+0800
+0800
+0800
+0800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03AC GREEK SMALL LETTER ALPHA WITH TONOS
+ENCODING 220
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+1000
+0000
+0000
+3200
+4A00
+4400
+4400
+4400
+4400
+4A00
+3200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03AD GREEK SMALL LETTER EPSILON WITH TONOS
+ENCODING 221
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+1000
+0000
+0000
+3E00
+4000
+4000
+3C00
+4000
+4000
+4000
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03AE GREEK SMALL LETTER ETA WITH TONOS
+ENCODING 222
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+1000
+0000
+0000
+5C00
+6200
+4200
+4200
+4200
+4200
+4200
+4200
+0200
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03AF GREEK SMALL LETTER IOTA WITH TONOS
+ENCODING 223
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+1000
+0000
+0000
+1000
+1000
+1000
+1000
+1000
+1000
+1000
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
+ENCODING 224
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+1000
+4400
+4400
+0000
+4200
+4200
+4200
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B1 GREEK SMALL LETTER ALPHA
+ENCODING 225
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3200
+4A00
+4400
+4400
+4400
+4400
+4A00
+3200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B2 GREEK SMALL LETTER BETA
+ENCODING 226
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3800
+4400
+4400
+4400
+7C00
+4200
+4200
+4200
+6200
+5C00
+4000
+4000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B3 GREEK SMALL LETTER GAMMA
+ENCODING 227
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3100
+4900
+0A00
+0400
+0800
+0800
+1000
+1000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B4 GREEK SMALL LETTER DELTA
+ENCODING 228
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+2000
+2000
+2000
+1800
+2400
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B5 GREEK SMALL LETTER EPSILON
+ENCODING 229
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3C00
+4200
+4000
+3C00
+4000
+4000
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B6 GREEK SMALL LETTER ZETA
+ENCODING 230
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+2000
+2000
+1C00
+0800
+1000
+2000
+2000
+2000
+2000
+1C00
+0200
+1C00
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B7 GREEK SMALL LETTER ETA
+ENCODING 231
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+5C00
+6200
+4200
+4200
+4200
+4200
+4200
+4200
+0200
+0200
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B8 GREEK SMALL LETTER THETA
+ENCODING 232
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+2400
+2400
+4200
+7E00
+4200
+4200
+2400
+2400
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03B9 GREEK SMALL LETTER IOTA
+ENCODING 233
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1000
+1000
+1000
+1000
+1000
+1000
+1000
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03BA GREEK SMALL LETTER KAPPA
+ENCODING 234
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+2200
+2400
+2800
+3000
+3000
+2800
+2400
+2200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03BB GREEK SMALL LETTER LAMDA
+ENCODING 235
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+2000
+2000
+1000
+1000
+0800
+1800
+2400
+2400
+4200
+4200
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03BC GREEK SMALL LETTER MU
+ENCODING 236
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+4200
+4200
+4200
+4200
+6600
+6600
+5A00
+4200
+4000
+4000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03BD GREEK SMALL LETTER NU
+ENCODING 237
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+4200
+4200
+4200
+4400
+4400
+4800
+5000
+6000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03BE GREEK SMALL LETTER XI
+ENCODING 238
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+4000
+4000
+3C00
+4000
+4000
+3C00
+4000
+4000
+3C00
+0200
+0200
+3C00
+0000
+0000
+ENDCHAR
+STARTCHAR U+03BF GREEK SMALL LETTER OMICRON
+ENCODING 239
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3C00
+4200
+4200
+4200
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C0 GREEK SMALL LETTER PI
+ENCODING 240
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+7E00
+2400
+2400
+2400
+2400
+2400
+2400
+2400
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C1 GREEK SMALL LETTER RHO
+ENCODING 241
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3C00
+4200
+4200
+4200
+4200
+4200
+6200
+5C00
+4000
+4000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C2 GREEK SMALL LETTER FINAL SIGMA
+ENCODING 242
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1E00
+2000
+4000
+4000
+4000
+2000
+1C00
+0200
+0200
+1C00
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C3 GREEK SMALL LETTER SIGMA
+ENCODING 243
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3F00
+4800
+4400
+4400
+4400
+4400
+4400
+3800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C4 GREEK SMALL LETTER TAU
+ENCODING 244
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+7E00
+1000
+1000
+1000
+1000
+1000
+1000
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C5 GREEK SMALL LETTER UPSILON
+ENCODING 245
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+4200
+4200
+4200
+4200
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C6 GREEK SMALL LETTER PHI
+ENCODING 246
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3E00
+4900
+4900
+4900
+4900
+4900
+4900
+3E00
+0800
+0800
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C7 GREEK SMALL LETTER CHI
+ENCODING 247
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+4200
+4200
+2400
+2400
+1800
+1800
+2400
+2400
+4200
+4200
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C8 GREEK SMALL LETTER PSI
+ENCODING 248
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+4900
+4900
+4900
+4900
+4900
+3E00
+0800
+0800
+0000
+0000
+ENDCHAR
+STARTCHAR U+03C9 GREEK SMALL LETTER OMEGA
+ENCODING 249
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+2200
+4100
+4100
+4900
+4900
+4900
+4900
+3600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03CA GREEK SMALL LETTER IOTA WITH DIALYTIKA
+ENCODING 250
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+2400
+2400
+0000
+0000
+1000
+1000
+1000
+1000
+1000
+1000
+1000
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03CB GREEK SMALL LETTER UPSILON WITH DIALYTIKA
+ENCODING 251
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+2400
+2400
+0000
+0000
+4200
+4200
+4200
+4200
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03CC GREEK SMALL LETTER OMICRON WITH TONOS
+ENCODING 252
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+1000
+0000
+0000
+3C00
+4200
+4200
+4200
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03CD GREEK SMALL LETTER UPSILON WITH TONOS
+ENCODING 253
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1000
+1000
+0000
+0000
+4200
+4200
+4200
+4200
+4200
+4200
+4200
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR U+03CE GREEK SMALL LETTER OMEGA WITH TONOS
+ENCODING 254
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0800
+0800
+0000
+0000
+2200
+4100
+4100
+4900
+4900
+4900
+4900
+3600
+0000
+0000
+0000
+0000
+ENDCHAR
+ENDFONT
diff --git a/util/alevt/vtxt-koi8.bdf b/util/alevt/vtxt-koi8.bdf
new file mode 100644
index 0000000..a7398b2
--- /dev/null
+++ b/util/alevt/vtxt-koi8.bdf
@@ -0,0 +1,5906 @@
+STARTFONT 2.1
+FONT -alevt-teletext-medium-r-normal--16-1-75-75-c-90-fontspecific-1
+SIZE 1 75 75
+FONTBOUNDINGBOX 9 16 0 -4
+STARTPROPERTIES 10
+POINT_SIZE 1
+PIXEL_SIZE 16
+RESOLUTION_X 75
+RESOLUTION_Y 75
+FONT_ASCENT 12
+FONT_DESCENT 4
+AVERAGE_WIDTH 90
+SPACING "C"
+_XMBDFED_INFO "Edited with xmbdfed 3.0."
+FONT "vtxt"
+ENDPROPERTIES
+CHARS 256
+STARTCHAR char0
+ENCODING 0
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 1
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 2
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 3
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 4
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 5
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 6
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 7
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 8
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 9
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 10
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 11
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 12
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 13
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 14
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 15
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 16
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 17
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 18
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 19
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char0
+ENCODING 20
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 21
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 22
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 23
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char0
+ENCODING 24
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 25
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 26
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 27
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char0
+ENCODING 28
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 29
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 30
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 31
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char32
+ENCODING 32
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char33
+ENCODING 33
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3C00
+3C00
+3C00
+1800
+1800
+1800
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char34
+ENCODING 34
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6600
+6600
+6600
+2400
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char35
+ENCODING 35
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3600
+3600
+7F00
+3600
+3600
+3600
+7F00
+3600
+3600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char36
+ENCODING 36
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+0C00
+3E00
+6300
+6100
+6000
+3E00
+0300
+0300
+4300
+6300
+3E00
+0C00
+0C00
+0000
+0000
+ENDCHAR
+STARTCHAR char37
+ENCODING 37
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+6100
+6300
+0600
+0C00
+1800
+3000
+6300
+4300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char38
+ENCODING 38
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+3600
+1C00
+3B00
+6E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char39
+ENCODING 39
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+3000
+3000
+6000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char40
+ENCODING 40
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0C00
+1800
+3000
+3000
+3000
+3000
+3000
+3000
+1800
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char41
+ENCODING 41
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3000
+1800
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+1800
+3000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char42
+ENCODING 42
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6600
+3C00
+FF00
+3C00
+6600
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char43
+ENCODING 43
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+7E00
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char44
+ENCODING 44
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+1800
+3000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char45
+ENCODING 45
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7F00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char46
+ENCODING 46
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char47
+ENCODING 47
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0100
+0300
+0600
+0C00
+1800
+3000
+6000
+4000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char48
+ENCODING 48
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+6600
+C300
+C300
+DB00
+DB00
+C300
+C300
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char49
+ENCODING 49
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3800
+7800
+1800
+1800
+1800
+1800
+1800
+1800
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char50
+ENCODING 50
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+0300
+0600
+0C00
+1800
+3000
+6000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char51
+ENCODING 51
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+0300
+0300
+1E00
+0300
+0300
+0300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char52
+ENCODING 52
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0E00
+1E00
+3600
+6600
+7F00
+0600
+0600
+0600
+0F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char53
+ENCODING 53
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+6000
+6000
+6000
+7E00
+0300
+0300
+0300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char54
+ENCODING 54
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3000
+6000
+6000
+7E00
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char55
+ENCODING 55
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+6300
+0300
+0300
+0600
+0C00
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char56
+ENCODING 56
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+3E00
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char57
+ENCODING 57
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+3F00
+0300
+0300
+0300
+0600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char58
+ENCODING 58
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char59
+ENCODING 59
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+1800
+1800
+1800
+3000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char60
+ENCODING 60
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0600
+0C00
+1800
+3000
+6000
+3000
+1800
+0C00
+0600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char61
+ENCODING 61
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7E00
+0000
+0000
+7E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char62
+ENCODING 62
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+6000
+3000
+1800
+0C00
+0600
+0C00
+1800
+3000
+6000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char63
+ENCODING 63
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+0600
+0C00
+0C00
+0C00
+0000
+0C00
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char64
+ENCODING 64
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3E00
+6300
+6300
+6F00
+6F00
+6F00
+6E00
+6000
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char65
+ENCODING 65
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char66
+ENCODING 66
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3300
+3300
+3300
+3300
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char67
+ENCODING 67
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6000
+6000
+6100
+3300
+1E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char68
+ENCODING 68
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7C00
+3600
+3300
+3300
+3300
+3300
+3300
+3300
+3600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char69
+ENCODING 69
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char70
+ENCODING 70
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char71
+ENCODING 71
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6F00
+6300
+6300
+3300
+1D00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char72
+ENCODING 72
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+6300
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char73
+ENCODING 73
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char74
+ENCODING 74
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0F00
+0600
+0600
+0600
+0600
+0600
+6600
+6600
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char75
+ENCODING 75
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7300
+3300
+3300
+3600
+3C00
+3C00
+3600
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char76
+ENCODING 76
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7800
+3000
+3000
+3000
+3000
+3000
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char77
+ENCODING 77
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+E700
+FF00
+FF00
+DB00
+C300
+C300
+C300
+C300
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char78
+ENCODING 78
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+7300
+7B00
+7F00
+6F00
+6700
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char79
+ENCODING 79
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char80
+ENCODING 80
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char81
+ENCODING 81
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6B00
+6F00
+3E00
+0600
+0700
+0000
+0000
+ENDCHAR
+STARTCHAR char82
+ENCODING 82
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3600
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char83
+ENCODING 83
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+3000
+1C00
+0600
+0300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char84
+ENCODING 84
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+DB00
+9900
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char85
+ENCODING 85
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char86
+ENCODING 86
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+C300
+C300
+C300
+C300
+6600
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char87
+ENCODING 87
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+C300
+C300
+DB00
+DB00
+FF00
+6600
+6600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char88
+ENCODING 88
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+6600
+3C00
+1800
+1800
+3C00
+6600
+C300
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char89
+ENCODING 89
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+6600
+3C00
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char90
+ENCODING 90
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+C300
+8600
+0C00
+1800
+3000
+6000
+C100
+C300
+FF00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char91
+ENCODING 91
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char92
+ENCODING 92
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+4000
+6000
+7000
+3800
+1C00
+0E00
+0700
+0300
+0100
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char93
+ENCODING 93
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char94
+ENCODING 94
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0800
+1C00
+3600
+6300
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char95
+ENCODING 95
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char96
+ENCODING 96
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3000
+3000
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char97
+ENCODING 97
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char98
+ENCODING 98
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3C00
+3600
+3300
+3300
+3300
+3300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char99
+ENCODING 99
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6000
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char100
+ENCODING 100
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+0600
+0600
+1E00
+3600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char101
+ENCODING 101
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char102
+ENCODING 102
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+3200
+3000
+7800
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char103
+ENCODING 103
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3B00
+6600
+6600
+6600
+6600
+6600
+3E00
+0600
+6600
+3C00
+0000
+ENDCHAR
+STARTCHAR char104
+ENCODING 104
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3600
+3B00
+3300
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char105
+ENCODING 105
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char106
+ENCODING 106
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0600
+0000
+0E00
+0600
+0600
+0600
+0600
+0600
+0600
+6600
+6600
+3C00
+0000
+ENDCHAR
+STARTCHAR char107
+ENCODING 107
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3300
+3600
+3C00
+3C00
+3600
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char108
+ENCODING 108
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char109
+ENCODING 109
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+E600
+FF00
+DB00
+DB00
+DB00
+DB00
+DB00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char110
+ENCODING 110
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char111
+ENCODING 111
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char112
+ENCODING 112
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3E00
+3000
+3000
+7800
+0000
+ENDCHAR
+STARTCHAR char113
+ENCODING 113
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3B00
+6600
+6600
+6600
+6600
+6600
+3E00
+0600
+0600
+0F00
+0000
+ENDCHAR
+STARTCHAR char114
+ENCODING 114
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3B00
+3300
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char115
+ENCODING 115
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+3000
+1C00
+0600
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char116
+ENCODING 116
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1800
+1800
+7E00
+1800
+1800
+1800
+1800
+1B00
+0E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char117
+ENCODING 117
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char118
+ENCODING 118
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+C300
+C300
+C300
+6600
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char119
+ENCODING 119
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+C300
+C300
+DB00
+DB00
+FF00
+6600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char120
+ENCODING 120
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+6600
+3C00
+1800
+3C00
+6600
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char121
+ENCODING 121
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+3F00
+0300
+0600
+7C00
+0000
+ENDCHAR
+STARTCHAR char122
+ENCODING 122
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7F00
+6600
+0C00
+1800
+3000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char123
+ENCODING 123
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+1800
+1800
+1800
+7000
+1800
+1800
+1800
+1800
+0E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char124
+ENCODING 124
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char125
+ENCODING 125
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+1800
+1800
+1800
+0E00
+1800
+1800
+1800
+1800
+7000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char126
+ENCODING 126
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3B00
+6E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char127
+ENCODING 127
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 128
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 129
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 130
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 131
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 132
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 133
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 134
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 135
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 136
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 137
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 138
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 139
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 140
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 141
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 142
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 143
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 144
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 145
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 146
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 147
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char0
+ENCODING 148
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 149
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 150
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 151
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char0
+ENCODING 152
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 153
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 154
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 155
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char0
+ENCODING 156
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 157
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 158
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 159
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char160
+ENCODING 160
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+0880
+0880
+0880
+0880
+FF80
+0880
+0880
+0880
+0880
+0880
+FF80
+0880
+0880
+0880
+0880
+ENDCHAR
+STARTCHAR char161
+ENCODING 161
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+0000
+1800
+1800
+1800
+3C00
+3C00
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char162
+ENCODING 162
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1800
+1800
+7E00
+C300
+C000
+C000
+C000
+C300
+7E00
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char163
+ENCODING 163
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1C00
+3600
+3200
+3000
+7800
+3000
+3000
+3000
+3000
+7300
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char164
+ENCODING 164
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+4100
+6300
+3E00
+6300
+6300
+6300
+6300
+3E00
+6300
+4100
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char165
+ENCODING 165
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+6600
+3C00
+1800
+FF00
+1800
+FF00
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char166
+ENCODING 166
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char167
+ENCODING 167
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3E00
+6300
+3000
+1C00
+3600
+6300
+6300
+3600
+1C00
+0600
+6300
+3E00
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char168
+ENCODING 168
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+7E00
+DB00
+FF00
+BD00
+C300
+E700
+FF00
+7E00
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char169
+ENCODING 169
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+4100
+5D00
+5100
+5100
+5D00
+4100
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char170
+ENCODING 170
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3800
+0C00
+3C00
+6400
+3C00
+0000
+7C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char171
+ENCODING 171
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+1800
+3000
+7F00
+7F00
+3000
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char172
+ENCODING 172
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3C00
+7E00
+5A00
+1800
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char173
+ENCODING 173
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char174
+ENCODING 174
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+4100
+5D00
+5500
+5900
+5500
+4100
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char175
+ENCODING 175
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+7F00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char176
+ENCODING 176
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1C00
+3600
+3600
+1C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char177
+ENCODING 177
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+7E00
+1800
+1800
+0000
+0000
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char178
+ENCODING 178
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3800
+6C00
+1800
+3000
+6400
+7C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char179
+ENCODING 179
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+7C00
+0C00
+1800
+0C00
+6C00
+3800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char180
+ENCODING 180
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1800
+3000
+6000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char181
+ENCODING 181
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+6600
+6600
+6600
+6600
+6600
+7E00
+6300
+6000
+C000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char182
+ENCODING 182
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+DB00
+DB00
+DB00
+7B00
+1B00
+1B00
+1B00
+1B00
+1B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char183
+ENCODING 183
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char184
+ENCODING 184
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0080
+0100
+0300
+0600
+0C00
+1C00
+3000
+7F00
+7700
+0E00
+1C00
+1800
+3000
+6000
+8000
+0000
+ENDCHAR
+STARTCHAR char185
+ENCODING 185
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+7000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char186
+ENCODING 186
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3800
+6C00
+4400
+6C00
+3800
+0000
+7C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char187
+ENCODING 187
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0C00
+0600
+7F00
+7F00
+0600
+0C00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char188
+ENCODING 188
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6000
+6000
+6100
+6300
+6600
+0C00
+1800
+3300
+6700
+4B00
+1F00
+0300
+0300
+0000
+0000
+ENDCHAR
+STARTCHAR char189
+ENCODING 189
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6000
+6000
+6100
+6300
+6600
+0C00
+1800
+3000
+6700
+4D80
+0300
+0600
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char190
+ENCODING 190
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+7800
+1800
+3900
+1B00
+7600
+0C00
+1800
+3300
+6700
+4B00
+1F00
+0300
+0300
+0000
+0000
+ENDCHAR
+STARTCHAR char191
+ENCODING 191
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+0000
+1800
+1800
+3000
+6000
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char238
+ENCODING 192
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+CE00
+DB00
+DB00
+FB00
+DB00
+DB00
+CE00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char160
+ENCODING 193
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7800
+0C00
+7C00
+CC00
+CC00
+CC00
+7600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char161
+ENCODING 194
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0200
+0600
+3C00
+6000
+6000
+7C00
+6600
+6600
+6600
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char230
+ENCODING 195
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+CC00
+CC00
+CC00
+CC00
+CC00
+CC00
+FE00
+0600
+0600
+0000
+0000
+ENDCHAR
+STARTCHAR char164
+ENCODING 196
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+1E00
+3600
+3600
+6600
+6600
+6600
+FF00
+C300
+C300
+0000
+0000
+ENDCHAR
+STARTCHAR char165
+ENCODING 197
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7C00
+C600
+FE00
+C000
+C000
+C600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char228
+ENCODING 198
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+3C00
+1800
+7E00
+DB00
+DB00
+DB00
+DB00
+7E00
+1800
+1800
+3C00
+0000
+ENDCHAR
+STARTCHAR char163
+ENCODING 199
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7E00
+3200
+3200
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char229
+ENCODING 200
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C600
+6C00
+3800
+3800
+3800
+6C00
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char168
+ENCODING 201
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C600
+C600
+CE00
+D600
+E600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char169
+ENCODING 202
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3800
+3800
+C600
+C600
+CE00
+D600
+E600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char170
+ENCODING 203
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+E600
+6C00
+7800
+7800
+6C00
+6600
+E600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char171
+ENCODING 204
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+1E00
+3600
+6600
+6600
+6600
+6600
+6600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char172
+ENCODING 205
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C600
+EE00
+FE00
+FE00
+D600
+D600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char173
+ENCODING 206
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C600
+C600
+C600
+FE00
+C600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char174
+ENCODING 207
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7C00
+C600
+C600
+C600
+C600
+C600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char175
+ENCODING 208
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FE00
+C600
+C600
+C600
+C600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char239
+ENCODING 209
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7E00
+CC00
+CC00
+FC00
+6C00
+CC00
+CE00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char224
+ENCODING 210
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+DC00
+6600
+6600
+6600
+6600
+6600
+7C00
+6000
+6000
+F000
+0000
+ENDCHAR
+STARTCHAR char225
+ENCODING 211
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7C00
+C600
+C000
+C000
+C000
+C600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char226
+ENCODING 212
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7E00
+5A00
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char227
+ENCODING 213
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C600
+C600
+C600
+C600
+C600
+7E00
+0600
+0600
+C600
+7C00
+0000
+ENDCHAR
+STARTCHAR char166
+ENCODING 214
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+D600
+D600
+5400
+7C00
+5400
+D600
+D600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char162
+ENCODING 215
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FC00
+6600
+6600
+7C00
+6600
+6600
+FC00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char236
+ENCODING 216
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+6000
+6000
+7C00
+6600
+6600
+FC00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char235
+ENCODING 217
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C600
+C600
+C600
+F600
+DE00
+DE00
+F600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char167
+ENCODING 218
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3C00
+6600
+0600
+0C00
+0600
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char232
+ENCODING 219
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+D600
+D600
+D600
+D600
+D600
+D600
+FE00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char237
+ENCODING 220
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3C00
+6600
+0600
+1E00
+0600
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char233
+ENCODING 221
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+D600
+D600
+D600
+D600
+D600
+D600
+FE00
+0300
+0300
+0000
+0000
+ENDCHAR
+STARTCHAR char231
+ENCODING 222
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C600
+C600
+C600
+C600
+7E00
+0600
+0600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char234
+ENCODING 223
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F800
+B000
+3000
+3E00
+3300
+3300
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char158
+ENCODING 224
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+CE00
+DB00
+DB00
+DB00
+FB00
+DB00
+DB00
+DB00
+DB00
+CE00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char128
+ENCODING 225
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3600
+6600
+C600
+C600
+FE00
+C600
+C600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char129
+ENCODING 226
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FE00
+6200
+6200
+6000
+7C00
+6600
+6600
+6600
+6600
+FC00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char150
+ENCODING 227
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+CC00
+CC00
+CC00
+CC00
+CC00
+CC00
+CC00
+CC00
+CC00
+FE00
+0600
+0600
+0000
+0000
+ENDCHAR
+STARTCHAR char132
+ENCODING 228
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+FF00
+C300
+8100
+0000
+0000
+ENDCHAR
+STARTCHAR char133
+ENCODING 229
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FE00
+6600
+6200
+6800
+7800
+6800
+6000
+6200
+6600
+FE00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char148
+ENCODING 230
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3C00
+1800
+7E00
+DB00
+DB00
+DB00
+DB00
+DB00
+7E00
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char131
+ENCODING 231
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FE00
+6200
+6200
+6000
+6000
+6000
+6000
+6000
+6000
+F000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char149
+ENCODING 232
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C600
+C600
+6C00
+7C00
+3800
+3800
+7C00
+6C00
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char136
+ENCODING 233
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C600
+C600
+CE00
+CE00
+D600
+E600
+E600
+C600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char137
+ENCODING 234
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3800
+3800
+C600
+C600
+CE00
+CE00
+D600
+E600
+E600
+C600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char138
+ENCODING 235
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+E600
+6600
+6C00
+6C00
+7800
+7800
+6C00
+6C00
+6600
+E600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char139
+ENCODING 236
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3600
+6600
+C600
+C600
+C600
+C600
+C600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char140
+ENCODING 237
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C600
+EE00
+FE00
+FE00
+D600
+C600
+C600
+C600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char141
+ENCODING 238
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C600
+C600
+C600
+C600
+FE00
+C600
+C600
+C600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char142
+ENCODING 239
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7C00
+C600
+C600
+C600
+C600
+C600
+C600
+C600
+C600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char143
+ENCODING 240
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FE00
+C600
+C600
+C600
+C600
+C600
+C600
+C600
+C600
+C600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char159
+ENCODING 241
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3F00
+6600
+6600
+6600
+3E00
+3E00
+6600
+6600
+6600
+E700
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char144
+ENCODING 242
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FC00
+6600
+6600
+6600
+7C00
+6000
+6000
+6000
+6000
+F000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char145
+ENCODING 243
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+6600
+C200
+C000
+C000
+C000
+C000
+C200
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char146
+ENCODING 244
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+5A00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char147
+ENCODING 245
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C600
+C600
+C600
+C600
+C600
+7E00
+0600
+0600
+C600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char134
+ENCODING 246
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+D600
+D600
+5400
+5400
+7C00
+7C00
+5400
+D600
+D600
+D600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char130
+ENCODING 247
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FC00
+6600
+6600
+6600
+7C00
+6600
+6600
+6600
+6600
+FC00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char156
+ENCODING 248
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+F000
+6000
+6000
+6000
+7C00
+6600
+6600
+6600
+6600
+FC00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char155
+ENCODING 249
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+C300
+F300
+DB00
+DB00
+DB00
+DB00
+F300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char135
+ENCODING 250
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7C00
+C600
+0600
+0600
+3C00
+0600
+0600
+0600
+C600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char152
+ENCODING 251
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+DB00
+DB00
+DB00
+DB00
+DB00
+DB00
+DB00
+DB00
+DB00
+FF00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char157
+ENCODING 252
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7C00
+C600
+0600
+2600
+3E00
+2600
+0600
+0600
+C600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char153
+ENCODING 253
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+DB00
+DB00
+DB00
+DB00
+DB00
+DB00
+DB00
+DB00
+DB00
+FF00
+0300
+0300
+0000
+0000
+ENDCHAR
+STARTCHAR char151
+ENCODING 254
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C600
+C600
+C600
+C600
+C600
+7E00
+0600
+0600
+0600
+0600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char154
+ENCODING 255
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+F800
+B000
+3000
+3000
+3C00
+3600
+3600
+3600
+3600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+ENDFONT
diff --git a/util/alevt/vtxt-latin-1.bdf b/util/alevt/vtxt-latin-1.bdf
new file mode 100644
index 0000000..2f1a11b
--- /dev/null
+++ b/util/alevt/vtxt-latin-1.bdf
@@ -0,0 +1,5906 @@
+STARTFONT 2.1
+FONT -alevt-teletext-medium-r-normal--16-1-75-75-c-90-fontspecific-1
+SIZE 1 75 75
+FONTBOUNDINGBOX 9 16 0 -4
+STARTPROPERTIES 10
+POINT_SIZE 1
+PIXEL_SIZE 16
+RESOLUTION_X 75
+RESOLUTION_Y 75
+FONT_ASCENT 12
+FONT_DESCENT 4
+AVERAGE_WIDTH 90
+SPACING "C"
+_XMBDFED_INFO "Edited with xmbdfed 2.4."
+FONT "vtxt"
+ENDPROPERTIES
+CHARS 256
+STARTCHAR char0
+ENCODING 0
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 1
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 2
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 3
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 4
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 5
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 6
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 7
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 8
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 9
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 10
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 11
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 12
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 13
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 14
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 15
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 16
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 17
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 18
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 19
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char0
+ENCODING 20
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 21
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 22
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 23
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char0
+ENCODING 24
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 25
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 26
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 27
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char0
+ENCODING 28
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 29
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 30
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 31
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char32
+ENCODING 32
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char33
+ENCODING 33
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3C00
+3C00
+3C00
+1800
+1800
+1800
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char34
+ENCODING 34
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6600
+6600
+6600
+2400
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char35
+ENCODING 35
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3600
+3600
+7F00
+3600
+3600
+3600
+7F00
+3600
+3600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char36
+ENCODING 36
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+0C00
+3E00
+6300
+6100
+6000
+3E00
+0300
+0300
+4300
+6300
+3E00
+0C00
+0C00
+0000
+0000
+ENDCHAR
+STARTCHAR char37
+ENCODING 37
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+6100
+6300
+0600
+0C00
+1800
+3000
+6300
+4300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char38
+ENCODING 38
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+3600
+1C00
+3B00
+6E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char39
+ENCODING 39
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+3000
+3000
+6000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char40
+ENCODING 40
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0C00
+1800
+3000
+3000
+3000
+3000
+3000
+3000
+1800
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char41
+ENCODING 41
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3000
+1800
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+1800
+3000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char42
+ENCODING 42
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6600
+3C00
+FF00
+3C00
+6600
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char43
+ENCODING 43
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+7E00
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char44
+ENCODING 44
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+1800
+3000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char45
+ENCODING 45
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7F00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char46
+ENCODING 46
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char47
+ENCODING 47
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0100
+0300
+0600
+0C00
+1800
+3000
+6000
+4000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char48
+ENCODING 48
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+6600
+C300
+C300
+DB00
+DB00
+C300
+C300
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char49
+ENCODING 49
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3800
+7800
+1800
+1800
+1800
+1800
+1800
+1800
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char50
+ENCODING 50
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+0300
+0600
+0C00
+1800
+3000
+6000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char51
+ENCODING 51
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+0300
+0300
+1E00
+0300
+0300
+0300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char52
+ENCODING 52
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0E00
+1E00
+3600
+6600
+7F00
+0600
+0600
+0600
+0F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char53
+ENCODING 53
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+6000
+6000
+6000
+7E00
+0300
+0300
+0300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char54
+ENCODING 54
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3000
+6000
+6000
+7E00
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char55
+ENCODING 55
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+6300
+0300
+0300
+0600
+0C00
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char56
+ENCODING 56
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+3E00
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char57
+ENCODING 57
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+3F00
+0300
+0300
+0300
+0600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char58
+ENCODING 58
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char59
+ENCODING 59
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+1800
+1800
+1800
+3000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char60
+ENCODING 60
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0600
+0C00
+1800
+3000
+6000
+3000
+1800
+0C00
+0600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char61
+ENCODING 61
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7E00
+0000
+0000
+7E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char62
+ENCODING 62
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+6000
+3000
+1800
+0C00
+0600
+0C00
+1800
+3000
+6000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char63
+ENCODING 63
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+0600
+0C00
+0C00
+0C00
+0000
+0C00
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char64
+ENCODING 64
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3E00
+6300
+6300
+6F00
+6F00
+6F00
+6E00
+6000
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char65
+ENCODING 65
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char66
+ENCODING 66
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3300
+3300
+3300
+3300
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char67
+ENCODING 67
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6000
+6000
+6100
+3300
+1E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char68
+ENCODING 68
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7C00
+3600
+3300
+3300
+3300
+3300
+3300
+3300
+3600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char69
+ENCODING 69
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char70
+ENCODING 70
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char71
+ENCODING 71
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6F00
+6300
+6300
+3300
+1D00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char72
+ENCODING 72
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+6300
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char73
+ENCODING 73
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char74
+ENCODING 74
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0F00
+0600
+0600
+0600
+0600
+0600
+6600
+6600
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char75
+ENCODING 75
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7300
+3300
+3300
+3600
+3C00
+3C00
+3600
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char76
+ENCODING 76
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7800
+3000
+3000
+3000
+3000
+3000
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char77
+ENCODING 77
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+E700
+FF00
+FF00
+DB00
+C300
+C300
+C300
+C300
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char78
+ENCODING 78
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+7300
+7B00
+7F00
+6F00
+6700
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char79
+ENCODING 79
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char80
+ENCODING 80
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char81
+ENCODING 81
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6B00
+6F00
+3E00
+0600
+0700
+0000
+0000
+ENDCHAR
+STARTCHAR char82
+ENCODING 82
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3600
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char83
+ENCODING 83
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+3000
+1C00
+0600
+0300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char84
+ENCODING 84
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+DB00
+9900
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char85
+ENCODING 85
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char86
+ENCODING 86
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+C300
+C300
+C300
+C300
+6600
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char87
+ENCODING 87
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+C300
+C300
+DB00
+DB00
+FF00
+6600
+6600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char88
+ENCODING 88
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+6600
+3C00
+1800
+1800
+3C00
+6600
+C300
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char89
+ENCODING 89
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+6600
+3C00
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char90
+ENCODING 90
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+C300
+8600
+0C00
+1800
+3000
+6000
+C100
+C300
+FF00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char91
+ENCODING 91
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char92
+ENCODING 92
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+4000
+6000
+7000
+3800
+1C00
+0E00
+0700
+0300
+0100
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char93
+ENCODING 93
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char94
+ENCODING 94
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0800
+1C00
+3600
+6300
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char95
+ENCODING 95
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char96
+ENCODING 96
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3000
+3000
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char97
+ENCODING 97
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char98
+ENCODING 98
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3C00
+3600
+3300
+3300
+3300
+3300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char99
+ENCODING 99
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6000
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char100
+ENCODING 100
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+0600
+0600
+1E00
+3600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char101
+ENCODING 101
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char102
+ENCODING 102
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+3200
+3000
+7800
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char103
+ENCODING 103
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3B00
+6600
+6600
+6600
+6600
+6600
+3E00
+0600
+6600
+3C00
+0000
+ENDCHAR
+STARTCHAR char104
+ENCODING 104
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3600
+3B00
+3300
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char105
+ENCODING 105
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char106
+ENCODING 106
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0600
+0000
+0E00
+0600
+0600
+0600
+0600
+0600
+0600
+6600
+6600
+3C00
+0000
+ENDCHAR
+STARTCHAR char107
+ENCODING 107
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3300
+3600
+3C00
+3C00
+3600
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char108
+ENCODING 108
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char109
+ENCODING 109
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+E600
+FF00
+DB00
+DB00
+DB00
+DB00
+DB00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char110
+ENCODING 110
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char111
+ENCODING 111
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char112
+ENCODING 112
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3E00
+3000
+3000
+7800
+0000
+ENDCHAR
+STARTCHAR char113
+ENCODING 113
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3B00
+6600
+6600
+6600
+6600
+6600
+3E00
+0600
+0600
+0F00
+0000
+ENDCHAR
+STARTCHAR char114
+ENCODING 114
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3B00
+3300
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char115
+ENCODING 115
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+3000
+1C00
+0600
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char116
+ENCODING 116
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1800
+1800
+7E00
+1800
+1800
+1800
+1800
+1B00
+0E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char117
+ENCODING 117
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char118
+ENCODING 118
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+C300
+C300
+C300
+6600
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char119
+ENCODING 119
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+C300
+C300
+DB00
+DB00
+FF00
+6600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char120
+ENCODING 120
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+6600
+3C00
+1800
+3C00
+6600
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char121
+ENCODING 121
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+3F00
+0300
+0600
+7C00
+0000
+ENDCHAR
+STARTCHAR char122
+ENCODING 122
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7F00
+6600
+0C00
+1800
+3000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char123
+ENCODING 123
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+1800
+1800
+1800
+7000
+1800
+1800
+1800
+1800
+0E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char124
+ENCODING 124
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char125
+ENCODING 125
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+1800
+1800
+1800
+0E00
+1800
+1800
+1800
+1800
+7000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char126
+ENCODING 126
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3B00
+6E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char127
+ENCODING 127
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 128
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 129
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 130
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 131
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 132
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 133
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 134
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 135
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 136
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 137
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 138
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 139
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 140
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 141
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 142
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 143
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 144
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 145
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 146
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 147
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char0
+ENCODING 148
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 149
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 150
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 151
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char0
+ENCODING 152
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 153
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 154
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 155
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char0
+ENCODING 156
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 157
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 158
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 159
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char160
+ENCODING 160
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+0880
+0880
+0880
+0880
+FF80
+0880
+0880
+0880
+0880
+0880
+FF80
+0880
+0880
+0880
+0880
+ENDCHAR
+STARTCHAR char161
+ENCODING 161
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+0000
+1800
+1800
+1800
+3C00
+3C00
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char162
+ENCODING 162
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1800
+1800
+7E00
+C300
+C000
+C000
+C000
+C300
+7E00
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char163
+ENCODING 163
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1C00
+3600
+3200
+3000
+7800
+3000
+3000
+3000
+3000
+7300
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char164
+ENCODING 164
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+4100
+6300
+3E00
+6300
+6300
+6300
+6300
+3E00
+6300
+4100
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char165
+ENCODING 165
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+6600
+3C00
+1800
+FF00
+1800
+FF00
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char166
+ENCODING 166
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+6600
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char167
+ENCODING 167
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3E00
+6300
+3000
+1C00
+3600
+6300
+6300
+3600
+1C00
+0600
+6300
+3E00
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char168
+ENCODING 168
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+7E00
+DB00
+FF00
+BD00
+C300
+E700
+FF00
+7E00
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char169
+ENCODING 169
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+4100
+5D00
+5100
+5100
+5D00
+4100
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char170
+ENCODING 170
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3800
+0C00
+3C00
+6400
+3C00
+0000
+7C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char171
+ENCODING 171
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+1800
+3000
+7F00
+7F00
+3000
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char172
+ENCODING 172
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3C00
+7E00
+5A00
+1800
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char173
+ENCODING 173
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char174
+ENCODING 174
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+4100
+5D00
+5500
+5900
+5500
+4100
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char175
+ENCODING 175
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+7F00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char176
+ENCODING 176
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1C00
+3600
+3600
+1C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char177
+ENCODING 177
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+7E00
+1800
+1800
+0000
+0000
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char178
+ENCODING 178
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3800
+6C00
+1800
+3000
+6400
+7C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char179
+ENCODING 179
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+7C00
+0C00
+1800
+0C00
+6C00
+3800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char180
+ENCODING 180
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1800
+3000
+6000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char181
+ENCODING 181
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+6600
+6600
+6600
+6600
+6600
+7E00
+6300
+6000
+C000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char182
+ENCODING 182
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+DB00
+DB00
+DB00
+7B00
+1B00
+1B00
+1B00
+1B00
+1B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char183
+ENCODING 183
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char184
+ENCODING 184
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0080
+0100
+0300
+0600
+0C00
+1C00
+3000
+7F00
+7700
+0E00
+1C00
+1800
+3000
+6000
+8000
+0000
+ENDCHAR
+STARTCHAR char185
+ENCODING 185
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+7000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char186
+ENCODING 186
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3800
+6C00
+4400
+6C00
+3800
+0000
+7C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char187
+ENCODING 187
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0C00
+0600
+7F00
+7F00
+0600
+0C00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char188
+ENCODING 188
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6000
+6000
+6100
+6300
+6600
+0C00
+1800
+3300
+6700
+4B00
+1F00
+0300
+0300
+0000
+0000
+ENDCHAR
+STARTCHAR char189
+ENCODING 189
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6000
+6000
+6100
+6300
+6600
+0C00
+1800
+3000
+6700
+4D80
+0300
+0600
+0F80
+0000
+0000
+ENDCHAR
+STARTCHAR char190
+ENCODING 190
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+7800
+1800
+3900
+1B00
+7600
+0C00
+1800
+3300
+6700
+4B00
+1F00
+0300
+0300
+0000
+0000
+ENDCHAR
+STARTCHAR char191
+ENCODING 191
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+0000
+1800
+1800
+3000
+6000
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char192
+ENCODING 192
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1800
+0C00
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char193
+ENCODING 193
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char194
+ENCODING 194
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1C00
+3600
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char195
+ENCODING 195
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3B00
+6E00
+0000
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char196
+ENCODING 196
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6300
+0000
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char197
+ENCODING 197
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1C00
+1400
+1C00
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char198
+ENCODING 198
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1F00
+3600
+6600
+6600
+7F00
+6600
+6600
+6600
+6600
+6700
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char199
+ENCODING 199
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6000
+6100
+3300
+1E00
+0600
+0300
+3E00
+0000
+ENDCHAR
+STARTCHAR char200
+ENCODING 200
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1800
+0C00
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char201
+ENCODING 201
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char202
+ENCODING 202
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1C00
+3600
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char203
+ENCODING 203
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6300
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char204
+ENCODING 204
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3000
+1800
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char205
+ENCODING 205
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char206
+ENCODING 206
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3C00
+6600
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char207
+ENCODING 207
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6600
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char208
+ENCODING 208
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+3600
+3300
+3300
+7B00
+7B00
+3300
+3300
+3600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char209
+ENCODING 209
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3B00
+6E00
+6300
+7300
+7B00
+7F00
+6F00
+6700
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char210
+ENCODING 210
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3000
+1800
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char211
+ENCODING 211
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0600
+0C00
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char212
+ENCODING 212
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1C00
+3600
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char213
+ENCODING 213
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3B00
+6E00
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char214
+ENCODING 214
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6300
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char215
+ENCODING 215
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+6300
+3600
+1C00
+0800
+1C00
+3600
+6300
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char216
+ENCODING 216
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0100
+0300
+3E00
+6700
+6700
+6F00
+6B00
+6B00
+7B00
+7300
+7300
+3E00
+6000
+4000
+0000
+0000
+ENDCHAR
+STARTCHAR char217
+ENCODING 217
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3000
+1800
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char218
+ENCODING 218
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0600
+0C00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char219
+ENCODING 219
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1C00
+1400
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char220
+ENCODING 220
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6300
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char221
+ENCODING 221
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1800
+3000
+C300
+C300
+C300
+6600
+3C00
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char222
+ENCODING 222
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+7800
+3000
+3E00
+3300
+3300
+3300
+3E00
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char223
+ENCODING 223
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+6300
+6700
+6E00
+6C00
+6600
+6300
+6B00
+6E00
+6000
+4000
+0000
+0000
+ENDCHAR
+STARTCHAR char224
+ENCODING 224
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+1800
+0C00
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char225
+ENCODING 225
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0C00
+1800
+3000
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char226
+ENCODING 226
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0800
+1C00
+3600
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char227
+ENCODING 227
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3B00
+6E00
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char228
+ENCODING 228
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6600
+0000
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char229
+ENCODING 229
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1C00
+3600
+1C00
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char230
+ENCODING 230
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3B00
+1B00
+7E00
+D800
+DC00
+7700
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char231
+ENCODING 231
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6000
+6000
+6000
+6300
+3E00
+0C00
+0600
+3C00
+0000
+ENDCHAR
+STARTCHAR char232
+ENCODING 232
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+1800
+0C00
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char233
+ENCODING 233
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0600
+0C00
+1800
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char234
+ENCODING 234
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0800
+1C00
+3600
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char235
+ENCODING 235
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+0000
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char236
+ENCODING 236
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6000
+3000
+1800
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char237
+ENCODING 237
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0600
+0C00
+1800
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char238
+ENCODING 238
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1800
+3C00
+6600
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char239
+ENCODING 239
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6600
+0000
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char100
+ENCODING 240
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+0600
+0F00
+0600
+3E00
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char241
+ENCODING 241
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3B00
+6E00
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char242
+ENCODING 242
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+1800
+0C00
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char243
+ENCODING 243
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0C00
+1800
+3000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char244
+ENCODING 244
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0800
+1C00
+3600
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char245
+ENCODING 245
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3B00
+6E00
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char246
+ENCODING 246
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char247
+ENCODING 247
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+7E00
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char248
+ENCODING 248
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0100
+0300
+3E00
+6700
+6F00
+6B00
+7B00
+7300
+3E00
+6000
+4000
+0000
+0000
+ENDCHAR
+STARTCHAR char249
+ENCODING 249
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+1800
+0C00
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char250
+ENCODING 250
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0C00
+1800
+3000
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char251
+ENCODING 251
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1800
+3C00
+6600
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char252
+ENCODING 252
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6600
+0000
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char253
+ENCODING 253
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0C00
+1800
+3000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+3F00
+0300
+0600
+7C00
+0000
+ENDCHAR
+STARTCHAR char254
+ENCODING 254
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+7800
+3000
+3E00
+3300
+3300
+3300
+3300
+3300
+3E00
+3000
+3000
+7800
+0000
+ENDCHAR
+STARTCHAR char255
+ENCODING 255
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+0000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+3F00
+0300
+0600
+7C00
+0000
+ENDCHAR
+ENDFONT
diff --git a/util/alevt/vtxt-latin-2.bdf b/util/alevt/vtxt-latin-2.bdf
new file mode 100644
index 0000000..6505c6e
--- /dev/null
+++ b/util/alevt/vtxt-latin-2.bdf
@@ -0,0 +1,5906 @@
+STARTFONT 2.1
+FONT -alevt-teletext-medium-r-normal--16-1-75-75-c-90-fontspecific-2
+SIZE 1 75 75
+FONTBOUNDINGBOX 9 16 0 -4
+STARTPROPERTIES 10
+POINT_SIZE 1
+PIXEL_SIZE 16
+RESOLUTION_X 75
+RESOLUTION_Y 75
+FONT_ASCENT 12
+FONT_DESCENT 4
+AVERAGE_WIDTH 90
+SPACING "C"
+_XMBDFED_INFO "Edited with xmbdfed 3.3."
+FONT "vtxt"
+ENDPROPERTIES
+CHARS 256
+STARTCHAR char0
+ENCODING 0
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 1
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 2
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 3
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 4
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 5
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 6
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 7
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 8
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 9
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 10
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 11
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 12
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 13
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char2
+ENCODING 14
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char1
+ENCODING 15
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 16
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 17
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 18
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 19
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char0
+ENCODING 20
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 21
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 22
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 23
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char0
+ENCODING 24
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 25
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 26
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 27
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char0
+ENCODING 28
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 29
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char2
+ENCODING 30
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char1
+ENCODING 31
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+ENDCHAR
+STARTCHAR char32
+ENCODING 32
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char33
+ENCODING 33
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3C00
+3C00
+3C00
+1800
+1800
+1800
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char34
+ENCODING 34
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6600
+6600
+6600
+2400
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char35
+ENCODING 35
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3600
+3600
+7F00
+3600
+3600
+3600
+7F00
+3600
+3600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char36
+ENCODING 36
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+0C00
+3E00
+6300
+6100
+6000
+3E00
+0300
+0300
+4300
+6300
+3E00
+0C00
+0C00
+0000
+0000
+ENDCHAR
+STARTCHAR char37
+ENCODING 37
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+6100
+6300
+0600
+0C00
+1800
+3000
+6300
+4300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char38
+ENCODING 38
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+3600
+1C00
+3B00
+6E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char39
+ENCODING 39
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3000
+3000
+3000
+6000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char40
+ENCODING 40
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0C00
+1800
+3000
+3000
+3000
+3000
+3000
+3000
+1800
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char41
+ENCODING 41
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3000
+1800
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+1800
+3000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char42
+ENCODING 42
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6600
+3C00
+FF00
+3C00
+6600
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char43
+ENCODING 43
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+7E00
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char44
+ENCODING 44
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+1800
+3000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char45
+ENCODING 45
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+7F00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char46
+ENCODING 46
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char47
+ENCODING 47
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0100
+0300
+0600
+0C00
+1800
+3000
+6000
+4000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char48
+ENCODING 48
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+6600
+C300
+C300
+DB00
+DB00
+C300
+C300
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char49
+ENCODING 49
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+3800
+7800
+1800
+1800
+1800
+1800
+1800
+1800
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char50
+ENCODING 50
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+0300
+0600
+0C00
+1800
+3000
+6000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char51
+ENCODING 51
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+0300
+0300
+1E00
+0300
+0300
+0300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char52
+ENCODING 52
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0E00
+1E00
+3600
+6600
+7F00
+0600
+0600
+0600
+0F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char53
+ENCODING 53
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+6000
+6000
+6000
+7E00
+0300
+0300
+0300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char54
+ENCODING 54
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3000
+6000
+6000
+7E00
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char55
+ENCODING 55
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+6300
+0300
+0300
+0600
+0C00
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char56
+ENCODING 56
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+3E00
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char57
+ENCODING 57
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+3F00
+0300
+0300
+0300
+0600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char58
+ENCODING 58
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char59
+ENCODING 59
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+0000
+0000
+1800
+1800
+1800
+3000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char60
+ENCODING 60
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0600
+0C00
+1800
+3000
+6000
+3000
+1800
+0C00
+0600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char61
+ENCODING 61
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7E00
+0000
+0000
+7E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char62
+ENCODING 62
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+6000
+3000
+1800
+0C00
+0600
+0C00
+1800
+3000
+6000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char63
+ENCODING 63
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+0600
+0C00
+0C00
+0C00
+0000
+0C00
+0C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char64
+ENCODING 64
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3E00
+6300
+6300
+6F00
+6F00
+6F00
+6E00
+6000
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char65
+ENCODING 65
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char66
+ENCODING 66
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3300
+3300
+3300
+3300
+7E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char67
+ENCODING 67
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6000
+6000
+6100
+3300
+1E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char68
+ENCODING 68
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7C00
+3600
+3300
+3300
+3300
+3300
+3300
+3300
+3600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char69
+ENCODING 69
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char70
+ENCODING 70
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char71
+ENCODING 71
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6F00
+6300
+6300
+3300
+1D00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char72
+ENCODING 72
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+6300
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char73
+ENCODING 73
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char74
+ENCODING 74
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0F00
+0600
+0600
+0600
+0600
+0600
+6600
+6600
+6600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char75
+ENCODING 75
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7300
+3300
+3300
+3600
+3C00
+3C00
+3600
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char76
+ENCODING 76
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7800
+3000
+3000
+3000
+3000
+3000
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char77
+ENCODING 77
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+E700
+FF00
+FF00
+DB00
+C300
+C300
+C300
+C300
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char78
+ENCODING 78
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+7300
+7B00
+7F00
+6F00
+6700
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char79
+ENCODING 79
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char80
+ENCODING 80
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char81
+ENCODING 81
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6B00
+6F00
+3E00
+0600
+0700
+0000
+0000
+ENDCHAR
+STARTCHAR char82
+ENCODING 82
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7E00
+3300
+3300
+3300
+3E00
+3600
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char83
+ENCODING 83
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+3000
+1C00
+0600
+0300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char84
+ENCODING 84
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+DB00
+9900
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char85
+ENCODING 85
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char86
+ENCODING 86
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+C300
+C300
+C300
+C300
+6600
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char87
+ENCODING 87
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+C300
+C300
+DB00
+DB00
+FF00
+6600
+6600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char88
+ENCODING 88
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+6600
+3C00
+1800
+1800
+3C00
+6600
+C300
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char89
+ENCODING 89
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+C300
+C300
+C300
+6600
+3C00
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char90
+ENCODING 90
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+C300
+8600
+0C00
+1800
+3000
+6000
+C100
+C300
+FF00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char91
+ENCODING 91
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3000
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char92
+ENCODING 92
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+4000
+6000
+7000
+3800
+1C00
+0E00
+0700
+0300
+0100
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char93
+ENCODING 93
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+0C00
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char94
+ENCODING 94
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0800
+1C00
+3600
+6300
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char95
+ENCODING 95
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+0000
+0000
+ENDCHAR
+STARTCHAR char96
+ENCODING 96
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3000
+3000
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char97
+ENCODING 97
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char98
+ENCODING 98
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3C00
+3600
+3300
+3300
+3300
+3300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char99
+ENCODING 99
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6000
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char100
+ENCODING 100
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+0600
+0600
+1E00
+3600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char101
+ENCODING 101
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char102
+ENCODING 102
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+3200
+3000
+7800
+3000
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char103
+ENCODING 103
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3B00
+6600
+6600
+6600
+6600
+6600
+3E00
+0600
+6600
+3C00
+0000
+ENDCHAR
+STARTCHAR char104
+ENCODING 104
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3600
+3B00
+3300
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char105
+ENCODING 105
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char106
+ENCODING 106
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0600
+0000
+0E00
+0600
+0600
+0600
+0600
+0600
+0600
+6600
+6600
+3C00
+0000
+ENDCHAR
+STARTCHAR char107
+ENCODING 107
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+3000
+3000
+3300
+3600
+3C00
+3C00
+3600
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char108
+ENCODING 108
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char109
+ENCODING 109
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+E600
+FF00
+DB00
+DB00
+DB00
+DB00
+DB00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char110
+ENCODING 110
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char111
+ENCODING 111
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char112
+ENCODING 112
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3E00
+3000
+3000
+7800
+0000
+ENDCHAR
+STARTCHAR char113
+ENCODING 113
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3B00
+6600
+6600
+6600
+6600
+6600
+3E00
+0600
+0600
+0F00
+0000
+ENDCHAR
+STARTCHAR char114
+ENCODING 114
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6E00
+3B00
+3300
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char115
+ENCODING 115
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+3000
+1C00
+0600
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char116
+ENCODING 116
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1800
+1800
+7E00
+1800
+1800
+1800
+1800
+1B00
+0E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char117
+ENCODING 117
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char118
+ENCODING 118
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+C300
+C300
+C300
+6600
+3C00
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char119
+ENCODING 119
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+C300
+C300
+DB00
+DB00
+FF00
+6600
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char120
+ENCODING 120
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+C300
+6600
+3C00
+1800
+3C00
+6600
+C300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char121
+ENCODING 121
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+3F00
+0300
+0600
+7C00
+0000
+ENDCHAR
+STARTCHAR char122
+ENCODING 122
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+7F00
+6600
+0C00
+1800
+3000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char123
+ENCODING 123
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+1800
+1800
+1800
+7000
+1800
+1800
+1800
+1800
+0E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char124
+ENCODING 124
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char125
+ENCODING 125
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7000
+1800
+1800
+1800
+0E00
+1800
+1800
+1800
+1800
+7000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char126
+ENCODING 126
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3B00
+6E00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char127
+ENCODING 127
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+7F00
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char0
+ENCODING 128
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 129
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 130
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 131
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 132
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 133
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 134
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 135
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 136
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 137
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 138
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 139
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 140
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 141
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char2
+ENCODING 142
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char1
+ENCODING 143
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+ENDCHAR
+STARTCHAR char0
+ENCODING 144
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 145
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 146
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 147
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char0
+ENCODING 148
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 149
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 150
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 151
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+F000
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char0
+ENCODING 152
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 153
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 154
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 155
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+0F80
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char0
+ENCODING 156
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 157
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+F000
+F000
+F000
+F000
+F000
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char2
+ENCODING 158
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0F80
+0F80
+0F80
+0F80
+0F80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char1
+ENCODING 159
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+FF80
+ENDCHAR
+STARTCHAR char160
+ENCODING 160
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+FF80
+0880
+0880
+0880
+0880
+FF80
+0880
+0880
+0880
+0880
+0880
+FF80
+0880
+0880
+0880
+0880
+ENDCHAR
+STARTCHAR char65
+ENCODING 161
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0600
+0300
+0000
+0000
+ENDCHAR
+STARTCHAR char162
+ENCODING 162
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6600
+3C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char76
+ENCODING 163
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7800
+3000
+3000
+3C00
+3800
+3000
+7000
+F100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char164
+ENCODING 164
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+4100
+6300
+3E00
+6300
+6300
+6300
+6300
+3E00
+6300
+4100
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char76
+ENCODING 165
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7B00
+3300
+3600
+3000
+3000
+3000
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char83
+ENCODING 166
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+3E00
+6300
+6300
+3000
+1C00
+0600
+0300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char167
+ENCODING 167
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3E00
+6300
+3000
+1C00
+3600
+6300
+6300
+3600
+1C00
+0600
+6300
+3E00
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char196
+ENCODING 168
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6300
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char169
+ENCODING 169
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6600
+3C00
+3E00
+6300
+6300
+3000
+1C00
+0600
+0300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char83
+ENCODING 170
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3E00
+6300
+6300
+3000
+1C00
+0600
+0300
+6300
+6300
+3E00
+0600
+0300
+3E00
+0000
+ENDCHAR
+STARTCHAR char171
+ENCODING 171
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6600
+3C00
+FF00
+DB00
+9900
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char90
+ENCODING 172
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+FF00
+C300
+8600
+0C00
+1800
+3000
+6000
+C100
+C300
+FF00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char173
+ENCODING 173
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+FF80
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char174
+ENCODING 174
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6600
+3C00
+FF00
+C300
+8600
+0C00
+1800
+3000
+6000
+C100
+C300
+FF00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char90
+ENCODING 175
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+C300
+8600
+0C00
+7E00
+3000
+6000
+C100
+C300
+FF00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char176
+ENCODING 176
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1C00
+3600
+3600
+1C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char97
+ENCODING 177
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0600
+0300
+0000
+0000
+ENDCHAR
+STARTCHAR char97
+ENCODING 178
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0C00
+1800
+0E00
+0000
+0000
+ENDCHAR
+STARTCHAR char108
+ENCODING 179
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3800
+1800
+1E00
+1C00
+1800
+3800
+7800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char180
+ENCODING 180
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1800
+3000
+6000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char108
+ENCODING 181
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3980
+1980
+1B00
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char115
+ENCODING 182
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0C00
+0000
+3E00
+6300
+3000
+1C00
+0600
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char171
+ENCODING 183
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6600
+3C00
+1800
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char184
+ENCODING 184
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0080
+0100
+0300
+0600
+0C00
+1C00
+3000
+7F00
+7700
+0E00
+1C00
+1800
+3000
+6000
+8000
+0000
+ENDCHAR
+STARTCHAR char185
+ENCODING 185
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3600
+1C00
+3E00
+6300
+3000
+1C00
+0600
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char115
+ENCODING 186
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+3000
+1C00
+0600
+6300
+3E00
+0300
+1E00
+0000
+0000
+ENDCHAR
+STARTCHAR char187
+ENCODING 187
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0180
+0980
+1B00
+1800
+7E00
+1800
+1800
+1800
+1800
+1B00
+0E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char122
+ENCODING 188
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0C00
+0000
+7F00
+6600
+0C00
+1800
+3000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char189
+ENCODING 189
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+3300
+6600
+CC00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char190
+ENCODING 190
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+6600
+3C00
+7F00
+6600
+0C00
+1800
+3000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char122
+ENCODING 191
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0C00
+0C00
+0000
+7F00
+6600
+0C00
+1800
+3000
+6300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char82
+ENCODING 192
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0600
+0C00
+7E00
+3300
+3300
+3300
+3E00
+3600
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char193
+ENCODING 193
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0300
+0600
+0000
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char194
+ENCODING 194
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1C00
+3600
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char195
+ENCODING 195
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6300
+3E00
+0000
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char196
+ENCODING 196
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6300
+0000
+0800
+1C00
+3600
+6300
+6300
+7F00
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char76
+ENCODING 197
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+7C00
+3000
+3000
+3000
+3000
+3000
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char67
+ENCODING 198
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0600
+0C00
+1E00
+3300
+6100
+6000
+6000
+6000
+6000
+6100
+3300
+1E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char199
+ENCODING 199
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+1E00
+3300
+6100
+6000
+6000
+6000
+6100
+3300
+1E00
+0600
+0300
+3E00
+0000
+ENDCHAR
+STARTCHAR char200
+ENCODING 200
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3300
+1E00
+1E00
+3300
+6100
+6000
+6000
+6000
+6000
+6100
+3300
+1E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char201
+ENCODING 201
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char202
+ENCODING 202
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0C00
+0600
+0000
+0000
+ENDCHAR
+STARTCHAR char203
+ENCODING 203
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6300
+0000
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char204
+ENCODING 204
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3300
+1E00
+7F00
+3300
+3100
+3400
+3C00
+3400
+3000
+3100
+3300
+7F00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char205
+ENCODING 205
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char206
+ENCODING 206
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3C00
+6600
+0000
+3C00
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char207
+ENCODING 207
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6600
+3C00
+7C00
+3600
+3300
+3300
+3300
+3300
+3300
+3300
+3600
+7C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char208
+ENCODING 208
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3C00
+3600
+3300
+3300
+7B00
+7B00
+3300
+3300
+3600
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char78
+ENCODING 209
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+6300
+7300
+7B00
+7F00
+6F00
+6700
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char210
+ENCODING 210
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6600
+3C00
+6300
+7300
+7B00
+7F00
+6F00
+6700
+6300
+6300
+6300
+6300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char211
+ENCODING 211
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0600
+0C00
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char212
+ENCODING 212
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1C00
+3600
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char213
+ENCODING 213
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+3300
+6600
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char214
+ENCODING 214
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6300
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char215
+ENCODING 215
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+6300
+3600
+1C00
+0800
+1C00
+3600
+6300
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char216
+ENCODING 216
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6600
+3C00
+7E00
+3300
+3300
+3300
+3E00
+3600
+3300
+3300
+3300
+7300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char217
+ENCODING 217
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0800
+1400
+6B00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char218
+ENCODING 218
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0600
+0C00
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char219
+ENCODING 219
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1B00
+3600
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char220
+ENCODING 220
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+6300
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char221
+ENCODING 221
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+1800
+3000
+C300
+C300
+C300
+6600
+3C00
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char84
+ENCODING 222
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+FF00
+DB00
+9900
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0600
+3C00
+0000
+0000
+ENDCHAR
+STARTCHAR char223
+ENCODING 223
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+1C00
+3600
+6300
+6700
+6E00
+6C00
+6600
+6300
+6B00
+6E00
+6000
+4000
+0000
+0000
+ENDCHAR
+STARTCHAR char224
+ENCODING 224
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0C00
+1800
+6E00
+3B00
+3300
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char225
+ENCODING 225
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0C00
+1800
+3000
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char226
+ENCODING 226
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0800
+1C00
+3600
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char227
+ENCODING 227
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6600
+3C00
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char228
+ENCODING 228
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6600
+0000
+0000
+3C00
+0600
+3E00
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char108
+ENCODING 229
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0C00
+1800
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char99
+ENCODING 230
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0C00
+0000
+3E00
+6300
+6000
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char231
+ENCODING 231
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+6000
+6000
+6000
+6300
+3E00
+0C00
+0600
+3C00
+0000
+ENDCHAR
+STARTCHAR char232
+ENCODING 232
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+6600
+3C00
+3E00
+6300
+6000
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char233
+ENCODING 233
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0600
+0C00
+1800
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char234
+ENCODING 234
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+1800
+0E00
+0000
+0000
+ENDCHAR
+STARTCHAR char235
+ENCODING 235
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+0000
+0000
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char236
+ENCODING 236
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3300
+1E00
+3E00
+6300
+7F00
+6000
+6000
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char237
+ENCODING 237
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0600
+0C00
+1800
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char238
+ENCODING 238
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1800
+3C00
+6600
+0000
+3800
+1800
+1800
+1800
+1800
+1800
+3C00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char239
+ENCODING 239
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+6000
+6E00
+3600
+0600
+1E00
+3600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char100
+ENCODING 240
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0E00
+0600
+0F00
+0600
+3E00
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char241
+ENCODING 241
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0C00
+0000
+6E00
+3300
+3300
+3300
+3300
+3300
+3300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char242
+ENCODING 242
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3300
+1E00
+6E00
+3300
+3300
+3300
+3300
+3300
+3300
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char243
+ENCODING 243
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0600
+0C00
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char244
+ENCODING 244
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0800
+1C00
+3600
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char245
+ENCODING 245
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3300
+6600
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char246
+ENCODING 246
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6300
+0000
+0000
+3E00
+6300
+6300
+6300
+6300
+6300
+3E00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char247
+ENCODING 247
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+0000
+1800
+1800
+0000
+7E00
+0000
+1800
+1800
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char248
+ENCODING 248
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0000
+3300
+1E00
+6E00
+3B00
+3300
+3000
+3000
+3000
+7800
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char249
+ENCODING 249
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+1800
+2400
+2400
+1800
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char250
+ENCODING 250
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0C00
+1800
+3000
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char251
+ENCODING 251
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+3300
+6600
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char252
+ENCODING 252
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+6600
+0000
+0000
+6600
+6600
+6600
+6600
+6600
+6600
+3B00
+0000
+0000
+0000
+0000
+ENDCHAR
+STARTCHAR char253
+ENCODING 253
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0C00
+1800
+3000
+0000
+6300
+6300
+6300
+6300
+6300
+6300
+3F00
+0300
+0600
+7C00
+0000
+ENDCHAR
+STARTCHAR char116
+ENCODING 254
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0000
+0800
+1800
+1800
+7E00
+1800
+1800
+1800
+1800
+1B00
+0E00
+0300
+1E00
+0000
+0000
+ENDCHAR
+STARTCHAR char255
+ENCODING 255
+SWIDTH 8640 0
+DWIDTH 9 0
+BBX 9 16 0 -4
+BITMAP
+0000
+0C00
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+0000
+ENDCHAR
+ENDFONT
diff --git a/util/alevt/xio.c b/util/alevt/xio.c
new file mode 100644
index 0000000..4c0bca2
--- /dev/null
+++ b/util/alevt/xio.c
@@ -0,0 +1,1156 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
+#define XK_MISCELLANY
+#define XK_LATIN1
+#include <X11/keysymdef.h>
+#include <sys/time.h>
+#include "vt.h"
+#include "misc.h"
+#include "dllist.h"
+#include "xio.h"
+#include "fdset.h"
+#include "lang.h"
+#include "icon.xbm"
+#include "font.h"
+
+#define WW (W*CW) /* pixel width of window */
+#define WH (H*CH) /* pixel hegiht of window */
+#define NO_SEL 999 /* sel_y1 value if no selection */
+#define SEL_MIN_TIME 500 /* anything shorter is a click */
+
+static struct dl_head dpys[1]; /* list of all displays */
+static void xio_timer(void *data, int fd);
+static void handle_event(struct xio *xio, int fd);
+
+
+static int timer_init(int argc, char **argv)
+{
+ int p[2], timer_pid, i;
+
+ if (pipe(p) == -1)
+ return -1;
+
+ signal(SIGPIPE, SIG_DFL);
+ timer_pid = fork();
+ if (timer_pid == -1)
+ return -1;
+ if (timer_pid > 0)
+ {
+ fdset_add_fd(fds, p[0], xio_timer, 0);
+ close(p[1]);
+ return 0;
+ }
+
+ close(p[0]);
+ for (i = 0; i < 32; ++i)
+ if (p[1] != i)
+ close(i);
+ memcpy(argv[0], "Timer", 6);
+
+ for (;;)
+ {
+ usleep(300000);
+ write(p[1], "*", 1);
+ }
+}
+
+
+static int local_init(int argc, char **argv)
+{
+ static int inited = 0;
+
+ if (inited)
+ return 0;
+
+ if (timer_init(argc, argv) == -1)
+ return -1;
+
+ dl_init(dpys);
+
+ inited = 1;
+ return 0;
+}
+
+
+static int get_colors(struct xio *xio)
+{
+ int i;
+ XColor c;
+
+ static short rgb[][3] =
+ {
+ { 0x0000,0x0000,0x0000 },
+ { 0xffff,0x0000,0x0000 },
+ { 0x0000,0xffff,0x0000 },
+ { 0xffff,0xffff,0x0000 },
+ { 0x0000,0x0000,0xffff },
+ { 0xffff,0x0000,0xffff },
+ { 0x0000,0xffff,0xffff },
+ { 0xffff,0xffff,0xffff },
+ { 0x7fff,0x7fff,0x7fff },
+ { 0x7fff,0x0000,0x0000 },
+ { 0x0000,0x7fff,0x0000 },
+ { 0x7fff,0x7fff,0x0000 },
+ { 0x0000,0x0000,0x7fff },
+ { 0x7fff,0x0000,0x7fff },
+ { 0x0000,0x7fff,0x7fff },
+ { 0x3fff,0x3fff,0x3fff },
+ };
+
+ for (i = 0; i < 16; ++i)
+ {
+ c.red = rgb[i][0];
+ c.green = rgb[i][1];
+ c.blue = rgb[i][2];
+ if (XAllocColor(xio->dpy, xio->cmap, &c) == 0)
+ return -1;
+ xio->color[i] = c.pixel;
+ }
+ return 0;
+}
+
+
+static int get_fonts(struct xio *xio)
+{
+ GC gc;
+ int i;
+ unsigned char *font_bits;
+ switch(latin1) {
+ case LATIN1: font_bits=font1_bits; break;
+ case LATIN2: font_bits=font2_bits; break;
+ case KOI8: font_bits=font3_bits; break;
+ case GREEK: font_bits=font4_bits; break;
+ default: font_bits=font1_bits; break;
+ }
+
+ xio->font[0] = XCreateBitmapFromData(xio->dpy, xio->root,
+ font_bits, font_width, font_height);
+ xio->font[1] = XCreatePixmap(xio->dpy, xio->root,
+ font_width, font_height*2, 1);
+ gc = XCreateGC(xio->dpy, xio->font[0], 0, 0);
+ for (i = 0; i < font_height; ++i)
+ {
+ XCopyArea(xio->dpy, xio->font[0], xio->font[1], gc, 0, i,
+ font_width, 1, 0, i*2);
+ XCopyArea(xio->dpy, xio->font[0], xio->font[1], gc, 0, i,
+ font_width, 1, 0, i*2+1);
+ }
+ XFreeGC(xio->dpy, gc);
+ return 0;
+}
+
+
+static void xlib_conn_watch(Display *dpy, void *fds, int fd, int open_flag, void *data)
+{
+ if (open_flag)
+ fdset_add_fd(fds, fd, XProcessInternalConnection, dpy);
+ else
+ fdset_del_fd(fds, fd);
+}
+
+
+struct xio * xio_open_dpy(char *dpy, int argc, char **argv)
+{
+ XClassHint classhint[1];
+ struct xio *xio;
+
+ if (local_init(argc, argv) == -1)
+ goto fail1;
+
+ if (not(xio = malloc(sizeof(*xio))))
+ goto fail1;
+
+ if (not(xio->dpy = XOpenDisplay(dpy)))
+ goto fail2;
+
+ xio->fd = ConnectionNumber(xio->dpy);
+ xio->argc = argc;
+ xio->argv = argv;
+ dl_init(xio->windows);
+ xio->screen = DefaultScreen(xio->dpy);
+ xio->depth = DefaultDepth(xio->dpy, xio->screen);
+ xio->width = DisplayWidth(xio->dpy, xio->screen);
+ xio->height = DisplayHeight(xio->dpy, xio->screen);
+ xio->root = DefaultRootWindow(xio->dpy);
+ xio->cmap = DefaultColormap(xio->dpy, xio->screen);
+ xio->xa_del_win = XInternAtom(xio->dpy, "WM_DELETE_WINDOW", False);
+ xio->xa_targets = XInternAtom(xio->dpy, "TARGETS", False);
+ xio->xa_timestamp = XInternAtom(xio->dpy, "TIMESTAMP", False);
+ xio->xa_multiple = XInternAtom(xio->dpy, "MULTIPLE", False);
+ xio->xa_text = XInternAtom(xio->dpy, "TEXT", False);
+
+ if (get_colors(xio) == -1)
+ goto fail3;
+
+ if (get_fonts(xio) == -1)
+ goto fail3;
+
+ if (fdset_add_fd(fds, xio->fd, handle_event, xio) == -1)
+ goto fail3;
+
+ XAddConnectionWatch(xio->dpy, PTR xlib_conn_watch, PTR fds);
+
+ xio->icon = XCreateBitmapFromData(xio->dpy, xio->root,
+ icon_bits, icon_width, icon_height);
+
+ xio->group_leader = XCreateSimpleWindow(xio->dpy, xio->root,
+ 0, 0, 1, 1, 0, 0, 0);
+ XSetCommand(xio->dpy, xio->group_leader, xio->argv, xio->argc);
+ classhint->res_name = "VTLeader";
+ classhint->res_class = "AleVT";
+ XSetClassHint(xio->dpy, xio->group_leader, classhint);
+
+ dl_insert_first(dpys, xio->node);
+ return xio;
+
+fail4:
+ fdset_del_fd(fds, xio->fd);
+fail3:
+ XCloseDisplay(xio->dpy);
+fail2:
+ free(xio);
+fail1:
+ return 0;
+}
+
+
+static void set_user_geometry(struct xio_win *xw, char *geom, XSizeHints *sh, int bwidth)
+{
+ static int gravs[] = { NorthWestGravity, NorthEastGravity,
+ SouthWestGravity, SouthEastGravity };
+ int f, g = 0;
+
+ f = XParseGeometry(geom, &sh->x, &sh->y, &sh->width, &sh->height);
+
+ if (f & WidthValue)
+ sh->width = sh->base_width + sh->width * sh->width_inc;
+ if (f & HeightValue)
+ sh->height = sh->base_height + sh->height * sh->height_inc;
+ if (f & XNegative)
+ g+=1, sh->x = xw->xio->width + sh->x - sh->width - bwidth;
+ if (f & YNegative)
+ g+=2, sh->y = xw->xio->height + sh->y - sh->height - bwidth;
+
+ sh->width = bound(sh->min_width, sh->width, sh->max_width);
+ sh->height = bound(sh->min_height, sh->height, sh->max_height);
+
+ if (f & (WidthValue | HeightValue))
+ sh->flags |= USSize;
+ if (f & (XValue | YValue))
+ sh->flags |= USPosition | PWinGravity;
+
+ sh->win_gravity = gravs[g];
+}
+
+
+struct xio_win * xio_open_win(struct xio *xio, char *geom)
+{
+ struct xio_win *xw;
+ XSetWindowAttributes attr;
+ XGCValues gcval;
+ XSizeHints sizehint[1];
+ XClassHint classhint[1];
+ XWMHints wmhint[1];
+
+ if (not(xw = malloc(sizeof(*xw))))
+ goto fail1;
+
+ xw->xio = xio;
+
+ sizehint->flags = PSize | PBaseSize | PMinSize | PMaxSize | PResizeInc;
+ sizehint->x = sizehint->y = 0;
+ sizehint->width_inc = CW;
+ sizehint->height_inc = CH;
+ sizehint->base_width = 0;
+ sizehint->base_height = 0;
+ sizehint->min_width = 11*CW;
+ sizehint->min_height = 1*CH;
+ sizehint->max_width = sizehint->width = WW + CW;
+ sizehint->max_height = sizehint->height = WH;
+ set_user_geometry(xw, geom, sizehint, 1);
+
+ attr.background_pixel = xio->color[0];
+ attr.event_mask = KeyPressMask |
+ ButtonPressMask|ButtonReleaseMask|Button1MotionMask |
+ ExposureMask;
+ xw->win = XCreateWindow(xio->dpy, xio->root,
+ sizehint->x, sizehint->y, sizehint->width, sizehint->height, 1,
+ CopyFromParent, CopyFromParent, CopyFromParent,
+ CWBackPixel|CWEventMask, &attr);
+
+ classhint->res_name = "VTPage";
+ classhint->res_class = "AleVT";
+
+ wmhint->flags = InputHint | StateHint | WindowGroupHint | IconPixmapHint;
+ wmhint->input = True;
+ wmhint->initial_state = NormalState; //IconicState;
+ wmhint->window_group = xio->group_leader;
+ wmhint->icon_pixmap = xio->icon;
+
+ XSetWMProperties(xio->dpy, xw->win, 0,0, 0,0, sizehint, wmhint, classhint);
+ XSetWMProtocols(xio->dpy, xw->win, &xio->xa_del_win, 1);
+
+ xw->title[0] = 0;
+ xio_title(xw, "AleVT"); // will be reset pretty soon
+
+ gcval.graphics_exposures = False;
+ xw->gc = XCreateGC(xio->dpy, xw->win, GCGraphicsExposures, &gcval);
+
+ xw->tstamp = CurrentTime;
+ xw->fg = xw->bg = -1; /* unknown colors */
+
+ xw->curs_x = xw->curs_y = 999; // no cursor
+
+ xw->sel_y1 = NO_SEL; /* no selection area */
+ xw->sel_start_t = 0; /* no selection-drag active */
+ xw->sel_set_t = 0; /* not selection owner */
+ xw->sel_pixmap = 0; /* no selection pixmap yet */
+
+ xio_clear_win(xw);
+ xw->blink_on = xw->reveal = 0;
+
+ xw->handler = 0;
+
+ XMapWindow(xio->dpy, xw->win);
+ dl_insert_first(xio->windows, xw->node);
+ return xw;
+
+fail2:
+ free(xw);
+fail1:
+ return 0;
+}
+
+
+void xio_close_win(struct xio_win *xw, int dpy_too)
+{
+ struct xio *xio = xw->xio;
+
+ XDestroyWindow(xio->dpy, xw->win);
+ dl_remove(xw->node);
+ free(xw);
+
+ if (dpy_too && dl_empty(xio->windows))
+ xio_close_dpy(xio);
+}
+
+
+void xio_close_dpy(struct xio *xio)
+{
+ while (not dl_empty(xio->windows))
+ xio_close_win((struct xio_win *)xio->windows->first, 0);
+
+ XDestroyWindow(xio->dpy, xio->group_leader);
+ XRemoveConnectionWatch(xio->dpy, PTR xlib_conn_watch, PTR fds);
+ fdset_del_fd(fds, xio->fd);
+ dl_remove(xio->node);
+ free(xio);
+}
+
+
+void xio_set_handler(struct xio_win *xw, void *handler, void *data)
+{
+ xw->handler = handler;
+ xw->data = data;
+}
+
+
+void xio_title(struct xio_win *xw, char *title)
+{
+ char buf[sizeof(xw->title) + 32];
+
+ if (strlen(title) >= sizeof(xw->title))
+ return; //TODO: trimm...
+ if (strcmp(xw->title, title) == 0)
+ return;
+
+ strcpy(xw->title, title);
+ sprintf(buf, "AleVT " VERSION " %s", xw->title);
+ XStoreName(xw->xio->dpy, xw->win, buf);
+ XSetIconName(xw->xio->dpy, xw->win, xw->title);
+}
+
+
+void xio_clear_win(struct xio_win *xw)
+{
+ memset(xw->ch, ' ', sizeof(xw->ch));
+ xw->dheight = xw->blink = xw->concealed = 0;
+ xw->hidden = xw->lhidden = 0;
+ xw->modified = ALL_LINES;
+}
+
+
+void xio_put_line(struct xio_win *xw, int y, u8 *data)
+{
+ u8 *p = xw->ch + y*W;
+ u8 *ep = p + W;
+ lbits yb = 1 << y;
+ lbits x = xw->dheight;
+
+ if (y < 0 || y >= H)
+ return;
+
+ if (memcmp(data, p, ep - p) == 0)
+ return;
+
+ xw->modified |= yb;
+ xw->blink &= ~yb;
+ xw->dheight &= ~yb;
+ xw->concealed &= ~yb;
+
+ while (p < ep)
+ switch (*p++ = *data++)
+ {
+ case 0x08:
+ xw->blink |= yb;
+ break;
+ case 0x0d:
+ if (y < H-1)
+ xw->dheight |= yb;
+ break;
+ case 0x18:
+ xw->concealed |= yb;
+ break;
+ }
+
+ if ((xw->dheight ^ x) & yb) // dheight has changed, recalc hidden
+ {
+ xw->hidden &= yb*2 - 1;
+ for (; yb & ALL_LINES/2; yb *= 2)
+ if (~xw->hidden & xw->dheight & yb)
+ xw->hidden |= yb*2;
+ }
+}
+
+
+void xio_put_str(struct xio_win *xw, int y, u8 *str)
+{
+ u8 buf[W];
+ int l;
+ l = strlen(str);
+ if (l < W)
+ {
+ memcpy(buf, str, l);
+ memset(buf + l, ' ', W - l);
+ }
+ else
+ memcpy(buf, str, W);
+ xio_put_line(xw, y, buf);
+}
+
+
+static void dirty(struct xio_win *xw, int y1, int y2) // mark [y1,y2[ dirty
+{
+ if (y1 >= 0 && y1 < H && y1 < y2)
+ {
+ if (y2 > H)
+ y2 = H;
+ if (xw->hidden & (1 << y1))
+ y1--;
+ while (y1 < y2)
+ xw->modified |= 1 << y1++;
+ }
+}
+
+
+int xio_get_line(struct xio_win *xw, int y, u8 *data)
+{
+ if (y < 0 || y >= H)
+ return -1;
+ if (xw->hidden & (1 << y))
+ y--;
+ memcpy(data, xw->ch + y*W, 40);
+ return 0;
+}
+
+
+void xio_set_cursor(struct xio_win *xw, int x, int y)
+{
+ if (xw->curs_y >= 0 && xw->curs_y < H)
+ dirty(xw, xw->curs_y, xw->curs_y + 1);
+ if (x >= 0 && x < W && y >= 0 && y < H)
+ dirty(xw, y, y + 1);
+ else
+ x = y = 999;
+ xw->curs_x = x;
+ xw->curs_y = y;
+}
+
+
+static inline void draw_char(struct xio_win *xw, Window win, int fg, int bg,
+ int c, int dbl, int x, int y, int ry)
+{
+ struct xio *xio = xw->xio;
+
+ if (fg != xw->fg)
+ XSetForeground(xio->dpy, xw->gc, xio->color[xw->fg = fg]);
+ if (bg != xw->bg)
+ XSetBackground(xio->dpy, xw->gc, xio->color[xw->bg = bg]);
+
+ if (dbl)
+ {
+ XCopyPlane(xio->dpy, xio->font[1], win, xw->gc,
+ c%32*CW, c/32*CH*2, CW, CH*2, x*CW, y*CH, 1);
+ }
+ else
+ {
+ XCopyPlane(xio->dpy, xio->font[0], win, xw->gc,
+ c%32*CW, c/32*CH, CW, CH, x*CW, y*CH, 1);
+ if (xw->dheight & (1<<ry))
+ XCopyPlane(xio->dpy, xio->font[0], win, xw->gc,
+ ' '%32*CW, ' '/32*CH, CW, CH, x*CW, y*CH+CH, 1);
+ }
+}
+
+static void draw_cursor(struct xio_win *xw, int x, int y, int dbl)
+{
+ struct xio *xio = xw->xio;
+
+ if (xw->blink_on)
+ XSetForeground(xio->dpy, xw->gc, xio->color[xw->fg = xw->bg ^ 8]);
+ XDrawRectangle(xio->dpy, xw->win, xw->gc, x * CW, y * CH, CW-1,
+ (dbl ? 2*CH : CH)-1);
+}
+
+
+void xio_update_win(struct xio_win *xw)
+{
+ u8 *p = xw->ch;
+ lbits yb, redraw;
+ int x, y, c;
+
+ if (xw->modified == 0)
+ return;
+
+ redraw = xw->modified; // all modified lines
+ redraw |= xw->lhidden; // all previously hidden lines
+ redraw &= ~xw->hidden;
+
+ xw->lhidden = xw->hidden;
+ xw->modified = 0;
+
+ if (redraw == 0)
+ return;
+
+ for (yb = 1, y = 0; y < H; ++y, yb *= 2)
+ if (redraw & yb)
+ {
+ int fg = 7, bg = 0, _fg, _bg;
+ int dbl = 0, blk = 0, con = 0, gfx = 0, sep = 0, hld = 0;
+ int last_ch = ' ';
+
+ for (x = 0; x < W; ++x)
+ {
+ switch (c = *p++)
+ {
+ case 0x00 ... 0x07: /* alpha + foreground color */
+ fg = c & 7;
+ gfx = 0;
+ con = 0;
+ goto ctrl;
+ case 0x08: /* flash */
+ blk = not xw->blink_on;
+ goto ctrl;
+ case 0x09: /* steady */
+ blk = 0;
+ goto ctrl;
+ case 0x0a: /* end box */
+ case 0x0b: /* start box */
+ goto ctrl;
+ case 0x0c: /* normal height */
+ dbl = 0;
+ goto ctrl;
+ case 0x0d: /* double height */
+ dbl = y < H-1;
+ goto ctrl;
+ case 0x10 ... 0x17: /* graphics + foreground color */
+ fg = c & 7;
+ gfx = 1;
+ con = 0;
+ goto ctrl;
+ case 0x18: /* conceal display */
+ con = not xw->reveal;
+ goto ctrl;
+ case 0x19: /* contiguous graphics */
+ sep = 0;
+ goto ctrl;
+ case 0x1a: /* separate graphics */
+ sep = 1;
+ goto ctrl;
+ case 0x1c: /* black background */
+ bg = 0;
+ goto ctrl;
+ case 0x1d: /* new background */
+ bg = fg;
+ goto ctrl;
+ case 0x1e: /* hold graphics */
+ hld = 1;
+ goto ctrl;
+ case 0x1f: /* release graphics */
+ hld = 0;
+ goto ctrl;
+
+ case 0x0e: /* SO (reserved, double width) */
+ case 0x0f: /* SI (reserved, double size) */
+ c= ' '; break;
+ case 0x1b: /* ESC (reserved) */
+ c = ' ';
+ break;
+
+ ctrl:
+ c = ' ';
+ if (hld && gfx)
+ c = last_ch;
+ break;
+
+ case 0x80 ... 0x9f: /* these aren't used */
+ c = BAD_CHAR;
+ break;
+
+ default: /* mapped to selected font */
+ break;
+ }
+
+ if (gfx && (c & 0xa0) == 0x20)
+ {
+ last_ch = c;
+ c += (c & 0x40) ? 32 : -32;
+ }
+
+ _fg = fg;
+ _bg = bg;
+ if (blk)
+ _fg |= 8;
+ if (y >= xw->sel_y1 && y < xw->sel_y2 &&
+ x >= xw->sel_x1 && x < xw->sel_x2)
+ _bg |= 8;
+ if (con)
+ _fg = _bg;
+
+ draw_char(xw, xw->win, _fg, _bg, c, dbl, x, y, y);
+
+ if (y == xw->curs_y && x == xw->curs_x)
+ draw_cursor(xw, xw->curs_x, xw->curs_y, dbl);
+
+ if (xw->sel_pixmap && (_bg & 8))
+ draw_char(xw, xw->sel_pixmap, con ? bg : fg, bg, c, dbl,
+ x - xw->sel_x1, y - xw->sel_y1, y);
+ }
+ }
+ else
+ p += 40;
+}
+
+
+static void for_all_windows(void (*func)(struct xio_win *xw), struct xio_win *except)
+{
+ struct xio *xio, *vtn;
+ struct xio_win *xw, *vwn;
+
+ for (xio = PTR dpys->first; vtn = PTR xio->node->next; xio = vtn)
+ for (xw = PTR xio->windows->first; vwn = PTR xw->node->next; xw = vwn)
+ if (xw != except)
+ func(xw);
+}
+
+
+int xio_set_concealed(struct xio_win *xw, int on)
+{
+ on = !!on;
+ if (xw->reveal == on)
+ return on;
+
+ xw->reveal = on;
+ xw->modified |= xw->concealed;
+ return !on;
+}
+
+
+static void sel_set(struct xio_win *xw, int x1, int y1, int x2, int y2)
+{
+ int t;
+
+ x1 = bound(0, x1, W-1);
+ y1 = bound(0, y1, H-1);
+ x2 = bound(0, x2, W-1);
+ y2 = bound(0, y2, H-1);
+
+ if (x1 > x2)
+ t = x1, x1 = x2, x2 = t;
+ if (y1 > y2)
+ t = y1, y1 = y2, y2 = t;
+
+ dirty(xw, xw->sel_y1, xw->sel_y2);
+
+ if (xw->hidden & (1 << y1))
+ y1--;
+ if (xw->hidden & (2 << y2))
+ y2++;
+
+ xw->sel_x1 = x1;
+ xw->sel_y1 = y1;
+ xw->sel_x2 = x2 + 1;
+ xw->sel_y2 = y2 + 1;
+ dirty(xw, xw->sel_y1, xw->sel_y2);
+}
+
+
+static void sel_abort(struct xio_win *xw)
+{
+ if (xw->sel_set_t)
+ XSetSelectionOwner(xw->xio->dpy, XA_PRIMARY, None, xw->sel_set_t);
+ if (xw->sel_y1 != NO_SEL)
+ dirty(xw, xw->sel_y1, xw->sel_y2);
+ xw->sel_y1 = NO_SEL;
+ xw->sel_set_t = 0;
+ xw->sel_start_t = 0;
+}
+
+
+static void sel_start(struct xio_win *xw, int x, int y, Time t)
+{
+ sel_abort(xw);
+ xw->sel_start_x = x;
+ xw->sel_start_y = y;
+ xw->sel_start_t = t;
+}
+
+
+static void sel_move(struct xio_win *xw, int x, int y, Time t)
+{
+ if (xw->sel_start_t == 0)
+ return;
+ if (xw->sel_y1 == NO_SEL)
+ if (t - xw->sel_start_t < SEL_MIN_TIME)
+ if (x == xw->sel_start_x)
+ if (y == xw->sel_start_y)
+ return;
+ sel_set(xw, xw->sel_start_x, xw->sel_start_y, x, y);
+}
+
+
+static int sel_end(struct xio_win *xw, int x, int y, Time t)
+{
+ sel_move(xw, x, y, t);
+ xw->sel_start_t = 0;
+
+ if (xw->sel_y1 == NO_SEL)
+ return 0;
+
+ for_all_windows(sel_abort, xw);
+ XSetSelectionOwner(xw->xio->dpy, XA_PRIMARY, xw->win, t);
+ if (XGetSelectionOwner(xw->xio->dpy, XA_PRIMARY) == xw->win)
+ xw->sel_set_t = t;
+ else
+ sel_abort(xw);
+ return 1;
+}
+
+
+static int sel_convert2ascii(struct xio_win *xw, u8 *buf)
+{
+ u8 *d = buf;
+ int x, y, nl = 0;
+
+ for (y = xw->sel_y1; y < xw->sel_y2; y++)
+ {
+ u8 *s = xw->ch + y * W;
+ int gfx = 0, con = 0;
+
+ if (~xw->hidden & (1 << y))
+ {
+ for (x = 0; x < xw->sel_x2; ++x)
+ {
+ int ch, c = ' ';
+ switch (ch = *s++)
+ {
+ case 0x00 ... 0x07:
+ gfx = con = 0;
+ break;
+ case 0x10 ... 0x17:
+ gfx = 1, con = 0;
+ break;
+ case 0x18:
+ con = not xw->reveal;
+ break;
+ case 0xa0 ... 0xff:
+ case 0x20 ... 0x7f:
+ if (not con)
+ if (gfx && ch != ' ' && (ch & 0xa0) == 0x20)
+ c = '#';
+ else if (ch == 0x7f)
+ c = '*';
+ else
+ c = ch;
+ break;
+ }
+ if (x >= xw->sel_x1)
+ {
+ if (nl)
+ *d++ = '\n', nl = 0;
+ *d++ = c;
+ }
+ }
+ nl = 1;
+ }
+ }
+ *d = 0; // not necessary
+ return d - buf;
+}
+
+
+static Pixmap sel_convert2pixmap(struct xio_win *xw)
+{
+ struct xio *xio = xw->xio;
+ Pixmap pm;
+
+ if (xw->sel_y1 == NO_SEL)
+ return None;
+
+ pm = XCreatePixmap(xio->dpy, xio->root, (xw->sel_x2 - xw->sel_x1) * CW,
+ (xw->sel_y2 - xw->sel_y1) * CH,
+ xio->depth);
+ xw->sel_pixmap = pm;
+ dirty(xw, xw->sel_y1, xw->sel_y2);
+ xio_update_win(xw);
+ xw->sel_pixmap = 0;
+
+ return pm;
+}
+
+
+static int sel_do_conv(struct xio_win *xw, Window w, Atom type, Atom prop)
+{
+ struct xio *xio = xw->xio;
+
+ if (type == xio->xa_targets)
+ {
+ u32 atoms[6];
+
+ atoms[0] = XA_STRING;
+ atoms[1] = xio->xa_text;
+ atoms[2] = XA_PIXMAP;
+ atoms[3] = XA_COLORMAP;
+ atoms[4] = xio->xa_multiple;
+ atoms[5] = xio->xa_timestamp;
+ XChangeProperty(xio->dpy, w, prop, type,
+ 32, PropModeReplace, PTR atoms, NELEM(atoms));
+ }
+ else if (type == xio->xa_timestamp)
+ {
+ u32 t = xw->sel_set_t;
+
+ XChangeProperty(xio->dpy, w, prop, type, 32, PropModeReplace, PTR &t, 1);
+ }
+ else if (type == XA_COLORMAP)
+ {
+ u32 t = xio->cmap;
+
+ XChangeProperty(xio->dpy, w, prop, type, 32, PropModeReplace, PTR &t, 1);
+ }
+ else if (type == XA_STRING || type == xio->xa_text)
+ {
+ u8 buf[H * (W+1)];
+ int len;
+
+ len = sel_convert2ascii(xw, buf);
+
+ XChangeProperty(xio->dpy, w, prop, type, 8, PropModeReplace, buf, len);
+ }
+ else if (type == XA_PIXMAP || type == XA_DRAWABLE)
+ {
+ Pixmap pm;
+
+ pm = sel_convert2pixmap(xw);
+
+ XChangeProperty(xio->dpy, w, prop, type, 32, PropModeReplace, PTR &pm, 1);
+ }
+ else if (type == xio->xa_multiple)
+ {
+ u32 *atoms, ty, fo, i;
+ unsigned long n, b;
+
+ if (prop != None)
+ {
+ if (Success == XGetWindowProperty(xio->dpy, w, prop, 0, 1024, 0,
+ AnyPropertyType, PTR &ty, PTR &fo, &n, &b, PTR &atoms))
+ {
+ if (fo == 32 && n%2 == 0)
+ {
+ for (i = 0; i < n; i += 2)
+ if (sel_do_conv(xw, w, atoms[i], atoms[i+1]) == None)
+ atoms[i] = None;
+ }
+ XChangeProperty(xio->dpy, w, prop, type, 32, PropModeReplace,
+ PTR atoms, n);
+ XFree(atoms);
+ }
+ }
+ }
+ else
+ return None;
+ return prop;
+}
+
+
+static void sel_send(struct xio_win *xw, XSelectionRequestEvent *req)
+{
+ XSelectionEvent ev[1];
+
+ if (req->property == None)
+ req->property = req->target;
+
+ ev->type = SelectionNotify;
+ ev->requestor = req->requestor;
+ ev->selection = req->selection;
+ ev->target = req->target;
+ ev->property = sel_do_conv(xw, req->requestor, req->target, req->property);
+ ev->time = req->time;
+ XSendEvent(xw->xio->dpy, req->requestor, False, 0, PTR ev);
+}
+
+
+static void sel_retrieve(struct xio_win *xw, Window w, Atom prop, int del)
+{
+ u8 *data;
+ u32 ty, fo;
+ unsigned long n, b;
+ struct xio *xio = xw->xio;
+
+ if (prop == None)
+ return;
+
+ if (Success == XGetWindowProperty(xio->dpy, w, prop, 0, 1024, del,
+ AnyPropertyType, PTR &ty, PTR &fo, &n, &b, PTR &data))
+ {
+ if (fo == 8 && n != 0)
+ {
+ struct vt_event vtev[1];
+
+ vtev->resource = xw;
+ vtev->type = EV_SELECTION;
+ vtev->i1 = n;
+ vtev->p1 = data;
+ xw->handler(xw->data, vtev);
+ }
+ XFree(data);
+ }
+}
+
+
+void xio_cancel_selection(struct xio_win *xw)
+{
+ sel_abort(xw);
+}
+
+
+void xio_query_selection(struct xio_win *xw)
+{
+ struct xio *xio = xw->xio;
+
+ if (XGetSelectionOwner(xio->dpy, XA_PRIMARY) == None)
+ sel_retrieve(xw, xio->root, XA_CUT_BUFFER0, False);
+ else
+ {
+ XDeleteProperty(xio->dpy, xw->win, XA_STRING);
+ XConvertSelection(xio->dpy, XA_PRIMARY, XA_STRING,
+ XA_STRING, xw->win, xw->tstamp);
+ }
+}
+
+
+void xio_set_selection(struct xio_win *xw, int x1, int y1, int x2, int y2)
+{
+ sel_start(xw, x1, y1, xw->tstamp - SEL_MIN_TIME);
+ sel_end(xw, x2, y2, xw->tstamp);
+}
+
+
+static void handle_event(struct xio *xio, int fd)
+{
+ struct xio_win *xw;
+ struct vt_event vtev[1];
+ XEvent ev[1];
+
+ XNextEvent(xio->dpy, ev);
+
+ for (xw = PTR xio->windows->first; xw->node->next; xw = PTR xw->node->next)
+ if (xw->win == ev->xany.window)
+ break;
+ if (xw->node->next == 0)
+ return;
+
+ vtev->resource = xw;
+
+ switch(ev->type)
+ {
+ case Expose:
+ {
+ int y1 = ev->xexpose.y / CH;
+ int y2 = (ev->xexpose.y + ev->xexpose.height + CH-1) / CH;
+
+ dirty(xw, y1, y2);
+ break;
+ }
+ case ClientMessage:
+ {
+ vtev->type = EV_CLOSE;
+ if (ev->xclient.format == 32)
+ if ((Atom)ev->xclient.data.l[0] == xio->xa_del_win)
+ xw->handler(xw->data, vtev);
+ break;
+ }
+ case KeyPress:
+ {
+ unsigned char ch;
+ KeySym k;
+
+ xw->tstamp = ev->xkey.time;
+ vtev->type = EV_KEY;
+ vtev->i1 = 0;
+ vtev->i2 = (ev->xkey.state & ShiftMask) != 0;
+ if (XLookupString(&ev->xkey, &ch, 1, &k, 0))
+ vtev->i1 = ch;
+ else
+ switch (k)
+ {
+ case XK_Left: vtev->i1 = KEY_LEFT; break;
+ case XK_Right: vtev->i1 = KEY_RIGHT; break;
+ case XK_Up: vtev->i1 = KEY_UP; break;
+ case XK_Down: vtev->i1 = KEY_DOWN; break;
+ case XK_Prior: vtev->i1 = KEY_PUP; break;
+ case XK_Next: vtev->i1 = KEY_PDOWN; break;
+ case XK_Delete: vtev->i1 = KEY_DEL; break;
+ case XK_Insert: vtev->i1 = KEY_INS; break;
+ case XK_F1: vtev->i1 = KEY_F(1); break;
+ case XK_F2: vtev->i1 = KEY_F(2); break;
+ case XK_F3: vtev->i1 = KEY_F(3); break;
+ case XK_F4: vtev->i1 = KEY_F(4); break;
+ case XK_F5: vtev->i1 = KEY_F(5); break;
+ case XK_F6: vtev->i1 = KEY_F(6); break;
+ case XK_F7: vtev->i1 = KEY_F(7); break;
+ case XK_F8: vtev->i1 = KEY_F(8); break;
+ case XK_F9: vtev->i1 = KEY_F(9); break;
+ case XK_F10: vtev->i1 = KEY_F(10); break;
+ case XK_F11: vtev->i1 = KEY_F(11); break;
+ case XK_F12: vtev->i1 = KEY_F(12); break;
+ }
+ if (vtev->i1)
+ xw->handler(xw->data, vtev);
+ break;
+ }
+ case ButtonPress:
+ {
+ xw->tstamp = ev->xkey.time;
+ ev->xbutton.x /= CW;
+ ev->xbutton.y /= CH;
+ if (ev->xbutton.button == Button1)
+ sel_start(xw, ev->xbutton.x, ev->xbutton.y, ev->xbutton.time);
+ break;
+ }
+ case MotionNotify:
+ {
+ xw->tstamp = ev->xkey.time;
+ ev->xmotion.x /= CW;
+ ev->xmotion.y /= CH;
+ if (ev->xmotion.state & Button1Mask)
+ sel_move(xw, ev->xmotion.x, ev->xmotion.y, ev->xmotion.time);
+ break;
+ }
+ case ButtonRelease:
+ {
+ xw->tstamp = ev->xkey.time;
+ ev->xbutton.x /= CW;
+ ev->xbutton.y /= CH;
+ if (ev->xbutton.button == Button1)
+ if (sel_end(xw, ev->xbutton.x, ev->xbutton.y, ev->xbutton.time))
+ break;
+
+ vtev->type = EV_MOUSE;
+ vtev->i1 = ev->xbutton.button;
+ vtev->i2 = (ev->xbutton.state & ShiftMask) != 0;
+ vtev->i3 = ev->xbutton.x;
+ vtev->i4 = ev->xbutton.y;
+ if (vtev->i3 >= 0 && vtev->i3 < W && vtev->i4 >= 0 && vtev->i4 < H)
+ xw->handler(xw->data, vtev);
+ break;
+ }
+ case SelectionClear:
+ {
+ // may be our own Owner=None due to sel_start
+ if (xw->sel_set_t && ev->xselectionclear.time >= xw->sel_set_t)
+ {
+ xw->sel_set_t = 0; // no need to reset owner
+ sel_abort(xw);
+ }
+ break;
+ }
+ case SelectionRequest:
+ {
+ sel_send(xw, &ev->xselectionrequest);
+ break;
+ }
+ case SelectionNotify:
+ {
+ sel_retrieve(xw, ev->xselection.requestor, ev->xselection.property, True);
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+
+static void switch_blink_state(struct xio_win *xw)
+{
+ xw->blink_on = !xw->blink_on;
+ xw->modified |= xw->blink;
+ dirty(xw, xw->curs_y, xw->curs_y + 1);
+}
+
+
+static void send_timer_event(struct xio_win *xw)
+{
+ struct vt_event vtev[1];
+ vtev->type = EV_TIMER;
+ xw->handler(xw->data, vtev);
+}
+
+
+static void xio_timer(void *data, int fd)
+{
+ char buf[64];
+ read(fd, buf, sizeof(buf));
+ for_all_windows(switch_blink_state, 0);
+ for_all_windows(send_timer_event, 0);
+}
+
+
+void xio_event_loop(void)
+{
+ struct xio *xio, *vtn;
+ int f;
+
+ while (not dl_empty(dpys))
+ {
+ do
+ {
+ for_all_windows(xio_update_win, 0);
+ f = 0;
+ for (xio = PTR dpys->first; vtn = PTR xio->node->next; xio = vtn)
+ while (XPending(xio->dpy))
+ {
+ handle_event(xio, xio->fd);
+ f++;
+ }
+ } while (f);
+ fdset_select(fds, -1);
+ }
+}
diff --git a/util/alevt/xio.h b/util/alevt/xio.h
new file mode 100644
index 0000000..664b701
--- /dev/null
+++ b/util/alevt/xio.h
@@ -0,0 +1,80 @@
+#ifndef VTXIO_H
+#define VTXIO_H
+
+#include <X11/Xlib.h>
+#include "vt.h"
+#include "dllist.h"
+
+typedef u32 lbits;
+#define ALL_LINES ((1ul << H) - 1)
+
+/* one xio per display */
+struct xio
+{
+ struct dl_node node[1];
+ int argc;
+ char **argv;
+ Display *dpy; /* display connection */
+ int fd; /* the displays file descriptor */
+ Atom xa_del_win; /* WM_DELETE_WINDOW atom */
+ Atom xa_targets; /* TARGETS atom (selection) */
+ Atom xa_timestamp; /* TIMESTAMP atom (selection) */
+ Atom xa_text; /* TEXT atom (selection) */
+ Atom xa_multiple; /* MULTIPLE atom (selection) */
+ Window group_leader; /* unmapped window */
+ int screen; /* DefaultScreen */
+ int width, height; /* DisplayWidth/Height */
+ int depth; /* DefaultDepth */
+ Window root; /* DefaultRoot */
+ Colormap cmap;
+ int color[16]; /* 8 normal, 8 dim intensity */
+ Pixmap font[2]; /* normal, dbl-height */
+ Pixmap icon; /* icon pixmap */
+ struct dl_head windows[1]; /* all windows on this display */
+};
+
+/* one vt_win per window */
+struct xio_win
+{
+ struct dl_node node[1];
+ struct xio *xio; /* display */
+ Window win; /* the drawing window */
+ Time tstamp; /* timestamp of last user event */
+ GC gc; /* it's graphics context */
+ u8 ch[H*W]; /* the page contents */
+ lbits modified, hidden, lhidden; /* states for each line */
+ lbits dheight, blink, concealed; /* attributes for each line */
+ int fg, bg; /* current foreground/background */
+ int blink_on; /* blinking on */
+ int reveal; /* reveal concealed text */
+ void (*handler)(void *data, struct vt_event *ev); /* event-handler */
+ void *data; /* data for the event-handler */
+ int curs_x, curs_y; /* cursor position */
+ u8 title[32]; /* the user title */
+ // selection support
+ int sel_start_x, sel_start_y;
+ Time sel_start_t;
+ Time sel_set_t; /* time we got selection owner */
+ int sel_x1, sel_y1, sel_x2, sel_y2; /* selected area */
+ Pixmap sel_pixmap; /* for pixmap-selection requests */
+};
+
+struct xio *xio_open_dpy(char *dpy, int argc, char **argv);
+struct xio_win *xio_open_win(struct xio *xio, char *geom);
+void xio_close_win(struct xio_win *xw, int dpy_too);
+void xio_close_dpy(struct xio *xio);
+void xio_set_handler(struct xio_win *xw, void *handler, void *data);
+void xio_clear_win(struct xio_win *xw);
+void xio_put_line(struct xio_win *xw, int line, u8 *data);
+void xio_put_str(struct xio_win *xw, int line, u8 *c_str);
+int xio_get_line(struct xio_win *xw, int line, u8 *data);
+int xio_set_concealed(struct xio_win *xw, int on);
+void xio_update_win(struct xio_win *xw);
+void xio_fd_handler(int fd, void *handler, void *data);
+void xio_cancel_selection(struct xio_win *xw);
+void xio_query_selection(struct xio_win *xw);
+void xio_set_selection(struct xio_win *xw, int x1, int y1, int x2, int y2);
+void xio_set_cursor(struct xio_win *xw, int x, int y);
+void xio_event_loop(void);
+void xio_title(struct xio_win *xw, char *title);
+#endif