<!--

    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.

-->

#### Contributors

 * Andrew Dufilie (https://github.com/adufilie)
 * Alex Harui (https://github.com/aharui)
 * Omprakash Muppirala (https://github.com/bigosmallm)
 * Carlos Rovira (https://github.com/carlosrovira)
 * Christofer Dutz (https://github.com/chrisdutz)
 * Andrew Wetmore (https://github.com/cottage14)
 * Frédéric Thomas (https://github.com/doublefx)
 * Erik DeBruin (https://github.com/erikdebruin)
 * Harbs (https://github.com/harbs)
 * Josh Tynjala (https://github.com/joshtynjala)
 * Justin Mclean (https://github.com/justinmclean)
 * Peter Ent (https://github.com/pentapache)
 * Piotr Zarzycki (https://github.com/piotrzarzycki21)
 * Yishay Weiss (https://github.com/yishayw)

