
    'j+                        d dl mc mZ d dlmZ d dlmZmZm	Z	m
Z
mZmZmZmZmZ d dlZd dlmZ d dlmZmZmZmZ d dlmZ ddlmZmZmZmZm Z m!Z! dd	l"m#Z# 	 d dl$Z%d
Z&n# e'$ r dZ&Y nw xY w	 e G d d                      Z( ed
           G d d                      Z)	 de*ddfdZ+de*de(fdZ,d,de*de-de(fdZ.dee*e
e*         f         dee*ef         ddfdZ/de	e*         de*fdZ0	 edz  Z1dZ2 G d d e          Z3d-d!Z4d-d"Z5d-d#Z6d$e*de)fd%Z7	 dej8        fd&Z9d'ej8        d(e*de:fd)Z; G d* d+          Z< e<            Z=dS ).    N)	dataclass)	AnyDictIterableListOptionalSetTupleUnioncast)tags)
LOCAL_DATAGitHubDownloaderrprintwebdl)LeakWarning   )InvalidLocaleMissingReleaseNotInstalledGeoIPExtraUnknownIPLocationUnknownLanguageUnknownTerritory)validate_ipTFc                       e Zd ZU dZeed<   dZee         ed<   dZee         ed<   e	defd            Z
deeef         fdZdS )	Localez8
    Stores locale, region, and script information.
    languageNregionscriptreturnc                 @    | j         r| j         d| j          S | j        S )N-)r   r   selfs    S/home/ice/.hermes/hermes-agent/venv/lib/python3.11/site-packages/camoufox/locale.py	as_stringzLocale.as_string,   s,    ; 	4m33dk333}    c                 X    | j         sJ | j         | j        d}| j        r
