     END USER LICENSE AGREEMENT

     The following agreement regarding RAR (and its Windows version - WinRAR)
     archiver - referred to as "software" - is made between win.rar GmbH -
     referred to as "licensor" - and anyone who is installing, accessing
     or in any other way using the software - referred to as "user".

  1. The author and holder of the copyright of the software is
     Alexander L. Roshal. The licensor and as such issuer of the license
     and bearer of the worldwide exclusive usage rights including the rights
     to reproduce, distribute and make the software available to the public
     in any form is win.rar GmbH, Marienstr. 12, 10117 Berlin, Germany.

  2. The software is distributed as try before you buy. This means that
     anyone may use the software during a test period of a maximum of 40 days
     at no charge. Following this test period, the user must purchase
     a license to continue using the software.

  3. The software's trial version may be freely distributed, with exceptions
     noted below, provided the distribution package is not modified in any way.

     a. Nobody may distribute separate parts of the package, with the exception
        of the UnRAR components, without written permission.

     b. The software's unlicensed trial version may not be distributed
        inside of any other software package without written permission.
        The software must remain in the original unmodified installation
        file for download without any barrier and conditions to the user
        such as collecting fees for the download or making the download
        conditional on the user giving his contact data.

     c. The unmodified installation file of WinRAR must be provided pure
        and unpaired. Any bundling is interdicted. In particular the use
        of any install or download software which is providing any kind
        of download bundles is prohibited unless granted by win.rar GmbH
        in written form.

     d. Hacks/cracks, keys or key generators may not be included, pointed to
        or referred to by the distributor of the trial version.

     e. In case of violation of the precedent conditions the allowance
        lapses immediately and automatically.

  4. The trial version of the software can display a registration reminder
     dialog. Depending on the software version and configuration such dialog
     can contain either a predefined text and links loaded locally
     or a web page loaded from the internet. Such web page can contain
     licensing instructions or other materials according to the licensor's
     choice, including advertisement. When opening a web page, the software
     transfers only those parameters which are technically required
     by HTTP protocol to successfully open a web page in a browser.

  5. The software is distributed "as is". No warranty of any kind is expressed
     or implied. You use at your own risk. Neither the author, the licensor
     nor the agents of the licensor will be liable for data loss, damages,
     loss of profits or any other kind of loss while using or misusing
     this software.

  6. There are 2 basic types of licenses issued for the software. These are:

     a. A single computer usage license. The user purchases one license to
        use the software on one computer.

        Home users may use their single computer usage license on all
        computers and mobile devices (USB drive, external hard drive, etc.)
        which are property of the license owner.

        Business users require one license per computer or mobile device
        on which the software is installed.

     b. A multiple usage license. The user purchases a number of usage
        licenses for use, by the purchaser or the purchaser's employees
        on the same number of computers.

        In a network (server/client) environment the user must purchase
        a license copy for each separate client (workstation) on which
        the software is installed, used or accessed. A separate license copy
        for each client (workstation) is needed regardless of whether
        the clients (workstations) will use the software simultaneously
        or at different times. If for example you wish to have 9 different
        clients (workstations) in your network with access to RAR,
        you must purchase 9 license copies.

     A user who purchased a license, is granted a non-exclusive right to use
     the software on as many computers as defined by the licensing terms above
     according to the number of licenses purchased, for any legal purpose.

  7. There are no additional license fees, apart from the cost of the license,
     associated with the creation and distribution of RAR archives,
     volumes, self-extracting archives or self-extracting volumes.
     Owners of a license may use their copies of the software to produce
     archives and self-extracting archives and to distribute those archives
     free of any additional royalties.

  8. The licensed software may not be rented or leased but may be permanently
     transferred, in its entirety, if the recipient agrees to the terms of
     this license.

  9. To buy a license, please read the file order.htm provided with
     the software for details.

 10. You may not use, copy, emulate, clone, rent, lease, sell, modify,
     decompile, disassemble, otherwise reverse engineer, or transfer
     the licensed software, or any subset of the licensed software,
     except as provided for in this agreement. Any such unauthorized use
     shall result in immediate and automatic termination of this license
     and may result in criminal and/or civil prosecution.

     Neither RAR binary code, WinRAR binary code, UnRAR source
     or UnRAR binary code may be used or reverse engineered to re-create
     the RAR compression algorithm, which is proprietary, without written
     permission.

     The software may be using components developed and/or copyrighted
     by third parties. Please read "Acknowledgments" help file topic
     for WinRAR or acknow.txt text file for other RAR versions for details.

 11. This License Agreement is construed solely and exclusively under
     German law. If you are a merchant, the courts at the registered office
     of win.rar GmbH in Berlin/Germany shall have exclusive jurisdiction
     for any and all disputes arising in connection with this License
     Agreement or its validity.

 12. Installing and using the software signifies acceptance of these terms
     and conditions of the license. If you do not agree with the terms of this
     license, you must remove all software files from your storage devices
     and cease to use the software.
