http://www.adobe.com/products/eulas/players/flash/

End User License Agreement

ADOBE® SOFTWARE LICENSE AGREEMENT

   NOTICE TO USER: PLEASE READ THIS CONTRACT CAREFULLY. BY USING, COPYING OR
   DISTRIBUTING ALL OR ANY PORTION OF THE ADOBE SOFTWARE ("SOFTWARE") YOU
   ACCEPT  ALL  THE TERMS AND CONDITIONS OF THIS AGREEMENT, INCLUDING, IN
   PARTICULAR THE LIMITATIONS ON: USE CONTAINED IN SECTION 2; TRANSFERABILITY
   IN SECTION 4; WARRANTY IN SECTION 7; AND LIABILITY IN SECTION 8. YOU AGREE
   THAT THIS AGREEMENT IS ENFORCEABLE LIKE ANY WRITTEN NEGOTIATED AGREEMENT
   SIGNED BY YOU. THIS AGREEMENT IS ENFORCEABLE AGAINST YOU AND ANY LEGAL
   ENTITY THAT OBTAINED THE SOFTWARE AND ON WHOSE BEHALF IT IS USED. IF YOU DO
   NOT AGREE, DO NOT USE THIS SOFTWARE.

   Adobe and its suppliers own all intellectual property in the Software. Adobe
   permits you to Use the Software only in accordance with the terms of this
   Agreement. Use of some third party materials included in the Software may be
   subject to other terms and conditions typically found in a separate license
   agreement, a “Read Me” file located near such materials or in the “Third
   Party Software Notices and/or Additional Terms and Conditions” found at
   [92]www.adobe.com/go/thirdparty/
    1. Definitions. "Software" means (a) all of the contents of the files
       (provided either by electronic download, on physical media or any other
       method of distribution), disk(s), CD-ROM(s) or other media with which
       this Agreement is provided, including but not limited to (i) Adobe or
       third  party computer information or software, including the Adobe
       Reader® ("Adobe Reader"), Adobe Flash® Player, Shockwave® Player and
       Authorware® Player (collectively, the Flash, Shockwave and Authorware
       players,  are the "Web Players"); (ii) related explanatory written
       materials or files ("Documentation"); and (iii) fonts; and (b) upgrades,
       modified versions, updates, additions, and copies of the Software, if
       any,  licensed to you by Adobe (collectively, "Updates"). "Use" or
       "Using" means to access, install, download, copy, or otherwise benefit
       from using the functionality of the Software in accordance with the
       Documentation.  "Permitted  Number" means one (1) unless otherwise
       indicated under a valid license (e.g., volume license) granted by Adobe.
       "Computer"  means an electronic device that accepts information in
       digital or similar form and manipulates it for a specific result based
       on a sequence of instructions. "Adobe" means Adobe Systems Incorporated,
       a Delaware corporation, 345 Park Avenue, San Jose, California 95110, if
       subsection 9(a) of this Agreement applies; otherwise it means Adobe
       Systems Software Ireland Limited, Unit 3100, Lake Drive, City West
       Campus, Saggart D24, Republic of Ireland, a company organized under the
       laws  of  Ireland  and  an affiliate and licensee of Adobe Systems
       Incorporated.
    2. Software License. If you obtained the Software from Adobe or one of its
       authorized licensees, and subject to your compliance with the terms of
       this agreement (this "Agreement"), including the restrictions in Setion
       3, Adobe grants to you a non-exclusive license to Use the Software for
       the purposes described in the Documentation as follows.
       2.1  General Use. You may install and Use a copy of the Software on your
       compatible  Computer, up to the Permitted Number of computers. The
       Software may not be shared, installed or used concurrently on different
       computers. See Section 3 for important restrictions on the Use of Adobe
       Reader and Web Players.
       2.2  Server Use and Distribution.
       2.2.1  You may install one copy of the Adobe Reader on a computer file
       server within your internal network for the sole and exclusive purpose
       of (a) using the Software (from an unlimited number of client computers
       on your internal network) via (i) the Network File System (NFS) for UNIX
       versions of the Software or (ii) Windows Terminal Services and (b)
       allowing for printing within your internal network. Unless otherwise
       expressly permitted hereunder, no other server or network use of the
       Software is permitted, including but not limited to use of the Software
       (i) either directly or through commands, data or instructions from or to
       another computer or (ii) for internal network, internet or web hosting
       services.
       2.2.2  For information on how to distribute the Software on tangible
       media  or through an internal network please refer to the sections
       entitled     "How     to     Distribute     Adobe    Reader"    at
       [93]http://www.adobe.com/products/acrobat/distribute.html;      or
       "Distribute Macromedia Web Players" at
       [94]http://www.adobe.com/licensing.
       2.3  Backup Copy. You may make one backup copy of the Software, provided
       your backup copy is not installed or used on any Computer. You may not
       transfer the rights to a backup copy unless you transfer all rights in
       the Software as provided under Section 4.
       2.4  Portable or Home Computer Use. If and only if the Software is Adobe
       Reader, in addition to the single copy permitted under Sections 2.1 and
       2.2, the primary user of the Computer on which the Software is installed
       may make a second copy of the Software for his or her exclusive Use on
       either a portable Computer or a Computer located at his or her home,
       provided the Software on the portable or home Computer is not used at
       the same time as the Software on the primary computer.
       2.5  No Modification.
       2.5.1  You may not modify, adapt, translate or create derivative works
       based  upon the Software. You may not reverse engineer, decompile,
       disassemble or otherwise attempt to discover the source code of the
       Software  except  to  the extent you may be expressly permitted to
       decompile under applicable law, it is essential to do so in order to
       achieve operability of the Software with another software program, and
       you have first requested Adobe to provide the information necessary to
       achieve  such  operability and Adobe has not made such information
       available. Adobe has the right to impose reasonable conditions and to
       request a reasonable fee before providing such information. Any such
       information supplied by Adobe and any information obtained by you by
       such permitted decompilation may only be used by you for the purpose
       described herein and may not be disclosed to any third party or used to
       create any software which is substantially similar to the expression of
       the Software. Requests for information should be directed to the Adobe
       Customer Support Department.
       2.5.2  As an exception to the above, you may customize or extend the
       functionality of the installer for the Adobe Reader as specifically
       allowed by instructions found at
       [95]http://www.adobe.com/support/main.html                      or
       [96]http://partners.adobe.com (e.g., installation of additional plug-in
       and help files). You may not otherwise alter or modify the Software or
       create a new installer for the Software. The Adobe Reader is licensed
       and distributed by Adobe for viewing, distributing and sharing PDF
       files.
       2.6  Third Party Website Access. The Software may allow you to access
       third party websites ("Third Party Sites"). Your access to and use of
       any Third Party Sites, including any goods, services or information made
       available from such sites, is governed by the terms and conditions found
       at each Third Party Site, if any. Third Party Sites are not owned or
       operated by Adobe. YOUR USE OF THIRD PARTY SITES IS AT YOUR OWN RISK.
       ADOBE MAKES NO WARRANTIES, CONDITIONS, INDEMNITIES, REPRESENTATIONS OR
       TERMS, EXPRESS OR IMPLIED, WHETHER BY STATUTE, COMMON LAW, CUSTOM, USAGE
       OR OTHERWISE AS TO ANY OTHER MATTERS, INCLUDING BUT NOT LIMITED TO
       NON-INFRINGEMENT OF THIRD PARTY RIGHTS, TITLE, INTEGRATION, ACCURACY,
       SECURITY, AVAILABILITY, SATISFACTORY QUALITY, MERCHANTABILITY OR FITNESS
       FOR ANY PARTICULAR PURPOSE WITH RESPECT TO THE THIRD PARTY SITES.
       2.7  Certified Documents.
       2.7.1  Certified Documents and CD Services. The Software may allow you
       to validate Certified Documents. A "Certified Document" or “CD” is a PDF
       file that has been digitally signed using (a) a certificate and (b) a
       “private” encryption key that corresponds to the “public” key in the
       certificate. Validation of a CD requires CD Services from the CD Service
       Provider  that issued the certificate. “CD Service Provider” is an
       independent    third    party    service    vendor    listed    at
       [97]http://www.adobe.com/security/partners_cds.html. “CD Services” are
       services provided by CD Service Providers, including without limitation
       (i) certificates issued by such CD Service Provider for use with the
       Software's  CD  feature  set, (ii) services related to issuance of
       certificates,  and  (iii)  other services related to certificates,
       including without limitation verification services.
       2.7.2   CD  Service  Providers.  Although the Software may provide
       validation features, Adobe does not supply the necessary CD Services
       required  to  use  these  features.  Purchasing,  availability and
       responsibility for the CD Services are between you and the CD Service
       Provider. Before you rely upon any CD, any digital signature applied
       thereto, and/or any related CD Services, you must first review and agree
       to  the  applicable  Issuer  Statement and this Agreement. “Issuer
       Statement” means the terms and conditions under which each CD Service
       Provider    offers    CD    Services    (see    the    links    on
       [98]http://www.adobe.com/security/partners_cds.html), including for
       example any subscriber agreements, relying party agreements, certificate
       policies and practice statements, and Section 2.7 of this Agreement. By
       validating a CD using CD Services, you acknowledge and agree that (a)
       the certificate used to digitally sign a CD may be revoked at the time
       of verification, making the digital signature on the CD appear valid
       when in fact it is not, (b) the security or integrity of a CD may be
       compromised due to an act or omission by the signer of the CD, the
       applicable CD Service Provider, or any other third party and (c) you
       must read, understand, and be bound by the applicable Issuer Statement.
       2.7.3  Warranty Disclaimer. CD Service Providers offer CD Services
       solely in accordance with the applicable Issuer Statement. ACCESS TO THE
       CD SERVICES THROUGH THE USE OF THE SOFTWARE IS MADE AVAILABLE ON AN “AS
       IS” BASIS ONLY AND WITHOUT ANY WARRANTY OR INDEMNITY OF ANY KIND (EXCEPT
       AS SUPPLIED BY A CD SERVICES PROVIDER IN ITS ISSUER STATEMENT). ADOBE
       AND EACH CD SERVICE PROVIDER (EXCEPT AS EXPRESSLY PROVIDED IN ITS ISSUER
       STATEMENT) MAKE NO WARRANTIES, CONDITIONS, INDEMNITIES, REPRESENTATIONS
       OR TERMS, EXPRESS OR IMPLIED, WHETHER BY STATUTE, COMMON LAW, CUSTOM,
       USAGE OR OTHERWISE AS TO ANY OTHER MATTERS, INCLUDING BUT NOT LIMITED TO
       NON-INFRINGEMENT OF THIRD PARTY RIGHTS, TITLE, INTEGRATION, ACCURACY,
       SECURITY, AVAILABILITY, SATISFACTORY QUALITY, MERCHANTABILITY OR FITNESS
       FOR ANY PARTICULAR PURPOSE WITH RESPECT TO THE CD SERVICES.
       2.7.4  Indemnity. You agree to hold Adobe and any applicable CD Service
       Provider (except as expressly provided in its Issuer Statement) harmless
       from  any and all liabilities, losses, actions, damages, or claims
       (including all reasonable expenses, costs, and attorneys fees) arising
       out  of or relating to any use of, or reliance on, any CD Service,
       including, without limitation (a) reliance on an expired or revoked
       certificate, (b) improper verification of a certificate, (c) use of a
       certificate other than as permitted by any applicable Issuer Statement,
       this Agreement or applicable law; (d) failure to exercise reasonable
       judgment under the circumstances in relying on the CD Services or (e)
       failure to perform any of the obligations as required in an applicable
       Issuer Statement.
       2.7.5  Limit of Liability. UNDER NO CIRCUMSTANCES WILL ADOBE OR ANY CD
       SERVICE PROVIDER (EXCEPT AS EXPRESSLY SET FORTH IN ITS ISSUER STATEMENT)
       BE LIABLE TO YOU, OR ANY OTHER PERSON OR ENTITY, FOR ANY LOSS OF USE,
       REVENUE OR PROFIT, LOST OR DAMAGED DATA, OR OTHER COMMERCIAL OR ECONOMIC
       LOSS  OR FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, STATUTORY,
       PUNITIVE, EXEMPLARY OR CONSEQUENTIAL DAMAGES WHATSOEVER RELATED TO YOUR
       USE OR RELIANCE UPON CD SERVICES, EVEN IF ADVISED OF THE POSSIBILITY OF
       SUCH DAMAGES OR IF SUCH DAMAGES ARE FORESEEABLE. THIS LIMITATION SHALL
       APPLY EVEN IN THE EVENT OF A FUNDAMENTAL OR MATERIAL BREACH OR A BREACH
       OF THE FUNDAMENTAL OR MATERIALTERMS OF THIS AGREEMENT.
       2.7.6  Third Party Beneficiaries. You agree that any CD Service Provider
       you utilize shall be a third party beneficiary with respect to this
       Section 2.7 of this Agreement, and that such CD Service Provider shall
       have the right to enforce such provisions in its own name as if the CD
       Service Provider were Adobe.
    3. Restrictions.
       3.1  Web Player Prohibited Devices. You may not Use any Web Player on
       any  non-PC  device  or with any embedded or device version of any
       operating system. For the avoidance of doubt, and by example only, you
       may not use a Web Player on any (a) mobile devices, set top boxes (STB),
       handhelds, phones, web pads, tablets and Tablet PCs that are not running
       Windows XP Tablet PC Edition, game consoles, TVs, DVD players, media
       centers (excluding Windows XP Media Center Edition and its successors),
       electronic billboards or other digital signage, internet appliances or
       other internet-connected devices, PDAs, medical devices, ATMs, telematic
       devices,  gaming machines, home automation systems, kiosks, remote
       control  devices,  or  any  other consumer electronics device, (b)
       operator-based mobile, cable, satellite, or television systems or (c)
       other closed system devices.
       3.2  Notices. You shall not copy the Software except as set forth in
       Section 2. Any copy of the Software that you make must contain the same
       copyright  and  other proprietary notices that appear on or in the
       Software.
       3.3   Document  Features.  The  Software  may contain features and
       functionality (the “Document Features”) that appear disabled or “grayed
       out.” These Document Features will only activate when opening a PDF
       document  that was created using corresponding enabling technology
       available only from Adobe (“Keys”). You agree not to access, or attempt
       to  access, disabled Document Features or otherwise circumvent the
       permissions that control activation of such Document Features. You may
       only use the Document Features with PDF documents that have been enabled
       using Keys obtained under a valid license from Adobe. No other use is
       permitted.
       3.4  Adobe Reader Restrictions. You are not authorized to integrate or
       use the Adobe Reader with any other software, plug-in or enhancement
       that  uses  or relies upon the the Adobe Reader when converting or
       transforming PDF files into other file formats (e.g., a PDF file into a
       TIFF, JPEG, or SVG file). You are not authorized to integrate or use the
       Adobe Reader with any plug-in software not developed in accordance with
       the  Adobe Integration Key License Agreement. Further, you are not
       permitted to integrate or use the Adobe Reader with other software, or
       access PDF files that contain instructions (e.g., JavaScript), in order
       to (a) save data locally (on the same Computer), (b) create a file that
       contains data (e.g., an XML or comments file) or (c) save modifications
       to a PDF file, except when such saving or creation is allowed through
       the use of Document Feature(s) enabled by Adobe.
    4. Transfer. You may not rent, lease, sublicense, assign or transfer your
       rights in the Software, or authorize all or any portion of the Software
       to be copied onto another user's Computer except as may be expressly
       permitted herein. You may, however, transfer all your rights to Use the
       Software to another person or legal entity provided that: (a) you also
       transfer  (i)  this Agreement, and (ii) the Software and all other
       software  or  hardware bundled or pre-installed with the Software,
       including all copies, Updates and prior versions, to such person or
       entity, (b) you retain no copies, including backups and copies stored on
       a Computer, and (c) the receiving party accepts the terms and conditions
       of this Agreement and any other terms and conditions upon which you
       legally  purchased  a license to the Software. Notwithstanding the
       foregoing, you may not transfer education, pre-release, or not for
       resale copies of the Software.
    5. Intellectual Property Ownership, Copyright Protection. The Software and
       any authorized copies that you make are the intellectual property of and
       are  owned  by  Adobe  Systems Incorporated and its suppliers. The
       structure, organization and code of the Software are the valuable trade
       secrets and confidential information of Adobe Systems Incorporated and
       its suppliers. The Software is protected by law, including without
       limitation the copyright laws of the United States and other countries,
       and by international treaty provisions. Except as expressly stated
       herein, this Agreement does not grant you any intellectual property
       rights in the Software and all rights not expressly granted are reserved
       by Adobe and its suppliers.
    6. Updates. If the Software is an Update to a previous version of the
       Software, you must possess a valid license to such previous version in
       order to Use such Update. All Updates are provided to you on a license
       exchange  basis. You agree that by Using an Update you voluntarily
       terminate your right to use any previous version of the Software. As an
       exception, you may continue to Use previous versions of the Software on
       your Computer after you Use the Update but only to assist you in the
       transition to the Update, provided that: (a) the Update and the previous
       versions are installed on the same computer; (b) the previous versions
       or copies thereof are not transferred to another party or Computer
       unless all copies of the Update are also transferred to such party or
       Computer; and (c) you acknowledge that any obligation Adobe may have to
       support  the  previous  versions of the Software may be ended upon
       availability of the Update.
    7. NO WARRANTY. The Software is being delivered to you "AS IS" and Adobe
       makes  no warranty as to its use or performance. Adobe provides no
       technical support, warranties or remedies for the Software. ADOBE AND
       ITS SUPPLIERS DO NOT AND CANNOT WARRANT THE PERFORMANCE OR RESULTS YOU
       MAY OBTAIN BY USING THE 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 YOU IN YOUR 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. The
       provisions of Section 7 and Section 8 shall survive the termination of
       this Agreement, howsoever caused, but this shall not imply or create any
       continued right to Use the Software after termination of this Agreement.
    8. LIMITATION OF LIABILITY. IN NO EVENT WILL ADOBE OR ITS SUPPLIERS BE
       LIABLE  TO  YOU FOR ANY DAMAGES, CLAIMS OR COSTS WHATSOEVER OR ANY
       CONSEQUENTIAL, INDIRECT, 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 YOUR JURISDICTION. ADOBE'S
       AGGREGATE LIABILITY AND THAT OF ITS SUPPLIERS UNDER OR IN CONNECTION
       WITH  THIS  AGREEMENT  SHALL BE LIMITED TO THE AMOUNT PAID FOR THE
       SOFTWARE, IF ANY. Nothing contained in this Agreement limits Adobe's
       liability to you 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. For
       further information, please see the jurisdiction specific information at
       the end of this Agreement, if any, or contact Adobe's Customer Support
       Department.
    9. Export  Rules.  You  agree  that the Software will not be shipped,
       transferred  or  exported  into  any country or used in any manner
       prohibited by the United States Export Administration Act or any other
       export laws, restrictions or regulations (collectively the "Export
       Laws"). In addition, if the Software is identified as export controlled
       items under the Export Laws, you represent and warrant that you are not
       a citizen, or otherwise located within, an embargoed nation (including
       without limitation Iran, Syria, Sudan, Libya, Cuba, and North Korea) and
       that  you  are not otherwise prohibited under the Export Laws from
       receiving the Software. All rights to Use the Software are granted on
       condition that such rights are forfeited if you fail to comply with the
       terms of this Agreement.
   10. Governing Law. This Agreement will be governed by and construed in
       accordance with the substantive laws in force: (a) in the State of
       California, if a license to the Software is obtained when you are in the
       United States, Canada, or Mexico; or (b) in Japan, if a license to the
       Software is obtained when you are in Japan, China, Korea, or other
       Southeast Asian country where all official languages are written in
       either an ideographic script (e.g., hanzi, kanji, or hanja), and/or
       other  script based upon or similar in structure to an ideographic
       script, such as hangul or kana; or (c) England, if a license to the
       Software  is  purchased when you are in any other jurisdiction not
       described above. The respective courts of Santa Clara County, California
       when  California  law applies, Tokyo District Court in Japan, when
       Japanese law applies, and the competent courts of England, when the law
       of England applies, shall each have non-exclusive jurisdiction over all
       disputes relating to this Agreement. This Agreement will not be governed
       by the conflict of law rules of any jurisdiction or the United Nations
       Convention  on  Contracts for the International Sale of Goods, the
       application of which is expressly excluded.
   11. General Provisions. If any part of this Agreement is found void and
       unenforceable, it will not affect the validity of the balance of this
       Agreement, which shall remain valid and enforceable according to its
       terms. This Agreement shall not prejudice the statutory rights of any
       party dealing as a consumer. This Agreement may only be modified by a
       writing  signed  by an authorized officer of Adobe. Updates may be
       licensed to you by Adobe with additional or different terms. This is the
       entire agreement between Adobe and you relating to the Software and it
       supersedes  any  prior representations, discussions, undertakings,
       communications or advertising relating to the Software.
   12. Notice to U.S. Government End Users. The Software and Documentation are
       "Commercial  Items,"  as that term is defined at 48 C.F.R. §2.101,
       consisting of "Commercial Computer Software" and "Commercial Computer
       Software Documentation," as such terms are used in 48 C.F.R. §12.212 or
       48 C.F.R. §227.7202, as applicable. Consistent with 48 C.F.R. §12.212 or
       48 C.F.R. §§227.7202-1 through 227.7202-4, as applicable, the Commercial
       Computer Software and Commercial Computer Software Documentation are
       being licensed to U.S. Government end users (a) only as Commercial Items
       and (b) with only those rights as are granted to all other end users
       pursuant to the terms and conditions herein. Unpublished-rights reserved
       under  the  copyright  laws  of  the  United States. Adobe Systems
       Incorporated, 345 Park Avenue, San Jose, CA 95110-2704, USA. For U.S.
       Government End Users, Adobe agrees to comply with all applicable equal
       opportunity laws including, if appropriate, the provisions of Executive
       Order  11246,  as amended, Section 402 of the Vietnam Era Veterans
       Readjustment Assistance Act of 1974 (38 USC 4212), and Section 503 of
       the Rehabilitation Act of 1973, as amended, and the regulations at 41
       CFR Parts 60-1 through 60-60, 60-250, and 60-741. The affirmative action
       clause and regulations contained in the preceding sentence shall be
       incorporated by reference in this Agreement.
   13. Compliance with Licenses. If you are a business or organization, you
       agree that upon request from Adobe or Adobe's authorized representative,
       you will within thirty (30) days fully document and certify that use of
       any and all Software at the time of the request is in conformity with
       your valid licenses from Adobe.
   14. Specific Provisions and Exceptions.
       14.1  Limited Warranty for Users Residing in Germany or Austria. If you
       obtained the Software in Germany or Austria, and you usually reside in
       such country, then Section 7 does not apply, instead, Adobe warrants
       that  the  Software  provides the functionalities set forth in the
       Documentation  (the "agreed upon functionalities") for the limited
       warranty period following receipt of the Software when used on the
       recommended hardware configuration. As used in this Section, "limited
       warranty period" means one (1) year if you are a business user and two
       (2) years if you are not a business user. Non-substantial variation from
       the agreed upon functionalities shall not be considered and does not
       establish any warranty rights. THIS LIMITED WARRANTY DOES NOT APPLY TO
       SOFTWARE  PROVIDED  TO  YOU  FREE OF CHARGE, FOR EXAMPLE, UPDATES,
       PRE-RELEASE, TRYOUT, PRODUCT SAMPLER, NOT FOR RESALE (NFR) COPIES OF
       SOFTWARE, OR SOFTWARE THAT HAS BEEN ALTERED BY YOU, TO THE EXTENT SUCH
       ALTERATIONS  CAUSED A DEFECT. To make a warranty claim, during the
       limited warranty period you must return, at our expense, the Software
       and proof of purchase to the location where you obtained it. If the
       functionalities of the Software vary substantially from the agreed upon
       functionalities, Adobe is entitled -- by way of re-performance and at
       its own discretion -- to repair or replace the Software. If this fails,
       you are entitled to a reduction of the purchase price (reduction) or to
       cancel  the  purchase agreement (rescission). For further warranty
       information, please contact Adobe's Customer Support Department
       14.2  Limitation of Liability for Users Residing in Germany and Austria.
       14.2.1  If you obtained the Software in Germany or Austria, and you
       usually reside in such country, then Section 8 does not apply, Instead,
       subject to the provisions in Section 14.2.2, Adobe's statutory liability
       for damages shall be limited as follows: (i) Adobe shall be liable only
       up to the amount of damages as typically foreseeable at the time of
       entering into the purchase agreement in respect of damages caused by a
       slightly negligent breach of a material contractual obligation and (ii)
       Adobe shall not be liable for damages caused by a slightly negligent
       breach of a non-material contractual obligation.
       14.2.2  The aforesaid limitation of liability shall not apply to any
       mandatory statutory liability, in particular, to liability under the
       German  Product  Liability  Act, liability for assuming a specific
       guarantee or liability for culpably caused personal injuries.
       14.2.3  You are required to take all reasonable measures to avoid and
       reduce damages, in particular to make back-up copies of the Software and
       your computer data subject to the provisions of this Agreement.
       14.3  Pre-release Product Additional Terms. If the product you have
       received with this license is pre-commercial release or beta Software
       ("Pre-release Software"), then the following Section applies. To the
       extent that any provision in this Section is in conflict with any other
       term or condition in this Agreement, this Section shall supercede such
       other term(s) and condition(s) with respect to the Pre-release Software,
       but  only  to  the  extent  necessary to resolve the conflict. You
       acknowledge  that  the Software is a pre-release version, does not
       represent final product from Adobe, and may contain bugs, errors and
       other problems that could cause system or other failures and data loss.
       Consequently, the Pre-release Software is provided to you "AS-IS", and
       Adobe disclaims any warranty or liability obligations to you of any
       kind. WHERE LIABILITY CANNOT BE EXCLUDED FOR PRE-RELEASE SOFTWARE, BUT
       IT MAY BE LIMITED, ADOBE'S LIABILITY AND THAT OF ITS SUPPLIERS SHALL BE
       LIMITED TO THE SUM OF FIFTY DOLLARS (U.S. $50) IN TOTAL. You acknowledge
       that  Adobe has not promised or guaranteed to you that Pre-release
       Software will be announced or made available to anyone in the future,
       Adobe  has  no express or implied obligation to you to announce or
       introduce the Pre-release Software and that Adobe may not introduce a
       product  similar  to  or compatible with the Pre-release Software.
       Accordingly, you acknowledge that any research or development that you
       perform regarding the Pre-release Software or any product associated
       with the Pre-release Software is done entirely at your own risk. During
       the term of this Agreement, if requested by Adobe, you will provide
       feedback to Adobe regarding testing and use of the Pre-release Software,
       including  error  or  bug  reports.  If you have been provided the
       Pre-release Software pursuant to a separate written agreement, such as
       the Adobe Systems Incorporated Serial Agreement for Unreleased Products,
       your use of the Software is also governed by such agreement. You agree
       that you may not and certify that you will not sublicense, lease, loan,
       rent, assign or transfer the Pre-release Software. Upon receipt of a
       later unreleased version of the Pre-release Software or release by Adobe
       of a publicly released commercial version of the Software, whether as a
       stand-alone product or as part of a larger product, you agree to return
       or destroy all earlier Pre-release Software received from Adobe and to
       abide by the terms of the license agreement for any such later versions
       of the Pre-release Software. Notwithstanding anything in this Section to
       the contrary, if you are located outside the United States of America,
       you agree that you will return or destroy all unreleased versions of the
       Pre-release Software within thirty (30) days of the completion of your
       testing of the Software when such date is earlier than the date for
       Adobe's first commercial shipment of the publicly released (commercial)
       Software.
       14.4  Settings Manager. Use of the Web Players, specifically the Flash
       Player, will enable the Software to store certain user settings as a
       local  shared  object  on  a your Computer. These settings are not
       associated with you, but allow you to configure certain settings within
       the Flash Player. You can find more information on local shared objects
       at [99]http://www.adobe.com/software/flashplayer/security/ and more
       information on the Settings Manager at
       [100]www.adobe.com/go/settingsmanager.

   If you have any questions regarding this Agreement or if you wish to request
   any information from Adobe please use the address and contact information
   included with this product or via the web at www.adobe.com to contact the
   Adobe office serving your jurisdiction

   Adobe,  Authorware, Flash, Reader, and Shockwave are either registered
   trademarks or trademarks of Adobe Systems Incorporated in the United States
   and/or other countries.


   Reader-PlayerWWEULA-en_US-20060607_2230
