
    Mik                        % S SK r S SKrS SKrS SKrS SKrS SKJr  S SKJr  S SK	J
r
  S SKJrJrJrJrJrJr  S SKJrJr  S SKJr  S SKJrJr  S	\4S
 jr0 S\" S5      _S\" S5      _S\" S5      _S\" S5      _S\" S5      _S\" S5      _S\" S5      _S\" S5      _S\" S5      _S\" S5      _S\" S 5      _S!\" S"5      _S#\" S$5      _S%\" S&5      _S'\" S(5      _S)\" S*5      _S+\" S,5      _\" S-5      \" S.5      \" S/5      S0.Er\\\4   \S1'    " S2 S35      r0 SS4_SS4_SS4_SS4_S5S4_SS4_SS4_SS4_SS4_S!S4_S#S4_S%S4_S'S4_S)S4_S+S4_S6S4_S7S4_S4S4S8.Erg)9    N)Callable)deepcopy)Path)DictListUnionAnyTupleOptional)	async_apisync_api)CaseInsensitiveDict)AsyncWrappingContextManagerSyncWrappingContextManagerreturnc                 \    [        [        5      R                  S-  U -  R                  5       $ )Njs)r   __file__parent	read_text)names    t/var/www/eduai.edurigo.com/storigo/production/storigo_env/lib/python3.13/site-packages/playwright_stealth/stealth.py	from_filer      s%    N!!D(4/::<<    generate_magic_arrayszgenerate.magic.arrays.jsutilszutils.js
chrome_appzevasions/chrome.app.js
chrome_csizevasions/chrome.csi.jschrome_hairlinezevasions/chrome.hairline.jschrome_load_timeszevasions/chrome.load.times.jschrome_runtimezevasions/chrome.runtime.jsiframe_content_windowz evasions/iframe.contentWindow.jsmedia_codecszevasions/media.codecs.jsnavigator_hardware_concurrencyz)evasions/navigator.hardwareConcurrency.jsnavigator_languageszevasions/navigator.languages.jsnavigator_permissionsz!evasions/navigator.permissions.jsnavigator_platformzevasions/navigator.platform.jsnavigator_pluginszevasions/navigator.plugins.jsnavigator_user_agentzevasions/navigator.userAgent.jsnavigator_user_agent_dataz#evasions/navigator.userAgentData.jsnavigator_vendorzevasions/navigator.vendor.jszevasions/navigator.webdriver.jszevasions/error.prototype.jszevasions/webgl.vendor.js)navigator_webdrivererror_prototypewebgl_vendorSCRIPTSc            9          \ rS rSrSrSrSrSrSSSSSSSSSSSSSSSSSSSSS	S
S
S
S
S
SSS.S\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S\S\	\
\
4   S \
S!\\
   S"\
S#\\
   S$\
S%\
S&\S'\48S( jjr\S)\
4S* j5       r\S)\
4S+ j5       r\S, 5       r\S)\
4S- j5       rS.\S)\4S/ jrS0\R*                  S)\4S1 jrS0\R*                  S)\4S2 jrS3\\R8                  \R:                  4   S)S
4S4 jrS3\\R8                  \R:                  4   S)S
4S5 jrS0\\R@                  \R@                  4   S)S
4S6 jr!S7\"S8\#\
\4   S9\S)\#\
\4   4S: jr$S7\"S9\4S; jr%S<\"S=\"S)\"4S> jr&S=\"S?\S)\"4S@ jr'SA\"S8\#\
\4   S)\#\
\4   4SB jr(SA\"S8\#\
\4   S)\#\
\4   4SC jr)SD\\RT                  \RT                  4   S)S
4SE jr+\,SF\
S)\\
   4SG j5       r-\,SH\\.\
      S)\.\
   4SI j5       r/\,SH\.\
   SJ\
S)\.\
   4SK j5       r0\,S8\#\
\4   S)S
4SL j5       r1SMr2g
)NStealth0   a  
Playwright stealth configuration that applies stealth strategies to Playwright.
The stealth strategies are contained in ./js package and are basic javascript scripts that are executed
on every page.goto() called.
Note:
    All init scripts are combined by playwright into one script and then executed this means
    the scripts should not have conflicting constants/variables etc. !
    This also means scripts can be extended by overriding enabled_scripts generator:
    ```
    @property
    def enabled_scripts():
        yield 'console.log("first script")'
        yield from super().enabled_scripts()
        yield 'console.log("last script")'
    ```
