AGREEMENT FOR THE SOFTWARE MODULES
PROPRIETARY TO CANON OR ITS LICENSOR


IMPORTANT


SOFTWARE LICENSE AGREEMENT

This is a legal agreement (the "Agreement") between you and Canon Inc.
("Canon") governing your use of Canon's or its licensors' software
modules listed in Appendix 1 attached hereto which are incorporated in
Canon's software program "Canon Bubble Jet Print Filter Ver.2.50 for
Linux", "Canon Inkjet Print Filter Ver.2.60 for Linux" and "IJ Printer
Driver Ver.2.70 for Linux (or later)" (the "Software").

READ CAREFULLY AND UNDERSTAND ALL OF THE RIGHTS AND RESTRICTIONS
DESCRIBED IN THIS AGREEMENT BEFORE USING THE SOFTWARE.

BY USING THE SOFTWARE AS DESCRIBED IN SECTION 1 BELOW, YOU AGREE TO BE
BOUND BY THE TERMS AND CONDITIONS OF THIS AGREEMENT.  IF YOU DO NOT
AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT, DO NOT USE THE
SOFTWARE AND PROMPTLY RETURN THE SAME TO THE PLACE WHERE YOU OBTAINED
IT.

1.	GRANT OF LICENSE
Canon grants you a personal, limited and non-exclusive license to use
("use" as used herein shall mean storing, loading, installing,
accessing, executing or displaying), have used, copy, have copied,
distribute and permit third parties to use and copy the Software solely
for use with Canon's Inkjet printer products and Inkjet MFP products.
You may modify the Software only for your own use and reverse engineer
the same for debugging such modifications.  You shall distribute the
Software to any third party under the same terms and conditions as
contained herein.

2.	RESTRICTIONS
Except as expressly granted or permitted herein, you shall not use,
assign, sublicense, sell, rent, lease, loan, convey or transfer to any
third party the Software.

3.	COPYRIGHT NOTICE
You shall not modify, remove or delete any copyright notice of Canon or
its licensors contained in the Software, including any copy thereof.

4.	OWNERSHIP
Canon and its licensors retain in all respects the title, ownership and
intellectual property rights in and to the Software.  Except as
expressly provided herein, no license or right, express or implied, is
hereby conveyed or granted by Canon to you for any intellectual
property of Canon and its licensors.

5.	EXPORT RESTRICTION
You agree to comply with all export laws and restrictions and
regulations of the country involved, and not to export or re-export,
directly or indirectly, the Software in violation of any such laws,
restrictions and regulations, or without all necessary approvals.

6.	NO WARRANTY AND DISCLAIMER OF INDEMNITY
THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
EXPRESS 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, FUNCTION AND PERFORMANCE OF THE
SOFTWARE IS WITH YOU.  SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME
THE ENTIRE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL
EITHER CANON, CANON'S SUBSIDIARIES OR AFFILIATES, THEIR DISTRIBUTORS,
DEALERS OR CANON'S LICENSORS BE LIABLE FOR ANY DAMAGES WHATSOEVER
(INCLUDING WITHOUT LIMITATION, LOSS OF BUSINESS PROFITS, LOSS OF
BUSINESS INFORMATION, BUSINESS INTERRUPTION OR OTHER COMPENSATORY,
INCIDENTAL OR CONSEQUENTIAL DAMAGES) ARISING OUT OF THE SOFTWARE, USE
THEREOF OR INABILITY TO USE THE SOFTWARE EVEN IF EITHER CANON, CANON'S
SUBSIDIARIES OR AFFILIATES, THEIR DISTRIBUTORS, DEALERS OR CANON'S
LICENSORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, YOU HEREBY RELEASE
CANON, CANON'S SUBSIDIARIES AND AFFILIATES, THEIR DISTRIBUTORS, DEALERS
AND CANON'S LICENSORS FROM ANY AND ALL LIABILITY ARISING FROM OR
RELATED TO ALL CLAIMS CONCERNING THE SOFTWARE OR ITS USE.

