<!--
 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/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. See accompanying LICENSE file.
-->

<footer class="footer">
  <div class="footer__contained">
    <div class="footer__cols">
      <div class="footer__cols__col">
        <div class="footer__cols__col__logo">
          <img src="{{'/images/beam_logo_circle.svg'|prepend:site.baseurl}}" class="footer__logo" alt="Beam logo">
        </div>
        <div class="footer__cols__col__logo">
          <img src="{{'/images/apache_logo_circle.svg'|prepend:site.baseurl}}" class="footer__logo" alt="Apache logo">
        </div>
      </div>
      <div class="footer__cols__col footer__cols__col--md">
        <div class="footer__cols__col__title">Start</div>
        <div class="footer__cols__col__link"><a href="{{'/get-started/beam-overview/'|prepend:site.baseurl}}">Overview</a></div>
        <div class="footer__cols__col__link"><a href="{{'/get-started/quickstart-java/'|prepend:site.baseurl}}">Quickstart (Java)</a></div>
        <div class="footer__cols__col__link"><a href="{{'/get-started/quickstart-py/'|prepend:site.baseurl}}">Quickstart (Python)</a></div>
        <div class="footer__cols__col__link"><a href="{{'/get-started/quickstart-go/'|prepend:site.baseurl}}">Quickstart (Go)</a></div>
        <div class="footer__cols__col__link"><a href="{{'/get-started/downloads/'|prepend:site.baseurl}}">Downloads</a></div>
      </div>
      <div class="footer__cols__col footer__cols__col--md">
        <div class="footer__cols__col__title">Docs</div>
        <div class="footer__cols__col__link"><a href="{{'/documentation/programming-guide/'|prepend:site.baseurl}}">Concepts</a></div>
        <div class="footer__cols__col__link"><a href="{{'/documentation/pipelines/design-your-pipeline/'|prepend:site.baseurl}}">Pipelines</a></div>
        <div class="footer__cols__col__link"><a href="{{'/documentation/runners/capability-matrix/'|prepend:site.baseurl}}">Runners</a></div>
      </div>
      <div class="footer__cols__col footer__cols__col--md">
        <div class="footer__cols__col__title">Community</div>
        <div class="footer__cols__col__link"><a href="{{'/contribute/'|prepend:site.baseurl}}">Contribute</a></div>
        <div class="footer__cols__col__link"><a href="https://projects.apache.org/committee.html?beam" target="_blank">Team<img src="{{ site.baseurl }}/images/external-link-icon.png"
                                                                                                                                width="14" height="14"
                                                                                                                                alt="External link."></a></div>
        <div class="footer__cols__col__link"><a href="{{'/contribute/presentation-materials/'|prepend:site.baseurl}}">Media</a></div>
       <div class="footer__cols__col__link"><a href="{{'/community/in-person/'|prepend:site.baseurl}}">Events/Meetups</a></div>
      </div>
      <div class="footer__cols__col footer__cols__col--md">
        <div class="footer__cols__col__title">Resources</div>
        <div class="footer__cols__col__link"><a href="{{'/blog/'|prepend:site.baseurl}}">Blog</a></div>
        <div class="footer__cols__col__link"><a href="{{'/community/contact-us/'|prepend:site.baseurl}}">Contact Us</a></div>
        <div class="footer__cols__col__link"><a href="https://github.com/apache/beam">GitHub</a></div>
      </div>
    </div>
  </div>
  <div class="footer__bottom">
    &copy;
    <a href="http://www.apache.org">The Apache Software Foundation</a>
    | <a href="{{ site.baseurl }}/privacy_policy">Privacy Policy</a>
    | <a href="{{ "/feed.xml" | prepend: site.baseurl }}">RSS Feed</a>
    <br><br>
    Apache Beam, Apache, Beam, the Beam logo, and the Apache feather logo are
    either registered trademarks or trademarks of The Apache Software
    Foundation. All other products or name brands are trademarks of their
    respective holders, including The Apache Software Foundation.
  </div>
</footer>
