The Eternal Lands license is a slightly modified QTPL license (the QTPL license can be found here http://opensource.org/licenses/qtpl.php)

The Eternal Lands Client Public License Version 1.0
Copyright (C) 2003, Radu Privantu and Maura Privantu.
Everyone is permitted to copy and distribute this license document. 

The intent of this license is to establish freedom to share and change the software regulated by this license under the open source model.

Definitions: 
Software means the Source Code (or compiled binary) but does not include anything else.
Binary Data means the art (2d, 3d, animations, sound, music, maps, stories, etc.) and anything that is not source or compiled code. The Binary Data is propietary, and should not be used without our permission.


This license applies to any software containing a notice placed by the copyright holder saying that it may be distributed under the terms of the Eternal Lands Client Public License version 1.0. Such software is herein referred to as the Software. This license covers modification and distribution of the Software, use of third-party application programs based on the Software, and development of free software which uses the Software.

Granted Rights
1. You are granted the non-exclusive rights set forth in this license provided you agree to and comply with any and all conditions in this license. Whole or partial distribution of the Software, or software items that link with the Software, in any form signifies acceptance of this license.

2. You may copy and distribute the Software in unmodified form provided that the entire package, including - but not restricted to - copyright, trademark notices and disclaimers, as released by the initial developer of the Software, is distributed.

3. You may make modifications to the Software and distribute your modifications, in a form that is separate from the Software, such as patches. The following restrictions apply to modifications:

a. Modifications must not alter or remove any copyright notices in the Software.

b. When modifications to the Software are released under this license, a non-exclusive royalty-free right is granted to the initial developer of the Software to distribute your modification in future versions of the Software provided such versions remain available under these terms in addition to any other license(s) of the initial developer.

c. You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.

4. You may distribute machine-executable forms of the Software or machine-executable forms of modified versions of the Software, provided that you meet these restrictions:

a. You must include this license document in the distribution.

b. You must ensure that all recipients of the machine-executable forms are also able to receive the complete machine-readable source code to the distributed Software, including all modifications, without any charge beyond the costs of data transfer, and place prominent notices in the distribution explaining this.

c. You must ensure that all modifications included in the machine-executable forms are available under the terms of this license.

5. You may use the original or modified versions of the Software to compile, link and run application programs legally developed by you or by others.

6. You may develop application programs, reusable components and other software items that link with the original or modified versions of the Software. These items, when distributed, are subject to the following requirements:

a. You must ensure that all recipients of machine-executable forms of these items are also able to receive and use the complete machine-readable source code to the items without any charge beyond the costs of data transfer.

b. You must explicitly license all recipients of your items to use and re-distribute original and modified versions of the items in both machine-executable and source code forms. The recipients must be able to do so without any charges whatsoever, and they must be able to re-distribute to anyone they choose.

c. If the items are not available to the general public, and the initial developer of the Software requests a copy of the items, then you must supply one.

Restrictions:
1. You are not allowed to use the Binary Data that comes with the Official Eternal Lands Client without our prior approval.
2. You may not distribute our Binary Data in your modified versions, without our approval.
3. You may not use our Trademarks (such as Eternal Lands(TM)) in modifed versions, without our approval. You can (and must) add a notice stating that the code is a Modified Version of the the Eternal Lands Official Client.
4. You may not use modified versions to connect to the Eternal Lands server, without our approval.

Limitations of Liability
In no event shall the initial developers or copyright holders be liable for any damages whatsoever, including - but not restricted to - lost revenue or profits or other direct, indirect, special, incidental or consequential damages, even if they have been advised of the possibility of such damages, except to the extent invariable law, if any, provides otherwise.

No Warranty
The Software and this license document are provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.

Choice of Law
This license is governed by the Laws of Pennsylvania, USA.