7.	TERM
This Agreement is effective upon your acceptance hereof by using the
Software and remains in effect until terminated.  You may terminate
this Agreement by destroying the Software.

Canon may terminate this Agreement if you fail to comply with any terms
hereof.  Upon such termination of this Agreement, in addition to Canon
enforcing its respective legal rights, you must then promptly destroy
the Software.

Notwithstanding the foregoing, Sections 4, and 6 through 10 shall
survive any termination of this Agreement.

8.	U.S. GOVERNMENT RESTRICTED RIGHTS NOTICE
The Software is "commercial items," as that term is defined at 48
C.F.R. 2.101 (October 1995), consisting of "commercial computer
software" as such terms are used in 48 C.F.R. 12.212 (September 1995).
Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through
227.7202-4 (June 1995), all U.S. Government End Users shall acquire the
Software with only those rights set forth herein.  Manufacturer is
Canon Inc./30-2, Shimomaruko 3-chome, Ohta-ku, Tokyo 146-8501, Japan.

9.	SEVERABILITY
In the event that any section hereof is declared or found to be illegal
by any court or tribunal of competent jurisdiction, such section shall
be null and void with respect to the jurisdiction of that court or
tribunal and all the remaining provisions hereof shall remain in full
force and effect.

10.	ACKNOWLEDGEMENT
YOU AGREE THAT THIS AGREEMENT IS THE COMPLETE AND EXCLUSIVE STATEMENT
OF AGREEMENT BETWEEN YOU AND CANON CONCERNING THE SUBJECT MATTER HEREOF
AND SUPERSEDES ALL PROPOSALS OR PRIOR AGREEMENTS, VERBAL OR WRITTEN,
AND ANY OTHER COMMUNICATIONS BETWEEN YOU AND CANON RELATING TO THE
SUBJECT MATTER HEREOF.



NOTICE FOR THE SOFTWARE MODULES TO BE PROVIDED TO YOU
UNDER THE GNU GENERAL PUBLIC LICENSE AND A SPECIAL EXEMPTION


IMPORTANT


Canon's software program "Canon Bubble Jet Print Filter Ver.2.50 for
Linux", "Canon Inkjet Print Filter Ver.2.60 for Linux" and "IJ Printer
Driver Ver. 2.70 for Linux (or later)" contain the software modules
listed in Appendix 2 and Appendix 3 attached hereto.

Such software modules are free software and you can redistribute them
and/or modify them under the terms of GNU General Public License
Version 2 published by the Free Software Foundation ("GPL").

Such modules are distributed in the hope that they will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  You can find full
text of the GPL later within this notice and see it for more details.

In addition, as a special exception, Canon gives permission that if you
link the modules listed in Appendix 3 attached hereto with other files
to produce an executable, this does not by itself cause the resulting
executable to be covered by the GPL.  Your use of that executable is in
no way restricted on account of linking the modules listed in Appendix
3 attached hereto into it.

This exception does not however invalidate any other reasons why the
executable file might be covered by the GPL.  This exception applies
only to the modules listed in Appendix 3 attached hereto.

If you copy the modules listed in Appendix 2 attached hereto or code
provided under the GPL into a copy of the modules listed in Appendix 3
attached hereto, as the GPL permits, this exception does not apply to
the code that you add in this way.  To avoid misleading anyone as to
the status of such modified files, you must delete this exception
notice from them, and then you must not link such modified files with
the modules listed in Appendix 1 attached hereto to produce an
executable.

If you write modifications of you own for the modules listed in
Appendix 3 attached hereto, it is your choice whether to permit this
exception to apply to your modifications.  If you do not wish that,
delete this exception notice, and then you must not link such
modifications with the modules listed in Appendix 1 attached hereto to
produce an executable.




GNU GENERAL PUBLIC LICENSE
Version 2, June 1991

Copyright (C) 1989, 1991 Free Software Foundation, Inc.  59 Temple
Place, Suite 330, Boston, MA  02111-1307, 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.

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

How to Apply These Terms to Your New Programs

If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these
terms.

