ó
Ñs/Uc           @   s#
  d  Z  d d l Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d	 e f d
 „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ	 d e f d „  ƒ  YZ
 d e	 f d „  ƒ  YZ d e	 f d „  ƒ  YZ d e	 f d „  ƒ  YZ d e	 f d „  ƒ  YZ d e	 f d „  ƒ  YZ d e	 f d „  ƒ  YZ d e	 f d „  ƒ  YZ d e	 f d  „  ƒ  YZ d! e	 f d" „  ƒ  YZ d# e	 f d$ „  ƒ  YZ d% e	 f d& „  ƒ  YZ d' e f d( „  ƒ  YZ d) e f d* „  ƒ  YZ d+ e f d, „  ƒ  YZ d e f d- „  ƒ  YZ
 d. e f d/ „  ƒ  YZ d0 e f d1 „  ƒ  YZ d2 e f d3 „  ƒ  YZ d4 e f d5 „  ƒ  YZ d6 e f d7 „  ƒ  YZ d8 e	 f d9 „  ƒ  YZ d: e f d; „  ƒ  YZ d< e f d= „  ƒ  YZ  d> e f d? „  ƒ  YZ! d@ e f dA „  ƒ  YZ" dB e	 f dC „  ƒ  YZ# dD e f dE „  ƒ  YZ$ dF e f dG „  ƒ  YZ% e ƒ  Z& dH „  Z' dI e f dJ „  ƒ  YZ( dK „  Z) e* dL k r	
