End User License Agreement

    Geekbench

   The Geekbench software application (“App”) that you are downloading is
   licensed, not sold, to you for use only under the terms of this EULA. You
   are agreeing to the provisions of this EULA by installing the App on your
   mobile device and using it. IF YOU DO NOT AGREE WITH ALL OF THESE TERMS,
   PLEASE UNINSTALL THE APP. IF YOU ARE ENTERING INTO THIS AGREEMENT ON
   BEHALF OF A COMPANY OR OTHER LEGAL ENTITY, YOU REPRESENT THAT YOU HAVE THE
   AUTHORITY TO BIND SUCH ENTITY TO THIS AGREEMENT, IN WHICH CASE THE TERMS
   “YOU” OR “YOUR” SHALL REFER TO SUCH ENTITY AND ALL APPLICABLE USERS. IF
   YOU DO NOT HAVE SUCH AUTHORITY, OR IF YOU DO NOT UNCONDITIONALLY AGREE TO
   ALL OF THE TERMS OF THIS AGREEMENT, PLEASE UNINSTALL THE APP.

    1. Scope of License. Primate Labs Inc. (“Primate Labs”) grants you a
       limited, non-transferable, perpetual, revocable license for specific
       named user(s) (set forth in the ordering process) to use the App on
       devices that you own solely for personal testing and evaluation
       purposes (i.e., to generate benchmark results “Benchmark Results”),
       subject to the License Level (defined below) that you have selected.
       Primate Labs reserves all other rights in the App. You may not under
       any circumstances: (a) distribute or make the App available over a
       network where it could be used by multiple devices at the same time;
       (b) rent, lease, lend, sell, redistribute or sublicense the App; or
       (c) copy (except as expressly permitted by this EULA), decompile,
       reverse engineer, disassemble, attempt to derive the source code of,
       modify, or create derivative works of the App (except to the extent
       allowed by applicable law); The App is subject to the copyright and
       other intellectual property rights of Primate Labs, and any violation
       of this license is prohibited by law.

       Primate Labs offers three (3) different license levels with different
       functionalities (each a “License Level”), which may be selected upon
       order: (a) Geekbench Trial is a free trial license for specific named
       user(s) to use the App pursuant to the license scope above, which
       includes automatic upload of Benchmark Results (defined below) to
       Primate Labs’ website; (b) Geekbench License, a personal license for
       one (1) specific named user to use the App pursuant to the license
       scope above, solely for use with personally owned devices and not for
       use in, by or on behalf of a business or company, which includes
       additional functionality, including the ability to disable automatic
       uploads of Benchmark Results to Primate Labs’ website; and (c)
       Geekbench Pro License, a business license for specific named user(s)
       to use the App pursuant to the license scope above in connection with
       devices owned by a business or company. In each case, all licenses are
       restricted to use by the named individuals identified to Primate Labs
       at the time of order; you may change named users only with primate
       labs prior permission.

    2. Benchmark Data: You agree that Primate Labs may collect and use
       technical data and related information, including but not limited to
       technical information about your device, system and application
       software, and peripherals, that is gathered periodically to facilitate
       the provision of software updates, product support and other services
       to you (if any) related to the App. Primate Labs may use this
       information, as long as it is in a form that does not personally
       identify you. Your use of the App will automatically result in the
       publication of your Benchmark Results on Primate Labs’ website. The
       Benchmark Results will not identify you but will identify, for
       example, the make and model of the device you are testing and
       evaluating with the App. Primate Labs shall have the right to use,
       create derivative works of, distribute and otherwise exploit the
       Benchmark Results.

       You represent and warrant that (a) you have all rights necessary to
       provide Primate Labs with the Benchmark Results, (b) you will not use
       the App on any pre-release (i.e., not generally available to the
       public) device or operating system unless you have the rights to
       authorize publication of the Benchmark Results related to such
       pre-release device or operating system as set forth in this Section 2,
       and (c) that your use of the App does not and will not exceed the
       license limitations for your applicable License Level.

    3. Termination. The EULA is effective until terminated by you or Primate
       Labs. You may terminate this EULA by uninstalling the App from your
       device. This EULA will terminate automatically without notice if you
       fail to comply with any of its provisions. Upon termination, you must
       uninstall the App.

    4. NO WARRANTY. PRIMATE LABS PROVIDES THE APP “AS IS” AND “AS AVAILABLE.”
       PRIMATE LABS HEREBY DISCLAIMS ALL EXPRESS OR IMPLIED REPRESENTATIONS
       AND WARRANTIES WITH RESPECT TO THE APP, INCLUDING THE IMPLIED
       WARRANTIES OF MERCHANTABILITY, OF SATISFACTORY QUALITY, OF FITNESS FOR
       A PARTICULAR PURPOSE, OF ACCURACY, OF QUIET ENJOYMENT, AND
       NON-INFRINGEMENT. PRIMATE LABS DOES NOT WARRANT AGAINST INTERFERENCE
       WITH YOUR ENJOYMENT OF THE APP, THAT THE APP WILL MEET YOUR
       REQUIREMENTS, THAT THE OPERATION OF THE APP WILL BE UNINTERRUPTED OR
       ERROR-FREE, OR THAT DEFECTS IN THE APP WILL BE CORRECTED. THESE
       DISCLAIMERS WILL APPLY TO THE EXTENT ALLOWED BY THE LAW OF THE
       APPLICABLE JURISDICTION.

    5. LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO
       EVENT SHALL PRIMATE LABS BE LIABLE FOR ANY INCIDENTAL, SPECIAL,
       INDIRECT OR CONSEQUENTIAL DAMAGES WHATSOEVER, INCLUDING DAMAGES FOR
       LOSS OF PROFITS, LOSS OF DATA, BUSINESS INTERRUPTION OR ANY OTHER
       COMMERCIAL DAMAGES OR LOSSES, ARISING OUT OF OR RELATED TO YOUR USE OR
       INABILITY TO USE THE APP, HOWEVER CAUSED, REGARDLESS OF THE THEORY OF
       LIABILITY (CONTRACT, TORT OR OTHERWISE) AND EVEN IF PRIMATE LABS HAS
       BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. IN ADDITION, IN NO
       EVENT SHALL PRIMATE LABS’ TOTAL LIABILITY TO YOU FOR ALL DAMAGES
       (OTHER THAN AS MAY BE REQUIRED BY APPLICABLE LAW IN CASES INVOLVING
       PERSONAL INJURY) EXCEED THE AMOUNT OF FIFTY DOLLARS ($50.00). THE
       FOREGOING LIMITATIONS WILL APPLY EVEN IF THE ABOVE STATED REMEDY FAILS
       OF ITS ESSENTIAL PURPOSE. SOME JURISDICTIONS DO NOT ALLOW THE
       LIMITATION OF LIABILITY FOR PERSONAL INJURY, OR OF INCIDENTAL OR
       CONSEQUENTIAL DAMAGES, SO THIS LIMITATION MAY NOT APPLY TO YOU.

    6. Export Compliance. You may not use or otherwise export or re-export
       the App except as authorized by United States law and the laws of the
       jurisdiction in which the App was obtained. In particular, but without
       limitation, the App may not be exported or re-exported into any U.S.
       embargoed countries or to anyone on the U.S. Treasury Department’s
       list of Specially Designated Nationals or the U.S. Department of
       Commerce Denied Person’s List or Entity List. By using the App, you
       represent and warrant that you are not located in any such country or
       on any such list. You also agree that you will not use the App for any
       purposes prohibited by United States law, including, without
       limitation, the development, design, manufacture or production of
       nuclear, missiles, or chemical or biological weapons.

    7. Government Users. The App and related 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 are reserved under the copyright laws of the United
       States.

    8. Indemnification. You hereby agree to indemnify, defend and hold
       harmless Primate Labs from and against any and all liability and costs
       (including, without limitation, attorneys’ fees and costs) incurred by
       Primate Labs in connection with any actual or alleged claim arising
       out of or in connection with: (a) your breach of the warranties in
       Section 2 and/or Primate Labs’ use and exploitation of the Benchmark
       Results (including automatic publication of the Benchmark Results if
       you have not selected to turn off that feature); (b) any breach or
       alleged breach by you of this EULA; (c) any breach or alleged breach
       by you of a third party’ s rights, including, without limitation, any
       intellectual property, privacy, confidentiality or publicity rights;
       or (d) any actual or alleged violation or non-compliance by you with
       any applicable law, rule or regulation.

    9. Governing Law; Jurisdiction. The laws of the State of Oregon,
       excluding its conflicts of law rules, govern this EULA and your use of
       the App. The exclusive venue and jurisdiction for any and all
       disputes, claims and controversies arising from or relating to this
       EULA shall be the courts located in Oregon. You hereby party waive any
       objection (on the grounds of lack of jurisdiction, forum non
       conveniens or otherwise) to the exercise of such jurisdiction over it
       by any such courts. The United Nations Convention on Contracts for the
       International Sale of Goods will not apply to the interpretation or
       enforcement of this EULA.
