# 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

   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 Java SE Platform Products in binary
   form that you selected for download, install or use from Oracle or its
   authorized licensees, 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.  "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, netbooks, 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 Java
   technology applets and applications  intended to run on the Java Platform,
   Standard Edition platform on Java-enabled General Purpose Desktop
   Computers and Servers.  "Commercial Features" means those features
   identified in Table 1-1 (Commercial Features In Java SE Product Editions)
   of the Software documentation accessible at 
   http://www.oracle.com/technetwork/java/javase/documentation/index.html. 
   "README File" means the README file for the Software accessible at
   http://www.oracle.com/technetwork/java/javase/terms/readme/index.html.

   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/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 README File 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  
   README File, 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
   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 G, 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.

   D.  LICENSE TO DISTRIBUTE REDISTRIBUTABLES.  Subject to the terms and
   conditions of this Agreement and restrictions and exceptions set forth in
   the README  File, 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 and distribute  those files specifically identified as
   redistributable in the   README File ("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 README
   File), (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 G, (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.

   E.  DISTRIBUTION BY PUBLISHERS.  This section pertains to your
   distribution  of the JavaTM SE Development Kit Software 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 Software 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 Software on a stand-alone
   basis; it must be distributed with your Publication(s); (ii) You are
   responsible for downloading the Software from the applicable Oracle web
   site; (iii) You must refer to the Software as JavaTM SE Development Kit;
   (iv) The Software 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
   2011, 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.  This information must be placed on the Media 
   label in such a manner as to only apply to the Oracle  Software;  (vi) You
   must clearly identify the Software 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 Software; (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 Software 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.  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 identified Table 1-1 (Commercial Features In Java SE
   Product Editions) of the Software documentation accessible at
   http://www.oracle.com/technetwork/java/javase/documentation/index.html

   H.  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.

   I.  THIRD PARTY CODE.  Additional copyright notices and license terms
   applicable to portions of the Software are set forth in the
   THIRDPARTYLICENSEREADME file 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  THIRDPARTYLICENSEREADME
   file, 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.

   J.  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.

   K.  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 May 17, 2011
