# lynx -dump http://www.google.com/chrome/intl/en/eula_text.html

Google Chrome Terms of Service

   These Terms of Service apply to the executable code version of Google
   Chrome. Source code for Google Chrome is available free of charge under
   open source software license agreements at
   http://code.google.com/chromium/terms.html.

   1. Your relationship with Google

   1.1 Your use of Google’s products, software, services and web sites
   (referred to collectively as the “Services” in this document and
   excluding any services provided to you by Google under a separate
   written agreement) is subject to the terms of a legal agreement between
   you and Google. “Google” means Google Inc., whose principal place of
   business is at 1600 Amphitheatre Parkway, Mountain View, CA 94043,
   United States. This document explains how the agreement is made up, and
   sets out some of the terms of that agreement.

   1.2 Unless otherwise agreed in writing with Google, your agreement with
   Google will always include, at a minimum, the terms and conditions set
   out in this document. These are referred to below as the “Universal
   Terms”. Open source software licenses for Google Chrome source code
   constitute separate written agreements. To the limited extent that the
   open source software licenses expressly supersede these Universal
   Terms, the open source licenses govern your agreement with Google for
   the use of Google Chrome or specific included components of Google
   Chrome.

   1.3 Your agreement with Google will also include the terms set forth
   below in the Google Chrome Additional Terms of Service and terms of any
   Legal Notices applicable to the Services, in addition to the Universal
   Terms. All of these are referred to below as the “Additional Terms”.
   Where Additional Terms apply to a Service, these will be accessible for
   you to read either within, or through your use of, that Service.

   1.4 The Universal Terms, together with the Additional Terms, form a
   legally binding agreement between you and Google in relation to your
   use of the Services. It is important that you take the time to read
   them carefully. Collectively, this legal agreement is referred to below
   as the “Terms”.

   1.5 If there is any contradiction between what the Additional Terms say
   and what the Universal Terms say, then the Additional Terms shall take
   precedence in relation to that Service.

   2. Accepting the Terms

   2.1 In order to use the Services, you must first agree to the Terms.
   You may not use the Services if you do not accept the Terms.

   2.2 You can accept the Terms by:

   (A) clicking to accept or agree to the Terms, where this option is made
   available to you by Google in the user interface for any Service; or

   (B) by actually using the Services. In this case, you understand and
   agree that Google will treat your use of the Services as acceptance of
   the Terms from that point onwards.

   3. Language of the Terms

   3.1 Where Google has provided you with a translation of the English
   language version of the Terms, then you agree that the translation is
   provided for your convenience only and that the English language
   versions of the Terms will govern your relationship with Google.

   3.2 If there is any contradiction between what the English language
   version of the Terms says and what a translation says, then the English
   language version shall take precedence.

   4. Provision of the Services by Google

   4.1 Google has subsidiaries and affiliated legal entities around the
   world (“Subsidiaries and Affiliates”). Sometimes, these companies will
   be providing the Services to you on behalf of Google itself. You
   acknowledge and agree that Subsidiaries and Affiliates will be entitled
   to provide the Services to you.

   4.2 Google is constantly innovating in order to provide the best
   possible experience for its users. You acknowledge and agree that the
   form and nature of the Services which Google provides may change from
   time to time without prior notice to you.

   4.3 As part of this continuing innovation, you acknowledge and agree
   that Google may stop (permanently or temporarily) providing the
   Services (or any features within the Services) to you or to users
   generally at Google’s sole discretion, without prior notice to you. You
   may stop using the Services at any time. You do not need to
   specifically inform Google when you stop using the Services.

   4.4 You acknowledge and agree that if Google disables access to your
   account, you may be prevented from accessing the Services, your account
   details or any files or other content which is contained in your
   account.

   5. Use of the Services by you

   5.1 You agree to use the Services only for purposes that are permitted
   by (a) the Terms and (b) any applicable law, regulation or generally
   accepted practices or guidelines in the relevant jurisdictions
   (including any laws regarding the export of data or software to and
   from the United States or other relevant countries).

   5.2 You agree that you will not engage in any activity that interferes
   with or disrupts the Services (or the servers and networks which are
   connected to the Services).

   5.3 Unless you have been specifically permitted to do so in a separate
   agreement with Google, you agree that you will not reproduce,
   duplicate, copy, sell, trade or resell the Services for any purpose.

   5.4 You agree that you are solely responsible for (and that Google has
   no responsibility to you or to any third party for) any breach of your
   obligations under the Terms and for the consequences (including any
   loss or damage which Google may suffer) of any such breach.

   6. Privacy and your personal information

   6.1 For information about Google’s data protection practices, please
   read Google’s privacy policy at http://www.google.com/privacy.html and
   at http://www.google.com/chrome/intl/en/privacy.html. This policy
   explains how Google treats your personal information, and protects your
   privacy, when you use the Services.

   6.2 You agree to the use of your data in accordance with Google’s
   privacy policies.

   7. Content in the Services

   7.1 You understand that all information (such as data files, written
   text, computer software, music, audio files or other sounds,
   photographs, videos or other images) which you may have access to as
   part of, or through your use of, the Services are the sole
   responsibility of the person from which such content originated. All
   such information is referred to below as the “Content.”

   7.2 You should be aware that Content presented to you as part of the
   Services, including but not limited to advertisements in the Services
   and sponsored Content within the Services may be protected by
   intellectual property rights which are owned by the sponsors or
   advertisers who provide that Content to Google (or by other persons or
   companies on their behalf). You may not modify, rent, lease, loan,
   sell, distribute or create derivative works based on this Content
   (either in whole or in part) unless you have been specifically told
   that you may do so by Google or by the owners of that Content, in a
   separate agreement.

   7.3 Google reserves the right (but shall have no obligation) to
   pre-screen, review, flag, filter, modify, refuse or remove any or all
   Content from any Service. For some of the Services, Google may provide
   tools to filter out explicit sexual content. These tools include the
   SafeSearch preference settings (see
   http://www.google.com/help/customize.html#safe). In addition, there are
   commercially available services and software to limit access to
   material that you may find objectionable.

   7.4 You understand that by using the Services you may be exposed to
   Content that you may find offensive, indecent or objectionable and
   that, in this respect, you use the Services at your own risk.

   7.5 You agree that you are solely responsible for (and that Google has
   no responsibility to you or to any third party for) any Content that
   you create, transmit or display while using the Services and for the
   consequences of your actions (including any loss or damage which Google
   may suffer) by doing so.

   8. Proprietary rights

   8.1 You acknowledge and agree that Google (or Google’s licensors) own
   all legal right, title and interest in and to the Services, including
   any intellectual property rights which subsist in the Services (whether
   those rights happen to be registered or not, and wherever in the world
   those rights may exist).

   8.2 Unless you have agreed otherwise in writing with Google, nothing in
   the Terms gives you a right to use any of Google’s trade names, trade
   marks, service marks, logos, domain names, and other distinctive brand
   features.

   8.3 If you have been given an explicit right to use any of these brand
   features in a separate written agreement with Google, then you agree
   that your use of such features shall be in compliance with that
   agreement, any applicable provisions of the Terms, and Google's brand
   feature use guidelines as updated from time to time. These guidelines
   can be viewed online at
   http://www.google.com/permissions/guidelines.html (or such other URL as
   Google may provide for this purpose from time to time).

   8.4 Google acknowledges and agrees that it obtains no right, title or
   interest from you (or your licensors) under these Terms in or to any
   Content that you submit, post, transmit or display on, or through, the
   Services, including any intellectual property rights which subsist in
   that Content (whether those rights happen to be registered or not, and
   wherever in the world those rights may exist). Unless you have agreed
   otherwise in writing with Google, you agree that you are responsible
   for protecting and enforcing those rights and that Google has no
   obligation to do so on your behalf.

   8.5 You agree that you shall not remove, obscure, or alter any
   proprietary rights notices (including copyright and trade mark notices)
   which may be affixed to or contained within the Services.

   8.6 Unless you have been expressly authorized to do so in writing by
   Google, you agree that in using the Services, you will not use any
   trade mark, service mark, trade name, logo of any company or
   organization in a way that is likely or intended to cause confusion
   about the owner or authorized user of such marks, names or logos.

   9. License from Google

   9.1 Google gives you a personal, worldwide, royalty-free,
   non-assignable and non-exclusive license to use the software provided
   to you by Google as part of the Services as provided to you by Google
   (referred to as the “Software” below). This license is for the sole
   purpose of enabling you to use and enjoy the benefit of the Services as
   provided by Google, in the manner permitted by the Terms.

   9.2 Subject to section 1.2, you may not (and you may not permit anyone
   else to) copy, modify, create a derivative work of, reverse engineer,
   decompile or otherwise attempt to extract the source code of the
   Software or any part thereof, unless this is expressly permitted or
   required by law, or unless you have been specifically told that you may
   do so by Google, in writing.

   9.3 Subject to section 1.2, unless Google has given you specific
   written permission to do so, you may not assign (or grant a sub-license
   of) your rights to use the Software, grant a security interest in or
   over your rights to use the Software, or otherwise transfer any part of
   your rights to use the Software.

   10. Content license from you

   10.1 You retain copyright and any other rights you already hold in
   Content which you submit, post or display on or through, the Services.

   11. Software updates

   11.1 The Software which you use may automatically download and install
   updates from time to time from Google. These updates are designed to
   improve, enhance and further develop the Services and may take the form
   of bug fixes, enhanced functions, new software modules and completely
   new versions. You agree to receive such updates (and permit Google to
   deliver these to you) as part of your use of the Services.

   12. Ending your relationship with Google

   12.1 The Terms will continue to apply until terminated by either you or
   Google as set out below.

   12.2 Google may at any time, terminate its legal agreement with you if:

   (A) you have breached any provision of the Terms (or have acted in
   manner which clearly shows that you do not intend to, or are unable to
   comply with the provisions of the Terms); or

   (B) Google is required to do so by law (for example, where the
   provision of the Services to you is, or becomes, unlawful); or

   (C) the partner with whom Google offered the Services to you has
   terminated its relationship with Google or ceased to offer the Services
   to you; or

   (D) Google is transitioning to no longer providing the Services to
   users in the country in which you are resident or from which you use
   the service; or

   (E) the provision of the Services to you by Google is, in Google’s
   opinion, no longer commercially viable.

   12.3 Nothing in this Section shall affect Google’s rights regarding
   provision of Services under Section 4 of the Terms.

   12.4 When these Terms come to an end, all of the legal rights,
   obligations and liabilities that you and Google have benefited from,
   been subject to (or which have accrued over time whilst the Terms have
   been in force) or which are expressed to continue indefinitely, shall
   be unaffected by this cessation, and the provisions of paragraph 19.7
   shall continue to apply to such rights, obligations and liabilities
   indefinitely.

   13. EXCLUSION OF WARRANTIES

   13.1 NOTHING IN THESE TERMS, INCLUDING SECTIONS 13 AND 14, SHALL
   EXCLUDE OR LIMIT GOOGLE’S WARRANTY OR LIABILITY FOR LOSSES WHICH MAY
   NOT BE LAWFULLY EXCLUDED OR LIMITED BY APPLICABLE LAW. SOME
   JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF CERTAIN WARRANTIES OR
   CONDITIONS OR THE LIMITATION OR EXCLUSION OF LIABILITY FOR LOSS OR
   DAMAGE CAUSED BY NEGLIGENCE, BREACH OF CONTRACT OR BREACH OF IMPLIED
   TERMS, OR INCIDENTAL OR CONSEQUENTIAL DAMAGES. ACCORDINGLY, ONLY THE
   LIMITATIONS WHICH ARE LAWFUL IN YOUR JURISDICTION WILL APPLY TO YOU AND
   OUR LIABILITY WILL BE LIMITED TO THE MAXIMUM EXTENT PERMITTED BY LAW.

   13.2 YOU EXPRESSLY UNDERSTAND AND AGREE THAT YOUR USE OF THE SERVICES
   IS AT YOUR SOLE RISK AND THAT THE SERVICES ARE PROVIDED "AS IS" AND “AS
   AVAILABLE.”

   13.3 IN PARTICULAR, GOOGLE, ITS SUBSIDIARIES AND AFFILIATES, AND ITS
   LICENSORS DO NOT REPRESENT OR WARRANT TO YOU THAT:

   (A) YOUR USE OF THE SERVICES WILL MEET YOUR REQUIREMENTS,

   (B) YOUR USE OF THE SERVICES WILL BE UNINTERRUPTED, TIMELY, SECURE OR
   FREE FROM ERROR,

   (C) ANY INFORMATION OBTAINED BY YOU AS A RESULT OF YOUR USE OF THE
   SERVICES WILL BE ACCURATE OR RELIABLE, AND

   (D) THAT DEFECTS IN THE OPERATION OR FUNCTIONALITY OF ANY SOFTWARE
   PROVIDED TO YOU AS PART OF THE SERVICES WILL BE CORRECTED.

   13.4 ANY MATERIAL DOWNLOADED OR OTHERWISE OBTAINED THROUGH THE USE OF
   THE SERVICES IS DONE AT YOUR OWN DISCRETION AND RISK AND THAT YOU WILL
   BE SOLELY RESPONSIBLE FOR ANY DAMAGE TO YOUR COMPUTER SYSTEM OR OTHER
   DEVICE OR LOSS OF DATA THAT RESULTS FROM THE DOWNLOAD OF ANY SUCH
   MATERIAL.

   13.5 NO ADVICE OR INFORMATION, WHETHER ORAL OR WRITTEN, OBTAINED BY YOU
   FROM GOOGLE OR THROUGH OR FROM THE SERVICES SHALL CREATE ANY WARRANTY
   NOT EXPRESSLY STATED IN THE TERMS.

   13.6 GOOGLE FURTHER EXPRESSLY DISCLAIMS ALL WARRANTIES AND CONDITIONS
   OF ANY KIND, WHETHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO
   THE IMPLIED WARRANTIES AND CONDITIONS OF MERCHANTABILITY, FITNESS FOR A
   PARTICULAR PURPOSE AND NON-INFRINGEMENT.

   14. LIMITATION OF LIABILITY

   14.1 SUBJECT TO OVERALL PROVISION IN PARAGRAPH 13.1 ABOVE, YOU
   EXPRESSLY UNDERSTAND AND AGREE THAT GOOGLE, ITS SUBSIDIARIES AND
   AFFILIATES, AND ITS LICENSORS SHALL NOT BE LIABLE TO YOU FOR:

   (A) ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL CONSEQUENTIAL OR
   EXEMPLARY DAMAGES WHICH MAY BE INCURRED BY YOU, HOWEVER CAUSED AND
   UNDER ANY THEORY OF LIABILITY.. THIS SHALL INCLUDE, BUT NOT BE LIMITED
   TO, ANY LOSS OF PROFIT (WHETHER INCURRED DIRECTLY OR INDIRECTLY), ANY
   LOSS OF GOODWILL OR BUSINESS REPUTATION, ANY LOSS OF DATA SUFFERED,
   COST OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR OTHER
   INTANGIBLE LOSS;

   (B) ANY LOSS OR DAMAGE WHICH MAY BE INCURRED BY YOU, INCLUDING BUT NOT
   LIMITED TO LOSS OR DAMAGE AS A RESULT OF:

   (I) ANY RELIANCE PLACED BY YOU ON THE COMPLETENESS, ACCURACY OR
   EXISTENCE OF ANY ADVERTISING, OR AS A RESULT OF ANY RELATIONSHIP OR
   TRANSACTION BETWEEN YOU AND ANY ADVERTISER OR SPONSOR WHOSE ADVERTISING
   APPEARS ON THE SERVICES;

   (II) ANY CHANGES WHICH GOOGLE MAY MAKE TO THE SERVICES, OR FOR ANY
   PERMANENT OR TEMPORARY CESSATION IN THE PROVISION OF THE SERVICES (OR
   ANY FEATURES WITHIN THE SERVICES);

   (III) THE DELETION OF, CORRUPTION OF, OR FAILURE TO STORE, ANY CONTENT
   AND OTHER COMMUNICATIONS DATA MAINTAINED OR TRANSMITTED BY OR THROUGH
   YOUR USE OF THE SERVICES;

   (IV) YOUR FAILURE TO PROVIDE GOOGLE WITH ACCURATE ACCOUNT INFORMATION;

   (V) YOUR FAILURE TO KEEP YOUR PASSWORD OR ACCOUNT DETAILS SECURE AND
   CONFIDENTIAL;

   14.2 THE LIMITATIONS ON GOOGLE’S LIABILITY TO YOU IN PARAGRAPH 14.1
   ABOVE SHALL APPLY WHETHER OR NOT GOOGLE HAS BEEN ADVISED OF OR SHOULD
   HAVE BEEN AWARE OF THE POSSIBILITY OF ANY SUCH LOSSES ARISING.

   15. Copyright and trade mark policies

   15.1 It is Google’s policy to respond to notices of alleged copyright
   infringement that comply with applicable international intellectual
   property law (including, in the United States, the Digital Millennium
   Copyright Act) and to terminating the accounts of repeat infringers.
   Details of Google’s policy can be found at
   http://www.google.com/dmca.html.

   15.2 Google operates a trade mark complaints procedure in respect of
   Google’s advertising business, details of which can be found at
   http://www.google.com/tm_complaint.html.

   16. Advertisements

   16.1 Some of the Services are supported by advertising revenue and may
   display advertisements and promotions. These advertisements may be
   targeted to the content of information stored on the Services, queries
   made through the Services or other information.

   16.2 The manner, mode and extent of advertising by Google on the
   Services are subject to change without specific notice to you.

   16.3 In consideration for Google granting you access to and use of the
   Services, you agree that Google may place such advertising on the
   Services.

   17. Other content

   17.1 The Services may include hyperlinks to other web sites or content
   or resources. Google may have no control over any web sites or
   resources which are provided by companies or persons other than Google.

   17.2 You acknowledge and agree that Google is not responsible for the
   availability of any such external sites or resources, and does not
   endorse any advertising, products or other materials on or available
   from such web sites or resources.

   17.3 You acknowledge and agree that Google is not liable for any loss
   or damage which may be incurred by you as a result of the availability
   of those external sites or resources, or as a result of any reliance
   placed by you on the completeness, accuracy or existence of any
   advertising, products or other materials on, or available from, such
   web sites or resources.

   18. Changes to the Terms

   18.1 Google may make changes to the Universal Terms or Additional Terms
   from time to time. When these changes are made, Google will make a new
   copy of the Universal Terms available at
   http://www.google.com/chrome/intl/en/eula_text.html and any new
   Additional Terms will be made available to you from within, or through,
   the affected Services.

   18.2 You understand and agree that if you use the Services after the
   date on which the Universal Terms or Additional Terms have changed,
   Google will treat your use as acceptance of the updated Universal Terms
   or Additional Terms.

   19. General legal terms

   19.1 Sometimes when you use the Services, you may (as a result of, or
   in connection with your use of the Services) use a service or download
   a piece of software, or purchase goods, which are provided by another
   person or company. Your use of these other services, software or goods
   may be subject to separate terms between you and the company or person
   concerned. If so, the Terms do not affect your legal relationship with
   these other companies or individuals.

   19.2 The Terms constitute the whole legal agreement between you and
   Google and govern your use of the Services (but excluding any services
   which Google may provide to you under a separate written agreement),
   and completely replace any prior agreements between you and Google in
   relation to the Services.

   19.3 You agree that Google may provide you with notices, including
   those regarding changes to the Terms, by email, regular mail, or
   postings on the Services.

   19.4 You agree that if Google does not exercise or enforce any legal
   right or remedy which is contained in the Terms (or which Google has
   the benefit of under any applicable law), this will not be taken to be
   a formal waiver of Google’s rights and that those rights or remedies
   will still be available to Google.

   19.5 If any court of law, having the jurisdiction to decide on this
   matter, rules that any provision of these Terms is invalid, then that
   provision will be removed from the Terms without affecting the rest of
   the Terms. The remaining provisions of the Terms will continue to be
   valid and enforceable.

   19.6 You acknowledge and agree that each member of the group of
   companies of which Google is the parent shall be third party
   beneficiaries to the Terms and that such other companies shall be
   entitled to directly enforce, and rely upon, any provision of the Terms
   which confers a benefit on (or rights in favor of) them. Other than
   this, no other person or company shall be third party beneficiaries to
   the Terms.

   19.7 The Terms, and your relationship with Google under the Terms,
   shall be governed by the laws of the State of California without regard
   to its conflict of laws provisions. You and Google agree to submit to
   the exclusive jurisdiction of the courts located within the county of
   Santa Clara, California to resolve any legal matter arising from the
   Terms. Notwithstanding this, you agree that Google shall still be
   allowed to apply for injunctive remedies (or an equivalent type of
   urgent legal relief) in any jurisdiction.

   20. Additional Terms for Extensions for Google Chrome

   20.1 These terms in this section apply if you install extensions on
   your copy of Google Chrome. Extensions are small software programs,
   developed by Google or third parties, that can modify and enhance the
   functionality of Google Chrome. Extensions may have greater privileges
   to access your browser or your computer than regular webpages,
   including the ability to read and modify your private data.

   20.2 From time to time, Google Chrome may check with remote servers
   (hosted by Google or by third parties) for available updates to
   extensions, including but not limited to bug fixes or enhanced
   functionality. You agree that such updates will be automatically
   requested, downloaded, and installed without further notice to you.

   20.3 From time to time, Google may discover an extension that violates
   Google developer terms or other legal agreements, laws, regulations or
   policies. Google Chrome will periodically download a list of such
   extensions from Google’s servers. You agree that Google may remotely
   disable or remove any such extension from user systems in its sole
   discretion.

   21. Additional Terms for Enterprise Use

   21.1 If you are a business entity, then the individual accepting on
   behalf of the entity (for the avoidance of doubt, for business
   entities, in these Terms, "you" means the entity) represents and
   warrants that he or she has the authority to act on your behalf, that
   you represent that you are duly authorized to do business in the
   country or countries where you operate, and that your employees,
   officers, representatives, and other agents accessing the Service are
   duly authorized to access Google Chrome and to legally bind you to
   these Terms.

   21.2 Subject to the Terms, and in addition to the license grant in
   Section 9, Google grants you a non-exclusive, non-transferable license
   to reproduce, distribute, install, and use Google Chrome solely on
   machines intended for use by your employees, officers, representatives,
   and agents in connection with your business entity, and provided that
   their use of Google Chrome will be subject to the Terms.

   August 12, 2010
     __________________________________________________________________