To do so, attach the following notices to the program. It is safest to
attach them to the start of each source file to most effectively convey
the exclusion of warranty; and each file should have at least the
"copyright" line and a pointer to where the full notice is found.

one line to give the program's name and an idea of what it does.
Copyright (C) yyyy  name of author

This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.

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.

You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
59 Temple Place, Suite 330, Boston, MA  02111-1307, USA.

Also add information on how to contact you by electronic and paper
mail.

If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:

Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show
w'.  This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the
appropriate parts of the General Public License. Of course, the
commands you use may be called something other than `show w' and `show
c'; they could even be mouse-clicks or menu items--whatever suits your
program.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:

Yoyodyne, Inc., hereby disclaims all copyright
interest in the program `Gnomovision' (which makes passes at compilers)
written by James Hacker.

signature of Ty Coon, 1 April 1989
Ty Coon, President of Vice

This General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications
with the library. If this is what you want to do, use the GNU Library
General Public License instead of this License.




Appendix


Appendix 1


(the modules incorporated in "Canon Bubble Jet Print Filter Ver.2.50
for Linux")

libcnbpcmcm*.so.?.?.?
libcnbpcnclapi*.so. ?.?.?
libcnbpcnclbjcmd*.so.?.?.?
libcnbpcnclui*.so.?.?.?
libcnbpess*.so.?.?.?
libcnbpo*.so.?.?.?
bjfilter*.conf
cnb_*0.tbl
cnbpname*.tbl
nozl_*.utl
regi_*.utl
*.xpm
printui.res
*_ps
*_raw


(the modules incorporated in "Canon Inkjet Print Filter Ver.2.60 for
Linux" and "IJ Printer Driver Ver.2.70 for Linux (or later)")

libcnbpcmcm*.so.?.?.?
libcnbpcnclapi*.so. ?.?.?
libcnbpcnclbjcmd*.so.?.?.?
libcnbpcnclui*.so.?.?.?
libcnbpess*.so.?.?.?
libcnbpo*.so.?.?.?
libcnnet*.so.?.?.?
cnnet.ini
cif*.conf
cnb_*0.tbl
cnbpname*.tbl
nozl_*.utl
regi_*.utl
cif_*.bscc
*.xpm
printui.res
*_ps
*_raw
cnij_entry_*series
cnij_entry
cnb_*.res
81-canonij_prn.rules
maintenance.res
autoalign.utl
cleaning.utl
nozzlecheck.utl
cnijlgmon2.res


Appendix 2


(the modules incorporated in "Canon Bubble Jet Print Filter Ver.2.50
for Linux")

bjcups
pstocanonbj
canon_usb
canon_parallel
bjcupsmon
lgmon*
printui*.mo
bjcupsmon.mo
printui.glade
*.ppd
locale-table
stsmon*
bjcmd*
stsmon*.mo


(the modules incorporated in "Canon Inkjet Print Filter Ver.2.60 for
Linux" and "IJ Printer Driver Ver.2.70 for Linux (or later)")

cngpij
pstocanonij
cnij_usb
cnijusb
cnijnet
cnij_parallel
cngpijmon*
lgmon*(Ver.2.60-Ver.3.1*)
printui*.mo
cngpijmon*.mo
printui.glade
*.ppd
locale-table
stsmon*
ijcmd*
stsmon*.mo
cnijfilter-*-pkgconfig.sh
cnijfilter2-*-pkgconfig.sh
printer_*.lc
cngpijmnt
maintenance*.mo
maintenance.glade
cnijbe*
cmdtocanonij
cnijlgmon2.mo
cnijlgmon3.mo
rastertocanonij
tocnpwg


Appendix 3


(the modules incorporated in "Canon Bubble Jet Print Filter Ver.2.50
for Linux")

printui*
bjfilter*


(the modules incorporated in "Canon Inkjet Print Filter Ver.2.60 for
Linux" and "IJ Printer Driver Ver.2.70 for Linux (or later)")

printui*
cif*
cnijnetprn
cnijnpr
lgmon*(Ver.3.20-)
maintenance*
cnijlgmon2
cnijlgmon3
cmdtocanonij2
tocanonij