| j        |d<   |S )zB
        Converts the locale to a intl config dictionary.
        )zlocale:regionzlocale:languagezlocale:script)r   r   r   r$   datas     r%   	as_configzLocale.as_config2   sD     {{![#}
 
 ; 	0$(KD!r'   )__name__
__module____qualname____doc__str__annotations__r   r   r   propertyr&   r   r+    r'   r%   r   r   "   s           MMM FHSM    FHSM   3    X
4S>      r'   r   )frozenc                   r    e Zd ZU dZeed<   eed<   eed<   eed<   dZe	e         ed<   de
eef         fd	ZdS )
Geolocationz)
    Stores geolocation information.
    locale	longitudelatitudetimezoneNaccuracyr    c                     | j         | j        | j        d| j                                        }| j        r
| j        |d<   |S )zB
        Converts the geolocation to a config dictionary.
        )zgeolocation:longitudezgeolocation:latituder:   zgeolocation:accuracy)r8   r9   r:   r7   r+   r;   r)   s     r%   r+   zGeolocation.as_configL   sU    
 &*^$(M
 
 k##%%	
 = 	9+/=D'(r'   )r,   r-   r.   r/   r   r1   floatr0   r;   r   r   r   r+   r3   r'   r%   r6   r6   @   s           NNNOOOMMM $Hhuo$$$4S>      r'   r6   locr    c                 V    t          j        |           rdS t          j        |           )zX
    Verifies that a locale is valid.
    Takes either language-region or language.
    N)r   checkr   invalid_input)r>   s    r%   verify_localerB   `   s*    
 z# 

%c
*
**r'   r7   c                 $   t          |            t          j        |           }|j        st	          j        |           |j        j        d         }t          |d         |j        j        d         d         |	                    d                    S )z1
    Normalizes and validates a locale code.
    recordSubtagzSuppress-Script)r   r   r   )
rB   r   tagr   r   rA   r   r*   r   get)r7   parserrD   s      r%   normalize_localerI   j   s     & XfF= 2)&111_!(+F !}!(+H5zz+,,   r'   ignore_regionc                    t          |           dk    rt          |           S 	 t                              |           S # t          $ r Y nw xY w|rt          |            t          |           S 	 t                              |           }t          j	        d           |S # t          $ r Y nw xY wt          j        |           )z>
    Handles a locale input, normalizing it if necessary.
       )r   	no_region)lenrI   SELECTORfrom_regionr   rB   r   from_languager   warnr   r   rA   )r7   rJ   r   s      r%   handle_localerS      s    
 6{{Q'''##F+++     'fv&&&&))&11 	%%%	     
%f
-
--s!   > 
A
A0B   
B-,B-localesconfigc                 H   t          | t                    rd |                     d          D             } t          | d                   }|                    |                                           t          |           dk     rdS t          d | D                       |d<   dS )z$
    Handles a list of locales.
    c                 6    g | ]}|                                 S r3   )strip).0r>   s     r%   
<listcomp>z"handle_locales.<locals>.<listcomp>   s     ===3399;;===r'   ,r      Nc              3   B   K   | ]}t          |d           j        V  dS )T)rJ   N)rS   r&   )rY   r7   s     r%   	<genexpr>z!handle_locales.<locals>.<genexpr>   sC       ( (@FfD111;( ( ( ( ( (r'   z
locale:all)
isinstancer0   splitrS   updater+   rN   _join_unique)rT   rU   intl_locales      r%   handle_localesrd      s     '3 >=='--*<*<===  
++K
MM+''))***
7||a ( ( (JQ( ( (  F<r'   seqc                 b    t                      d                    fd| D                       S )z8
    Joins a sequence of strings without duplicates
    z, c              3   N   K   | ]}|v                      |          |V   d S N)add)rY   xseens     r%   r^   z_join_unique.<locals>.<genexpr>   s5      FF1AII!IQIIIIFFr'   )setjoin)re   rk   s    @r%   rb   rb      s5     UUD99FFFFFFFFFFr'   zGeoLite2-City.mmdbzP3TERX/GeoLite.mmdbc                   6    e Zd ZdZdedee         fdZddZdS )MaxMindDownloaderz?
    MaxMind database downloader from a GitHub repository.
    assetr    c                 L    |d                              d          r|d         S d S )Nnamez
-City.mmdbbrowser_download_url)endswith)r$   rp   s     r%   check_assetzMaxMindDownloader.check_asset   s-    =!!,// 	1/00tr'   Nc                      t          d          )Nz+Failed to find GeoIP database release asset)r   r#   s    r%   missing_asset_errorz%MaxMindDownloader.missing_asset_error   s    JKKKr'   r    N)	r,   r-   r.   r/   r   r   r0   ru   rw   r3   r'   r%   ro   ro      s^          (3-    L L L L L Lr'   ro   c                  2    t           st          d          dS )z3
    Checks if the geoip2 module is available.
    zOPlease install the geoip extra to use this feature: pip install camoufox[geoip]N)ALLOW_GEOIPr   r3   r'   r%   geoip_allowedr{      s+      
$]
 
 	

 
r'   c                      t                       t          t                                                    } t	          t
          d          5 }t          | d|           ddd           dS # 1 swxY w Y   dS )z0
    Downloads the MaxMind GeoIP2 database.
    wbzDownloading GeoIP database)descbufferN)r{   ro   	MMDB_REPO	get_assetopen	MMDB_FILEr   )	asset_urlfs     r%   download_mmdbr      s     OOO!),,6688I	i		 
!-	
 	
 	
 	

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
s   
A**A.1A.c                      t                                           st          d           dS t                                            t          d           dS )z.
    Removes the MaxMind GeoIP2 database.
    zGeoIP database not found.NzGeoIP database removed.)r   existsr   unlinkr3   r'   r%   remove_mmdbr      sS      *+++
$%%%%%r'   ipc           
         t                                           st                       t          |            t          j                            t          t                               5 }|                    |           }t          t          |j
        j                                                  }|j        t          fddD                       rt          d|            t                               |          }t%          |t          t&          |j        j                  t          t&          |j        j                  t          t          |j        j                            cddd           S # 1 swxY w Y   dS )z1
    Gets the geolocation for an IP address.
    c              3   :   K   | ]}t          |           V  d S rh   )getattr)rY   attrlocations     r%   r^   z"get_geolocation.<locals>.<genexpr>
  s0      ^^t78T***^^^^^^r'   )r8   r9   	time_zonezUnknown IP location: )r7   r8   r9   r:   N)r   r   r   r   geoip2databaseReaderr0   cityr   registered_countryiso_codeupperr   anyr   rO   rP   r6   r=   r8   r9   r   )r   readerrespr   r7   r   s        @r%   get_geolocationr      s   
   OOO			I	/	/ 
6{{2T4=>>DDFF= ^^^^7]^^^^^ 	B#$@B$@$@AAA %%h//5$-"9::%!788#t}677	
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
s   )C>E44E8;E8c                      t          t          dz  d          5 } t          j        |                                           }ddd           n# 1 swxY w Y   |
J d            |S )z
    Fetches supplemental data from the territoryInfo.xml file.
    Source: https://raw.githubusercontent.com/unicode-org/cldr/master/common/supplemental/supplementalData.xml
    zterritoryInfo.xmlrbNz Failed to load territoryInfo.xml)r   r   ETXMLread)r   r*   s     r%   get_unicode_infor     s    
 
j..	5	5  vaffhh                             ?Ks   'AAAelementr   c                 H    t          |                     |d                    S )z+
    Converts an attribute to a float.
    r   )r=   rG   )r   r   s     r%   	_as_floatr   (  s      T1%%&&&r'   c                       e Zd ZdZd Zdedeej        ej        f         fdZ	dedeej        ej        f         fdZ
dej        d	ej        deej        ej        f         fd
ZdedefdZdedefdZdS )StatisticalLocaleSelectorz
    Selects a random locale based on statistical data.
    Takes either a territory code or a language code, and generates a Locale object.
    c                 ,    t                      | _        d S rh   )r   rootr#   s    r%   __init__z"StatisticalLocaleSelector.__init__5  s    $&&			r'   r   r    c                 \   | j                             d| d          }|t          d|           |                    d          }|st	          d|           t          j        d |D                       }t          j        d |D                       }|                     ||          S )	z
        Calculates a random language based on the territory code,
        based on the probability that a person speaks the language in the territory.
        zterritory[@type='z']NzUnknown territory: languagePopulationz#No language data found for region: c                 8    g | ]}|                     d           S )type)rG   rY   langs     r%   rZ   zBStatisticalLocaleSelector._load_territory_data.<locals>.<listcomp>E  s$    LLL4dhhv..LLLr'   c                 .    g | ]}t          |d           S )populationPercent)r   r   s     r%   rZ   zBStatisticalLocaleSelector._load_territory_data.<locals>.<listcomp>F  s#    bbb	$0C D Dbbbr'   )r   findr   findall
ValueErrornparraynormalize_probabilities)r$   r   	territorylang_populations	languagespercentagess         r%   _load_territory_dataz.StatisticalLocaleSelector._load_territory_data8  s    
 INN#Cx#C#C#CDD	"#C#C#CDDD$,,-ABB 	OM8MMNNNHLL;KLLLMM	hbbQabbbcc++I{CCCr'   r   c                 6   | j                             d| d          }|st          d|           g }g }|D ]}|                    d          }||                    d| d          }|6|                    |           |                    t          |d          t          |d	          z  d
z  t          |d          z             |st          d|           |                     t          j
        |          t          j
        |                    S )z
        Calculates a random region for a language
        based on the total speakers of the language in that region.
        z'.//territory/languagePopulation[@type="z"]/..z#No region data found for language: r   NzlanguagePopulation[@type="z"]r   literacyPercenti'  
populationz)No valid region data found for language: )r   r   r   rG   r   appendr   r   r   r   r   )r$   r   territoriesregionsr   terrr   lang_pops           r%   _load_language_dataz-StatisticalLocaleSelector._load_language_dataJ  sV   
 i''(aRZ(a(a(abb 	T!"R"R"RSSS 	 	DXXf%%F~yy!Jh!J!J!JKKHNN6"""($788D"3445 D,//0     	USSSTTT++BHW,=,=rx?T?TUUUr'   r   freqc                 8    t          j        |          }|||z  fS )z*
        Normalize probabilities.
        )r   sum)r$   r   r   totals       r%   r   z1StatisticalLocaleSelector.normalize_probabilitiesl  s      t$,&&r'   r   c                     |                      |          \  }}t          j                            ||                              dd          }t          | d|           S )zj
        Get a random locale based on the territory ISO code.
        Returns as a Locale object.
        p_r"   )r   r   randomchoicereplacerI   )r$   r   r   probabilitiesr   s        r%   rP   z%StatisticalLocaleSelector.from_regionu  sb    
 $(#<#<V#D#D 	=9##I#??GGSQQ8 6 6f 6 6777r'   c                     |                      |          \  }}t          j                            ||          }t	          | d|           S )z`
        Get a random locale based on the language.
        Returns as a Locale object.
        r   r"   )r   r   r   r   rI   )r$   r   r   r   r   s        r%   rQ   z'StatisticalLocaleSelector.from_language~  sR    
 "&!9!9(!C!C!!']!;;8 6 6f 6 6777r'   N)r,   r-   r.   r/   r   r0   r
   r   ndarrayr   r   r   r   rP   rQ   r3   r'   r%   r   r   /  s        
