Apache NiFi Registry
Copyright 2014-2018 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

This includes derived works from the Apache NiFi (ASLv2 licensed) project (https://git-wip-us.apache.org/repos/asf?p=nifi.git):
  Copyright 2015-2017 The Apache Software Foundation
  This includes sources for bootstrapping, runtime, component API, security/authorization API
===========================================
Apache Software License v2
===========================================

The following binary components are provided under the Apache Software License v2

  (ASLv2) Jetty
    The following NOTICE information applies:
       Jetty Web Container
       Copyright 1995-2017 Mort Bay Consulting Pty Ltd.

  (ASLv2) Apache Commons Codec
    The following NOTICE information applies:
      Apache Commons Codec
      Copyright 2002-2014 The Apache Software Foundation

      src/test/org/apache/commons/codec/language/DoubleMetaphoneTest.java
      contains test data from http://aspell.net/test/orig/batch0.tab.
      Copyright (C) 2002 Kevin Atkinson (kevina@gnu.org)

      ===============================================================================

      The content of package org.apache.commons.codec.language.bm has been translated
      from the original php source code available at http://stevemorse.org/phoneticinfo.htm
      with permission from the original authors.
      Original source copyright:
      Copyright (c) 2008 Alexander Beider & Stephen P. Morse.

  (ASLv2) Apache Commons Lang
    The following NOTICE information applies:
      Apache Commons Lang
      Copyright 2001-2017 The Apache Software Foundation

      This product includes software from the Spring Framework,
      under the Apache License 2.0 (see: StringUtils.containsWhitespace())

  (ASLv2) Jackson JSON processor
    The following NOTICE information applies:
      # Jackson JSON processor

      Jackson is a high-performance, Free/Open Source JSON processing library.
      It was originally written by Tatu Saloranta (tatu.saloranta@iki.fi), and has
      been in development since 2007.
      It is currently developed by a community of developers, as well as supported
      commercially by FasterXML.com.

      ## Licensing

      Jackson core and extension components may licensed under different licenses.
      To find the details that apply to this artifact see the accompanying LICENSE file.
      For more information, including possible other licensing options, contact
      FasterXML.com (http://fasterxml.com).

      ## Credits

      A list of contributors may be found from CREDITS file, which is included
      in some artifacts (usually source distributions); but is always available
      from the source code management (SCM) system project uses.

  (ASLv2) Java Native Access Platform
    The following NOTICE information applies:
      Java Native Access Platform
      Copyright 2013 Timothy Wall, Matthias Bläsing

      This product includes software developed by
      The Apache Software Foundation (http://www.apache.org/).

      ===============================================================================

      The BracketFinder (package org.apache.commons.math3.optimization.univariate)
      and PowellOptimizer (package org.apache.commons.math3.optimization.general)
      classes are based on the Python code in module "optimize.py" (version 0.5)
      developed by Travis E. Oliphant for the SciPy library (http://www.scipy.org/)
      Copyright © 2003-2009 SciPy Developers.
      ===============================================================================

      The LinearConstraint, LinearObjectiveFunction, LinearOptimizer,
      RelationShip, SimplexSolver and SimplexTableau classes in package
      org.apache.commons.math3.optimization.linear include software developed by
      Benjamin McCann (http://www.benmccann.com) and distributed with
      the following copyright: Copyright 2009 Google Inc.
      ===============================================================================

      This product includes software developed by the
      University of Chicago, as Operator of Argonne National
      Laboratory.
      The LevenbergMarquardtOptimizer class in package
      org.apache.commons.math3.optimization.general includes software
      translated from the lmder, lmpar and qrsolv Fortran routines
      from the Minpack package
      Minpack Copyright Notice (1999) University of Chicago.  All rights reserved
      ===============================================================================

      The GraggBulirschStoerIntegrator class in package
      org.apache.commons.math3.ode.nonstiff includes software translated
      from the odex Fortran routine developed by E. Hairer and G. Wanner.
      Original source copyright:
      Copyright (c) 2004, Ernst Hairer
      ===============================================================================

      The EigenDecompositionImpl class in package
      org.apache.commons.math3.linear includes software translated
      from some LAPACK Fortran routines.  Original source copyright:
      Copyright (c) 1992-2008 The University of Tennessee.  All rights reserved.
      ===============================================================================

      The MersenneTwister class in package org.apache.commons.math3.random
      includes software translated from the 2002-01-26 version of
      the Mersenne-Twister generator written in C by Makoto Matsumoto and Takuji
      Nishimura. Original source copyright:
      Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
      All rights reserved
      ===============================================================================

      The LocalizedFormatsTest class in the unit tests is an adapted version of
      the OrekitMessagesTest class from the orekit library distributed under the
      terms of the Apache 2 licence. Original source copyright:
      Copyright 2010 CS Systèmes d'Information
      ===============================================================================

      The HermiteInterpolator class and its corresponding test have been imported from
      the orekit library distributed under the terms of the Apache 2 licence. Original
      source copyright:
      Copyright 2010-2012 CS Systèmes d'Information
      ===============================================================================

      The creation of the package "o.a.c.m.analysis.integration.gauss" was inspired
      by an original code donated by Sébastien Brisard.
      ===============================================================================

  (ASLv2) JSON-SMART
    The following NOTICE information applies:
      Copyright 2011 JSON-SMART authors

   (ASLv2) JsonPath
     The following NOTICE information applies:
       Copyright 2011 JsonPath authors

  (ASLv2) Classmate
    The following NOTICE information applies
        Java ClassMate library was originally written by Tatu Saloranta (tatu.saloranta@iki.fi)

        Other developers who have contributed code are:

        * Brian Langel

  (ASLv2) Apache Commons IO
    The following NOTICE information applies:
      Apache Commons IO
      Copyright 2002-2016 The Apache Software Foundation

  (ASLv2) Apache log4j
    The following NOTICE information applies:
      Apache log4j
      Copyright 2010 The Apache Software Foundation

  (ASLv2) Spring Framework
    The following NOTICE information applies:
      Spring Framework 5.0.2.RELEASE
      Copyright (c) 2002-2017 Pivotal, Inc.

  (ASLv2) Spring Security
    The following NOTICE information applies:
      Spring Framework 5.0.5.RELEASE
      Copyright (c) 2002-2017 Pivotal, Inc.

      This product includes software developed by Spring Security
      Project (http://www.springframework.org/security).

  (ASLv2) Spring LDAP
    The following NOTICE information applies:
      Spring LDAP 2.3.2.RELEASE
      Copyright (c) 2002-2017 Pivotal, Inc.

      This product includes software developed by the Spring LDAP
      Project (http://www.springframework.org/ldap).

  (ASLv2) Apache Tomcat Embed EL
    The following NOTICE information applies:
        Apache Tomcat
        Copyright 1999-2017 The Apache Software Foundation

        This product includes software developed at
        The Apache Software Foundation (http://www.apache.org/).

        This software contains code derived from netty-native
        developed by the Netty project
        (http://netty.io, https://github.com/netty/netty-tcnative/)
        and from finagle-native developed at Twitter
        (https://github.com/twitter/finagle).

        The Windows Installer is built with the Nullsoft
        Scriptable Install System (NSIS), which is
        open source software.  The original software and
        related information is available at
        http://nsis.sourceforge.net.

        Java compilation software for JSP pages is provided by the Eclipse
        JDT Core Batch Compiler component, which is open source software.
        The original software and related information is available at
        http://www.eclipse.org/jdt/core/.

        For portions of the Tomcat JNI OpenSSL API and the OpenSSL JSSE integration
        The org.apache.tomcat.jni and the org.apache.tomcat.net.openssl packages
        are derivative work originating from the Netty project and the finagle-native
        project developed at Twitter
        * Copyright 2014 The Netty Project
        * Copyright 2014 Twitter

        The original XML Schemas for Java EE Deployment Descriptors:
         - javaee_5.xsd
         - javaee_web_services_1_2.xsd
         - javaee_web_services_client_1_2.xsd
         - javaee_6.xsd
         - javaee_web_services_1_3.xsd
         - javaee_web_services_client_1_3.xsd
         - jsp_2_2.xsd
         - web-app_3_0.xsd
         - web-common_3_0.xsd
         - web-fragment_3_0.xsd
         - javaee_7.xsd
         - javaee_web_services_1_4.xsd
         - javaee_web_services_client_1_4.xsd
         - jsp_2_3.xsd
         - web-app_3_1.xsd
         - web-common_3_1.xsd
         - web-fragment_3_1.xsd
         - javaee_8.xsd
         - web-app_4_0.xsd
         - web-common_4_0.xsd
         - web-fragment_4_0.xsd

        may be obtained from:
        http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/index.html

  (ASLv2) SnakeYAML
    The following NOTICE information applies:
      Copyright (c) 2008, http://www.snakeyaml.org

  (ASLv2) Swagger UI
    The following NOTICE information applies:
      Copyright 2017 SmartBear Software


************************
Common Development and Distribution License 1.1
************************

The following binary components are provided under the Common Development and Distribution License 1.1. See project link for details.

    (CDDL 1.1) (GPL2 w/ CPE) JavaMail API (compat) (javax.mail:mail:jar:1.4.7 - http://kenai.com/projects/javamail/mail)
    (CDDL 1.1) (GPL2 w/ CPE) Java Servlet API  (javax.servlet:javax.servlet-api:jar:3.1.0 - http://servlet-spec.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) JavaServer Pages Standard Tag Library  (javax.servlet.jsp.jstl:jstl:jar:1.2 - https://javaee.github.io/jstl-api/)
    (CDDL 1.1) (GPL2 w/ CPE) javax.annotation API (javax.annotation:javax.annotation-api:jar:1.2 - http://jcp.org/en/jsr/detail?id=250)
    (CDDL 1.1) (GPL2 w/ CPE) aopalliance-repackaged (org.glassfish.hk2.external:aopalliance-repackaged:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) asm-all-repackaged (org.glassfish.hk2.external:asm-all-repackaged:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) class-model (org.glassfish.hk2:class-model:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) config-types (org.glassfish.hk2:config-types:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2 (org.glassfish.hk2:hk2:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2-api (org.glassfish.hk2:hk2-api:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2-utils (org.glassfish.hk2:hk2-utils:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2-locator (org.glassfish.hk2:hk2-locator:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2-config (org.glassfish.hk2:hk2-config:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2-core (org.glassfish.hk2:hk2-core:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) hk2-runlevel (org.glassfish.hk2:hk2-runlevel:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) spring-bridge (org.glassfish.hk2:spring-bridge:jar:2.5.0-b42 - https://javaee.github.io/glassfish/)
    (CDDL 1.1) (GPL2 w/ CPE) javax.inject:1 as OSGi bundle (org.glassfish.hk2.external:javax.inject:jar:2.4.0-b25 - https://hk2.java.net/external/javax.inject)
    (CDDL 1.1) (GPL2 w/ CPE) javax.ws.rs-api (javax.ws.rs:javax.ws.rs-api:jar:2.1 - http://jax-rs-spec.java.net)
    (CDDL 1.1) (GPL2 w/ CPE) javax.el (org.glassfish:javax.el:jar:3.0.1-b08 - https://github.com/javaee/el-spec)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-bean-validation (org.glassfish.jersey.ext:jersey-bean-validation:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-client (org.glassfish.jersey.core:jersey-client:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-common (org.glassfish.jersey.core:jersey-common:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-container-servlet-core (org.glassfish.jersey.containers:jersey-container-servlet-core:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-entity-filtering (org.glassfish.jersey.ext:jersey-entity-filtering:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-hk2 (org.glassfish.jersey.inject:jersey-hk2:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-media-jaxb (org.glassfish.jersey.media:jersey-media-jaxb:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-media-json-jackson (org.glassfish.jersey.media:jersey-media-json-jackson:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-server (org.glassfish.jersey.core:jersey-server:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) jersey-spring4 (org.glassfish.jersey.ext:jersey-spring4:jar:2.26 - https://jersey.github.io/)
    (CDDL 1.1) (GPL2 w/ CPE) OSGi resource locator bundle (org.glassfish.hk2:osgi-resource-locator:jar:1.0.1 - http://glassfish.org/osgi-resource-locator)


************************
Common Development and Distribution License 1.0
************************

The following binary components are provided under the Common Development and Distribution License 1.0.  See project link for details.

    (CDDL 1.0) JavaBeans Activation Framework (JAF) (javax.activation:activation:jar:1.1 - http://java.sun.com/products/javabeans/jaf/index.jsp)


************************
Eclipse Public License 1.0
************************

The following binary components are provided under the Eclipse Public License 1.0.  See project link for details.

    (EPL 1.0)(MPL 2.0) H2 Database (com.h2database:h2:jar:1.3.176 - http://www.h2database.com/html/license.html)
    (EPL 1.0)(LGPL 2.1) Logback Classic (ch.qos.logback:logback-classic:jar:1.2.3 - http://logback.qos.ch/)
    (EPL 1.0)(LGPL 2.1) Logback Core (ch.qos.logback:logback-core:jar:1.2.3 - http://logback.qos.ch/)
    (EPL 1.0) AspectJ Weaver (org.aspectj:aspectjweaver:jar:1.8.13 - http://www.eclipse.org/aspectj/)
