LICENSE AGREEMENT FOR VOLANOMARK(TM)

Please read the following Agreement carefully.

This product includes software developed by the Apache Software
Foundation (http://www.apache.org/). Copyright (c) 1999-2001 The Apache
Software Foundation. All rights reserved. See the following files for
the corresponding Apache Software Licenses:

  license-tomcat.txt - the Apache Tomcat license
  license-xerces.txt - the Apache Xerces license

Installation of VolanoMark Server Software Program (hereinafter
"Product") is contingent on your (hereinafter "Recipient") agreement to
the following terms:

1. GRANT OF LICENSE.

(a) Volano grants to Recipient a limited, non-exclusive, nontransferable
license to use copies of the executable code of the VolanoMark Server
software on computers residing on Recipient's premises.

(b) Recipient shall not rent, lease, sell, sublicense, assign, or
otherwise transfer Product, including any accompanying documentation or
printed materials. Recipient may not reverse engineer, decompile or
disassemble the Product. Volano and its suppliers shall retain title and
all ownership rights to the Product.

2. PRODUCT MAINTENANCE.

Volano is not obligated to provide maintenance or updates to Recipient
for the Product. However, any maintenance or updates provided by Volano
shall be covered by this Agreement.

3. DISCLAIMER OF WARRANTY.

THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTIES AS TO
PERFORMANCE OR MERCHANTABILITY.

THIS PROGRAM IS PROVIDED WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES
WHATSOEVER. BECAUSE OF THE DIVERSITY OF CONDITIONS AND HARDWARE UNDER
WHICH THIS PROGRAM MAY BE USED, NO WARRANTY OF FITNESS FOR A PARTICULAR
PURPOSE IS OFFERED. THE USER IS ADVISED TO TEST THE PROGRAM THOROUGHLY
BEFORE RELYING ON IT. THE USER MUST ASSUME THE ENTIRE RISK OF USING THE
PROGRAM. ANY LIABILITY OF SELLER OR MANUFACTURER WILL BE LIMITED
EXCLUSIVELY TO PRODUCT REPLACEMENT.

4. GOVERNING LAW; ATTORNEYS FEES.

This Agreement shall be governed by the laws of the State of California
and Recipient further consents to jurisdiction by the state and federal
courts sitting in the State of California. If either Volano or Recipient
employs attorneys to enforce any rights arising out of or relating to
this Agreement, the prevailing party shall be entitled to recover
reasonable attorneys' fees.

5. ENTIRE AGREEMENT.

This Agreement constitutes the complete and exclusive agreement between
Volano and Recipient with respect to the subject matter hereof, and
supersedes all prior oral or written understandings, communications or
agreements not specifically incorporated herein. This Agreement may not
be modified except in a writing duly signed by an authorized
representative of Volano and Recipient.
