# File generated from the output of:
# links -dump http://www.oracle.com/technetwork/java/javase/terms/license/index.html
# For up-to-date version with html links, please check the URL

   Oracle Binary Code License Agreement for the Java SE Platform Products and
   JavaFX

   ORACLE AMERICA, INC. ("ORACLE"), FOR AND ON BEHALF OF ITSELF AND ITS
   SUBSIDIARIES AND AFFILIATES UNDER COMMON CONTROL, IS WILLING TO LICENSE
   THE SOFTWARE TO YOU ONLY UPON THE CONDITION THAT YOU ACCEPT ALL OF THE
   TERMS CONTAINED IN THIS BINARY CODE LICENSE AGREEMENT AND SUPPLEMENTAL
   LICENSE TERMS (COLLECTIVELY "AGREEMENT"). PLEASE READ THE AGREEMENT
   CAREFULLY. BY SELECTING THE "ACCEPT LICENSE AGREEMENT" (OR THE EQUIVALENT)
   BUTTON AND/OR BY USING THE SOFTWARE YOU ACKNOWLEDGE THAT YOU HAVE READ THE
   TERMS AND AGREE TO THEM. IF YOU ARE AGREEING TO THESE TERMS ON BEHALF OF A
   COMPANY OR OTHER LEGAL ENTITY, YOU REPRESENT THAT YOU HAVE THE LEGAL
   AUTHORITY TO BIND THE LEGAL ENTITY TO THESE TERMS. IF YOU DO NOT HAVE SUCH
   AUTHORITY, OR IF YOU DO NOT WISH TO BE BOUND BY THE TERMS, THEN SELECT THE
   "DECLINE LICENSE AGREEMENT" (OR THE EQUIVALENT) BUTTON AND YOU MUST NOT
   USE THE SOFTWARE ON THIS SITE OR ANY OTHER MEDIA ON WHICH THE SOFTWARE IS
   CONTAINED.

   1. DEFINITIONS. "Software" means the software identified above in binary
   form that you selected for download, install or use (in the version You
   selected for download, install or use) from Oracle or its authorized
   licensees and/or those portions of such software produced by jlink as
   output using a Program’s code, when such output is in unmodified form in
   combination, and for sole use with, that Program, as well as any other
   machine readable materials (including, but not limited to, libraries,
   source files, header files, and data files), any updates or error
   corrections provided by Oracle, and any user manuals, programming guides
   and other documentation provided to you by Oracle under this Agreement.
   The Java Linker (jlink) is available with Java 9 and later versions. 
   "General Purpose Desktop Computers and Servers" means computers, including
   desktop and laptop computers, or servers, used for general computing
   functions under end user control (such as but not specifically limited to
   email, general purpose Internet browsing, and office suite productivity
   tools). The use of Software in systems and solutions that provide
   dedicated functionality (other than as mentioned above) or designed for
   use in embedded or function-specific software applications, for example
   but not limited to: Software embedded in or bundled with industrial
   control systems, wireless mobile telephones, wireless handheld devices,
   kiosks, TV/STB, Blu-ray Disc devices, telematics and network control
   switching equipment, printers and storage management systems, and other
   related systems are excluded from this definition and not licensed under
   this Agreement. "Programs" means (a) Java technology applets and
   applications intended to run on the Java Platform, Standard Edition
   platform on Java-enabled General Purpose Desktop Computers and Servers;
   and (b) JavaFX technology applications intended to run on the JavaFX
   Runtime on JavaFX-enabled General Purpose Desktop Computers and Servers.
   “Java SE LIUM” means the Licensing Information User Manual – Oracle Java
   SE and Oracle Java Embedded Products Document accessible at
   http://www.oracle.com/technetwork/java/javase/documentation/index.html.
   “Commercial Features” means those features that are identified as such in
   the Java SE LIUM under the “Description of Product Editions and Permitted
   Features” section.

   2. LICENSE TO USE. Subject to the terms and conditions of this Agreement
   including, but not limited to, the Java Technology Restrictions of the
   Supplemental License Terms, Oracle grants you a non-exclusive,
   non-transferable, limited license without license fees to reproduce and
   use internally the Software complete and unmodified for the sole purpose
   of running Programs. THE LICENSE SET FORTH IN THIS SECTION 2 DOES NOT
   EXTEND TO THE COMMERCIAL FEATURES. YOUR RIGHTS AND OBLIGATIONS RELATED TO
   THE COMMERCIAL FEATURES ARE AS SET FORTH IN THE SUPPLEMENTAL TERMS ALONG
   WITH ADDITIONAL LICENSES FOR DEVELOPERS AND PUBLISHERS.

   3. RESTRICTIONS. Software is copyrighted. Title to Software and all
   associated intellectual property rights is retained by Oracle and/or its
   licensors. Unless enforcement is prohibited by applicable law, you may not
   modify, decompile, or reverse engineer Software. You acknowledge that the
   Software is developed for general use in a variety of information
   management applications; it is not developed or intended for use in any
   inherently dangerous applications, including applications that may create
   a risk of personal injury. If you use the Software in dangerous
   applications, then you shall be responsible to take all appropriate
   fail-safe, backup, redundancy, and other measures to ensure its safe use.
   Oracle disclaims any express or implied warranty of fitness for such uses.
   No right, title or interest in or to any trademark, service mark, logo or
   trade name of Oracle or its licensors is granted under this Agreement.
   Additional restrictions for developers and/or publishers licenses are set
   forth in the Supplemental License Terms.

   4. DISCLAIMER OF WARRANTY. THE SOFTWARE IS PROVIDED "AS IS" WITHOUT
   WARRANTY OF ANY KIND. ORACLE FURTHER DISCLAIMS ALL WARRANTIES, EXPRESS AND
   IMPLIED, INCLUDING WITHOUT LIMITATION, ANY IMPLIED WARRANTIES OF
   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.

   5. LIMITATION OF LIABILITY. IN NO EVENT SHALL ORACLE BE LIABLE FOR ANY
   INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE OR CONSEQUENTIAL DAMAGES, OR
   DAMAGES FOR LOSS OF PROFITS, REVENUE, DATA OR DATA USE, INCURRED BY YOU OR
   ANY THIRD PARTY, WHETHER IN AN ACTION IN CONTRACT OR TORT, EVEN IF ORACLE
   HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. ORACLE'S ENTIRE
   LIABILITY FOR DAMAGES HEREUNDER SHALL IN NO EVENT EXCEED ONE THOUSAND
   DOLLARS (U.S. $1,000).

   6. TERMINATION. This Agreement is effective until terminated. You may
   terminate this Agreement at any time by destroying all copies of Software.
   This Agreement will terminate immediately without notice from Oracle if
   you fail to comply with any provision of this Agreement. Either party may
   terminate this Agreement immediately should any Software become, or in
   either party's opinion be likely to become, the subject of a claim of
   infringement of any intellectual property right. Upon termination, you
   must destroy all copies of Software.

   7. EXPORT REGULATIONS. You agree that U.S. export control laws and other
   applicable export and import laws govern your use of the Software,
   including technical data; additional information can be found on Oracle's
   Global Trade Compliance web site
   (http://www.oracle.com/us/products/export). You agree that neither the
   Software nor any direct product thereof will be exported, directly, or
   indirectly, in violation of these laws, or will be used for any purpose
   prohibited by these laws including, without limitation, nuclear, chemical,
   or biological weapons proliferation.

   8. TRADEMARKS AND LOGOS. You acknowledge and agree as between you and
   Oracle that Oracle owns the ORACLE and JAVA trademarks and all ORACLE- and
   JAVA-related trademarks, service marks, logos and other brand designations
   ("Oracle Marks"), and you agree to comply with the Third Party Usage
   Guidelines for Oracle Trademarks currently located at
   http://www.oracle.com/us/legal/third-party-trademarks/index.html. Any use
   you make of the Oracle Marks inures to Oracle's benefit.

   9. U.S. GOVERNMENT LICENSE RIGHTS. If Software is being acquired by or on
   behalf of the U.S. Government or by a U.S. Government prime contractor or
   subcontractor (at any tier), then the Government's rights in Software and
   accompanying documentation shall be only those set forth in this
   Agreement.

   10. GOVERNING LAW. This agreement is governed by the substantive and
   procedural laws of California. You and Oracle agree to submit to the
   exclusive jurisdiction of, and venue in, the courts of San Francisco, or
   Santa Clara counties in California in any dispute arising out of or
   relating to this agreement.

   11. SEVERABILITY. If any provision of this Agreement is held to be
   unenforceable, this Agreement will remain in effect with the provision
   omitted, unless omission would frustrate the intent of the parties, in
   which case this Agreement will immediately terminate.

   12. INTEGRATION. This Agreement is the entire agreement between you and
   Oracle relating to its subject matter. It supersedes all prior or
   contemporaneous oral or written communications, proposals, representations
   and warranties and prevails over any conflicting or additional terms of
   any quote, order, acknowledgment, or other communication between the
   parties relating to its subject matter during the term of this Agreement.
   No modification of this Agreement will be binding, unless in writing and
   signed by an authorized representative of each party.

   SUPPLEMENTAL LICENSE TERMS

   These Supplemental License Terms add to or modify the terms of the Binary
   Code License Agreement. Capitalized terms not defined in these
   Supplemental Terms shall have the same meanings ascribed to them in the
   Binary Code License Agreement. These Supplemental Terms shall supersede
   any inconsistent or conflicting terms in the Binary Code License
   Agreement, or in any license contained within the Software.

   A. COMMERCIAL FEATURES. You may not use the Commercial Features for
   running Programs, Java applets or applications in your internal business
   operations or for any commercial or production purpose, or for any purpose
   other than as set forth in Sections B, C, D and E of these Supplemental
   Terms. If You want to use the Commercial Features for any purpose other
   than as permitted in this Agreement, You must obtain a separate license
   from Oracle.

   B. SOFTWARE INTERNAL USE FOR DEVELOPMENT LICENSE GRANT. Subject to the
   terms and conditions of this Agreement and restrictions and exceptions set
   forth in the Java SE LIUM incorporated herein by reference, including, but
   not limited to the Java Technology Restrictions of these Supplemental
   Terms, Oracle grants you a non-exclusive, non-transferable, limited
   license without fees to reproduce internally and use internally the
   Software complete and unmodified for the purpose of designing, developing,
   and testing your Programs.

   C. LICENSE TO DISTRIBUTE SOFTWARE. Subject to the terms and conditions of
   this Agreement and restrictions and exceptions set forth in the Java SE
   LIUM, including, but not limited to the Java Technology Restrictions and
   Limitations on Redistribution of these Supplemental Terms, Oracle grants
   you a non-exclusive, non-transferable, limited license without fees to
   reproduce and distribute the Software, provided that (i) you distribute
   the Software complete and unmodified and only bundled as part of, and for
   the sole purpose of running, your Programs, (ii) the Programs add
   significant and primary functionality to the Software, (iii) you do not
   distribute additional software intended to replace any component(s) of the
   Software, (iv) you do not remove or alter any proprietary legends or
   notices contained in the Software, (v) you only distribute the Software
   subject to a license agreement that: (a) is a complete, unmodified
   reproduction of this Agreement; or (b) protects Oracle's interests
   consistent with the terms contained in this Agreement and that includes
   the notice set forth in Section H, and (vi) you agree to defend and
   indemnify Oracle and its licensors from and against any damages, costs,
   liabilities, settlement amounts and/or expenses (including attorneys'
   fees) incurred in connection with any claim, lawsuit or action by any
   third party that arises or results from the use or distribution of any and
   all Programs and/or Software. The license set forth in this Section C does
   not extend to the Software identified in Section G.

   D. LICENSE TO DISTRIBUTE REDISTRIBUTABLES. Subject to the terms and
   conditions of this Agreement and restrictions and exceptions set forth in
   the Java SE LIUM, including but not limited to the Java Technology
   Restrictions and Limitations on Redistribution of these Supplemental
   Terms, Oracle grants you a non-exclusive, non-transferable, limited
   license without fees to reproduce and distribute those files specifically
   identified as redistributable in the Java SE LIUM ("Redistributables")
   provided that: (i) you distribute the Redistributables complete and
   unmodified, and only bundled as part of Programs, (ii) the Programs add
   significant and primary functionality to the Redistributables, (iii) you
   do not distribute additional software intended to supersede any
   component(s) of the Redistributables (unless otherwise specified in the
   applicable Java SE LIUM), (iv) you do not remove or alter any proprietary
   legends or notices contained in or on the Redistributables, (v) you only
   distribute the Redistributables pursuant to a license agreement that: (a)
   is a complete, unmodified reproduction of this Agreement; or (b) protects
   Oracle's interests consistent with the terms contained in the Agreement
   and includes the notice set forth in Section H, (vi) you agree to defend
   and indemnify Oracle and its licensors from and against any damages,
   costs, liabilities, settlement amounts and/or expenses (including
   attorneys' fees) incurred in connection with any claim, lawsuit or action
   by any third party that arises or results from the use or distribution of
   any and all Programs and/or Software. The license set forth in this
   Section D does not extend to the Software identified in Section G.

   E. DISTRIBUTION BY PUBLISHERS. This section pertains to your distribution
   of the JavaTM SE Development Kit Software (“JDK”) with your printed book
   or magazine (as those terms are commonly used in the industry) relating to
   Java technology ("Publication"). Subject to and conditioned upon your
   compliance with the restrictions and obligations contained in the
   Agreement, Oracle hereby grants to you a non-exclusive, nontransferable
   limited right to reproduce complete and unmodified copies of the JDK on
   electronic media (the "Media") for the sole purpose of inclusion and
   distribution with your Publication(s), subject to the following terms: (i)
   You may not distribute the JDK on a stand-alone basis; it must be
   distributed with your Publication(s); (ii) You are responsible for
   downloading the JDK from the applicable Oracle web site; (iii) You must
   refer to the JDK as JavaTM SE Development Kit; (iv) The JDK must be
   reproduced in its entirety and without any modification whatsoever
   (including with respect to all proprietary notices) and distributed with
   your Publication subject to a license agreement that is a complete,
   unmodified reproduction of this Agreement; (v) The Media label shall
   include the following information: “Copyright [YEAR], Oracle America, Inc.
   All rights reserved. Use is subject to license terms. ORACLE and JAVA
   trademarks and all ORACLE- and JAVA-related trademarks, service marks,
   logos and other brand designations are trademarks or registered trademarks
   of Oracle in the U.S. and other countries.” [YEAR] is the year of Oracle's
   release of the Software; the year information can typically be found in
   the Software’s “About” box or screen. This information must be placed on
   the Media label in such a manner as to only apply to the JDK; (vi) You
   must clearly identify the JDK as Oracle's product on the Media holder or
   Media label, and you may not state or imply that Oracle is responsible for
   any third-party software contained on the Media; (vii) You may not include
   any third party software on the Media which is intended to be a
   replacement or substitute for the JDK; (viii) You agree to defend and
   indemnify Oracle and its licensors from and against any damages, costs,
   liabilities, settlement amounts and/or expenses (including attorneys'
   fees) incurred in connection with any claim, lawsuit or action by any
   third party that arises or results from the use or distribution of the JDK
   and/or the Publication; ; and (ix) You shall provide Oracle with a written
   notice for each Publication; such notice shall include the following
   information: (1) title of Publication, (2) author(s), (3) date of
   Publication, and (4) ISBN or ISSN numbers. Such notice shall be sent to
   Oracle America, Inc., 500 Oracle Parkway, Redwood Shores, California 94065
   U.S.A , Attention: General Counsel.

   F. JAVA TECHNOLOGY RESTRICTIONS. You may not create, modify, or change the
   behavior of, or authorize your licensees to create, modify, or change the
   behavior of, classes, interfaces, or subpackages that are in any way
   identified as "java", "javax", "sun", “oracle” or similar convention as
   specified by Oracle in any naming convention designation.

   G. LIMITATIONS ON REDISTRIBUTION. You may not redistribute or otherwise
   transfer patches, bug fixes or updates made available by Oracle through
   Oracle Premier Support, including those made available under Oracle's Java
   SE Support program.

   H. COMMERCIAL FEATURES NOTICE. For purpose of complying with Supplemental
   Term Section C.(v)(b) and D.(v)(b), your license agreement shall include
   the following notice, where the notice is displayed in a manner that
   anyone using the Software will see the notice:

   Use of the Commercial Features for any commercial or production purpose
   requires a separate license from Oracle. “Commercial Features” means those
   features that are identified as such in the Licensing Information User
   Manual – Oracle Java SE and Oracle Java Embedded Products Document,
   accessible
   at http://www.oracle.com/technetwork/java/javase/documentation/index.html,
   under the “Description of Product Editions and Permitted Features”
   section.
    
   I. SOURCE CODE. Software may contain source code that, unless expressly
   licensed for other purposes, is provided solely for reference purposes
   pursuant to the terms of this Agreement. Source code may not be
   redistributed unless expressly provided for in this Agreement.

   J. THIRD PARTY CODE. Additional copyright notices and license terms
   applicable to portions of the Software are set forth in the Java SE LIUM
   accessible at
   http://www.oracle.com/technetwork/java/javase/documentation/index.html. In
   addition to any terms and conditions of any third party
   opensource/freeware license identified in the Java SE LIUM, the disclaimer
   of warranty and limitation of liability provisions in paragraphs 4 and 5
   of the Binary Code License Agreement shall apply to all Software in this
   distribution.

   K. TERMINATION FOR INFRINGEMENT. Either party may terminate this Agreement
   immediately should any Software become, or in either party's opinion be
   likely to become, the subject of a claim of infringement of any
   intellectual property right.

   L. INSTALLATION AND AUTO-UPDATE. The Software's installation and
   auto-update processes transmit a limited amount of data to Oracle (or its
   service provider) about those specific processes to help Oracle understand
   and optimize them. Oracle does not associate the data with personally
   identifiable information. You can find more information about the data
   Oracle collects as a result of your Software download at
   http://www.oracle.com/technetwork/java/javase/documentation/index.html.

   For inquiries please contact: Oracle America, Inc., 500 Oracle Parkway,

   Redwood Shores, California 94065, USA.

   Last updated 21 September 2017