Google Chrome Additional Terms of Service

   MPEGLA

   THIS PRODUCT IS LICENSED UNDER THE AVC PATENT PORTFOLIO LICENSE FOR THE
   PERSONAL AND NON-COMMERCIAL USE OF A CONSUMER TO (i) ENCODE VIDEO IN
   COMPLIANCE WITH THE AVC STANDARD ( “AVC VIDEO”) AND/OR (ii) DECODE AVC
   VIDEO THAT WAS ENCODED BY A CONSUMER ENGAGED IN A PERSONAL AND
   NON-COMMERCIAL ACTIVITY AND/OR WAS OBTAINED FROM A VIDEO PARTNER
   LICENSED TO PROVIDE AVC VIDEO. NO LICENSE IS GRANTED OR SHALL BE
   IMPLIED FOR ANY OTHER USE. ADDITIONAL INFORMATION MAY BE OBTAINED FROM
   MPEG LA, L.L.C. SEE HTTP://WWW.MPEGLA.COM.

   Adobe

   Google Chrome may include one or more components provided by Adobe
   Systems Incorporated and Adobe Software Ireland Limited (collectively
   “Adobe”). Your use of the Adobe software as provided by Google (“Adobe
   Software”) is subject to the following additional terms (the “Adobe
   Terms”). You, the entity receiving the Adobe Software, will be
   hereinafter referred to as “Sublicensee.”

   1. License Restrictions.

   (a) Flash Player, Version 10.x is designed only as a browser plug-in.
   Sublicensee may not modify or distribute this Adobe Software for use as
   anything but a browser plug-in for playing back content on a web page.
   For example, Sublicensee will not modify this Adobe Software in order
   to allow interoperation with applications that run outside of the
   browser (e.g., standalone applications, widgets, device UI).

   (b) Sublicensee will not expose any APIs of the Flash Player, Version
   10.x through a browser plug-in interface in such a way that allows such
   extension to be used to playback content from a web page as a
   stand-alone application.

   (c) The Chrome-Reader Software may not be used to render any PDF or
   EPUB documents that utilize digital rights management protocols or
   systems other than Adobe DRM.

   (d) Adobe DRM must be enabled in the Chrome-Reader Software for all
   Adobe DRM protected PDF and EPUB documents.

   (e) The Chrome-Reader Software may not, other than as explicitly
   permitted by the technical specifications, disable any capabilities
   provided by Adobe in the Adobe Software, including but not limited to,
   support for PDF and EPUB formats and Adobe DRM.

   2. Electronic Transmission. Sublicensee may allow the download of the
   Adobe Software from a web site, the Internet, an intranet, or similar
   technology (an, “Electronic Transmissions”) provided that Sublicensee
   agrees that any distributions of the Adobe Software by Sublicensee,
   including those on CD-ROM, DVD-ROM or other storage media and
   Electronic Transmissions, if expressly permitted, shall be subject to
   reasonable security measures to prevent unauthorized use. With relation
   to Electronic Transmissions approved hereunder, Sublicensee agrees to
   employ any reasonable use restrictions set by Adobe, including those
   related to security and/or the restriction of distribution to end users
   of the Sublicensee Product.

   3. EULA and Distribution Terms.

   (a) Sublicensee shall ensure that the Adobe Software is distributed to
   end users under an enforceable end user license agreement, in favor of
   Sublicensee and its suppliers containing at least each of the following
   minimum terms (the “End-User License”): (i) a prohibition against
   distribution and copying, (ii) a prohibition against modifications and
   derivative works, (iii) a prohibition against decompiling, reverse
   engineering, disassembling, and otherwise reducing the Adobe Software
   to a human-perceivable form, (iv) a provision indicating ownership of
   Sublicensee Product (as defined in Section 8) by Sublicensee and its
   licensors, (v) a disclaimer of indirect, special, incidental, punitive,
   and consequential damages, and (vi) other industry standard disclaimers
   and limitations, including, as applicable: a disclaimer of all
   applicable statutory warranties, to the full extent allowed by law.

   (b) Sublicensee shall ensure that the Adobe Software is distributed to
   Sublicensee’s distributors under an enforceable distribution license
   agreement, in favor of Sublicensee and its suppliers containing terms
   as protective of Adobe as the Adobe Terms.

   4. Opensource. Sublicensee will not directly or indirectly grant, or
   purport to grant, to any third party any rights or immunities under
   Adobe’s intellectual property or proprietary rights that will subject
   such intellectual property to an open source license or scheme in which
   there is or could be interpreted to be a requirement that as a
   condition of use, modification and/or distribution, the Adobe Software
   be: (i) disclosed or distributed in source code form; (ii) licensed for
   the purpose of making derivative works; or (iii) redistributable at no
   charge. For clarification purposes, the foregoing restriction does not
   preclude Sublicensee from distributing, and Sublicensee will distribute
   the Adobe Software as bundled with the Google Software, without charge.

   5. Additional Terms. With respect to any update, upgrade, new versions
   of the Adobe Software (collectively “Upgrades”) provided to
   Sublicenses, Adobe reserves the right to require additional terms and
   conditions applicable solely to the Upgrade and future versions
   thereof, and solely to the extent that such restrictions are imposed by
   Adobe on all licensees of such Upgrade. If Sublicensee does not agree
   to such additional terms or conditions, Sublicensee will have no
   license rights with respect to such Upgrade, and Sublicensee’s license
   rights with respect to the Adobe Software will terminate automatically
   on the 90th day from the date such additional terms are made available
   to Sublicensee.

   6. Proprietary Rights Notices. Sublicensee shall not, and shall require
   its distributors not to, delete or in any manner alter the copyright
   notices, trademarks, logos or related notices, or other proprietary
   rights notices of Adobe (and its licensors, if any) appearing on or
   within the Adobe Software or accompanying materials.

   7. Technical Requirements. Sublicensee and its distributors may only
   distribute Adobe Software and/or Upgrade on devices that (i) meet the
   technical specifications posted on
   http://www.adobe.com/mobile/licensees, (or a successor web site
   thereto), and (ii) has been verified by Adobe as set forth below.

   8. Verification and Update. Sublicensee must submit to Adobe each
   Sublicensee product (and each version thereof) containing the Adobe
   Software and/or Upgrade (“Sublicensee Product”) that do not meet the
   Device Verification exemption criteria to be communicated by Google,
   for Adobe to verify. Sublicensee shall pay for each submission made by
   Sublicensee by procuring verification packages at Adobe’s then-current
   terms set forth at http://flashmobile.adobe.com/. Sublicensee Product
   that has not passed verification may not be distributed. Verification
   will be accomplished in accordance with Adobe’s then-current process
   described at http://flashmobile.adobe.com/ (“Verification”).

   9. Profiles and Device Central. Sublicensee will be prompted to enter
   certain profile information about the Sublicensee Products either as
   part of the Verification process or some other method, and Sublicensee
   will provide such information, to Adobe. Adobe may (i) use such profile
   information as reasonably necessary to verify the Sublicensee Product
   (if such product is subject to Verification), and (ii) display such
   profile information in “Adobe Device Intelligence system,” located at
   https://devices.adobe.com/partnerportal/, and made available through
   Adobe’s authoring and development tools and services to enable
   developers and end users to see how content or applications are
   displayed in Sublicensee Products (e.g. how video images appear in
   certain phones).

   10. Export. Sublicensee acknowledges that the laws and regulations of
   the United States restrict the export and re-export of commodities and
   technical data of United States origin, which may include the Adobe
   Software. Sublicensee agrees that it will not export or re-export the
   Adobe Software, without the appropriate United States and foreign
   governmental clearances, if any.

   11. Technology Pass-through Terms.

   (a) Except pursuant to applicable permissions or agreements therefor,
   from or with the applicable parties, Sublicensees shall not use and
   shall not allow the use of, the Adobe Software for the encoding or
   decoding of mp3 audio only (.mp3) data on any non-pc device (e.g.,
   mobile phone or set-top box), nor may the mp3 encoders or decoders
   contained in the Adobe Software be used or accessed by any product
   other than the Adobe Software. The Adobe Software may be used for the
   encoding or decoding of MP3 data contained within a swf or flv file,
   which contains video, picture or other data. Sublicensee shall
   acknowledge that use of the Adobe Software for non-PC devices, as
   described in the prohibitions in this section, may require the payment
   of licensing royalties or other amounts to third parties who may hold
   intellectual property rights related to the MP3 technology and that
   Adobe nor Sublicensee has not paid any royalties or other amounts on
   account of third party intellectual property rights for such use. If
   Sublicensee requires an MP3 encoder or decoder for such use,
   Sublicensee is responsible for obtaining the necessary intellectual
   property license, including any applicable patent rights.

   (b) Sublicensee will not use, copy, reproduce and modify (i) the On2
   source code (provided hereunder as a component of the Source Code) as
   necessary to enable the Adobe Software to decode video in the Flash
   video file format (.flv or .f4v), and (ii) the Sorenson Spark source
   code (provided hereunder as a component of the Source Code) for the
   limited purpose of making bug fixes and performance enhancements to the
   Adobe Software. All codecs provided with the Adobe Software may only be
   used and distributed as an integrated part of the Adobe Software and
   may not be accessed by any other application, including other Google
   applications.

   (c) The Source Code may be provided with an AAC codec and/or HE-AAC
   codec (“the AAC Codec”). Use of the AAC Codec is conditioned on
   Sublicensee obtaining a proper patent license covering necessary
   patents as provided by VIA Licensing, for end products on or in which
   the AAC Codec will be used. Sublicensee acknowledges and agrees that
   Adobe is not providing a patent license for an AAC Codec under this
   Agreement to Sublicensee or its sublicensees.

   (d) THE SOURCE CODE MAY CONTAIN CODE LICENSED UNDER THE AVC PATENT
   PORTFOLIO LICENSE FOR THE PERSONAL NON-COMMERCIAL USE OF A CONSUMER TO
   (i) ENCODE VIDEO IN COMPLIANCE WITH THE AVC STANDARD ("AVC VIDEO")
   AND/OR (ii) DECODE AVC VIDEO THAT WAS ENCODED BY A CONSUMER ENGAGED IN
   A PERSONAL NON-COMMERCIAL ACTIVITY AND/OR WAS OBTAINED FROM A VIDEO
   PROVIDER LICENSED TO PROVIDE AVC VIDEO. NO LICENSE IS GRANTED OR WILL
   BE IMPLIED FOR ANY OTHER USE. ADDITIONAL INFORMATION MAY BE OBTAINED
   FROM MPEG LA, L.L.C. See http://www.mpegla.com

   12. Update. Sublicensee will not circumvent Google’s or Adobe’s efforts
   to update the Adobe Software in all Sublicensee’s products
   incorporating the Adobe Software as bundled with the Google Software
   (“Sublicensee Products”).

   13. Attribution and Proprietary Notices. Sublicensee will list the
   Adobe Software in publicly available Sublicensee Product specifications
   and include appropriate Adobe Software branding (specifically excluding
   the Adobe corporate logo) on the Sublicensee Product packaging or
   marketing materials in a manner consistent with branding of other third
   party products contained within the Sublicensee Product.

   14. No Warranty. THE ADOBE SOFTWARE IS MADE AVAILABLE TO SUBLICENSEE
   FOR USE AND REPRODUCTION “AS IS” AND ADOBE MAKES NO WARRANTY AS TO ITS
   USE OR PERFORMANCE. ADOBE AND ITS SUPPLIERS DO NOT AND CANNOT WARRANT
   THE PERFORMANCE OR RESULTS OBTAINED BY USING THE ADOBE SOFTWARE. EXCEPT
   FOR ANY WARRANTY, CONDITION, REPRESENTATION OR TERM TO THE EXTENT TO
   WHICH THE SAME CANNOT OR MAY NOT BE EXCLUDED OR LIMITED BY LAW
   APPLICABLE TO SUBLICENSEEIN SUBLICENSEE’S JURISDICTION, ADOBE AND ITS
   SUPPLIERS MAKE NO WARRANTIES, CONDITIONS, REPRESENTATIONS, OR TERMS
   (EXPRESS OR IMPLIED WHETHER BY STATUTE, COMMON LAW, CUSTOM, USAGE OR
   OTHERWISE) AS TO ANY MATTER INCLUDING WITHOUT LIMITATION
   NONINFRINGEMENT OF THIRD PARTY RIGHTS, MERCHANTABILITY, INTEGRATION,
   SATISFACTORY QUALITY, OR FITNESS FOR ANY PARTICULAR PURPOSE.
   SUBLICENSEE AGREES THAT SUBLICENSEE SHALL NOT MAKE ANY WARRANTY,
   EXPRESS OR IMPLIED, ON BEHALF OF ADOBE.

   15. Limitation of Liability. IN NO EVENT WILL ADOBE OR ITS SUPPLIERS BE
   LIABLE TO SUBLICENSEE FOR ANY DAMAGES, CLAIMS OR COSTS WHATSOEVER OR
   ANY CONSEQUENTIAL, INDIRECT, OR INCIDENTAL DAMAGES, OR ANY LOST PROFITS
   OR LOST SAVINGS, EVEN IF AN ADOBE REPRESENTATIVE HAS BEEN ADVISED OF
   THE POSSIBILITY OF SUCH LOSS, DAMAGES, CLAIMS OR COSTS OR FOR ANY CLAIM
   BY ANY THIRD PARTY. THE FOREGOING LIMITATIONS AND EXCLUSIONS APPLY TO
   THE EXTENT PERMITTED BY APPLICABLE LAW IN SUBLICENSEE’S JURISDICTION.
   ADOBE’S AGGREGATE LIABILITY AND THAT OF ITS SUPPLIERS UNDER OR IN
   CONNECTION WITH THIS AGREEMENT SHALL BE LIMITED TO ONE THOUSAND DOLLARS
   (US$1,000). Nothing contained in this Agreement limits Adobe’s
   liability to Sublicensee in the event of death or personal injury
   resulting from Adobe’s negligence or for the tort of deceit (fraud).
   Adobe is acting on behalf of its suppliers for the purpose of
   disclaiming, excluding and/or limiting obligations, warranties and
   liability as provided in this Agreement, but in no other respects and
   for no other purpose.

   16. Content Protection Terms

   (a) Definitions.

   “Compliance and Robustness Rules” means the document setting forth
   compliance and robustness rules for the Adobe Software located at
   http://www.adobe.com/mobile/licensees, or a successor web site thereto.

   “Content Protection Functions” means those aspects of the Adobe
   Software that are designed to ensure compliance with the Compliance and
   Robustness Rules, and to prevent playback, copying, modification,
   redistribution or other actions with respect to digital content
   distributed for consumption by users of the Adobe Software when such
   actions are not authorized by the owners of such digital content or its
   licensed distributors.

   “Content Protection Code” means code within certain designated versions
   of the Adobe Software that enables certain Content Protection
   Functions.

   “Key” means a cryptographic value contained in the Adobe Software for
   use in decrypting digital content.

   (b) License Restrictions. Sublicensee’s right to exercise the licenses
   with respect to the Adobe Software is subject to the following
   additional restrictions and obligations. Sublicensee will ensure that
   Sublicensee’s customers comply with these restrictions and obligations
   to the same extent imposed on Sublicensee with respect to the Adobe
   Software; any failure by Sublicensee’s customers to comply with these
   additional restrictions and obligations shall be treated as a material
   breach by Sublicensee.

   b.1. Sublicensee and customers may only distribute the Adobe Software
   that meets the Robustness and Compliance Rules as so confirmed by
   Sublicensee during the verification process described above in the
   Adobe Terms.

   b.2. Sublicensee shall not (i) circumvent the Content Protection
   Functions of either the Adobe Software or any related Adobe Software
   that is used to encrypt or decrypt digital content for authorized
   consumption by users of the Adobe Software, or (ii) develop or
   distribute products that are designed to circumvent the Content
   Protection Functions of either the Adobe Software or any Adobe Software
   that is used to encrypt or decrypt digital content for authorized
   consumption by users of the Adobe Software.

   (c) The Keys are hereby designated as Adobe’s Confidential Information,
   and Sublicensee will, with respect to the Keys, adhere to Adobe’s
   Source Code Handling Procedure (to be provided by Adobe upon request).

   (d) Injunctive Relief. Sublicensee agrees that a breach of this
   Agreement may compromise the Content Protection Functions of the Adobe
   Software and may cause unique and lasting harm to the interests of
   Adobe and owners of digital content that rely on such Content
   Protection Functions, and that monetary damages may be inadequate to
   compensate fully for such harm. Therefore, Sublicensee further agrees
   that Adobe may be entitled to seek injunctive relief to prevent or
   limit the harm caused by any such breach, in addition to monetary
   damages.

   17. Intended Third-party Beneficiary. Adobe Systems Incorporated and
   Adobe Software Ireland Limited are the intended third-party
   beneficiaries of Google’s agreement with Sublicensee with respect to
   the Adobe Software, including but not limited to, the Adobe Terms.
   Sublicensee agrees, notwithstanding anything to the contrary in its
   agreement with Google, that Google may disclose Sublicensee’s identity
   to Adobe and certify in writing that Sublicensee has entered into a
   license agreement with Google which includes the Adobe Terms.
   Sublicensee must have an agreement with each of its licensees, and if
   such licensees are allowed to redistribute the Adobe Software, such
   agreement will include the Adobe Terms.
