ERLANG PUBLIC LICENSE
Version 1.1

1. Definitions.

1.1. ``Contributor'' means each entity that creates or contributes to
the creation of Modifications.

1.2. ``Contributor Version'' means the combination of the Original
Code, prior Modifications used by a Contributor, and the Modifications
made by that particular Contributor.

1.3. ``Covered Code'' means the Original Code or Modifications or the
combination of the Original Code and Modifications, in each case
including portions thereof.

1.4. ``Electronic Distribution Mechanism'' means a mechanism generally
accepted in the software development community for the electronic
transfer of data.

1.5. ``Executable'' means Covered Code in any form other than Source
Code.

1.6. ``Initial Developer'' means the individual or entity identified
as the Initial Developer in the Source Code notice required by Exhibit
A.

1.7. ``Larger Work'' means a work which combines Covered Code or
portions thereof with code not governed by the terms of this License.

1.8. ``License'' means this document.

1.9. ``Modifications'' means any addition to or deletion from the
substance or structure of either the Original Code or any previous
Modifications. When Covered Code is released as a series of files, a
Modification is:

A. Any addition to or deletion from the contents of a file containing
   Original Code or previous Modifications.

B. Any new file that contains any part of the Original Code or
   previous Modifications.

1.10. ``Original Code'' means Source Code of computer software code
which is described in the Source Code notice required by Exhibit A as
Original Code, and which, at the time of its release under this
License is not already Covered Code governed by this License.

1.11. ``Source Code'' means the preferred form of the Covered Code for
making modifications to it, including all modules it contains, plus
any associated interface definition files, scripts used to control
compilation and installation of an Executable, or a list of source
code differential comparisons against either the Original Code or
another well known, available Covered Code of the Contributor's
choice. The Source Code can be in a compressed or archival form,
provided the appropriate decompression or de-archiving software is
widely available for no charge.

1.12. ``You'' means an individual or a legal entity exercising rights
under, and complying with all of the terms of, this License. For legal
entities,``You'' includes any entity which controls, is controlled by,
or is under common control with You. For purposes of this definition,
``control'' means (a) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (b) ownership of fifty percent (50%) or more of the
outstanding shares or beneficial ownership of such entity.

2. Source Code License.

2.1. The Initial Developer Grant.
The Initial Developer hereby grants You a world-wide, royalty-free,
non-exclusive license, subject to third party intellectual property
claims:

(a) to use, reproduce, modify, display, perform, sublicense and
    distribute the Original Code (or portions thereof) with or without
    Modifications, or as part of a Larger Work; and

(b) under patents now or hereafter owned or controlled by Initial
    Developer, to make, have made, use and sell (``Utilize'') the
    Original Code (or portions thereof), but solely to the extent that
    any such patent is reasonably necessary to enable You to Utilize
    the Original Code (or portions thereof) and not to any greater
    extent that may be necessary to Utilize further Modifications or
    combinations.

2.2. Contributor Grant.
Each Contributor hereby grants You a world-wide, royalty-free,
non-exclusive license, subject to third party intellectual property
claims:

(a) to use, reproduce, modify, display, perform, sublicense and
    distribute the Modifications created by such Contributor (or
    portions thereof) either on an unmodified basis, with other
    Modifications, as Covered Code or as part of a Larger Work; and

(b) under patents now or hereafter owned or controlled by Contributor,
    to Utilize the Contributor Version (or portions thereof), but
    solely to the extent that any such patent is reasonably necessary
    to enable You to Utilize the Contributor Version (or portions
    thereof), and not to any greater extent that may be necessary to
    Utilize further Modifications or combinations.

3. Distribution Obligations.

3.1. Application of License.
The Modifications which You contribute are governed by the terms of
this License, including without limitation Section 2.2. The Source
Code version of Covered Code may be distributed only under the terms
of this License, and You must include a copy of this License with
every copy of the Source Code You distribute. You may not offer or
impose any terms on any Source Code version that alters or restricts
the applicable version of this License or the recipients' rights
hereunder. However, You may include an additional document offering
the additional rights described in Section 3.5.

3.2. Availability of Source Code.
Any Modification which You contribute must be made available in Source
Code form under the terms of this License either on the same media as
an Executable version or via an accepted Electronic Distribution
Mechanism to anyone to whom you made an Executable version available;
and if made available via Electronic Distribution Mechanism, must
remain available for at least twelve (12) months after the date it
initially became available, or at least six (6) months after a
subsequent version of that particular Modification has been made
available to such recipients. You are responsible for ensuring that
the Source Code version remains available even if the Electronic
Distribution Mechanism is maintained by a third party.

3.3. Description of Modifications.
You must cause all Covered Code to which you contribute to contain a
file documenting the changes You made to create that Covered Code and
the date of any change. You must include a prominent statement that
the Modification is derived, directly or indirectly, from Original
Code provided by the Initial Developer and including the name of the
Initial Developer in (a) the Source Code, and (b) in any notice in an
Executable version or related documentation in which You describe the
origin or ownership of the Covered Code.

3.4. Intellectual Property Matters

(a) Third Party Claims.
    If You have knowledge that a party claims an intellectual property
    right in particular functionality or code (or its utilization
    under this License), you must include a text file with the source
    code distribution titled ``LEGAL'' which describes the claim and
    the party making the claim in sufficient detail that a recipient
    will know whom to contact. If you obtain such knowledge after You
    make Your Modification available as described in Section 3.2, You
    shall promptly modify the LEGAL file in all copies You make
    available thereafter and shall take other steps (such as notifying
    appropriate mailing lists or newsgroups) reasonably calculated to
    inform those who received the Covered Code that new knowledge has
    been obtained.