' ' 'DS DU2:rz;Q5R D D D D$ VC  VE"*bj:P4Q  V  V  V  VD''+-:'	rz2:%	&' ' ' '8# 8& 8 8 8 88c 8f 8 8 8 8 8 8r'   r   )Frx   )>xml.etree.ElementTreeetreeElementTreer   dataclassesr   typingr   r   r   r   r   r	   r
   r   r   numpyr   language_tagsr   camoufox.pkgmanr   r   r   r   camoufox.warningsr   
exceptionsr   r   r   r   r   r   r   r   geoip2.databaser   rz   ImportErrorr   r6   r0   rB   rI   boolrS   rd   rb   r   r   ro   r{   r   r   r   Elementr   r=   r   r   rO   r3   r'   r%   <module>r      s   " " " " " " " " " ! ! ! ! ! ! O O O O O O O O O O O O O O O O O O O O O O           G G G G G G G G G G G G ) ) ) ) ) )                      KK    KKK
        : $       4
+s +t + + + +S V    *. .# .d .v . . . .@E#tCy.1 4S> d    *Ghsm G G G G G --	!	L L L L L( L L L
 
 
 

 
 
 
 	& 	& 	& 	&
 
 
 
 
 
>
"*    'rz ' ' ' ' ' 'V8 V8 V8 V8 V8 V8 V8 V8r %$&&s   A   A*)A*