   =========================================================================
   ==  DO NOT PANIC!  This is a draft for discussion purposes only.       ==
   ==  It has not yet been approved. It does not yet apply to any         ==
   ==  software distributed by the Apache Software Foundation.            ==
   ==                                                                     ==
   ==  This JSR version is for use by JSR-defined projects releasing      ==
   ==  code in the javax.* namespace under JSPA 2.5.                      ==
   ====================================+====================================

                               Apache JSR License
                            Version 2.0, March 2004
                        http://www.apache.org/licenses/

   AMENDMENTS

   The Apache JSR License, Version 2.0, consists of the Apache License,
   Version 2.0, with the following Amendments required by version 2.5 of
   the Java Specification Participation Agreement for the Reference
   Implementation and any Independent Implementation wishing to claim
   compliance with the Specification. Exhibit A describes how to apply
   this License to your work.

   I. Additional Definitions for Section 1.

      "Specification" shall mean the one or more current or proposed
      industry standards, developed as part of the Java Community Process,
      that are identified within the copyright notice by title, revision
      label (or date if no label has been assigned), and Uniform Resource
      Identifier.

      "Specification Lead" shall mean the individual or Legal Entity
      owning copyright on the identified Specification(s).

      "Technology Compatibility Kit" (or "TCK") shall mean the suite of
      tests, tools, and documentation made available by the Specification
      Lead that allows an implementor of a Specification to determine if
      their implementation is compliant with that Specification.

      "Restricted Name Space" shall mean public class or interface
      declarations whose names begin with "java", "javax", "com.sun",
      or any recognized successors or replacements thereof that are
      restricted as per the Java Specification Participation Agreement
      between Licensor and Sun Microsystems, Inc.

   II. Additional condition for Section 5.

      (e) Prior to distributing a Derivative Work, You must do one of the
          following:

          (1) Cause the Derivative Work to fully implement the
              Specification(s), or later revisions of the Specification(s)
              that are acknowledged by the Specification Lead as
              successors to the Specification(s), without modifying,
              subsetting, supersetting, or otherwise extending the
              Restricted Name Space or including any public or protected
              packages, classes, Java interfaces, fields, or methods
              within the Restricted Name Space other than those
              required/authorized by the Specification(s) being
              implemented, and pass the TCK for such Specification(s); or

          (2) Make no claims that the Derivative Work complies with the
              Specification(s) and remove any such claims from the
              Derivative Work that originated with the Work.

   END OF AMENDMENTS

   Exhibit A: How to apply the Apache JSR License to your work.

      To apply the Apache JSR License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!) The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache JSR License, Version 2.0 (the "License"),
   as a reference implementation of the following specifications:

     [ Widget Interface, revision 5.1
          <http://www.example.com/specs/widget/5.1/> ]

   You may not use this file except in compliance with the License.
   You may obtain a copy of the License files at

       http://www.apache.org/licenses/JSR-LICENSE-2.0
       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