(b) Contributor APIs.
    If Your Modification is an application programming interface and
    You own or control patents which are reasonably necessary to
    implement that API, you must also include this information in the
    LEGAL file.

3.5. Required Notices.
You must duplicate the notice in Exhibit A in each file of the Source
Code, and this License in any documentation for the Source Code, where
You describe recipients' rights relating to Covered Code. If You
created one or more Modification(s), You may add your name as a
Contributor to the notice described in Exhibit A. If it is not
possible to put such notice in a particular Source Code file due to
its structure, then you must include such notice in a location (such
as a relevant directory file) where a user would be likely to look for
such a notice. You may choose to offer, and to charge a fee for,
warranty, support, indemnity or liability obligations to one or more
recipients of Covered Code. However, You may do so only on Your own
behalf, and not on behalf of the Initial Developer or any
Contributor. You must make it absolutely clear than any such warranty,
support, indemnity or liability obligation is offered by You alone,
and You hereby agree to indemnify the Initial Developer and every
Contributor for any liability incurred by the Initial Developer or
such Contributor as a result of warranty, support, indemnity or
liability terms You offer.

3.6. Distribution of Executable Versions.
You may distribute Covered Code in Executable form only if the
requirements of Section 3.1-3.5 have been met for that Covered Code,
and if You include a notice stating that the Source Code version of
the Covered Code is available under the terms of this License,
including a description of how and where You have fulfilled the
obligations of Section 3.2. The notice must be conspicuously included
in any notice in an Executable version, related documentation or
collateral in which You describe recipients' rights relating to the
Covered Code. You may distribute the Executable version of Covered
Code under a license of Your choice, which may contain terms different
from this License, provided that You are in compliance with the terms
of this License and that the license for the Executable version does
not attempt to limit or alter the recipient's rights in the Source
Code version from the rights set forth in this License. If You
distribute the Executable version under a different license You must
make it absolutely clear that any terms which differ from this License
are offered by You alone, not by the Initial Developer or any
Contributor. You hereby agree to indemnify the Initial Developer and
every Contributor for any liability incurred by the Initial Developer
or such Contributor as a result of any such terms You offer.

3.7. Larger Works.
You may create a Larger Work by combining Covered Code with other code
not governed by the terms of this License and distribute the Larger
Work as a single product. In such a case, You must make sure the
requirements of this License are fulfilled for the Covered Code.

4. Inability to Comply Due to Statute or Regulation.
If it is impossible for You to comply with any of the terms of this
License with respect to some or all of the Covered Code due to statute
or regulation then You must: (a) comply with the terms of this License
to the maximum extent possible; and (b) describe the limitations and
the code they affect. Such description must be included in the LEGAL
file described in Section 3.4 and must be included with all
distributions of the Source Code. Except to the extent prohibited by
statute or regulation, such description must be sufficiently detailed
for a recipient of ordinary skill to be able to understand it.

5. Application of this License.

This License applies to code to which the Initial Developer has
attached the notice in Exhibit A, and to related Covered Code.

6. CONNECTION TO MOZILLA PUBLIC LICENSE

This Erlang License is a derivative work of the Mozilla Public
License, Version 1.0. It contains terms which differ from the Mozilla
Public License, Version 1.0.

7. DISCLAIMER OF WARRANTY.

COVERED CODE IS PROVIDED UNDER THIS LICENSE ON AN ``AS IS'' BASIS,
WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
WITHOUT LIMITATION, WARRANTIES THAT THE COVERED CODE IS FREE OF
DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR
NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF
THE COVERED CODE IS WITH YOU. SHOULD ANY COVERED CODE PROVE DEFECTIVE
IN ANY RESPECT, YOU (NOT THE INITIAL DEVELOPER OR ANY OTHER
CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR
CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART
OF THIS LICENSE. NO USE OF ANY COVERED CODE IS AUTHORIZED HEREUNDER
EXCEPT UNDER THIS DISCLAIMER.

8. TERMINATION.
This License and the rights granted hereunder will terminate
automatically if You fail to comply with terms herein and fail to cure
such breach within 30 days of becoming aware of the breach. All
sublicenses to the Covered Code which are properly granted shall
survive any termination of this License. Provisions which, by their
nature, must remain in effect beyond the termination of this License
shall survive.

9. DISCLAIMER OF LIABILITY
Any utilization of Covered Code shall not cause the Initial Developer
or any Contributor to be liable for any damages (neither direct nor
indirect).

10. MISCELLANEOUS
This License represents the complete agreement concerning the subject
matter hereof. If any provision is held to be unenforceable, such
provision shall be reformed only to the extent necessary to make it
enforceable. This License shall be construed by and in accordance with
the substantive laws of Sweden. Any dispute, controversy or claim
arising out of or relating to this License, or the breach, termination
or invalidity thereof, shall be subject to the exclusive jurisdiction
of Swedish courts, with the Stockholm City Court as the first
instance.

EXHIBIT A.

``The contents of this file are subject to the Erlang Public License,
Version 1.1, (the "License"); you may not use this file except in
compliance with the License. You should have received a copy of the
Erlang Public License along with this software. If not, it can be
retrieved via the world wide web at http://www.erlang.org/.

Software distributed under the License is distributed on an "AS IS"
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
the License for the specific language governing rights and limitations
under the License.

The Initial Developer of the Original Code is Ericsson Utvecklings AB.
Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
AB. All Rights Reserved.''
