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

The binary distribution of this product bundles binaries of
org.iq80.leveldb:leveldb-api (https://github.com/dain/leveldb), which has the
following notices:
* Copyright 2011 Dain Sundstrom <dain@iq80.com>
* Copyright 2011 FuseSource Corp. http://fusesource.com

The binary distribution of this product bundles binaries of
AWS SDK for Java - Bundle 1.11.563 (https://github.com/aws/aws-sdk-java),
which has the following notices:

This software includes third party software subject to the following copyrights:
- XML parsing and utility functions from JetS3t - Copyright 2006-2009 James Murty.
- PKCS#1 PEM encoded private key parsing and utility functions from oauth.googlecode.com - Copyright 1998-2010 AOL Inc.

The binary distribution of this product bundles binaries of
Gson 2.2.4,
which has the following notices:

                            The Netty Project
                            =================

Please visit the Netty web site for more information:

  * http://netty.io/

Copyright 2014 The Netty Project

The Netty Project licenses this file to you under the Apache License,
version 2.0 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at:

  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.

Also, please refer to each LICENSE.<component>.txt file, which is located in
the 'license' directory of the distribution file, for the license terms of the
components that this product depends on.

-------------------------------------------------------------------------------
This product contains the extensions to Java Collections Framework which has
been derived from the works by JSR-166 EG, Doug Lea, and Jason T. Greene:

  * LICENSE:
    * license/LICENSE.jsr166y.txt (Public Domain)
  * HOMEPAGE:
    * http://gee.cs.oswego.edu/cgi-bin/viewcvs.cgi/jsr166/
    * http://viewvc.jboss.org/cgi-bin/viewvc.cgi/jbosscache/experimental/jsr166/

This product contains a modified version of Robert Harder's Public Domain
Base64 Encoder and Decoder, which can be obtained at:

  * LICENSE:
    * license/LICENSE.base64.txt (Public Domain)
  * HOMEPAGE:
    * http://iharder.sourceforge.net/current/java/base64/

This product contains a modified portion of 'Webbit', an event based
WebSocket and HTTP server, which can be obtained at:

  * LICENSE:
    * license/LICENSE.webbit.txt (BSD License)
  * HOMEPAGE:
    * https://github.com/joewalnes/webbit

This product contains a modified portion of 'SLF4J', a simple logging
facade for Java, which can be obtained at:

  * LICENSE:
    * license/LICENSE.slf4j.txt (MIT License)
  * HOMEPAGE:
    * http://www.slf4j.org/

This product contains a modified portion of 'ArrayDeque', written by Josh
Bloch of Google, Inc:

  * LICENSE:
    * license/LICENSE.deque.txt (Public Domain)

This product contains a modified portion of 'Apache Harmony', an open source
Java SE, which can be obtained at:

  * LICENSE:
    * license/LICENSE.harmony.txt (Apache License 2.0)
  * HOMEPAGE:
    * http://archive.apache.org/dist/harmony/

This product contains a modified version of Roland Kuhn's ASL2
AbstractNodeQueue, which is based on Dmitriy Vyukov's non-intrusive MPSC queue.
It can be obtained at:

  * LICENSE:
    * license/LICENSE.abstractnodequeue.txt (Public Domain)
  * HOMEPAGE:
    * https://github.com/akka/akka/blob/wip-2.2.3-for-scala-2.11/akka-actor/src/main/java/akka/dispatch/AbstractNodeQueue.java

This product contains a modified portion of 'jbzip2', a Java bzip2 compression
and decompression library written by Matthew J. Francis. It can be obtained at:

  * LICENSE:
    * license/LICENSE.jbzip2.txt (MIT License)
  * HOMEPAGE:
    * https://code.google.com/p/jbzip2/

This product contains a modified portion of 'libdivsufsort', a C API library to construct
the suffix array and the Burrows-Wheeler transformed string for any input string of
a constant-size alphabet written by Yuta Mori. It can be obtained at:

  * LICENSE:
    * license/LICENSE.libdivsufsort.txt (MIT License)
  * HOMEPAGE:
    * https://code.google.com/p/libdivsufsort/

This product contains a modified portion of Nitsan Wakart's 'JCTools', Java Concurrency Tools for the JVM,
 which can be obtained at:

  * LICENSE:
    * license/LICENSE.jctools.txt (ASL2 License)
  * HOMEPAGE:
    * https://github.com/JCTools/JCTools

This product optionally depends on 'JZlib', a re-implementation of zlib in
pure Java, which can be obtained at:

  * LICENSE:
    * license/LICENSE.jzlib.txt (BSD style License)
  * HOMEPAGE:
    * http://www.jcraft.com/jzlib/

This product optionally depends on 'Compress-LZF', a Java library for encoding and
decoding data in LZF format, written by Tatu Saloranta. It can be obtained at:

  * LICENSE:
    * license/LICENSE.compress-lzf.txt (Apache License 2.0)
  * HOMEPAGE:
    * https://github.com/ning/compress

This product optionally depends on 'lz4', a LZ4 Java compression
and decompression library written by Adrien Grand. It can be obtained at:

  * LICENSE:
    * license/LICENSE.lz4.txt (Apache License 2.0)
  * HOMEPAGE:
    * https://github.com/jpountz/lz4-java

This product optionally depends on 'lzma-java', a LZMA Java compression
and decompression library, which can be obtained at:

  * LICENSE:
    * license/LICENSE.lzma-java.txt (Apache License 2.0)
  * HOMEPAGE:
    * https://github.com/jponge/lzma-java

This product contains a modified portion of 'jfastlz', a Java port of FastLZ compression
and decompression library written by William Kinney. It can be obtained at:

  * LICENSE:
    * license/LICENSE.jfastlz.txt (MIT License)
  * HOMEPAGE:
    * https://code.google.com/p/jfastlz/

This product contains a modified portion of and optionally depends on 'Protocol Buffers', Google's data
interchange format, which can be obtained at:

  * LICENSE:
    * license/LICENSE.protobuf.txt (New BSD License)
  * HOMEPAGE:
    * http://code.google.com/p/protobuf/

This product optionally depends on 'Bouncy Castle Crypto APIs' to generate
a temporary self-signed X.509 certificate when the JVM does not provide the
equivalent functionality.  It can be obtained at:

  * LICENSE:
    * license/LICENSE.bouncycastle.txt (MIT License)
  * HOMEPAGE:
    * http://www.bouncycastle.org/

This product optionally depends on 'Snappy', a compression library produced
by Google Inc, which can be obtained at:

  * LICENSE:
    * license/LICENSE.snappy.txt (New BSD License)
  * HOMEPAGE:
    * http://code.google.com/p/snappy/

This product contains a modified portion of UnsignedBytes LexicographicalComparator
from Guava v21 project by Google Inc, which can be obtained at:

  * LICENSE:
    * license/COPYING (Apache License 2.0)
  * HOMEPAGE:
    * https://github.com/google/guava

This product optionally depends on 'JBoss Marshalling', an alternative Java
serialization API, which can be obtained at:

  * LICENSE:
    * license/LICENSE.jboss-marshalling.txt (GNU LGPL 2.1)
  * HOMEPAGE:
    * http://www.jboss.org/jbossmarshalling

This product optionally depends on 'Caliper', Google's micro-
benchmarking framework, which can be obtained at:

  * LICENSE:
    * license/LICENSE.caliper.txt (Apache License 2.0)
  * HOMEPAGE:
    * http://code.google.com/p/caliper/

This product optionally depends on 'Apache Commons Logging', a logging
framework, which can be obtained at:

  * LICENSE:
    * license/LICENSE.commons-logging.txt (Apache License 2.0)
  * HOMEPAGE:
    * http://commons.apache.org/logging/

This product optionally depends on 'reload4j', a logging framework, which
can be obtained at:

  * LICENSE:
    * license/LICENSE.reload4j.txt (Apache License 2.0)
  * HOMEPAGE:
    * https://reload4j.qos.ch/

This product optionally depends on 'Aalto XML', an ultra-high performance
non-blocking XML processor, which can be obtained at:

  * LICENSE:
    * license/LICENSE.aalto-xml.txt (Apache License 2.0)
  * HOMEPAGE:
    * http://wiki.fasterxml.com/AaltoHome

This product contains a modified version of 'HPACK', a Java implementation of
the HTTP/2 HPACK algorithm written by Twitter. It can be obtained at:

  * LICENSE:
    * license/LICENSE.hpack.txt (Apache License 2.0)
  * HOMEPAGE:
    * https://github.com/twitter/hpack

This product contains a modified portion of 'Apache Commons Lang', a Java library
provides utilities for the java.lang API, which can be obtained at:

  * LICENSE:
    * license/LICENSE.commons-lang.txt (Apache License 2.0)
  * HOMEPAGE:
    * https://commons.apache.org/proper/commons-lang/

This product contains a modified portion of 'JDOM 1.1', which can be obtained at:

  * LICENSE:
    * https://github.com/hunterhacker/jdom/blob/jdom-1.1/core/LICENSE.txt
  * HOMEPAGE:
    * http://www.jdom.org/

The binary distribution of this product bundles binaries of
Commons Codec 1.4,
which has the following notices:
 * src/test/org/apache/commons/codec/language/DoubleMetaphoneTest.javacontains 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.

The binary distribution of this product bundles binaries of
Commons Lang 2.6,
which has the following notices:
 * This product includes software from the Spring Framework,under the Apache License 2.0 (see: StringUtils.containsWhitespace())

The binary distribution of this product bundles binaries of
reload4j 1.2.18.3,
which has the following notices:
 * ResolverUtil.java
    Copyright 2005-2006 Tim Fennell
  Dumbster SMTP test server
    Copyright 2004 Jason Paul Kitchen
  TypeUtil.java
    Copyright 2002-2012 Ramnivas Laddad, Juergen Hoeller, Chris Beams

The binary distribution of this product bundles binaries of
"Java Concurrency in Practice" book annotations 1.0,
which has the following notices:
 * Copyright (c) 2005 Brian Goetz and Tim Peierls Released under the Creative
  Commons Attribution License (http://creativecommons.org/licenses/by/2.5)
  Official home: http://www.jcip.net Any republication or derived work
  distributed in source code form must include this copyright and license
  notice.

The binary distribution of this product bundles binaries of
Jetty :: Http Utility 9.3.19.,
Jetty :: IO Utility 9.3.19.,
Jetty :: Security 9.3.19.,
Jetty :: Server Core 9.3.19.,
Jetty :: Servlet Handling 9.3.19.,
Jetty :: Utilities 9.3.19.,
Jetty :: Utilities :: Ajax,
Jetty :: Webapp Application Support 9.3.19.,
Jetty :: XML utilities 9.3.19.,
which has the following notices:
 * ==============================================================
    Jetty Web Container
    Copyright 1995-2016 Mort Bay Consulting Pty Ltd.
   ==============================================================

   The Jetty Web Container is Copyright Mort Bay Consulting Pty Ltd
   unless otherwise noted.

   Jetty is dual licensed under both

     * The Apache 2.0 License
       http://www.apache.org/licenses/LICENSE-2.0.html

         and

     * The Eclipse Public 1.0 License
       http://www.eclipse.org/legal/epl-v10.html

   Jetty may be distributed under either license.

   ------
   Eclipse

   The following artifacts are EPL.
    * org.eclipse.jetty.orbit:org.eclipse.jdt.core

   The following artifacts are EPL and ASL2.
    * org.eclipse.jetty.orbit:javax.security.auth.message


   The following artifacts are EPL and CDDL 1.0.
    * org.eclipse.jetty.orbit:javax.mail.glassfish


   ------
   Oracle

   The following artifacts are CDDL + GPLv2 with classpath exception.
   https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html

    * javax.servlet:javax.servlet-api
    * javax.annotation:javax.annotation-api
    * javax.transaction:javax.transaction-api
    * javax.websocket:javax.websocket-api

   ------
   Oracle OpenJDK

   If ALPN is used to negotiate HTTP/2 connections, then the following
   artifacts may be included in the distribution or downloaded when ALPN
   module is selected.

    * java.sun.security.ssl

   These artifacts replace/modify OpenJDK classes.  The modififications
   are hosted at github and both modified and original are under GPL v2 with
   classpath exceptions.
   http://openjdk.java.net/legal/gplv2+ce.html


   ------
   OW2

   The following artifacts are licensed by the OW2 Foundation according to the
   terms of http://asm.ow2.org/license.html

   org.ow2.asm:asm-commons
   org.ow2.asm:asm


   ------
   Apache

   The following artifacts are ASL2 licensed.

   org.apache.taglibs:taglibs-standard-spec
   org.apache.taglibs:taglibs-standard-impl


   ------
   MortBay

   The following artifacts are ASL2 licensed.  Based on selected classes from
   following Apache Tomcat jars, all ASL2 licensed.

   org.mortbay.jasper:apache-jsp
     org.apache.tomcat:tomcat-jasper
     org.apache.tomcat:tomcat-juli
     org.apache.tomcat:tomcat-jsp-api
     org.apache.tomcat:tomcat-el-api
     org.apache.tomcat:tomcat-jasper-el
     org.apache.tomcat:tomcat-api
     org.apache.tomcat:tomcat-util-scan
     org.apache.tomcat:tomcat-util

   org.mortbay.jasper:apache-el
     org.apache.tomcat:tomcat-jasper-el
     org.apache.tomcat:tomcat-el-api


   ------
   Mortbay

   The following artifacts are CDDL + GPLv2 with classpath exception.

   https://glassfish.dev.java.net/nonav/public/CDDL+GPL.html

   org.eclipse.jetty.toolchain:jetty-schemas

   ------
   Assorted

   The UnixCrypt.java code implements the one way cryptography used by
   Unix systems for simple password protection.  Copyright 1996 Aki Yoshida,
   modified April 2001  by Iris Van den Broeke, Daniel Deville.
   Permission to use, copy, modify and distribute UnixCrypt
   for non-commercial or commercial purposes and without fee is
   granted provided that the copyright notice appears in all copies./

The binary distribution of this product bundles binaries of
Snappy for Java 1.0.4.1,
which has the following notices:
 * This product includes software developed by Google
    Snappy: http://code.google.com/p/snappy/ (New BSD License)

   This product includes software developed by Apache
    PureJavaCrc32C from apache-hadoop-common http://hadoop.apache.org/
    (Apache 2.0 license)

   This library containd statically linked libstdc++. This inclusion is allowed by
   "GCC RUntime Library Exception"
   http://gcc.gnu.org/onlinedocs/libstdc++/manual/license.html

   == Contributors ==
     * Tatu Saloranta
       * Providing benchmark suite
     * Alec Wysoker
       * Performance and memory usage improvement

The binary distribution of this product bundles binaries of
Xerces2 Java Parser 2.9.1,
which has the following notices:
 * =========================================================================
   ==  NOTICE file corresponding to section 4(d) of the Apache License,   ==
   ==  Version 2.0, in this case for the Apache Xerces Java distribution. ==
   =========================================================================

   Apache Xerces Java
   Copyright 1999-2007 The Apache Software Foundation

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

   Portions of this software were originally based on the following:
     - software copyright (c) 1999, IBM Corporation., http://www.ibm.com.
     - software copyright (c) 1999, Sun Microsystems., http://www.sun.com.
     - voluntary contributions made by Paul Eng on behalf of the
       Apache Software Foundation that were originally developed at iClick, Inc.,
       software copyright (c) 1999.

The binary distribution of this product bundles binaries of
Logback Classic Module 1.1.2,
Logback Core Module 1.1.2,
which has the following notices:
 * Logback: the reliable, generic, fast and flexible logging framework.
   Copyright (C) 1999-2012, QOS.ch. All rights reserved.

The binary distribution of this product bundles binaries of
Apache HBase - Annotations 1.2.6,
Apache HBase - Client 1.2.6,
Apache HBase - Common 1.2.6,
Apache HBase - Hadoop Compatibility 1.2.6,
Apache HBase - Hadoop Two Compatibility 1.2.6,
Apache HBase - Prefix Tree 1.2.6,
Apache HBase - Procedure 1.2.6,
Apache HBase - Protocol 1.2.6,
Apache HBase - Server 1.2.6,
which has the following notices:
 * Apache HBase
   Copyright 2007-2015 The Apache Software Foundation

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

   --
   This product incorporates portions of the 'Hadoop' project

   Copyright 2007-2009 The Apache Software Foundation

   Licensed under the Apache License v2.0
   --
   Our Orca logo we got here: http://www.vectorfree.com/jumping-orca
   It is licensed Creative Commons Attribution 3.0.
   See https://creativecommons.org/licenses/by/3.0/us/
   We changed the logo by stripping the colored background, inverting
   it and then rotating it some.

   Later we found that vectorfree.com image is not properly licensed.
   The original is owned by vectorportal.com. The original was
   relicensed so we could use it as Creative Commons Attribution 3.0.
   The license is bundled with the download available here:
   http://www.vectorportal.com/subcategory/205/KILLER-WHALE-FREE-VECTOR.eps/ifile/9136/detailtest.asp
   --
   This product includes portions of the Bootstrap project v3.0.0

   Copyright 2013 Twitter, Inc.

   Licensed under the Apache License v2.0

   This product uses the Glyphicons Halflings icon set.

   http://glyphicons.com/

   Copyright Jan Kovařík

   Licensed under the Apache License v2.0 as a part of the Bootstrap project.

   --
   This product includes portions of the Guava project v14, specifically
   'hbase-common/src/main/java/org/apache/hadoop/hbase/io/LimitInputStream.java'

   Copyright (C) 2007 The Guava Authors

   Licensed under the Apache License, Version 2.0

The binary distribution of this product bundles binaries of
Phoenix Core 4.7.0,
which has the following notices:
   Apache Phoenix
   Copyright 2013-2016 The Apache Software Foundation

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

   This also includes:

   The phoenix-spark module has been adapted from the phoenix-spark library
   distributed under the terms of the Apache 2 license. Original source copyright:
   Copyright 2014 Simply Measured, Inc.
   Copyright 2015 Interset Software Inc.

   The file bin/daemon.py is based on the file of the same name in python-daemon 2.0.5
   (https://pypi.python.org/pypi/python-daemon/). Original source copyright:
   # Copyright © 2008–2015 Ben Finney <ben+python@benfinney.id.au>
   # Copyright © 2007–2008 Robert Niederreiter, Jens Klein
   # Copyright © 2004–2005 Chad J. Schroeder
   # Copyright © 2003 Clark Evans
   # Copyright © 2002 Noah Spurrier
   # Copyright © 2001 Jürgen Hermann

The binary distribution of this product bundles binaries of
Plexus Cipher: encryption/decryption Component 1.4,
which has the following notices:
 * The code in this component contains a class - Base64 taken from http://juliusdavies.ca/svn/not-yet-commons-ssl/tags/commons-ssl-0.3.10/src/java/org/apache/commons/ssl/Base64.java
   which is Apache license: http://www.apache.org/licenses/LICENSE-2.0

   The PBE key processing routine PBECipher.createCipher() is adopted from http://juliusdavies.ca/svn/not-yet-commons-ssl/tags/commons-ssl-0.3.10/src/java/org/apache/commons/ssl/OpenSSL.java
    which is also Apache APL-2.0 license: http://www.apache.org/licenses/LICENSE-2.0

The binary distribution of this product bundles binaries of
software.amazon.ion:ion-java 1.0.1,
which has the following notices:
 * Amazon Ion Java Copyright 2007-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved.

The binary distribution of this product bundles binaries of
joda-time:joda-time:2.9.9
which has the following notices:
 * =============================================================================
   = NOTICE file corresponding to section 4d of the Apache License Version 2.0 =
   =============================================================================
   This product includes software developed by
   Joda.org (http://www.joda.org/).

The binary distribution of this product bundles binaries of
Ehcache 3.3.1,
which has the following notices:
 * Ehcache V3 Copyright 2014-2016 Terracotta, Inc.

The binary distribution of this product bundles binaries of
snakeyaml (https://bitbucket.org/asomov/snakeyaml),
which has the following notices:
 * Copyright (c) 2008, http://www.snakeyaml.org

The binary distribution of this product bundles binaries of
swagger-annotations (https://github.com/swagger-api/swagger-core),
which has the following notices:
 * Copyright 2016 SmartBear Software

The binary distribution of this product bundles binaries of
metrics-core 3.2.4
which has the following notices:
 * Copyright 2010-2013 Coda Hale and Yammer, Inc.

   This product includes software developed by Coda Hale and Yammer, Inc.

   This product includes code derived from the JSR-166 project (ThreadLocalRandom, Striped64,
   LongAdder), which was released with the following comments:

   Written by Doug Lea with assistance from members of JCP JSR-166
   Expert Group and released to the public domain, as explained at
   http://creativecommons.org/publicdomain/zero/1.0/
