# Eclipse Foundation Technology Compatibility Kit License - v 1.0

Copyright (c) 2018, Eclipse Foundation, Inc. and its licensors.

Redistribution and use in binary form is permitted provided that the
following conditions are met:

1.  Use of the Technology Compatibility Kit accompanying this license
    (the "TCK") and its documentation is permitted solely for the
    purpose of testing compatibility of an implementation (the
    "Product") of a specification (the "Specification") made available
    by the Eclipse Foundation, Inc. ("Eclipse").

2.  Only those modifications expressly permitted by the TCK and its
    documentation are permitted. Except in these limited circumstances,
    no modifications to the TCK are permitted under this license.

3.  A Product will be deemed to be "compatible" with the Specification
    if it fully and completely meets and satisfies all requirements of
    the TCK.

4.  Before any claim of compatibility (or any similar claim suggesting
    compatibility) is made based on the TCK, the testing party must:

    a.  use the TCK to demonstrate that the Product fully and
	completely meets and satisfies all requirements of the TCK;

    b.  make TCK test results showing full and complete satisfaction of
	all requirements of the TCK publicly available on the testing
	party's website and send a link to such test results to Eclipse
	at [tck@eclipse.org](mailto:tck@eclipse.org); and

    c.  comply with any requirements stated in the Specification with
	regard to subsetting, supersetting, modifying or extending the
	Specification in any Product claimed to be compatible with the
	Specification.

5.  The test results must be continuously available and the link must
    be live for at least as long as the Product is available in the
    marketplace.

6.  The TCK may not be used as a basis for any statements of partial
    compatibility. The TCK may only be used as a basis for true,
    factual statements of full compatibility of Products that fully
    meet and satisfy all requirements of the TCK.

7.  A determination that a Product is compatible with the TCK does not,
    in itself, give rise to the right to use any name, mark, logo
    associated with the TCK, Eclipse, or Eclipse's contributors or
    licensors.

8.  Upon the request of Eclipse, a tester will retract any statements
    of compatibility (or any similar claim suggesting compatibility)
    which Eclipse reasonably determines to be false or misleading or in
    violation of the terms of this license.

9.  Redistribution of the TCK must be under this Eclipse Foundation
    Technology Compatibility Kit License and must reproduce the above
    copyright notice, this list of conditions and the following
    disclaimer in the documentation and/or other materials provided
    with the distribution.

10. Neither the name, trademarks or logos of Eclipse, nor the names,
    trademarks or logos of its contributors or licensors may be used to
    endorse or promote products tested with this software without
    specific prior written permission.

11. The source code for the TCK accompanying this license is available
    from Eclipse.

TO THE EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED ON
AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER
EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR
CONDITIONS OF TITLE, NON- INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR
A PARTICULAR PURPOSE. TO THE EXTENT PERMITTED BY APPLICABLE LAW,
NEITHER THE COPYRIGHT OWNER OR ANY CONTRIBUTORS SHALL HAVE ANY
LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS),
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
