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

   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/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 TRAFFICCONTROL SUBCOMPONENTS:

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

For readability, subcomponent licenses have been broken out into their own
files, largely located in the licenses directory. Each subcomponent enumerated
below lists the files it comprises and a link to the full text of the license.

For the fontawesome component:
@traffic_portal/app/src/assets/fonts/[Ff]ont[Aa]wesome*

These binary fontawesome fonts are provided under the SIL Open Font License 1.1:
./licenses/SIL-1.1

The fontawesome CSS files are provided under an MIT license:
./licenses/MIT-fontawesome

For the bootstrap component:
@misc/traffic-control-cdn/*/bootstrap*
./licenses/MIT-bootstrap

/*! normalize.css v3.0.1 | MIT License | git.io/normalize */
./licenses/MIT-normalize

For the sorttable component:
@traffic_monitor/static/sorttable.js
./licenses/MIT-sorttable

For the jQuery component:
./licenses/MIT-jquery

For the JSON formatter component:
@traffic_portal/app/src/assets/css/jsonformatter.min_0.6.0.css
@traffic_portal/app/src/assets/js/jsonformatter.min_0.6.0.js
./licenses/AL2-jsonformatter

For the DataTables component:
@traffic_portal/app/src/assets/css/jquery.dataTables.min_1.10.9.css
@traffic_portal/app/src/assets/js/jquery.dataTables.min_1.10.19_patched.js
@traffic_portal/app/src/assets/images/sort_*
./licenses/MIT-datatables

For the DataTables ColReorder component:
@traffic_portal/app/src/assets/css/colReorder.dataTables.min_1.5.1.css
@traffic_portal/app/src/assets/js/colReorder.dataTables.min_1.5.1.js
./licenses/MIT-ColReorder

For the DataTables Buttons component:
@traffic_portal/app/src/assets/js/dataTables.buttons.min_1.5.6.js
./licenses/MIT-datatables-buttons

For the HTML5 Buttons component:
@traffic_portal/app/src/assets/js/buttons.html5.min_1.5.6.js
./licenses/MIT-buttons-html5

For the moment.js component:
@traffic_portal/app/src/assets/js/moment-min_2.22.1.js
./licenses/MIT-momentjs

For the jsdiff component:
@traffic_portal/app/src/assets/js/jsdiff-min_3.5.0.js
./licenses/BSD-jsdiff

For the fast-json-patch component:
@traffic_portal/app/src/assets/js/fast-json-patch_v2.1.0.js
./licenses/MIT-fast-json-patch

For the angular-moment-picker component:
@traffic_portal/app/src/assets/css/angular-moment-picker_0.10.2.css
@traffic_portal/app/src/assets/js/moment-picker/angular-moment-picker.min_0.10.2.js
./licenses/MIT-angular_moment_picker

For the Chart.js component:
@traffic_portal/app/src/assets/js/chartjs/Chart.min_2.7.2.js
./licenses/MIT-chartjs

For the angular-chart.js component:
@traffic_portal/app/src/assets/js/chartjs/angular-chart.min_1.1.1.js
./licenses/BSD-angular-chartjs

For the downloadjs component:
@traffic_portal/app/src/assets/js/downloadjs-min_v4.21.js
./licenses/MIT-downloadjs

For the angular-loading-bar component:
@traffic_portal/app/src/styles/loading.scss
./licenses/MIT-angular_loading_bar

For the gentelella admin theme:
@traffic_portal/app/src/styles/theme.scss
./licenses/MIT-gentelella

For the underscore component:
@traffic_portal/app/src/assets/js/underscore-min_1.8.3.js
./licenses/MIT-underscore

