# Notices for Eclipse Dash, Tools for Committers

This content is produced and maintained by the Eclipse Dash, Tools for
Committers project.

* Project home: https://projects.eclipse.org/projects/technology.dash

## Trademarks

Eclipse Dash, Tools for Committers, and Dash, Tools for Committers are
trademarks of the Eclipse Foundation.

## Copyright

All content is the property of the respective authors or their employers. For
more information regarding authorship of content, please consult the listed
source code repository logs.

## Declared Project Licenses

This program and the accompanying materials are made available under the
terms of the Eclipse Public License v. 2.0 which is available at
http://www.eclipse.org/legal/epl-2.0.

SPDX-License-Identifier: EPL-2.0

## Source Code

The project maintains the following source code repositories:

* http://git.eclipse.org/c/dash/org.eclipse.dash.dashboard.git
* http://git.eclipse.org/c/dash/org.eclipse.dash.handbook.git
* http://git.eclipse.org/c/dash/org.eclipse.dash.m4e.tools.git
* http://git.eclipse.org/c/dash/org.eclipse.dash.maven.git

## Third-party Content

This project leverages the following third party content.

ANTLR runtime (3.0)

* License: New BSD license

Apache Commons CSV (1.3)

* License: Apache License, 2.0
* Project: https://commons.apache.org/proper/commons-csv/
* Source: https://git-wip-us.apache.org/repos/asf?p=commons-csv.git

ckeditor (3.0.1)

* License: MPL 1.1, BSD
* Project: http://ckeditor.com/
* Source: http://ckeditor.com/download

commons-codec-1.3.jar (1.3)

* License: Apache License, 2.0

commons-net (3.3)

* License: Apache License, 2.0

commons-vfs2 (2.1)

* License: Apache License, 2.0

Google Gson (2.2.4)

* License: Apache License, 2.0

Google Guava (19.0)

* License: Apache License, 2.0

Services_JSON (1.31)

* License: Modified BSD 
* Project: http://pear.php.net/pepr/pepr-proposal-show.php?id=198
* Source: http://mike.teczno.com/JSON/

Yahoo YUI (2.3.1)

* License: New BSD license

YUI (2.6.0)

* License: New BSD license

## Cryptography

Content may contain encryption software. The country in which you are currently
may have restrictions on the import, possession, and use, and/or re-export to
another country, of encryption software. BEFORE using any encryption software,
please check the country's laws, regulations and policies concerning the import,
possession, or use, and re-export of encryption software, to see if this is
permitted.