////
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
    this work for additional information regarding copyright ownership.
    The ASF 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.
////

////
    ██     ██  █████  ██████  ███    ██ ██ ███    ██  ██████  ██
    ██     ██ ██   ██ ██   ██ ████   ██ ██ ████   ██ ██       ██
    ██  █  ██ ███████ ██████  ██ ██  ██ ██ ██ ██  ██ ██   ███ ██
    ██ ███ ██ ██   ██ ██   ██ ██  ██ ██ ██ ██  ██ ██ ██    ██
     ███ ███  ██   ██ ██   ██ ██   ████ ██ ██   ████  ██████  ██

    IF THIS FILE IS CALLED `index.adoc`, IT IS AUTO-GENERATED, DO NOT EDIT IT!

    Release notes `index.adoc` is generated from `src/changelog/.index.adoc.ftl`.
    Auto-generation happens during `generate-sources` phase of Maven.
    Hence, you must always

    1. Edit `.index.adoc.ftl`
    2. Run `./mvnw generate-sources`
    3. Commit both `.index.adoc.ftl` and the generated `.index.adoc`
////

[#release-notes]
== Release Notes

include::_release-notes/_0.x.x.adoc[]
include::_release-notes/_0.7.0.adoc[]
include::_release-notes/_0.6.0.adoc[]
include::_release-notes/_0.5.0.adoc[]
include::_release-notes/_0.4.0.adoc[]
include::_release-notes/_0.3.0.adoc[]
include::_release-notes/_0.2.0.adoc[]
include::_release-notes/_0.1.0.adoc[]