d d l+ Z+ d d l, Z, dM dN d e- f i e- dO 6e. dP 6i d@ dQ 6dR dS 6dT 6i d> dQ 6dU dS 6dV 6i d dQ 6dW 6f dX dY dZ e- f i e- dO 6e. dP 6i d@ dQ 6d[ dS 6dT 6i d> dQ 6d\ dS 6dV 6i dB dQ 6d] dS 6dW 6f d^ d_ d` e- f i e- dO 6e. dP 6i da dQ 6db dS 6dc 6i d0 dQ 6dd dS 6dV 6i de dQ 6df dS 6dW 6f dg dh di e- f i e- dO 6e- dP 6i d+ dQ 6dj dS 6dT 6i d) dQ 6dV 6i d dQ 6dk dS 6dW 6f dl d) dm e- f i e- dO 6e. dP 6i d) dQ 6dV 6i d dQ 6dn dS 6dW 6f do d) dp e- f i e- dO 6e. dP 6i d) dQ 6dV 6i d dQ 6dq dS 6dW 6f dr ds dt e- f i e- dO 6e- dP 6i du dS 6d. dQ 6dT 6i dv dS 6dF dQ 6dc 6i d dQ 6dw dS 6dW 6f dx dy dz e. f i e. dO 6e. dP 6i d0 dQ 6dd dS 6dV 6i d dQ 6d{ dS 6dW 6f d| d} d~ e- f i e- dO 6e- dP 6i d dS 6d< dQ 6dc 6i d' dQ 6dV 6i d€ dS 6d dQ 6dW 6f d d‚ d~ e- f i e- dO 6e. dP 6i dƒ dS 6d< dQ 6dc 6i d' dQ 6dV 6i d€ dS 6d dQ 6dW 6f d„ d… d† e. f i e. dO 6e. dP 6i d‡ dS 6d. dQ 6dT 6i d dQ 6dV 6i dˆ dS 6d dQ 6dW 6f d‰ dŠ d‹ e. f i e. dO 6e. dP 6i dŒ dS 6d. dQ 6dT 6i d dQ 6dV 6i d dS 6d8 dQ 6dW 6f dŽ d d e. f i e. dO 6e. dP 6i d‘ dS 6d4 dQ 6dc 6i d' dQ 6dV 6i d’ dS 6d dQ 6dW 6f d“ d” d~ e- f i e- dO 6e. dP 6i d• dS 6d< dQ 6dc 6i d' dQ 6dV 6i d€ dS 6d dQ 6dW 6f d– d— d~ e- f i e- dO 6e. dP 6i d˜ dS 6d< dQ 6dc 6i d' dQ 6dV 6i d€ dS 6d dQ 6dW 6f d™ dš d› e- f i e- dO 6e. dP 6i du dS 6d. dQ 6dT 6i du dS 6dD dQ 6dc 6i dœ dS 6d dQ 6dW 6f d dž dŸ e. f i e. dO 6e. dP 6i d: dQ 6d  dS 6dV 6i d8 dQ 6d¡ dS 6dW 6f d¢ dy d£ e. f i e. dO 6e. dP 6i d0 dQ 6dd dS 6dV 6i d dQ 6d¤ dS 6dW 6f d¥ d' d¦ e. f i e. dO 6e. dP 6i d' dQ 6dV 6i d dQ 6d§ dS 6dW 6f f Z/ d¨ e, j0 f d© „  ƒ  YZ1 e, j2 ƒ  n  dª e f d« „  ƒ  YZ3 d S(¬   s¤  
Extract client information from http user agent
The module does not try to detect all capabilities of browser in current form (it can easily be extended though).
Aim is
    * fast
    * very easy to extend
    * reliable enough for practical purposes
    * and assist python web apps to detect clients.

Taken from http://pypi.python.org/pypi/httpagentparser (MIT license)
Modified my Ross Peoples for web2py to better support iPhone and iPad.
Modified by Angelo Compagnucci <angelo.compagnucci@gmail.com> to better support a wide ringe of mobile devices.
Now it supports: tablet device (is_tablet), BlackBerry, BlackBerry PlayBook, Android Tablets, Windows Mobile,
Symbian.
iÿÿÿÿNt   DetectorsHubc           B   sG   e  Z d  d d d g Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(	   t   ost   distt   flavort   browserc         O   sE   t  j |  | | Ž x! |  j D] } |  j | g  ƒ q W|  j ƒ  d  S(   N(   t   dictt   __init__t   _known_typest
   setdefaultt   registerDetectors(   t   selft   argst   kwt   typ(    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR      s    c         C   sV   | j  |  j k r> | g |  | j  <|  j j | j | j  ƒ n |  | j  j | ƒ d  S(   N(   t	   info_typeR   t   insertt   ordert   append(   R
   t   detector(    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyt   register   s    c            sS   ˆ  d  k r g  Sˆ  g  k r  | Sˆ  j d d ƒ ‡  f d †  } t | d | ƒSd  S(   Ni    t    c            s(   |  j  ˆ  k r! ˆ  j |  j  ƒ p' t j S(   N(   t   namet   indext   syst   maxint(   t   d(   t   prefs(    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyt   key_name+   s    t   key(   t   NoneR   t   sorted(   R
   t	   detectorsR   R   (    (   R   sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyt   reorderByPrefs#   s    c         C   s   t  |  j ƒ S(   N(   t   iterR   (   R
   (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyt   __iter__/   s    c         C   sk   g  t  ƒ  j ƒ  D]' } t t | d g  ƒ k r | ƒ  ^ q } x' | D] } | j rD |  j | ƒ qD qD Wd  S(   Nt   __mro__(   t   globalst   valuest   DetectorBaset   getattrt   can_registerR   (   R
   t   vR   R   (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR	   2   s
    '	(   t   __name__t
   __module__R   R   R   R    R"   R	   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR       s   				R&   c           B   s}   e  Z d  Z d  Z d  Z d Z g  Z g  Z e Z	 e Z
 e Z e ƒ  Z d d g Z d Z d „  Z d „  Z d „  Z d „  Z RS(	   R   i
   t   /t    c         C   s:   |  j  s |  j j |  _  n  |  j j j d t ƒ |  _ d  S(   NR(   (   R   t	   __class__R*   t   __dict__t   gett   TrueR(   (   R
   (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR   H   s    	c         C   s—   | r“ |  j  | ƒ r“ t d |  j ƒ | |  j <|  j } |  j } | rS | | d <n  | rf | | d <n  |  j | ƒ } | r | | |  j d <n  t St S(   NR   t	   is_mobilet	   is_tablett   version(	   t
   checkWordsR   R   R   R2   R3   t
   getVersionR1   t   False(   R
   t   agentt   resultR2   R3   R4   (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyt   detectM   s    		c         C   sL   x! |  j  D] } | | k r
 t Sq
 Wx! |  j D] } | | k r. t Sq. Wt S(   N(   t   skip_if_foundR7   t   look_forR1   (   R
   R8   t   w(    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR5   ^   s    c         C   s@   |  j  } | j |  j d | d ƒ d j | d ƒ d j ƒ  S(   Ni    i   i   (   t   version_splitterst	   partitionR<   t   strip(   R
   R8   t   vs(    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR6   j   s    	N(   R*   R+   R   R   t
   result_keyR   R<   R;   R7   R(   R2   R3   R   R   R>   R   t   _suggested_detectorsR   R:   R5   R6   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR&   :   s    				t   OSc           B   s    e  Z d  Z e Z d d g Z RS(   R   t   ;R-   (   R*   R+   R   R7   R(   R>   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRD   p   s   t   Distc           B   s   e  Z d  Z e Z RS(   R   (   R*   R+   R   R7   R(   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRF   v   s   t   Flavorc           B   s   e  Z d  Z e Z RS(   R   (   R*   R+   R   R7   R(   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRG   {   s   t   Browserc           B   s   e  Z d  Z e Z RS(   R   (   R*   R+   R   R7   R(   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRH   €   s   t	   Macintoshc           B   s)   e  Z d  g Z e d d ƒ Z d „  Z RS(   RI   R   c         C   s   d  S(   N(    (   R
   R8   (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR6   ‰   s    N(   R*   R+   R<   R   R   R   R6   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRI   …   s   	t   Firefoxc           B   s   e  Z d  g Z RS(   RJ   (   R*   R+   R<   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRJ      s   t	   Konquerorc           B   s   e  Z d  g Z d d g Z RS(   RK   R,   RE   (   R*   R+   R<   R>   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRK   ‘   s   	t   Operac           B   s   e  Z d  g Z d „  Z RS(   RL   c         C   s)   | j  |  j d ƒ d d j  d ƒ d S(   Ni    i   i   R-   (   R?   R<   (   R
   R8   (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR6   ™   s    (   R*   R+   R<   R6   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRL   –   s   	t   Netscapec           B   s   e  Z d  g Z RS(   RM   (   R*   R+   R<   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRM      s   t   MSIEc           B   s,   e  Z d  g Z d g Z d Z d d g Z RS(   RN   RL   s   Microsoft Internet ExplorerR-   RE   (   R*   R+   R<   R;   R   R>   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRN   ¡   s   		t   Galeonc           B   s   e  Z d  g Z RS(   RO   (   R*   R+   R<   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRO   ¨   s   t   Safaric           B   s/   e  Z d  g Z d d d d d g Z d „  Z RS(   RP   t   Chromet   OmniWebt   Mobilet   iPadt   Androidc         C   s4   d | k r0 | j  d ƒ d j  d ƒ d j ƒ  Sd  S(   Ns   Version/i   R-   i    (   R?   R@   (   R
   R8   (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR6   °   s    (   R*   R+   R<   R;   R6   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRP   ¬   s   	t   SafariTabletc           B   sA   e  Z d  Z d  d g Z d d d d g Z e Z e Z d „  Z RS(   RP   RU   RQ   RR   RS   RT   c         C   s4   d | k r0 | j  d ƒ d j  d ƒ d j ƒ  Sd  S(   Ns   Version/i   R-   i    (   R?   R@   (   R
   R8   (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR6   ¼   s    (	   R*   R+   R   R<   R;   R1   R2   R3   R6   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRV   µ   s   t   SafariMobilec           B   s)   e  Z d  Z d  d g Z e Z d „  Z RS(   RP   RS   c         C   s4   d | k r0 | j  d ƒ d j  d ƒ d j ƒ  Sd  S(   Ns   Version/i   R-   i    (   R?   R@   (   R
   R8   (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR6   Æ   s    (   R*   R+   R   R<   R1   R2   R6   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRW   Á   s   t   SafariNokiac           B   s)   e  Z d  Z d  d g Z e Z d „  Z RS(   RP   t	   SymbianOSc         C   s   d  S(   N(    (   R
   R8   (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR6   Ð   s    (   R*   R+   R   R<   R1   R2   R6   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRX   Ë   s   t
   SafariiPadc           B   s;   e  Z d  Z d  d g Z d d g Z e Z e Z d „  Z RS(   RP   RT   RQ   RR   c         C   s4   d | k r0 | j  d ƒ d j  d ƒ d j ƒ  Sd  S(   Ns   Version/i   R-   i    (   R?   R@   (   R
   R8   (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR6   Û   s    (	   R*   R+   R   R<   R;   R1   R2   R3   R6   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRZ   Ô   s   t   Linuxc           B   s8   e  Z d  g Z e d d d d g d d ƒ Z d „  Z RS(   R[   R   t   UbuntuRU   t   DebianR   c         C   s   d  S(   N(    (   R
   R8   (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR6   ä   s    N(   R*   R+   R<   R   R   R   R6   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR[   à   s   	t
   BlackBerryc           B   s;   e  Z d  g Z e d d g ƒ Z e Z d „  Z d „  Z RS(   R^   R   t   PlayBookc         C   s    d | k s d | k r t  St S(   NR^   R_   (   R1   R7   (   R
   R8   (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR5   î   s    c         C   s   d  S(   N(    (   R
   R8   (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR6   ó   s    (	   R*   R+   R<   R   R   R1   R2   R5   R6   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR^   è   s
   		R_   c           B   s&   e  Z d  g Z e Z e Z d „  Z RS(   R_   c         C   s$   | j  d ƒ d j  d ƒ d j ƒ  S(   Ns	   Tablet OSi   RE   i    (   R?   R@   (   R
   R8   (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR6   ü   s    (   R*   R+   R<   R1   R2   R3   R6   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR_   ÷   s   	c           B   s2   e  Z d  g Z e d d d d g ƒ Z d „  Z RS(   RI   R   R   t   MacOSc         C   s   d  S(   N(    (   R
   R8   (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR6     s    N(   R*   R+   R<   R   R   R   R6   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRI      s   	R`   c           B   s;   e  Z d  g Z e d d d d d d d g ƒ Z d „  Z RS(	   s   Mac OSR   RP   RW   t
   SafariIpadRJ   RL   s   Microsoft Internet Explorerc         C   si   d d g } | j  d ƒ d j ƒ  } x1 | D]) } | | k r, | j  | ƒ d } Pq, q, W| j d d ƒ S(   NRE   t   )s   Mac OSi   i    t   _t   .(   R?   R@   t   replace(   R
   R8   t   version_end_charst   partt   cR4   (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR6     s    (   R*   R+   R<   R   R   R6   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR`     s   	t   Windowsc           B   sA   e  Z d  d g Z e d d d g d d g d d	 ƒ Z d „  Z RS(
   Ri   t   NTR   s   Microsoft Internet ExplorerRJ   R   t   WindowsMobileR   c         C   sB   | j  d ƒ } | d d | d j d d ƒ j  d ƒ d j ƒ  S(   NRj   i   R-   i   Rb   RE   i    (   R?   Re   R@   (   R
   R8   R)   (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR6     s    N(   R*   R+   R<   R   R   R   R6   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRi     s   Rk   c           B   s)   e  Z d  Z d d  g Z e Z d „  Z RS(   t   PhoneRi   c         C   s0   | j  d ƒ d j d d ƒ j  d ƒ d j ƒ  S(   Ns   Windows Phonei   Rb   R   RE   i    (   R?   Re   R@   (   R
   R8   (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR6   &  s    (   R*   R+   R   R<   R1   R2   R6   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRk   !  s   R\   c           B   s/   e  Z d  g Z d d g Z e d d g ƒ Z RS(   R\   R,   R-   R   RJ   (   R*   R+   R<   R>   R   R   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR\   *  s   	R]   c           B   s/   e  Z d  g Z d d g Z e d d g ƒ Z RS(   R]   R,   R-   R   RJ   (   R*   R+   R<   R>   R   R   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR]   0  s   	RQ   c           B   s   e  Z d  g Z d d g Z RS(   RQ   R,   R-   (   R*   R+   R<   R>   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRQ   6  s   	t   ChromeOSc           B   s8   e  Z d  g Z d d g Z e d d g ƒ Z d „  Z RS(   t   CrOSR-   Rb   R   RQ   c         C   sM   |  j  } | j |  j d | d ƒ d j | d ƒ d j d ƒ d j ƒ  S(   Ni    i   i   R-   (   R>   R?   R<   R@   (   R
   R8   RA   (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR6   @  s    	(   R*   R+   R<   R>   R   R   R6   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRm   ;  s   	RU   c           B   s5   e  Z d  g Z e d d d g ƒ Z e Z d „  Z RS(   RU   R   RV   RW   c         C   s$   | j  d ƒ d j  d ƒ d j ƒ  S(   NRU   i   RE   i    (   R?   R@   (   R
   R8   (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR6   J  s    (   R*   R+   R<   R   R   R1   R2   R6   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRU   E  s   	RY   c           B   sA   e  Z d  g Z e d d g d d d g ƒ Z e Z d d g Z RS(   RY   R   t   SeriesR   RP   RL   R,   s   ; (   R*   R+   R<   R   R   R1   R2   R>   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRY   N  s   	Ro   c           B   s)   e  Z d  d g Z d d g Z d „  Z RS(   RY   Ro   R,   RE   c         C   s*   | j  d ƒ d j  d ƒ d j d d ƒ S(   NRo   i   R-   i    R,   (   R?   Re   (   R
   R8   (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR6   Y  s    (   R*   R+   R<   R>   R6   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRo   U  s   t	   BrowserNGc           B   s   e  Z d  g Z d d g Z RS(   Rp   R,   RE   (   R*   R+   R<   R>   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRp   ]  s   	t   iPhonec           B   s2   e  Z d  g Z e Z e d d g ƒ Z d „  Z RS(   Rq   R   RW   c         C   s’   d d d g } d | k r+ d | k r+ d S| j  d ƒ d j ƒ  } x; | D]3 } | | k rK d	 | j  | ƒ d
 j ƒ  } PqK qK W| j d d ƒ S(   Nt   likeRE   Rb   s   CPU iPhone OSs   CPU OSt   XRD   i   s   iOS i    Rc   Rd   (   R?   R@   Re   (   R
   R8   Rf   Rg   Rh   R4   (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR6   g  s    (   R*   R+   R<   R1   R2   R   R   R6   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRq   b  s   	RT   c           B   s&   e  Z d  g Z e Z e Z d „  Z RS(   RT   c         C   s†   d d d g } d | k r d S| j  d ƒ d j ƒ  } x; | D]3 } | | k r? d | j  | ƒ d j ƒ  } Pq? q? W| j d	 d
 ƒ S(   NRr   RE   Rb   RD   R   i   s   iOS i    Rc   Rd   (   R?   R@   Re   (   R
   R8   Rf   Rg   Rh   R4   (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR6   x  s    (   R*   R+   R<   R1   R2   R3   R6   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRT   s  s   	c         C   sÝ   t  ƒ  } t  ƒ  } t | d <t | d <x t D]ˆ } t | } | j | g  ƒ } t j | | ƒ } y4 x- | D]% } | j |  | ƒ rk | j } Pqk qk WWq- t k
 r´ } | | d <q- Xq- Wd | k rÙ i d d 6| d <n  | S(   NR2   R3   t	   exceptionR   t   IE11R   (   R   R7   t   detectorshubR0   R    R:   R   t	   Exception(   R8   R9   R   R   R   t   _d_prefsR   t   ex(    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR:   †  s$    		


	t   Resultc           B   s   e  Z d  „  Z RS(   c         C   s   d S(   NR   (    (   R
   t   k(    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyt   __missing__  s    (   R*   R+   R|   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRz   œ  s   c         C   s²  t  |  ƒ } g  } d | k r6 | j | d d ƒ n  d | k rZ | j | d d ƒ n  d | k r~ | j | d d ƒ n  | r“ d j | ƒ p– d } | rÈ d | k rÈ | d rÈ | d j d ƒ pd | k rñ | d rñ | d j d ƒ pd | k r| d r| d j d ƒ pd } d	 | k r:| d	 d p=d
 } d	 | k r_| d	 j d ƒ pbd } | rƒd j | | f ƒ } n  | r¡d j | | f ƒ } n  | | | d f S(   s8   
    -> (os, browser, is_mobile) # tuple of strings
    R   R   R   R   R-   s
   Unknown OSR4   R   R   s   Unknown BrowserR2   (   R:   R   t   joinR0   (   R8   R9   t   os_listR   t
   os_versionR   t   browser_version(    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyt   simple_detect¡  s*    &2/t   __main__s”   Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 Nokia6120c/3.83; Profile/MIDP-2.0 Configuration/CLDC-1.1) AppleWebKit/413 (KHTML, like Gecko) Safari/413s   Series SymbianOS 60 3.1R2   R3   R   s   60 3.1R4   R   s   9.2R   R   sž   Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/20.0.019; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.18124s   Series SymbianOS 60 5.0s   BrowserNG 7.1.18124s   60 5.0s   9.4s	   7.1.18124sI   Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Windows Phone 6.5.3.5)s   Phone Windows 6.5.3.5s   Microsoft Internet Explorer 6.0Rl   s   6.5.3.5R   s   NT 5.1s   Microsoft Internet Explorers   6.0sx   Mozilla/5.0 (PlayBook; U; RIM Tablet OS 1.0.0; en-US) AppleWebKit/534.8+ (KHTML, like Gecko) Version/0.0.1 Safari/534.8+s   PlayBook BlackBerry 1.0.0s   Safari 0.0.1s   1.0.0s   0.0.1s   Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en-US) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.246 Mobile Safari/534.1+s   Safari 6.0.0.246s	   6.0.0.246s   Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en-US) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.600 Mobile Safari/534.8+s   Safari 6.0.0.600s	   6.0.0.600s   Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5s   MacOS iPad Xs   Safari 5.0.2Rs   s	   iOS 4.2.1s   5.0.2sU   Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20060127 Netscape/8.1s   Windows NT 5.1s   Netscape 8.1s   8.1s   Mozilla/5.0 (Linux; U; Android 3.0.1; en-us; A500 Build/HRI66) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13s   Android Linux 3.0.1s
   Safari 4.0s   3.0.1s   4.0sŽ   Mozilla/5.0 (Linux; U; Android 2.3.7; it-it; Dream/Sapphire Build/FRG83) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1s   Android Linux 2.3.7s   2.3.7sc   Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-GB; rv:1.9.0.10) Gecko/2009042315 Firefox/3.0.10s   MacOS Macintosh X 10.5s   Firefox 3.0.10s   X 10.5s   3.0.10s   Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_6) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.3 Safari/534.24,gzip(gfe)s   MacOS Macintosh X 10.6.6s   Chrome 11.0.696.3s   X 10.6.6s
   11.0.696.3sh   Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2) Gecko/20100308 Ubuntu/10.04 (lucid) Firefox/3.6 GTB7.1s   Ubuntu Linux 10.04s   Firefox 3.6s   10.04s   3.6sƒ   Mozilla/5.0 (Linux; U; Android 2.2.1; fr-ch; A43 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1s   Android Linux 2.2.1s   2.2.1s£   Mozilla/5.0 (Linux; U; Android 2.3.4; it-it; LG-P990 Build/GRJ22) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MMS/LG-Android-MMS-V1.0/1.2s   Android Linux 2.3.4s   2.3.4sz   Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3s   MacOS iPhone Xs
   Safari 3.0s   3.0st   Mozilla/5.0 (X11; CrOS i686 0.0.0) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.27 Safari/534.24,gzip(gfe)s   ChromeOS 0.0.0s   Chrome 11.0.696.27s   0.0.0s   11.0.696.27sL   Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.1) Opera 7.02 [en]s
   Opera 7.02s   7.02s@   Opera/9.80 (X11; Linux i686; U; en) Presto/2.9.168 Version/11.50s
   Opera 9.80s   9.80t   TestHAPc           B   s,   e  Z d  „  Z d „  Z d „  Z d „  Z RS(   c         C   s   d |  _  t |  _ d  S(   Nid   (   t   harass_repeatt   data(   R
   (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyt   setUp  s    	c         C   s4   x- t  D]% \ } } } |  j t | ƒ | ƒ q Wd  S(   N(   R…   t   assertEqualR   (   R
   R8   t
   simple_rest   res(    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyt   test_simple_detect  s    c         C   s4   x- t  D]% \ } } } |  j t | ƒ | ƒ q Wd  S(   N(   R…   R‡   R:   (   R
   R8   Rˆ   R‰   (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyt   test_detect  s    c         C   s   t  j  ƒ  } x( t |  j D] \ } } } t | ƒ q Wt  j  ƒ  | } t |  j ƒ |  j } d | | f GHd G| t |  j ƒ |  j GHd  S(   Ns"   
Time taken for %s detecttions: %ss"   Time taken for single detecttion: (   t   timeR…   R„   R:   t   len(   R
   t   thenR8   Rˆ   R‰   t
   time_takent   no_of_tests(    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyt   test_harass  s    (   R*   R+   R†   RŠ   R‹   R‘   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyRƒ     s   			t   mobilizec           B   s   e  Z d  „  Z d „  Z RS(   c         C   s   | |  _  d  S(   N(   t   func(   R
   R“   (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR   /  s    c         C   so   d d l  m } | j j ƒ  } | j re | j j j d ƒ } | j d d ƒ d j	 | ƒ | j _ n  |  j
 ƒ  S(   Niÿÿÿÿ(   t   currentRd   t   mobile(   t   gluonR”   t   requestt
   user_agentR2   t   responset   viewt   splitR   R}   R“   (   R
   R”   R˜   t   items(    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyt   __call__2  s    	(   R*   R+   R   R   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyR’   -  s   	(4   t   __doc__R   R   R    t   objectR&   RD   RF   RG   RH   RI   RJ   RK   RL   RM   RN   RO   RP   RV   RW   RX   RZ   R[   R^   R_   R`   Ri   Rk   R\   R]   RQ   Rm   RU   RY   Ro   Rp   Rq   RT   Rv   R:   Rz   R   R*   RŒ   t   unittestR1   R7   R…   t   TestCaseRƒ   t   mainR’   (    (    (    sI   /var/www/c4bv.valis/web2py-ge-R-2.10.3/gluon/contrib/user_agent_parser.pyt   <module>   sÎ   '6	
		
	
				LSSL77S>LLLLLLLS>>=