_stealth_user_agent_stealth_sec_ch_ua_playwright_stealth_appliedTFzen-USenWin32N)r   r   r    r!   hairliner"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   	sec_ch_uar.   navigator_languages_overridenavigator_platform_overridenavigator_user_agent_overridenavigator_vendor_overridesec_ch_ua_overridewebgl_renderer_overridewebgl_vendor_overrideinit_scripts_onlyscript_loggingr   r   r    r!   r9   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r:   r.   r;   r<   r=   r>   r?   r@   rA   rB   rC   c                J   Xl         X l        X0l        X@l        XPl        X`l        Xpl        Xl        Xl        Xl	        Xl
        Xl        Xl        Xl        Xl        UU l        UU l        UU l        UU l        U R'                  [)        5       5        U=(       d    SU l        UU l        UU l        U=(       d    S U l        Uc.  U R.                  b!  U R3                  U R.                  5      U l        OUU l        U=(       d    SU l        U=(       d    SU l        UU l        UU l        g )Nr6   zIntel Iris OpenGL Enginez
Intel Inc.)r   r   r    r!   r9   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r:   r.   &_check_for_disabled_options_overriddenlocalsr;   r<   r=   r>   _get_greased_chrome_sec_ua_chr?   r@   rA   rB   rC   )selfr   r   r    r!   r9   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r:   r.   r;   r<   r=   r>   r?   r@   rA   rB   rC   s                                r   __init__Stealth.__init__F   s   B !+ *'8$2&+@"".3Q+)< +@"(:'8*>!/H&&6)< %4(". 	33FH==Y=l]l):U(<Y*.G.O4&%$*L*L*X&*&H&HIkIk&lD#5GD#,C,aGa$*?*O<"'8,r   r   c                 h    SR                  U R                  5      n[        U5      S:X  a  gSU-   S-   $ )zy
Generates an immediately invoked function expression for all enabled scripts
Returns: string of enabled scripts in IIFE

r    z	(() => {
z
})();)joinenabled_scriptslen)rH   scripts_blocks     r   script_payloadStealth.script_payload   s8     		$"6"67}"m+i77r   c           	          U R                   U R                  U R                  U R                  U R                  U R
                  U R                  U R                  S.nS[        R                  " U5       S3$ )N)r$   r;   r'   r)   r+   webgl_rendererr.   rC   zconst opts = ;)
r$   r;   r<   r=   r>   r@   rA   rC   jsondumps)rH   optss     r   options_payloadStealth.options_payload   sn     /3.Q.Q,0,M,M"&"B"B$($F$F $ > >":: 66"11	
 tzz$/022r   c              #      #    SR                  U R                  5      n[        U5      S:X  a  gU R                  v   [        S   v   [        S   v   Uv   g 7f)NrL   r   rM   r   r   )rN   _evasion_scriptsrP   rZ   r/   )rH   evasion_script_blocks     r   rO   Stealth.enabled_scripts   sT     #yy)>)>?#$)"""g-..""s   AAc              #     #    U R                   (       a  [        S   v   U R                  (       a  [        S   v   U R                  (       a  [        S   v   U R                  (       a  [        S   v   U R
                  (       a  [        S   v   U R                  (       a  [        S   v   U R                  (       a  [        S   v   U R                  (       a  [        S   v   U R                  (       a  [        S	   v   U R                  (       a  [        S
   v   U R                  (       a  [        S   v   U R                  (       a  [        S   v   U R                  (       a  [        S   v   U R                  (       a  [        S   v   U R                  (       a  [        S   v   U R                   (       a  [        S   v   U R"                  (       a  [        S   v   g g 7f)Nr   r   r   r    r!   r"   r#   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   )r   r/   r   r9   r    r!   r"   r#   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   )rH   s    r   r]   Stealth._evasion_scripts   se    ??,''??,''==+,,!!-..*++%%122.))##/00%%122"".//!!-..$$011))566  ,--##/00+,,.)) s   GG!objc                 l    [        XR                  5      (       a  [        R                  " S[        S9  gg)NzYStealth has already been applied to this page or context. Skipping duplicate application.categoryTF)hasattr_STEALTH_APPLIED_KEYwarningswarnUserWarning)rH   rb   s     r   warn_if_stealth_appliedStealth.warn_if_stealth_applied   s-    31122MMk$ r   ctxc                     [        X5      $ )z
Instruments the playwright context manager.
Any browser connected to or any page created with any method from
the patched context should have stealth evasions applied automatically.

async with Stealth().use_async(async_playwright()) as p:
    ...
)r   rH   rm   s     r   	use_asyncStealth.use_async   s     +455r   c                     [        X5      $ )z
Instruments the playwright context manager.
Any browser connected to or any page created with any method from
the patched context should have stealth evasions applied automatically.

with Stealth().use_sync(sync_playwright()) as p:
    ...
)r   ro   s     r   use_syncStealth.use_sync   s     *$44r   page_or_contextc                    #    [        U R                  5      S:  aQ  U R                  U5      (       d:  UR                  U R                  5      I S h  vN   [	        XR
                  S5        g g g  N7fNr   TrP   rR   rk   add_init_scriptsetattrrg   rH   ru   s     r   apply_stealth_asyncStealth.apply_stealth_async   s^     t""#a'0L0L_0]0]!11$2E2EFFFO%>%>E 1^'Fs   AA0A.A0c                     [        U R                  5      S:  aI  U R                  U5      (       d2  UR                  U R                  5        [	        XR
                  S5        g g g rw   rx   r{   s     r   apply_stealth_syncStealth.apply_stealth_sync   sR    t""#a'0L0L_0]0]++D,?,?@O%>%>E 1^'r   c                 ~   [         R                  R                  nUR                  UR                  UR
                  4 H|  nUR                  S:H  n[        R                  " U[        R                  S9 HC  u  pVUR                  R                  S5      U:X  d  M&  U R                  Xd5      n[        X5U5        ME     M~     g)z
Given a Playwright context object, hooks all the browser type object methods that return a Browser object.
Can be used with sync and async methods contexts
chromium)	predicater   N)r   Browser__name__r   firefoxwebkitr   inspect
getmembersismethod__annotations__get,_generate_hooked_method_that_returns_browserrz   )rH   rm   browser_class_namebrowser_typechromium_moder   hooked_methods          r   hook_playwright_contextStealth.hook_playwright_context   s    
 &--66 \\3;;

CL(--;M'.'9'9,RYRbRb'c# 0044X>BTT$($U$UVc$sML>	 (d Dr   methodpacked_kwargsr   c                    [         R                  " U5      R                  nUR                  S5      n[	        U5      nUb  U(       a  U R
                  (       d  UR                  SUR                  5      nU R                  (       a  U R                  U=(       d    / 5      nU R                  (       a9  SSR                  U R                  5       3nU R                  U=(       d    / U5      nXvS'   U$ )Nargsz--accept-lang=,)r   	signature
parametersr   r   rB   defaultr,   _patch_blink_features_cli_argsr%   rN   r;   _patch_cli_arg)	rH   r   r   r   r   args_parameter
new_kwargsnew_cli_argslanguages_cli_flags	            r   _kwargs_with_patched_cli_arg$Stealth._kwargs_with_patched_cli_arg  s     %%f-88	"v. m,
%T%;%;)~~fn6L6LM++#'#F#F|GYWY#ZL+++9#((4CdCd:e9f)g&#'#6#6|7IrK]#^L%16"r   c                    ^ ^^ S[         R                  4UUU 4S jjnS[        R                  4UUU 4S jjn[        R                  " T5      (       a  U$ U$ )Nr   c            	      x   >#    T" U 0 TR                  TUT5      D6I S h  vN nTR                  U5        U$  N7fNr   _reassign_new_page_new_contextr   kwargsbrowserr   r   rH   s      r   async_hooked_methodQStealth._generate_hooked_method_that_returns_browser.<locals>.async_hooked_method!  sI     "33FFMR G //8Ns   :8:c            	      \   > T" U 0 TR                  TUT5      D6nTR                  U5        U$ r   r   r   s      r   sync_hooked_methodPStealth._generate_hooked_method_that_returns_browser.<locals>.sync_hooked_method)  s<    33FFMRG //8Nr   )r   r   r   r   iscoroutinefunction)rH   r   r   r   r   s   ```  r   r   4Stealth._generate_hooked_method_that_returns_browser   sP    	):K:K 	 		83C3C 	 	 &&v..&&!!r   new_context_methodnew_page_methodc                 f   ^ ^^ UUU 4S jnUUU 4S jn[         R                  " T5      (       a  U$ U$ )Nc                     >#    T" U 0 TR                  TU5      I S h  vN D6I S h  vN nTR                  U5      I S h  vN   U$  N) N! N
7fr   +_kwargs_new_page_context_with_patches_asyncr|   r   r   contextr   r   rH   s      r   hooked_new_context_asyncFStealth._generate_hooked_new_context.<locals>.hooked_new_context_async6  s\     .II/[abb G **7333N c 4s1   AA	AA	A AA	AAc                  Z   > T" U 0 TR                  TU5      D6nTR                  U5        U$ r   *_kwargs_new_page_context_with_patches_syncr   r   s      r   hooked_browser_method_syncHStealth._generate_hooked_new_context.<locals>.hooked_browser_method_sync>  s;    (BB?TZ[G ##G,Nr   r   r   )rH   r   r   r   r   s   ```  r   _generate_hooked_new_context$Stealth._generate_hooked_new_context5  s-    		 &&'9::++))r   patch_kwargsc                 f   ^ ^^ UUU 4S jnUUU 4S jn[         R                  " T5      (       a  U$ U$ )a  
Returns a hooked method (async or sync) for new_page.
*args and **kwargs even though these methods may not take any number of arguments,
we want to preserve accurate stack traces when caller passes args improperly.

If patch_kwargs is true, we patch kwargs the caller passes to enhance evasions. This only applies
to Browser.new_page, so we pass false when passing in a BrowserContext.new_page method
c                     >#    T(       a  TR                  TU5      I S h  vN OUnT" U 0 UD6I S h  vN nTR                  U5      I S h  vN   U$  N1 N! N
7fr   r   r   r   pager   r   rH   s      r   hooked_new_page_async@Stealth._generate_hooked_new_page.<locals>.hooked_new_page_asyncT  sg        FFX^___ 
 )$9&99D**4000K ` :0s1   AAAAAAAAAc                  p   > T(       a  TR                  TU5      OUnT" U 0 UD6nTR                  U5        U$ r   r   r   s      r   hooked_new_page_sync?Stealth._generate_hooked_new_page.<locals>.hooked_new_page_sync^  sB    \h??QWXnt  #D3F3D##D)Kr   r   )rH   r   r   r   r   s   ```  r   _generate_hooked_new_page!Stealth._generate_hooked_new_pageJ  s,    		 &&77((##r   unpatched_new_pagec                   ^ ^^#    TR                   n[        U[        R                  5      (       a  UR                  mOUmTR
                  R                  S:H  nS[        [        [        4   4UU U4S jjn[        U5      nT R                  (       a>  UR                  S5      c,  T R                  nUc  U(       a  U" 5       I Sh  vN u  nnXvS'   UR                  S0 5      n	T R                  (       aN  [        U	5      R                  S5      c3  T R                  n
U
c  U(       a  U" 5       I Sh  vN u  nn
U
b  XS'   XS'   U$  N~ N7f)a>  
This returns kwargs with arguments added based on enabled evasions, while respecting any kwargs the caller
has passed in. If enabled and overrides aren't set for either navigator_user_agent or sec_ch_ua,
and we're dealing with a Chromium browser, we create a temporary page to get up-to-date UA information.

This function is suitable for patching kwargs for new_context and new_page, though in either case, an unpatched
new_page method must be provided.
Args:
    unpatched_new_page: new_page
    packed_kwargs: kwargs the caller has passed in
Returns:
    patched kwargs
r   r   c                    >#    [        TTR                  S 5      n [        TTR                  S 5      nU b  Uc  T" 5       I S h  vN nUR                  S5      I S h  vN R	                  SS5      n UR                  SS9I S h  vN   TR                  U 5      n[        TTR                  U5        [        TTR                  U 5        X4$  N No NJ7fNznavigator.userAgentHeadlessChromeChromez-playwright_stealth internal temp utility page)reason)getattr"_USER_AGENT_OVERRIDE_PIGGYBACK_KEY!_SEC_CH_UA_OVERRIDE_PIGGYBACK_KEYevaluatereplacecloserG   rz   stealth_user_agentr:   	temp_pagebrowser_instancerH   r   s      r   "get_user_agent_and_sec_ch_ua_async_Stealth._kwargs_new_page_context_with_patches_async.<locals>.get_user_agent_and_sec_ch_ua_async  s     !()94;b;bdh!i 0$2X2XZ^_I!)Y->"4"66	,5,>,>?T,U&U%^%^$h&"  oo-\o]]] >>?QR	($*P*PR[\$;;&
 &00 7&U ^s6   ?CC	CC&CCACCC
user_agentNextra_http_headers	sec-ch-ua)__self__
isinstancer   BrowserContextr   r   r   r
   strr   r)   r   r=   r:   r   r?   )rH   r   r   browser_or_contextis_chromiumr   r   resolved_user_agent_override_r   resolved_sec_ch_ua_overrider   s   ``         @r   r   3Stealth._kwargs_new_page_context_with_patches_asyncj  sC      088()*B*BCC1991&3388JF	1%S/ 	1 	1& m,
$$):):<)H)P+/+M+M(+3 =>>0'C|$*../CRH>>12DEII+V^*.*A*A'*2{ =>>/*62M;/3E/0 ? ?s%   B?EEA)E.E/EEc                 ^  ^ ^^ TR                   n[        U[        R                  5      (       a  UR                  mOUmTR
                  R                  S:H  nS[        [        [        4   4UU U4S jjn[        U5      nT R                  (       a5  UR                  S5      c#  T R                  nUc  U(       a	  U" 5       u  pxXvS'   UR                  S0 5      n	T R                  (       aE  [        U	5      R                  S5      c*  T R                  n
U
c  U(       a	  U" 5       u  pU
b  XS'   XS'   U$ )z>see self._kwargs_new_page_context_with_patches_async for docs.r   r   c                  ^  > [        TTR                  S 5      n [        TTR                  S 5      nU b  Ucv  T" 5       nUR                  S5      R	                  SS5      n TR                  U 5      nUR                  SS9  [        TTR                  U5        [        TTR                  U 5        X4$ r   )r   r   r   r   r   rG   r   rz   r   s      r   !get_user_agent_and_sec_ch_ua_sync]Stealth._kwargs_new_page_context_with_patches_sync.<locals>.get_user_agent_and_sec_ch_ua_sync  s    !()94;b;bdh!i 0$2X2XZ^_I!)Y->.0	%.%7%78M%N%V%VWgiq%r" >>?QR	'VW($*P*PR[\$;;&
 &00r   r   r   r   )r   r   r   r   r   r   r   r
   r   r   r)   r   r=   r:   r   r?   )rH   r   r   r   r   r   r   r   r   r   r   r   s   ``         @r   r   2Stealth._kwargs_new_page_context_with_patches_sync  s!    088((*A*ABB1991&3388JF	15c? 	1 	1" m,
$$):):<)H)P+/+M+M(+32S2U/,'C|$*../CRH>>12DEII+V^*.*A*A'*2{1R1T.*62M;/3E/0r   r   c                    [        U[        R                  [        R                  45      (       aK  U R	                  UR
                  UR                  5      Ul        U R                  UR                  SS9Ul        g [        SU 35      e)NT)r   z.unexpected type from function (bug): returned )	r   r   r   r   r   new_contextnew_pager   	TypeError)rH   r   s     r   r   &Stealth._reassign_new_page_new_context  st    g	 1 183C3CDEE"&"C"CGDWDWY`YiYi"jG#==g>N>N]a=bGLWIVWWr   r   c                    / SQnSnS[         R                  " U5       S[         R                  " U5       S3n[        R                  " SU [        R                  5      n[        UR                  5       5      S:X  a  gUR                  S	5      nS
U4SU4U[         R                  " U5      4/n[         R                  " U5        SR                  S U 5       5      $ )a  
From the major version in user_agent, generate a Sec-CH-UA header value. An example of the data in this
header can be generated from navigator.userAgentData.brands (requires secure context). We could query that
ourselves, but since it requires a secure context, there's no performant way to do that, so instead we
re-implement the greasing algorithm from Chrome.

See Also:
     https://wicg.github.io/ua-client-hints/#grease
     https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Sec-CH-UA
     https://source.chromium.org/chromium/chromium/src/+/main:components/embedder_support/user_agent_utils.cc
Args:
    user_agent: Chrome UA

Returns:
    greased Sec-CH-UA header value, None if the Chrome version cannot be parsed
)   c      z ():-./;=?_NotABrandzChrome/(\d+)[\d.]+r   N   Chromiumr   z, c              3   8   #    U  H  u  pS U SU S 3v   M     g7f)"z";v="N ).0brandversions      r   	<genexpr>8Stealth._get_greased_chrome_sec_ua_ch.<locals>.<genexpr>  s!     Q&1UG5	3&s   )
randomchoiceresearch
IGNORECASErP   groupsgroupshufflerN   )r   greased_versionsgreasy_charsgreasy_brandr	  major_versionbrandss          r   rG   %Stealth._get_greased_chrome_sec_ua_ch  s    $ '$V]]<896==;V:WW\]))1:r}}Mw~~ A%a('}%6==)9:;

 	vyyQ&QQQr   existing_argsc                    / nSnSnU =(       d    /  HZ  nUR                  5       nUR                  U5      (       a   X5;  a  USU 3-  nUR                  U5        MI  UR                  U5        M\     UR                  U U 35        U$ )z`Patches CLI args list to disable AutomationControlled blink feature, while preserving other argsz--disable-blink-features=AutomationControlledr   )strip
startswithappend)r  new_argsdisable_blink_features_prefix"automation_controlled_feature_nameargstripped_args         r   r   &Stealth._patch_blink_features_cli_args   s     (C%-C* &B&C99;L&&'DEE5I a(J'K$LLL-$ ' OO<=>`=abcr   flagc                 \   / n[         R                  " SU5      R                  S5      nU  Hl  nUR                  5       nUR	                  U5      (       a2  [
        R                  " SU< S3[        S9  UR                  U5          U$ UR                  U5        Mn     UR                  U5        U$ )zZPatches CLI args list with any arg, warns if the user passed their own value in themselvesz(.*)=?r  zplaywright-stealth is trying to modify a flag you have set yourself already.Either disable the mitigation or don't specify this flag manually flag=zBto avoid this warning. playwright-stealth has overridden your flagrd   )	r  r  r  r  r  rh   ri   rj   r  )r  r&  r   switch_namer#  r$  s         r   r   Stealth._patch_cli_arg  s     ii$/55a8 C99;L&&{33_Y]X_XZ )	 % 	 $ ! OOD!r   c                     [         R                  5        HR  nU R                  U5      (       a  M  U R                  U S35      c  M2  [        R                  " U SU S3S[
        S9  MT     g )N	_overridez is False, but an override (zF_override) was provided, which is probably not what you intended to do   )
stacklevelre   )ALL_EVASIONS_DISABLED_KWARGSkeysr   rh   ri   rj   )r   keys     r   rE   .Stealth._check_for_disabled_options_overridden+  sg    /446C $$S))m.?.?3%y@Q.R.^e7u =D E (	 7r   )r   r   r    r!   r-   r9   r"   rB   r#   r$   r%   r;   r&   r'   r<   r(   r)   r*   r=   r+   r>   r,   rC   r:   r?   r@   r.   rA   )3r   
__module____qualname____firstlineno____doc__r   r   rg   boolr
   r   r   rI   propertyrR   rZ   rO   r]   r	   rk   r   PlaywrightContextManagerr   rp   r   r   rs   r   Pager   r|   r   
Playwrightr   r   r   r   r   r   r   r   r   r   r   staticmethodrG   r   r   r   rE   __static_attributes__r  r   r   r1   r1   0   s   " *?&(<%8
  "&$&*!/3$(&*#'"&%)*.!%$( $!8G+27;)-,0'+%)"'$=E- E- 	E-
  E- E- E-  $E- E- )-E- "E-  $E- !E-  E- #E-  $(!E-" #E-$ "%E-& 'E-( )E-* +E-, ',CHo-E-. &)/E-0 (0}1E-2 $'3E-4 %SM5E-6 "%7E-8  #9E-:  ;E-< =E-N 8 8 8 3 3 3 # # "*# "* "*H3 4 	6Y?? 	6D_ 	6	5H== 	5B\ 	5Fy~~yOgOg?g9h Fmq F
F%xG^G^8^2_ Fdh F
?51E1ExGZGZ1Z+[ ?`d ?/3CH~NR	c3h&"8 "\` "**x *Zb *go **$ $QU $Zb $@?"*?;?S>?	c3h?B+"*+;?S>+	c3h+ZXeI<M<MxO_O_<_6` Xei X R# R(3- R R@ htCy6I dSVi  & d3i s tCy  , d38n QU  r   r1   Fr9   r,   r-   )r:   r.   ) r   rW   r  r  rh   collections.abcr   copyr   pathlibr   typingr   r   r   r	   r
   r   
playwrightr   r   (playwright_stealth.case_insensitive_dictr   #playwright_stealth.context_managersr   r   r   r   r/   r   r1   r.  r  r   r   <module>rD     s      	  $   : : * H=s =Y'ABYz" )45 )45	
 y!>? #BC i <= Y'IJ I89 %i0[&\ 9%FG Y'JK )$DE #BC I&GH   +P!Q!" 	"@A#$ %%FG !>?89)c3h 0D DN % %    e	 
   U  E  %e  5  U  %    E        5! " u# $ '  r   