
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/bin/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) 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. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache 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 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/bin/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.

   APACHE DRUID (INCUBATING) SUBCOMPONENTS:

   Apache Druid (incubating) includes a number of subcomponents with
   separate copyright notices and license terms. Your use of the source
   code for these subcomponents is subject to the terms and
   conditions of the following licenses.


Apache License version 2.0
================================

SOURCE/JAVA-CORE
    This product contains conjunctive normal form conversion code, a variance aggregator algorithm, and Bloom filter
     adapted from Apache Hive.
      * processing/src/main/java/org/apache/druid/segment/filter/Filters.java
      * extensions-core/stats/src/main/java/io/druid/query/aggregation/variance/VarianceAggregatorCollector.java
      * extensions-core/druid-bloom-filter/src/main/java/org/apache/druid/query/filter/BloomKFilter.java

    This product contains variable length long deserialization code adapted from Apache Lucene.
      * processing/src/main/java/org/apache/druid/segment/data/VSizeLongSerde.java

    This product contains SQL query planning code adapted from Apache Calcite.
      * sql/src/main/java/org/apache/druid/sql/calcite/

    This product contains Kerberos authentication code adapted from Apache Hadoop.
      * extensions-core/druid-kerberos/src/main/java/org/apache/druid/security/kerberos/

    This product contains a modified version of the java-alphanum library,
     copyright Andrew Duffy (https://github.com/amjjd/java-alphanum).
      * processing/src/main/java/org/apache/druid/query/ordering/StringComparators.java

    This product contains a modified version of the Metamarkets java-util library,
     copyright Metamarkets Group Inc. (https://github.com/metamx/java-util).
      * java-util/

    This product contains a modified version of the Metamarkets bytebuffer-collections library,
     copyright Metamarkets Group Inc. (https://github.com/metamx/bytebuffer-collections)
      * processing/src/main/java/org/apache/druid/collections/

    This product contains a modified version of the Metamarkets extendedset library,
     copyright Metamarkets Group Inc. (https://github.com/metamx/extendedset)
      * extendedset/

    This product contains a modified version of the CONCISE (COmpressed 'N' Composable Integer SEt) library,
     copyright Alessandro Colantonio (https://sourceforge.net/projects/concise/), extending the functionality of
     ConciseSet to use IntBuffers.
      * extendedset/src/main/java/org/apache/druid/extendedset/intset/

    This product contains modified portions of the Guava library,
     copyright The Guava Authors (https://github.com/google/guava).
      Closer class:
      * core/src/main/java/org/apache/druid/java/util/common/io/Closer.java
      Splitter.splitToList() method:
      * core/src/main/java/org/apache/druid/java/util/common/parsers/DelimitedParser.java
      DirectExecutorService class:
      * core/src/main/java/org/apache/druid/java/util/common/concurrent/DirectExecutorService.java

    This product contains modified versions of the Dockerfile and related configuration files
     from SequenceIQ's Hadoop Docker image, copyright SequenceIQ, Inc. (https://github.com/sequenceiq/hadoop-docker/)
      * examples/quickstart/tutorial/hadoop/docker/

    This product contains fixed bins histogram percentile computation code adapted from Netflix Spectator,
     copyright Netflix, Inc. (https://github.com/Netflix/spectator)
      * extensions-core/histogram/src/main/java/org/apache/druid/query/aggregation/histogram/FixedBucketsHistogram.java


BINARY/WEB-CONSOLE
    This product bundles Microsoft tslib version 1.9.3.

    This product bundles diff-match-patch version 1.0.4.

    This product bundles @blueprintjs/core version 1.0.1.


BINARY/JAVA-CORE
    This product bundles AWS SDK for Java version 1.11.199.
      * com.amazonaws:aws-java-sdk-core
      * com.amazonaws:aws-java-sdk-ec2
      * com.amazonaws:aws-java-sdk-kms
      * com.amazonaws:aws-java-sdk-s3
      * com.amazonaws:jmespath-java

    This product bundles Esri Geometry API for Java version 2.0.0.
      * com.esri.geometry:esri-geometry-api

    This product bundles ClassMate version 1.0.0.
      * com.fasterxml:classmate

    This product bundles Jackson version 2.6.7.
      * com.fasterxml.jackson.core:jackson-annotations
      * com.fasterxml.jackson.core:jackson-core
      * com.fasterxml.jackson.core:jackson-databind
      * com.fasterxml.jackson.dataformat:jackson-dataformat-cbor
      * com.fasterxml.jackson.dataformat:jackson-dataformat-smile
      * com.fasterxml.jackson.datatype:jackson-datatype-guava
      * com.fasterxml.jackson.datatype:jackson-datatype-joda
      * com.fasterxml.jackson.jaxrs:jackson-jaxrs-base
      * com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider
      * com.fasterxml.jackson.jaxrs:jackson-jaxrs-smile-provider
      * com.fasterxml.jackson.module:jackson-module-jaxb-annotations

    This product bundles Caffeine version 2.5.5.
      * com.github.ben-manes.caffeine:caffeine

    This product bundles Error Prone Annotations version 2.3.2.
      * com.google.errorprone:error_prone_annotations

    This product bundles Guava version 16.0.1.
      * com.google.guava:guava

    This product bundles Guice version 4.1.0.
      * com.google.inject:guice
      * com.google.inject.extensions:guice-multibindings
      * com.google.inject.extensions:guice-servlet

    This product bundles JsonPath version 2.3.0.
      * com.jayway.jsonpath:json-path

    This product bundles LMAX Disruptor version 3.3.6.
      * com.lmax:disruptor

    This product bundles LZF Compressor version 1.0.4.
      * com.ning:compress-lzf

    This product bundles OpenCSV version 4.2.
      * com.opencsv:opencsv

    This product bundles OkHttp version 1.0.2,
      * com.squareup.okhttp:okhttp

    This product bundles Netty Reactive Streams version 2.0.0.
      * com.typesafe.netty:netty-reactive-streams

    This product bundles the following Apache Commons libraries:
      * commons-beanutils 1.9.3
      * commons-cli 1.2
      * commons-codec 1.7
      * commons-collections 3.2.2
      * commons-io	2.5
      * commons-lang	2.6
      * commons-logging 1.1.1
      * commons-pool	1.6
      * commons-collections4 4.1
      * commons-compress 1.16
      * commons-dbcp2 2.0.1
      * commons-lang3 3.7
      * commons-math3 3.6.1
      * commons-pool2 2.2
      * commons-text	1.3

    This product bundles Airline version 0.7.
      * io.airlift:airline

    This product bundles DropWizard Metrics Core version 4.0.0.
      * io.dropwizard.metrics:metrics-core

    This product bundles Netty version 3.10.6.Final.
      * io.netty:netty

    This product bundles Netty version 4.1.30.Final.
      * io.netty:netty-all

    This product bundles Netty version 4.1.29.Final.
      * io.netty:netty-buffer
      * io.netty:netty-codec
      * io.netty:netty-codec-dns
      * io.netty:netty-codec-http
      * io.netty:netty-codec-socks
      * io.netty:netty-common
      * io.netty:netty-handler
      * io.netty:netty-handler-proxy
      * io.netty:netty-resolver
      * io.netty:netty-resolver-dns
      * io.netty:netty-transport
      * io.netty:netty-transport-native-epoll
      * io.netty:netty-transport-native-unix-common

    This product bundles fastutil version 8.1.0.
      * it.unimi.dsi:fastutil

    This product bundles Javax Inject version 1.
      * javax.inject.javax:inject

    This product bundles Bean Validation API version 1.1.0.Final.
      * javax.validation:validation-api

    This product bundles Joda-Time version 2.9.9.
      * joda-time:joda-time

    This product bundles Aggregate Designer Algorithm version 6.0.
      * net.hydromatic:aggdesigner-algorithm

    This product bundles Java Native Access (JNA) version 4.5.1.
      * net.java.dev.jna:jna

    This product bundles ASM Based Accessors Helper Used By JSON Smart version 1.2.
      * net.minidev:accessors-smart

    This product bundles JSON Small and Fast Parser version 2.3.
      * net.minidev:json-smart

    This product bundles Spymemcached version 2.12.3.
      * net.spy:spymemcached

    This product bundles jackson-jq version 0.0.7.
      * net.thisptr:jackson-jq

    This product bundles Apache Calcite version 1.17.0.
      * org.apache.calcite:calcite-core
      * org.apache.calcite:calcite-linq4j

    This product bundles Apache Calcite Avatica version 1.10.0.
      * org.apache.calcite:avatica.avatica-core
      * org.apache.calcite:avatica.avatica-metrics
      * org.apache.calcite:avatica.avatica-server

    This product bundles Apache Curator version 4.1.0.
      * org.apache.curator:curator-client
      * org.apache.curator:curator-framework
      * org.apache.curator:curator-recipes
      * org.apache.curator:curator-x-discovery

    This product bundles Apache Derby version 10.11.1.1.
      * org.apache.derby:derby
      * org.apache.derby:derbyclient
      * org.apache.derby:derbynet

    This product bundles Apache HttpClient	version 4.5.3.
      * org.apache.httpcomponents:httpclient

    This product bundles Apache HttpCore version 4.4.4.
      * org.apache.httpcomponents:httpcore

    This product bundles Apache Log4j version 2.5.
      * org.apache.logging.log4j:log4j-1.2-api
      * org.apache.logging.log4j:log4j-api
      * org.apache.logging.log4j:log4j-core
      * org.apache.logging.log4j:log4j-jul
      * org.apache.logging.log4j:log4j-slf4j-impl

    This product bundles Apache Maven version 3.1.1.
      * org.apache.maven:maven-aether-provider
      * org.apache.maven:maven-model
      * org.apache.maven:maven-model-builder
      * org.apache.maven:maven-repository-metadata
      * org.apache.maven:maven-settings
      * org.apache.maven:maven-settings-builder

    This product bundles Apache Maven Artifact version 3.6.0.
      * org.apache.maven:maven-artifact

    This product bundles Apache Maven Wagon API version 2.4.
      * org.apache.maven.wagon:wagon-provider-api

    This product bundles Apache Yetus Audience Annotations Component version 0.5.0.
      * org.apache.yetus:audience-annotations

    This product bundles Apache Zookeeper version 3.4.11.
      * org.apache.zookeeper:zookeeper

    This product bundles AsyncHttpClient asynchttpclient version 2.5.3.
      * org.asynchttpclient:async-http-client
      * org.asynchttpclient:async-http-client-netty-utils

    This product bundles components from Jackson version 1.9.13.
      * org.codehaus.jackson:jackson-core-asl
      * org.codehaus.jackson:jackson-mapper-asl

    This product bundles Plexus Interpolation API 1.19.
      * org.codehaus.plexus:plexus-interpolation

    This product bundles Plexus Common Utilities 3.0.15.
      * org.codehaus.plexus:plexus-utils

    This product bundles Jetty version 9.4.10.v20180503.
      * org.eclipse.jetty:jetty-client
      * org.eclipse.jetty:jetty-continuation
      * org.eclipse.jetty:jetty-http
      * org.eclipse.jetty:jetty-io
      * org.eclipse.jetty:jetty-proxy
      * org.eclipse.jetty:jetty-security
      * org.eclipse.jetty:jetty-server
      * org.eclipse.jetty:jetty-servlet
      * org.eclipse.jetty:jetty-servlets
      * org.eclipse.jetty:jetty-util

    This product bundles JVM Attach API version 1.2.
      * org.gridkit.lab:jvm-attach-api

    This product bundles Hibernate Validator Engine version 5.1.3.Final.
      * org.hibernate:hibernate-validator

    This product bundles SIGAR version 1.6.5.132.
      * org.hyperic:sigar

    This product bundles JBoss Logging 3 version 3.1.3.GA.
      * org.jboss.logging:jboss-logging

    This product bundles JDBI version 2.63.1.
      * org.jdbi:jdbi

    This product bundles LZ4 Java version 1.5.0.
      * org.lz4:lz4-java

    This product bundles MapDB version 1.0.8.
      * org.mapdb:mapdb

    This product bundles Objenesis version 2.6.
      * org.objenesis:objenesis

    This product bundles RoaringBitmap version 0.7.36.
      * org.roaringbitmap:RoaringBitmap
      * org.roaringbitmap:shims

    This product bundles Config Magic version 0.9.
      * org.skife.config:config-magic

    This product bundles Ion Java version 1.0.2.
      * software.amazon.ion:ion-java


BINARY/HADOOP-CLIENT
    This product bundles Apache Hadoop version 2.8.3.
      * org.apache.hadoop:hadoop-annotations
      * org.apache.hadoop:hadoop-auth
      * org.apache.hadoop:hadoop-client
      * org.apache.hadoop:hadoop-common
      * org.apache.hadoop:hadoop-hdfs-client
      * org.apache.hadoop:hadoop-mapreduce-client-app
      * org.apache.hadoop:hadoop-mapreduce-client-common
      * org.apache.hadoop:hadoop-mapreduce-client-core
      * org.apache.hadoop:hadoop-mapreduce-client-jobclient
      * org.apache.hadoop:hadoop-mapreduce-client-shuffle
      * org.apache.hadoop:hadoop-yarn-api
      * org.apache.hadoop:hadoop-yarn-client
      * org.apache.hadoop:hadoop-yarn-common
      * org.apache.hadoop:hadoop-yarn-server-common

    This product bundles Gson version 2.2.4.
      * com.google.code.gson:gson

    This product bundles Guava version 11.0.2.
      * com.google.guava:guava

    This product bundles Nimbus JOSE+JWT version 3.9.
      * com.nimbusds:nimbus-jose-jwt

    This product bundles OkHttp version 2.4.0,
      * com.squareup.okhttp:okhttp

    This product bundles Okio version 1.4.0,
      * com.squareup.okio:okio

    This product bundles the following Apache Commons libraries:
      * commons-beanutils 1.7.0
      * commons-beanutils-core 1.8.0
      * commons-codec 1.4
      * commons-configuration 1.6
      * commons-digester 1.8
      * commons-io	commons-io 2.4
      * commons-logging 1.1.3
      * commons-net 3.1
      * commons-compress	1.4.1
      * commons-math3 3.1.1

    This product bundles Netty version 3.6.2.Final.
      * io.netty:netty

    This product bundles Apache Log4j version 1.2.17.
      * log4j:log4j

    This product bundles JSON Small and Fast Parser version 1.1.1.
      * net.minidev:json-smart

    This product bundles Apache Avro version 1.7.4.
      * org.apache.avro:avro

    This product bundles Apache Directory version 1.0.0-M20.
      * org.apache.directory.api:api-asn1-api
      * org.apache.directory.api:api-util

    This product bundles Apache Directory Server version 2.0.0-M15.
      * org.apache.directory.server:apacheds-i18n
      * org.apache.directory.server:apacheds-kerberos-codec

    This product bundles Apache HTrace version 4.0.1-incubating.
      * org.apache.htrace:htrace-core4

    This product bundles Apache HttpClient version 4.5.2.
      * org.apache.httpcomponents:httpclient

    This product bundles Apache Zookeeper version 3.4.6.
      * org.apache.zookeeper:zookeeper

    This product bundles components from Jackson version 1.9.13.
      * org.codehaus.jackson:jackson-jaxrs
      * org.codehaus.jackson:jackson-xc

    This product bundles Jetty version 6.1.26.
      * org.mortbay.jetty:jetty-sslengine
      * org.mortbay.jetty:jetty-util

    This product bundles snappy-java version 1.0.4.1.
      * org.xerial.snappy:snappy-java


BINARY/EXTENSIONS/druid-avro-extensions
    This product bundles Kafka Schema Registry Client version 3.0.1.
      * io.confluent:kafka-schema-registry-client

    This product bundles Apache Avro version 1.8.2.
      * org.apache.avro:avro
      * org.apache.avro:avro-mapred
      * org.apache.avro:avro-ipc

    This product bundles Schema Repository version 0.1.3.
      * org.schemarepo:schema-repo-api
      * org.schemarepo:schema-repo-avro
      * org.schemarepo:schema-repo-client
      * org.schemarepo:schema-repo-common

    This product bundles Gson version 2.3.1.
      * com.google.code.gson:gson

    This product bundles Apache Velocity version 1.7.
      * org.apache.velocity:velocity

    This product bundles Jetty version 6.1.26.
      * org.mortbay.jetty:jetty

    This product bundles Jetty version 2.5-20081211.
      * org.mortbay.jetty:servlet-api

    This product bundles Objenesis version 2.6.
      * org.objenesis:objenesis

    This product bundles snappy-java version 1.1.1.3.
      * org.xerial.snappy:snappy-java


BINARY/EXTENSIONS/druid-bloom-filter

    This product bundles Apache Hive version 2.7.0.
      * org.apache.hive:hive-storage-api


BINARY/EXTENSIONS/druid-datasketches

    This product bundles DataSketches version 0.12.0.
      * com.yahoo.datasketches:datasketches-core
      * com.yahoo.datasketches:memory


BINARY/EXTENSIONS/druid-examples

    This product bundles IRC API version 1.0-0014.
      * com.ircclouds.irc:irc-api

    This product bundles MaxMind GeoIP2 API version 0.4.0.
      * com.maxmind.geoip2:geoip2

    This product bundles the following Apache Commons libraries:
      * commons-beanutils 1.8.3
      * commons-validator 1.4.0

    This product bundles Twitter4J version 3.0.3.
      * org.twitter4j:twitter4j-async
      * org.twitter4j:twitter4j-core
      * org.twitter4j:twitter4j-stream


BINARY/EXTENSIONS/druid-kafka-eight

    This product bundles Apache Kafka version 0.8.2.1.
      * org.apache.kafka:kafka_2.10
      * org.apache.kafka:kafka-clients

    This product bundles ZkClient version 0.3.
      * com.101tec:zkclient

    This product bundles Yammer Metrics version 2.2.0.
      * com.yammer.metrics:metrics-core

    This product bundles snappy-java version 1.1.1.6.
      * org.xerial.snappy:snappy-java


BINARY/EXTENSIONS/druid-kafka-indexing-service
    This product bundles Apache Kafka version 0.10.2.2.
      * org.apache.kafka:kafka-clients

    This product bundles snappy-java version 1.1.2.6.
      * org.xerial.snappy:snappy-java


BINARY/EXTENSIONS/druid-kerberos

    This product bundles XML Builder version 0.4.
      * com.jamesmurty.utils:java-xmlbuilder

    This product bundles Jettison version 1.1.
      * org.codehaus.jettison:jettison

    This product bundles Jets3t version 0.9.0.
      * net.java.dev.jets3t:jets3t


BINARY/EXTENSIONS/druid-kinesis-indexing-service
    This product bundles AWS SDK for Java version 1.11.199.
      * com.amazonaws:aws-java-sdk-kinesis
      * com.amazonaws:aws-java-sdk-sts


BINARY/EXTENSIONS/druid-parquet-extensions
    This product bundles Apache Parquet version 1.10.0.
      * org.apache.parquet:parquet-avro
      * org.apache.parquet:parquet-column
      * org.apache.parquet:parquet-common
      * org.apache.parquet:parquet-encoding
      * org.apache.parquet:parquet-hadoop
      * org.apache.parquet:parquet-jackson

    This product bundles Apache Parquet Format version 2.4.0.
      * org.apache.parquet:parquet-format

    This product bundles snappy-java version 1.1.7.2.
      * org.xerial.snappy:snappy-java


BINARY/EXTENSIONS/protobuf-extensions
    This product bundles Protocol Buffers Dynamic Schema version 0.9.3.
      * com.github.os72:protobuf-dynamic

    This product bundles Gson version 2.7.
      * com.google.code.gson:gson



MIT License
================================

SOURCE/WEB-CONSOLE
    This product bundles jQuery version 1.11.0, copyright jQuery Foundation, Inc.,
     which is available under an MIT license. For details, see licenses/src/jquery.MIT.

    This product bundles jQuery UI version 1.9.2, copyright jQuery Foundation and other contributors,
     which is available under an MIT license. For details, see licenses/src/jquery-ui.MIT.

    This product bundles underscore version 1.2.2, copyright Jeremy Ashkenas, DocumentCloud,
     which is available under an MIT license. For details, see licenses/src/underscore.MIT.


BINARY/JAVA-CORE
    This product bundles Checker Qual version 2.5.7, copyright the Checker Framework developers,
     which is available under an MIT license. For details, see licenses/bin/checker-qual.MIT.
      * org.checkerframework:checker-qual

    This product bundles JCodings version 1.0.13, copyright JRuby Team,
     which is available under an MIT license. For details, see licenses/bin/jcodings.MIT.
      * org.jruby.jcodings:jcodings

    This product bundles Joni version 2.1.11, copyright JRuby Team,
     which is available under an MIT license. For details, see licenses/bin/joni.MIT.
      * org.jruby.joni:joni

    This product bundles JCL 1.2 Implemented Over SLF4J version 1.7.12, copyright QOS.ch,
     which is available under an MIT license. For details, see licenses/bin/jcl-over-slf4j.MIT.
      * org.slf4j:jcl-over-slf4j

    This product bundles SLF4J API version 1.6.4, copyright QOS.ch,
     which is available under an MIT license. For details, see licenses/bin/slf4j.MIT.
      * org.slf4j:slf4j-api


BINARY/HADOOP-CLIENT
    This product bundles SLF4J API version 1.7.10, copyright QOS.ch,
     which is available under an MIT license. For details, see licenses/bin/slf4j.MIT.
      * org.slf4j:slf4j-api
      * org.slf4j:slf4j-log4j12


BINARY/EXTENSIONS/druid-kafka-eight
    This product bundles JOpt Simple version 3.2., copyright Paul R. Holser, Jr.,
     which is available under an MIT license. For details, see licenses/bin/jopt-simple.MIT.
     * net.sf.jopt-simple:jopt-simple


BINARY/WEB-CONSOLE
The following dependency names are NPM package names (https://www.npmjs.com).

    This product bundles @babel/runtime version 7.3.4, copyright Sebastian McKenzie and other contributors,
     which is available under an MIT license. For details, see licenses/bin/@babel-runtime.MIT.

    This product bundles array-includes version 3.0.3, copyright Jordan Harband,
     which is available under an MIT license. For details, see licenses/bin/array-includes.MIT.

    This product bundles asap version 2.0.6, copyright Contributors,
     which is available under an MIT license. For details, see licenses/bin/asap.MIT.

    This product bundles axios version 0.18.0, copyright Matt Zabriskie,
     which is available under an MIT license. For details, see licenses/bin/axios.MIT.

    This product bundles brace version 0.11.1, copyright Thorsten Lorenz,
     which is available under an MIT license. For details, see licenses/brace.MIT.

    This product bundles chain-function version 1.0.1, copyright jquense,
     which is available under an MIT license. For details, see licenses/chain-function.MIT.

    This product bundles classnames version 2.2.6, copyright Jed Watson,
     which is available under an MIT license. For details, see licenses/bin/classnames.MIT.

    This product bundles define-properties version 1.1.3, copyright Jordan Harband,
     which is available under an MIT license. For details, see licenses/bin/define-properties.MIT.

    This product bundles dom-helpers version 3.4.0, copyright Jason Quense,
     which is available under an MIT license. For details, see licenses/bin/dom-helpers.MIT.

    This product bundles dom4 version 1.8.5, copyright Andrea Giammarchi,
     which is available under an MIT license. For details, see licenses/bin/dom4.MIT.

    This product bundles encoding version 0.1.12, copyright Andris Reinman,
     which is available under an MIT license. For details, see licenses/bin/encoding.MIT.

    This product bundles es-abstract version 1.13.0, copyright Jordan Harband,
     which is available under an MIT license. For details, see licenses/bin/es-abstract.MIT.

    This product bundles es-to-primitive version 1.2.0, copyright Jordan Harband,
     which is available under an MIT license. For details, see licenses/bin/es-to-primitive.MIT.

    This product bundles es6-shim version 0.35.4, copyright Paul Miller and contributors,
     which is available under an MIT license. For details, see licenses/bin/es6-shim.MIT.

    This product bundles es7-shim version 6.0.0, copyright Jordan Harband and contributors,
     which is available under an MIT license. For details, see licenses/bin/es7-shim.MIT.

    This product bundles fbjs version 0.8.17, copyright Facebook, Inc.,
     which is available under an MIT license. For details, see licenses/bin/fbjs.MIT.

    This product bundles function-bind version 1.1.1, copyright Raynos,
     which is available under an MIT license. For details, see licenses/bin/function-bind.MIT.

    This product bundles has-symbols version 1.0.0, copyright Jordan Harband,
     which is available under an MIT license. For details, see licenses/bin/has-symbols.MIT.

    This product bundles has version 1.0.3, copyright Thiago de Arruda,
     which is available under an MIT license. For details, see licenses/bin/has.MIT.

    This product bundles history version 4.7.2, copyright Michael Jackson,
     which is available under an MIT license. For details, see licenses/bin/history.MIT.

    This product bundles hjson version 3.1.2, copyright Christian Zangl,
     which is available under an MIT license. For details, see licenses/bin/hjson.MIT.

    This product bundles invariant version 2.2.4, copyright Facebook, Inc.,
     which is available under an MIT license. For details, see licenses/bin/invariant.MIT.

    This product bundles is-buffer version 1.1.6, copyright Feross Aboukhadijeh,
     which is available under an MIT license. For details, see licenses/bin/is-buffer.MIT.

    This product bundles is-callable version 1.1.4, copyright Jordan Harband,
     which is available under an MIT license. For details, see licenses/bin/is-callable.MIT.

    This product bundles is-date-object version 1.0.1, copyright Jordan Harband,
     which is available under an MIT license. For details, see licenses/bin/is-date-object.MIT.

    This product bundles is-regex version 1.0.4, copyright Jordan Harband,
     which is available under an MIT license. For details, see licenses/bin/is-regex.MIT.

    This product bundles is-symbol version 1.0.2, copyright Jordan Harband,
     which is available under an MIT license. For details, see licenses/bin/is-symbol.MIT.

    This product bundles isarray version 0.0.1, copyright Julian Gruber,
     which is available under an MIT license. For details, see licenses/bin/isarray.MIT.

    This product bundles numeral version 2.0.6, copyright Adam Draper,
     which is available under an MIT license. For details, see licenses/bin/numeral.MIT.

    This product bundles object-assign version 4.1.1, copyright Sindre Sorhus,
     which is available under an MIT license. For details, see licenses/bin/object-assign.MIT.

    This product bundles object-keys version 1.1.0, copyright Jordan Harband,
     which is available under an MIT license. For details, see licenses/bin/object-keys.MIT.

    This product bundles path-to-regexp version 1.7.0, copyright Blake Embrey (hello@blakeembrey.com),
     which is available under an MIT license. For details, see licenses/bin/path-to-regexp.MIT.

    This product bundles prop-types version 15.7.2, copyright Facebook, Inc.,
     which is available under an MIT license. For details, see licenses/bin/prop-types.MIT.

    This product bundles pure-render-decorator version 1.1.1, copyright Félix Girault,
     which is available under an MIT license. For details, see licenses/pure-render-decorator.MIT.

    This product bundles react-ace version 6.4.0, copyright James Hrisho,
     which is available under an MIT license. For details, see licenses/react-ace.MIT.

    This product bundles react-addons-css-transition-group version 15.6.2, copyright ,
     which is available under an MIT license. For details, see licenses/react-addons-css-transition-group.MIT.

    This product bundles react-dom version 16.8.3, copyright Facebook, Inc. and its affiliates.,
     which is available under an MIT license. For details, see licenses/bin/react-dom.MIT.

    This product bundles react-is version 16.8.3, copyright ,
     which is available under an MIT license. For details, see licenses/react-is.MIT.

    This product bundles react-router-dom version 4.3.1, copyright React Training,
     which is available under an MIT license. For details, see licenses/bin/react-router-dom.MIT.

    This product bundles react-router version 4.3.1, copyright React Training,
     which is available under an MIT license. For details, see licenses/bin/react-router.MIT.

    This product bundles react-table version 6.8.6, copyright Tanner Linsley,
     which is available under an MIT license. For details, see licenses/bin/react-table.MIT.

    This product bundles react version 16.8.3, copyright Facebook, Inc. and its affiliates.,
     which is available under an MIT license. For details, see licenses/bin/react.MIT.

    This product bundles resolve-pathname version 2.2.0, copyright Michael Jackson,
     which is available under an MIT license. For details, see licenses/bin/resolve-pathname.MIT.

    This product bundles scheduler version 0.13.3, copyright Facebook, Inc. and its affiliates.,
     which is available under an MIT license. For details, see licenses/bin/scheduler.MIT.

    This product bundles string-at version 1.0.1, copyright Jordan Harband,
     which is available under an MIT license. For details, see licenses/bin/string-at.MIT.

    This product bundles tether version 1.4.5, copyright ,
     which is available under an MIT license. For details, see licenses/tether.MIT.

    This product bundles value-equal version 0.4.0, copyright Michael Jackson,
     which is available under an MIT license. For details, see licenses/bin/value-equal.MIT.

    This product bundles warning version 4.0.3, copyright Facebook, Inc.,
     which is available under an MIT license. For details, see licenses/bin/warning.MIT.

    This product bundles ua-parser-js version 0.7.19, copyright Faisal Salman,
     which is available under an MIT license. For details, see licenses/bin/ua-parser-js.MIT.

    This product bundles druid-console version 0.0.2, copyright Metamarkets,
     which is available under an MIT license. For details, see licenses/bin/druid-console.MIT.

    This product bundles CSS from Font Awesome Free version 4.2.0, copyright Font Awesome,
     which is availble under an MIT license. For details, see licenses/bin/font-awesome.MIT.

    This product bundles webpack version 4.29.0, copyright JS Foundation and other contributors,
     which is available under an MIT license. For details, see licenses/bin/webpack.MIT.

    This product bundles style-loader version 0.23.1, copyright JS Foundation and other contributors,
     which is available under an MIT license. For details, see licenses/bin/style-loader.MIT.

    This product bundles os-browserify version 0.3.0, copyright CoderPuppy,
     which is available under an MIT license. For details, see licenses/bin/os-browserify.MIT.

    This product bundles process version 0.11.10, copyright Roman Shtylman,
     which is available under an MIT license. For details, see licenses/bin/process.MIT.

    This product bundles css-loader version 2.1.0, copyright JS Foundation and other contributors,
     which is available under an MIT license. For details, see licenses/bin/css-loader.MIT.

    This product bundles bootstrap version 3.1.1, copyright Twitter Inc,
     which is available under an MIT license. For details, see licenses/bin/bootstrap.MIT.


BSD-2-Clause License
================================

BINARY/JAVA-CORE
    This product bundles JNI binding for Zstd version 1.3.3-1, copyright Luben Karavelov,
     which is available under a BSD-2-Clause License. For details, see licenses/bin/zstd-jni.BSD2.
      * com.github.luben:zstd-jni


BSD-3-Clause License
================================

SOURCE/WEB-CONSOLE
    This product bundles demo_table.css and jquery.dataTables.js from DataTables version 1.8.2, copyright Allan Jardine.,
     which is available under a BSD-3-Clause License. For details, see licenses/src/datatables.BSD3.


BINARY/JAVA-CORE
    This product bundles Zstandard version 1.3.3, copyright Facebook, Inc.,
     which is available under a BSD-3-Clause License. For details, see licenses/bin/zstandard.BSD3.

    This product bundles FindBugs JSR305 version 2.0.1, copyright FindBugs,
     which is available under a BSD-3-Clause License. For details, see licenses/bin/jsr305.BSD3.
      * com.google.code.findbugs:jsr305

    This product bundles Protocol Buffers version 3.1.0, copyright Google, Inc.,
     which is available under a BSD-3-Clause License. For details, see licenses/bin/protobuf-java.BSD3.
      * com.google.protobuf:protobuf-java

    This product bundles JLine version 0.9.94, copyright Marc Prud'hommeaux,
     which is available under a BSD-3-Clause License. For details, see licenses/bin/jline.BSD3.
      * jline:jline

    This product bundles ANTLR 4 Runtime version 4.5.1, copyright The ANTLR Project,
     which is available under a BSD-3-Clause License. For details, see licenses/bin/antlr4-runtime.BSD3.
      * org.antlr:antlr4-runtime

    This product bundles Janino and Commons Compiler version 2.7.6, copyright Arno Unkrig and TIBCO Software Inc.,
     which are available under a BSD-3-Clause License. For details, see licenses/bin/janino.BSD3.
      * org.codehaus.janino:janino
      * org.codehaus.janino:commons-compiler

    This product bundles ASM version 5.2, copyright INRIA, France Telecom,
     which is available under a BSD-3-Clause License. For details, see licenses/bin/asm.BSD3.
      * org.ow2.asm:asm
      * org.ow2.asm:asm-commons
      * org.ow2.asm:asm-tree


BINARY/HADOOP-CLIENT
    This product bundles FindBugs JSR305 version 3.0.0, copyright FindBugs,
     which is available under a BSD-3-Clause License. For details, see licenses/bin/jsr305.BSD3.
      * com.google.code.findbugs:jsr305

    This product bundles Protocol Buffers version 2.5.0, copyright Google, Inc.,
     which is available under a BSD-3-Clause License. For details, see licenses/bin/protobuf-java.BSD3.
      * com.google.protobuf:protobuf-java

    This product bundles Paranamer version 2.3, copyright Paul Hammant & ThoughtWorks Inc,
     which is available under a BSD-3-Clause License. For details, see licenses/bin/paranamer.BSD3.
      * com.thoughtworks.paranamer:paranamer

    This product bundles LevelDB JNI version 1.8, copyright FuseSource Corp.,
     which is available under a BSD-3-Clause License. For details, see licenses/bin/leveldb-jni.BSD3.
      * org.fusesource.leveldbjni:leveldbjni-all

    This product bundles xmlenc version 0.5.2, copyright Ernst de Haan,
     which is available under a BSD-3-Clause License. For details, see licenses/bin/xmlenc.BSD3.
      * xmlenc:xmlenc


BINARY/EXTENSIONS/druid-avro-extensions
    This product bundles Paranamer version 2.7, copyright Paul Hammant & ThoughtWorks Inc,
     which is available under a BSD-3-Clause License. For details, see licenses/bin/paranamer.BSD3.
      * com.thoughtworks.paranamer:paranamer


BINARY/EXTENSIONS/druid-kerberos
    This product bundles JSch - Java Secure Channel version 0.1.54, copyright Atsuhiko Yamanaka, JCraft,Inc.,
     which is available under a BSD-3-Clause License. For details, see licenses/bin/jsch.BSD3.
      * com.jcraft:jsch


BINARY/EXTENSIONS/druid-kafka-eight
    This product bundles Scala Library version 2.10.4, copyright EPFL, Lightbend Inc.,
     which is available under a BSD-3-Clause License. For details, see licenses/bin/scala-lang.BSD3.
      * org.scala-lang:scala-library


BINARY/EXTENSIONS/druid-lookups-cached-single
    This product bundles StringTemplate version 3.2, copyright Terrence Parr,
     which is available under a BSD-3-Clause License. For details, see licenses/bin/antlr-stringtemplate.BSD3.
      * org.antlr:stringtemplate

    This product bundles ANTLR version 2.7.7, copyright The ANTLR Project,
     which is available under a BSD-3-Clause License. For details, see licenses/bin/antlr.BSD3.
      * antlr:antlr


BINARY/EXTENSIONS/postgresql-metadata-storage
    This product bundles PostgreSQL JDBC Driver version 9.4.1208.jre7, copyright PostgreSQL Global Development Group,
     which is available under a BSD-3-Clause License. For details, see licenses/bin/postgresql.BSD3.
      * org.postgresql:postgresql


BINARY/EXTENSIONS/druid-protobuf-extensions
    This product bundles Protocol Buffers version 3.1.0, copyright Google, Inc.,
     which is available under a BSD-3-Clause License. For details, see licenses/bin/protobuf-java.BSD3.
      * com.google.protobuf:protobuf-java-util


BINARY/WEB-CONSOLE
    This product bundles d3-array version 2.0.3, copyright Mike Bostock,
     which is available under a BSD-3-Clause License. For details, see licenses/bin/d3-array.BSD3.

    This product bundles hoist-non-react-statics version 2.5.5, copyright Yahoo! Inc.,
     which is available under a BSD-3-Clause License. For details, see licenses/bin/hoist-non-react-statics.BSD3.

    This product bundles react-transition-group version 1.2.1, copyright 2016, React Community,
     forked from React (https://github.com/facebook/react), copyright 2013-present, Facebook, Inc.
     which is available under a BSD-3-Clause License. For details, see licenses/bin/react-transition-group.BSD3.

    This product bundles warning version 3.0.0, copyright Facebook, Inc.,
     which is available under a BSD-3-Clause License. For details, see licenses/bin/warning.BSD3.


ICU License
================================

BINARY/JAVA-CORE
    This product bundles ICU4J version 54.1.1, copyright International Business Machines Corporation and others,
     which is available under the ICU License. For details, see licenses/bin/icu4j.ICU.
      * com.ibm.icu:icu4j


SIL Open Font License 1.1
================================

BINARY/WEB-CONSOLE
    This product bundles fonts from Font Awesome Free version 4.2.0, copyright Font Awesome,
     which is available under the SIL OFL 1.1. For details, see licenses/bin/font-awesome.silofl
      * https://fontawesome.com/


CDDL 1.1
================================

BINARY/JAVA-CORE
    This product bundles JavaBeans Activation Framework version 1.2.0, copyright Oracle and/or its affiliates.,
     which is available under the CDDL 1.1. For details, see licenses/bin/javax.activation.CDDL11
      * https://github.com/javaee/activation
      * com.sun.activation:javax.activation

    This product bundles Jersey version 1.19.3, copyright Oracle and/or its affiliates.,
     which is available under the CDDL 1.1. For details, see licenses/bin/jersey.CDDL11
      * https://jersey.github.io/
      * com.sun.jersey:jersey-core
      * com.sun.jersey:jersey-server
      * com.sun.jersey:jersey-servlet
      * com.sun.jersey:contribs

    This product bundles Expression Language 3.0 API version 3.0.0., copyright Oracle and/or its affiliates.,
     which is available under the CDDL 1.1. For details, see licenses/bin/javax.CDDL11
      * https://github.com/javaee/el-spec
      * javax.el:javax.el-api

    This product bundles Java Servlet API version 3.1.0, copyright Oracle and/or its affiliates.,
     which is available under the CDDL 1.1. For details, see licenses/bin/javax.CDDL11
      * https://github.com/javaee/servlet-spec
      * javax.servlet:javax.servlet-api

    This product bundles JSR311 API version 1.1.1, copyright Oracle and/or its affiliates.,
     which is available under the CDDL 1.1. For details, see licenses/bin/jsr311-api.CDDL11
      * https://github.com/javaee/jsr311
      * javax.ws.rs:jsr311-api

    This product bundles Expression Language 3.0 version 3.0.0., copyright Oracle and/or its affiliates.,
     which is available under the CDDL 1.1. For details, see licenses/bin/javax.CDDL11
      * https://github.com/javaee/el-spec
      * org.glassfish:javax.el


BINARY/HADOOP-CLIENT
    This product bundles Jersey version 1.9, copyright Oracle and/or its affiliates.,
     which is available under the CDDL 1.1. For details, see licenses/bin/jersey.CDDL11
      * https://jersey.github.io/
      * com.sun.jersey:jersey-client
      * com.sun.jersey:jersey-core

    This product bundles JavaBeans Activation Framework version 1.1, copyright Oracle and/or its affiliates.,
     which is available under the CDDL 1.1. For details, see licenses/bin/javaxCDDL11
      * https://github.com/javaee/activation
      * javax.activation:activation

    This product bundles Java Servlet API version 2.5, copyright Oracle and/or its affiliates.,
     which is available under the CDDL 1.1. For details, see licenses/bin/javax.CDDL11
      * https://github.com/javaee/servlet-spec
      * javax.servlet:javax.servlet-api

    This product bundles JAXB version 2.2.2, copyright Oracle and/or its affiliates.,
     which is available under the CDDL 1.1. For details, see licenses/bin/javax.CDDL11
      * https://github.com/javaee/jaxb-v2
      * javax.xml.bind:jaxb-api

    This product bundles stax-api version 1.0-2, copyright Oracle and/or its affiliates.,
     which is available under the CDDL 1.1. For details, see licenses/bin/javax.CDDL11
      * https://github.com/javaee/
      * javax.xml.stream:stax-api

    This product bundles jsp-api version 2.1, copyright Oracle and/or its affiliates.,
     which is available under the CDDL 1.1. For details, see licenses/bin/javax.CDDL11
      * https://github.com/javaee/javaee-jsp-api
      * javax.servlet.jsp:jsp-api


BINARY/EXTENSIONS/druid-avro-extensions
    This product bundles Jersey version 1.15, copyright Oracle and/or its affiliates.,
     which is available under the CDDL 1.1. For details, see licenses/bin/jersey.CDDL11
      * https://jersey.github.io/
      * com.sun.jersey:jersey-client


Eclipse Public License 1.0
================================

BINARY/JAVA-CORE
    This product bundles OkHttp Aether Connector version 0.0.9, copyright to original author or authors,
     which is available under the Eclipse Public License 1.0. For details, see licenses/bin/aether-connector-okhttp.EPL1.
      * https://github.com/takari/aether-connector-okhttp
      * io.tesla.aether:aether-connector-okhttp

    This product bundles Tesla Aether version 0.0.5, copyright to original author or authors,
     which is available under the Eclipse Public License 1.0. For details, see licenses/bin/tesla-aether.EPL1.
      * https://github.com/tesla/tesla-aether
      * io.tesla.aether:tesla-aether

    This product bundles Eclipse Aether libraries version 0.9.0.M2, copyright Sonatype, Inc.,
     which is available under the Eclipse Public License 1.0. For details, see licenses/bin/aether-core.EPL1.
      * https://github.com/eclipse/aether-core
      * org.eclipse.aether:aether-api
      * org.eclipse.aether:aether-connector-file
      * org.eclipse.aether:aether-impl
      * org.eclipse.aether:aether-spi
      * org.eclipse.aether:aether-util


Mozilla Public License Version 2.0
================================

BINARY/JAVA-CORE
    This product bundles Rhino version 1.7R5, copyright Mozilla and individual contributors.,
     which is available under the Mozilla Public License Version 2.0. For details, see licenses/bin/rhino.MPL2.
      * https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Rhino
      * org.mozilla:rhino


Creative Commons Attribution 2.5
================================

BINARY/HADOOP-CLIENT
    This product bundles "Java Concurrency In Practice" Book Annotations, copyright Brian Goetz and Tim Peierls,
     which is available under the Creative Commons Attribution 2.5 license. For details, see licenses/bin/creative-commons-2.5.LICENSE.
      * http://jcip.net/
      * net.jcip:jcip-annotations


Creative Commons CC0
================================

BINARY/JAVA-CORE
    This product bundles Reactive Streams version 1.0.2, which is available under a Creative Commons CC0 license.
     For details, see licenses/bin/reactive-streams.CC0.
      * org.reactivestreams:reactive-streams


Public Domain
================================

SOURCE/JAVA-CORE
    This product uses a smear function adapted from MurmurHash3, written by Austin Appleby who has placed
     MurmurHash3 in the public domain (https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp).
      * processing/src/main/java/org/apache/druid/query/groupby/epinephelinae/Groupers.java

BINARY/JAVA-CORE
    This product bundles AOP Alliance version 1.0, which is in the public domain (http://aopalliance.sourceforge.net/).
      * aopalliance:aopalliance

    This product bundles XZ for Java version 1.8, which is in the public domain (https://tukaani.org/xz/java.html).
      * org.tukaani:xz

BINARY/HADOOP-CLIENT
    This product bundles XZ for Java version 1.0, which is in the public domain (https://tukaani.org/xz/java.html).
      * org.tukaani:xz