For the selenium component:
@infrastructure/test/ui/vendor/github.com/tebeka/selenium/*
./infrastructure/test/ui/vendor/github.com/tebeka/selenium/LICENSE.txt

For the stoppableListener component:
@traffic_monitor/vendor/github.com/hydrogen18/stoppableListener/*
./traffic_monitor/vendor/github.com/hydrogen18/stoppableListener/LICENSE

For the fsnotify component:
@vendor/gopkg.in/fsnotify.v1/*
./vendor/gopkg.in/fsnotify.v1/LICENSE

For the yaml component:
@vendor/gopkg.in/yaml.v2/*
./vendor/gopkg.in/yaml.v2/LICENSE
./vendor/gopkg.in/yaml.v2/LICENSE.libyaml

For the jwt-go component:
@traffic_ops/experimental/traffic_ops_auth/vendor/github.com/dgrijalva/jwt-go/*
./traffic_ops/experimental/traffic_ops_auth/vendor/github.com/dgrijalva/jwt-go/LICENSE

For the pq component:
@traffic_ops/experimental/traffic_ops_auth/vendor/github.com/lib/pq/*
@vendor/github.com/lib/pq/*
./vendor/github.com/lib/pq/LICENSE.md

For the influxdb component:
@vendor/github.com/influxdata/influxdb/*
./vendor/github.com/influxdata/influxdb/LICENSE
./vendor/github.com/influxdata/influxdb/LICENSE_OF_DEPENDENCIES.md

For the errors component:
@traffic_stats/vendor/github.com/pkg/errors/*
./traffic_stats/vendor/github.com/pkg/errors/LICENSE

For the MaxMind DB GeoLite2 Database:
@traffic_router/core/src/test/resources/geo/GeoLite2-City.mmdb.gz
./licenses/CC_A_SA_4-maxmind

For the gofmt github hook:
@misc/git/pre-commit-hooks/01-gofmt
./licenses/BSD-go

For the IPv6 Perl Module component:
@traffic_ops/app/bin/checks/NetPacket/IPv6.pm
./licenses/ISC-netpacket_ipv6

Several subsections of main.css are under the MIT license, as noted in the file:
@traffic_portal/app/src/styles/main.scss
@traffic_portal/app/src/styles/main.scss

    For the bootstrap-vertical-tabs component:
    ./licenses/MIT-bootstrap_vertical_tabs

    For the cropper component:
    ./licenses/MIT-cropper

    For the bootstrap-progressbar component:
    ./licenses/MIT-bootstrap_progressbar

For the seelog component:
@traffic_stats/vendor/github.com/cihub/seelog/*
./licenses/BSD-seelog

The invalid_passwords.txt file is from the Projects/OWASP SecLists Project provided under a MIT license:
@traffic_ops/app/conf/invalid_passwords.txt
./licenses/MIT-SecLists

For the go-sqlmock component:
@traffic_ops/vendor/gopkg.in/DATA-DOG/go-sqlmock.v1/*
./traffic_ops/vendor/gopkg.in/DATA-DOG/go-sqlmock.v1/LICENSE

For the go-jwx component:
@traffic_ops/vendor/github.com/lestrrat/go-jwx/*
./traffic_ops/vendor/github.com/lestrrat/go-jwx/LICENSE

For the protobuf component:
@traffic_ops/vendor/github.com/golang/protobuf/*
./traffic_ops/vendor/github.com/golang/protobuf/LICENSE

For the sqlx component:
@vendor/github.com/jmoiron/sqlx/*
./vendor/github.com/jmoiron/sqlx/LICENSE

For the backoff component:
@traffic_ops/vendor/github.com/basho/backoff/*
./traffic_ops/vendor/github.com/basho/backoff/README.md

The riak-go-client component is used under the Apache license:
@traffic_ops/vendor/github.com/basho/riak-go-client/*
./traffic_ops/vendor/github.com/basho/riak-go-client/LICENSE

The envconfig component is used under the MIT license:
@traffic_ops/vendor/github.com/kelseyhightower/envconfig/*
./traffic_ops/vendor/github.com/kelseyhightower/envconfig/LICENSE

The govalidator component is used under the MIT license:
@vendor/github.com/asaskevich/govalidator/*
./vendor/github.com/asaskevich/govalidator/LICENSE

The ozzo-validation component is used under the MIT license:
@vendor/github.com/go-ozzo/ozzo-validation/*
./vendor/github.com/go-ozzo/ozzo-validation/LICENSE

The bytefmt component is used under the Apache 2.0 license:
@grove/vendor/code.cloudfoundry.org/bytefmt/*
./grove/vendor/code.cloudfoundry.org/bytefmt/LICENSE

The bytefmt component is used under the MIT license:
@grove/vendor/github.com/coreos/bbolt/*
./grove/vendor/github.com/coreos/bbolt/LICENSE

For the siphash component:
@grove/vendor/github.com/dchest/siphash/*
./licenses/CC0

For the miekg/dns component:
@traffic_ops/traffic_ops_golang/vendor/github.com/miekg/dns/*
./licenses/BSD-miekg-dns

The asn1-ber.v1 component is used under the MIT license:
@traffic_ops/vendor/gopkg.in/asn1-ber.v1/*
./traffic_ops/vendor/gopkg.in/asn1-ber.v1/LICENSE

The ldap.v2 component is used under the MIT license:
@traffic_ops/vendor/gopkg.in/ldap.v2/*
./traffic_ops/vendor/gopkg.in/ldap.v2/LICENSE

The json-iterator/go component is used under the MIT license:
@vendor/github.com/json-iterator/go/*
./vendor/github.com/json-iterator/go/LICENSE

The modern-go/concurrent component is used under the Apache 2.0 license:
@vendor/github.com/modern-go/concurrent/*
./vendor/github.com/modern-go/concurrent/LICENSE

The modern-go/reflect2 component is used under the Apache 2.0 license:
@vendor/github.com/modern-go/reflect2/*
./vendor/github.com/modern-go/reflect2/LICENSE

For the lestrrat-go/jwx (commit e35178a) component:
@traffic_ops/traffic_ops_golang/vendor/github.com/lestrrat-go/jwx/*
./traffic_ops/traffic_ops_golang/vendor/github.com/lestrrat-go/jwx/LICENSE

For the dgrijalva/jwt-go (commit 5e25c22) component:
@traffic_ops/traffic_ops_golang/vendor/github.com/dgrijalva/jwt-go/*
./traffic_ops/traffic_ops_golang/vendor/github.com/dgrijalva/jwt-go/LICENSE

For the ogier/pflag (commit 45c278a) component:
@vendor/github.com/ogier/pflag/*
./licenses/BSD-pflag

For the errors (commit 27936f6) component:
@vendor/github.com/pkg/errors/*
./vendor/github.com/pkg/errors/LICENSE
