
    (phz                    4   S r SSKJr  SSKJr  SSKJr  SSKrSSKJr  SSK	r	SSK
r
SSKJrJrJrJrJrJrJr  \R$                  " S	5      r\R$                  " S
5      rSrSrSrSrSrSrSrSrSrSr\R>                  \R@                  -  r!\RD                  \RF                  -  r$\R>                  \R@                  SS.r%\R$                  " S5      r&\R$                  " S5      r'\R$                  " S5      r(\R$                  " S5      r)\R$                  " S5      r*\R$                  " S5      r+\R$                  " S5      r,Sr-Sr.Sr/S r0S!r1S"r2S#r3 " S$ S%5      r4 " S& S'5      r5 " S( S)5      r6 " S* S+\55      r7 " S, S-\Rp                  5      r9\Rt                  " \95        g).zCSS matcher.    )annotations)datetime   )utilN)	css_types)IteratorIterableAnyCallableSequencer
   castz[^ 	
]z	[^ 	
]+ >~+z: z:>z:~z:+zhttp://www.w3.org/1999/xhtmlz$http://www.w3.org/XML/1998/namespace)ltrrtlautoz0^(?P<value>-?(?:[0-9]{1,}(\.[0-9]+)?|\.[0-9]+))$z*^(?P<hour>[0-9]{2}):(?P<minutes>[0-9]{2})$z)^(?P<year>[0-9]{4,})-(?P<month>[0-9]{2})$z)^(?P<year>[0-9]{4,})-W(?P<week>[0-9]{2})$z;^(?P<year>[0-9]{4,})-(?P<month>[0-9]{2})-(?P<day>[0-9]{2})$zd^(?P<year>[0-9]{4,})-(?P<month>[0-9]{2})-(?P<day>[0-9]{2})T(?P<hour>[0-9]{2}):(?P<minutes>[0-9]{2})$z(?:(?:-\*-)(?:\*(?:-|$))*|-\*$))      	                        c                  ,    \ rS rSrSrSS jrSS jrSrg)	_FakeParent;   z
Fake parent class.

When we have a fragment with no `BeautifulSoup` document object,
we can't evaluate `nth` selectors properly.  Create a temporary
fake parent so we can traverse the root element as a child.
c                    U/U l         g)Initialize.Ncontents)selfelements     F/var/www/html/venv/lib/python3.13/site-packages/soupsieve/css_match.py__init___FakeParent.__init__D   s     !	    c                ,    [        U R                  5      $ )zLength.)lenr%   r&   s    r(   __len___FakeParent.__len__I   s     4==!!r+   r$   N)r'   bs4.TagreturnNone)r2   int)__name__
__module____qualname____firstlineno____doc__r)   r/   __static_attributes__ r+   r(   r    r    ;   s    "
"r+   r    c                     \ rS rSrSr\S'S j5       r\S(S j5       r\S(S j5       r	\S(S j5       r
\S(S j5       r\S(S j5       r\S(S	 j5       r\S(S
 j5       r\S(S j5       r\S)S j5       r\S*S j5       rS*S jrS+S jrS,S-S jjr   S.         S/S jjr    S0           S1S jjr S,     S2S jjr  S3       S4S jjrS,S5S jjr\S6S j5       r\S7S j5       r\S6S j5       r\S8S j5       r\S,S9S jj5       r\S:S;S jj5       r\S,S9S jj5       r \S*S j5       r!\S<S j5       r"\S=S  j5       r#\ S>       S?S! jj5       r$\S@S" j5       r%\SAS# j5       r&S,SBS$ jjr'S,SCS% jjr(S&r)g)D_DocumentNavO   z#Navigate a Beautiful Soup document.c                ^    U R                  U5      (       d  [        S[        U5       35      eg)z%Check if valid input tag or document.z:Expected a BeautifulSoup 'Tag', but instead received type N)is_tag	TypeErrortype)clstags     r(   assert_valid_input_DocumentNav.assert_valid_inputR   s1    
 zz#XY]^aYbXcdee r+   c                6    [        U [        R                  5      $ )zIs `BeautifulSoup` object.)
isinstancebs4BeautifulSoupobjs    r(   is_doc_DocumentNav.is_docZ   s     #s0011r+   c                6    [        U [        R                  5      $ )zIs tag.)rH   rI   TagrK   s    r(   r@   _DocumentNav.is_tag_   s     #sww''r+   c                6    [        U [        R                  5      $ )zIs declaration.)rH   rI   DeclarationrK   s    r(   is_declaration_DocumentNav.is_declarationd   s     #s//r+   c                6    [        U [        R                  5      $ )z	Is CDATA.)rH   rI   CDatarK   s    r(   is_cdata_DocumentNav.is_cdatai   s     #syy))r+   c                6    [        U [        R                  5      $ )zIs processing instruction.)rH   rI   ProcessingInstructionrK   s    r(   is_processing_instruction&_DocumentNav.is_processing_instructionn   s     #s8899r+   c                J    [        U [        R                  R                  5      $ )zIs navigable string.)rH   rI   r'   NavigableStringrK   s    r(   is_navigable_string _DocumentNav.is_navigable_strings   s     #s{{::;;r+   c                    [        U [        R                  [        R                  [        R                  [        R
                  [        R                  45      $ )zIs special string.)rH   rI   CommentrS   rW   r[   DoctyperK   s    r(   is_special_string_DocumentNav.is_special_stringx   s5     #S__ciiIbIbdgdodopqqr+   c                ^    U R                  U5      =(       a    U R                  U5      (       + $ )z Check if node is content string.)r`   re   )rC   rL   s     r(   is_content_string_DocumentNav.is_content_string}   s(     &&s+NC4I4I#4N0NNr+   c                    [        U 5      $ )z'Create fake parent for a given element.)r    els    r(   create_fake_parent_DocumentNav.create_fake_parent   s     2r+   c                B    U SL=(       a    [        U R                  5      $ )z2Check if element (or document) is from a XML tree.N)bool_is_xmlrk   s    r(   is_xml_tree_DocumentNav.is_xml_tree   s     ~2$rzz"22r+   c                    Uc  g[        U R                  U5      (       a  UR                  O[        R                  " UR                  5      S:H  =(       a    U R                  U5      5      $ )z Check if element is an `iframe`.Fiframe)rp   rr   namer   loweris_html_tagr&   rl   s     r(   	is_iframe_DocumentNav.is_iframe   sW     :))"--bgg4::bgg3F8S !R 
 	
r+   c                    U R                   =(       a    U R                   UL nU(       d@  U R                  U5      nUSL=(       a$    U R                  =(       a    U R                  U5      nU$ )z
Return whether element is a root element.

We check that the element is the root of the tree (which we have already pre-calculated),
and we check if it is the root element under an `iframe`.
N)root
get_parentis_htmlrz   )r&   rl   r}   parents       r(   is_root_DocumentNav.is_root   sQ     yy,TYY"___R(F%Q$,,Q4>>&;QDr+   c              #  |   #    Ub3  U(       a  U R                  U5      (       d  UR                   Sh  vN   ggg N7f)z$Get contents or contents in reverse.N)rz   r%   r&   rl   	no_iframes      r(   get_contents_DocumentNav.get_contents   s7      >DNN2$6$6;;&& %7 &s   0<:<Nc                *    U R                  XUSU5      $ )zGet tag children.T)get_children)r&   rl   startreverser   s        r(   get_tag_children_DocumentNav.get_tag_children   s       GT9EEr+   c              #  x  #    Ub  U(       a  U R                  U5      (       d  [        UR                  5      S-
  nUc  U(       a  UOSnOUnU(       a  SOUS-   nU(       a  SOSn	SUs=::  a  U::  aE  O  gXx:w  a<  UR                  U   n
Xy-  nU(       a  U R                  U
5      (       a  U
v   Xx:w  a  M;  ggggg7f)zGet children.Nr   r   )rz   r-   r%   r@   )r&   rl   r   r   tagsr   lastindexendincrnodes              r(   r   _DocumentNav.get_children   s      >9DNN24F4Fr{{#a'D} 'Q"TAXC 2aDE!T!l;;u-DME4;;t#4#4"
	 l " 5G>s   B1B:5B:c              #  B   #    U R                  USUS9 Sh  vN   g N7f)z!Specifically get tag descendants.T)r   r   N)get_descendantsr   s      r(   get_tag_descendants _DocumentNav.get_tag_descendants   s"      '''KKKs   c              #  ~  #    UGb5  U(       a  U R                  U5      (       Gd  SnUR                   GH  nUb  XTLa  M  Sn[        U[        R                  5      (       a  U(       a  U R                  U5      (       a  UR
                  b  UR
                  nOUn[        U[        R                  5      (       aR  UR                  (       aA  UR                  S   n[        U[        R                  5      (       a  UR                  (       a  MA  UR                  nUv   Uc    gM  Uv   M  U(       a  M  Uv   GM     ggg7f)zGet descendants.Nr   )rz   descendantsrH   rI   rP   next_siblingr%   next_element)r&   rl   r   r   	next_goodchild
last_childs          r(   r   _DocumentNav.get_descendants   s      >9DNN24F4FI(-  $IeSWW-- T^^E%:%: --9(-(:(:I).J",Z"A"AjFYFY-7-@-@-D
 #-Z"A"AjFYFYFY(2(?(?I#$,! KK1 ( 5G>s   DD="D=1D=c                l    Ub  UR                   OSnU(       a  Ub  U R                  U5      (       a  SnU$ )zGet parent.N)r   rz   )r&   rl   r   r   s       r(   r~   _DocumentNav.get_parent  s3     !n$+v0F0FFr+   c                $    U b  U R                   $ S$ )Get tag.N)rv   rk   s    r(   get_tag_name_DocumentNav.get_tag_name	  s     .rww2d2r+   c                    U R                   $ zGet prefix.)prefixrk   s    r(   get_prefix_name_DocumentNav.get_prefix_name  s     yyr+   c                $    U b  U R                   $ S$ )zGet namespace `URI`.N)	namespacerk   s    r(   get_uri_DocumentNav.get_uri  s      "~r||747r+   c                "    U R                  USS9$ )Get next sibling tag.T)r   )get_next)rC   rl   s     r(   get_next_tag_DocumentNav.get_next_tag  s     ||BT|**r+   c                .   UR                   nU(       aY  [        U[        R                  5      (       d:  Ub7  UR                   nU(       a$  [        U[        R                  5      (       d  Ub  M7  U(       a!  [        U[        R                  5      (       d  SnU$ )r   N)r   rH   rI   rP   rC   rl   r   siblings       r(   r   _DocumentNav.get_next!  si     //:gsww77G<O**G :gsww77G<O 
7CGG44Gr+   c                &    U R                  US5      $ )Get previous sibling tag.T)get_previous)rC   rl   r   s      r(   get_previous_tag_DocumentNav.get_previous_tag.  s     D))r+   c                .   UR                   nU(       aY  [        U[        R                  5      (       d:  Ub7  UR                   nU(       a$  [        U[        R                  5      (       d  Ub  M7  U(       a!  [        U[        R                  5      (       d  SnU$ )r   N)previous_siblingrH   rI   rP   r   s       r(   r   _DocumentNav.get_previous4  sk     %%:gsww77G<O..G :gsww77G<O 
7CGG44Gr+   c                Z    U b  [        U S5      OSn[        U=(       a	    U[        :H  5      $ )z
Check if element has an HTML namespace.

This is a bit different than whether a element is treated as having an HTML namespace,
like we do in the case of `is_html_tag`.
Nr   )getattrrp   NS_XHTML)rl   nss     r(   has_html_ns_DocumentNav.has_html_nsA  s*     *,WR%TB)2>**r+   c                >    U c  g[        USS5      [        USS5      4$ )z7Return namespace and attribute name without the prefix.N)NNr   rv   )r   )rl   	attr_names     r(   split_namespace_DocumentNav.split_namespaceM  s*     :y+t4giQU6VVVr+   c           	        Uc  g[        U[        5      (       a  U$ [        U[        5      (       a  UR                  S5      $ [        U[        5      (       a  / nU H}  n[        U[        [        45      (       d1  [        U[        5      (       a  UR                  [        U5      5        MO  UR                  [        [        U R                  U5      5      5        M     U$ [        U5      $ )z6Normalize the value to be a string or list of strings. utf8)rH   strbytesdecoder   appendr   normalize_value)rC   value	new_valuevs       r(   r   _DocumentNav.normalize_valueV  s    
 = uc""L eU##<<'' eX&&I!!c5\22z!X7N7N $$SV, $$T#s/B/B1/E%FG   5zr+   c                2   UnUR                   (       a!   U R                  UR                  U   5      nU$ UR                  R	                  5        H3  u  pV[
        R                  " U5      U:X  d  M!  U R                  U5      n  U$    U$ ! [         a     U$ f = f)zGet attribute by name.)rq   r   attrsKeyErroritemsr   rw   )rC   rl   rv   defaultr   kr   s          r(   get_attribute_by_name"_DocumentNav.get_attribute_by_namew  s     ::++BHHTN; 	 (::a=D(//2E	 )    s   B 
BBc              #     #    Ub8  UR                   R                  5        H  u  p#X R                  U5      4v   M     gg7f)zIterate attributes.N)r   r   r   )rC   rl   r   r   s       r(   iter_attributes_DocumentNav.iter_attributes  s<      >(,,Q/// ) s   =?c                    U R                  US/ 5      n[        U[        5      (       a  [        R	                  U5      n[        [        [           U5      $ )zGet classes.class)r   rH   r   	RE_NOT_WSfindallr   r   )rC   rl   classess      r(   get_classes_DocumentNav.get_classes  sF     ++B<gs##''0GHSM7++r+   c                    SR                  U R                  XS9 Vs/ s H  nU R                  U5      (       d  M  UPM     sn5      $ s  snf )z	Get text.r   r   )joinr   rh   r&   rl   r   r   s       r(   get_text_DocumentNav.get_text  sQ     ww!%!5!5b!5!N!N))$/ !N
 	
s
   AAc                z    U R                  XS9 Vs/ s H  o0R                  U5      (       d  M  UPM     sn$ s  snf )zGet Own Text.r   )r   rh   r   s       r(   get_own_text_DocumentNav.get_own_text  s@     "..r.G
GTKaKabfKgDG
 	
 
s   88r;   )rD   r
   r2   r3   )rL   bs4.element.PageElement | Noner2   rp   )rl   r1   r2   r    rl   bs4.Tag | Noner2   rp   rl   r1   r2   rp   F)rl   r   r   rp   r2   !Iterator[bs4.element.PageElement])NFF)
rl   r   r   
int | Noner   rp   r   rp   r2   Iterator[bs4.Tag])NFFF)rl   r   r   r   r   rp   r   rp   r   rp   r2   r   )rl   r   r   rp   r2   r   )FF)rl   r   r   rp   r   rp   r2   r   )rl   r   r   rp   r2   r   rl   r   r2   
str | Nonerl   r1   r2   r   rl   r1   r2   r   )rl   r1   r   rp   r2   r   )T)rl   r1   r   rp   r2   r   )rl   r   r   r   r2   ztuple[str | None, str | None])r   r
   r2   zstr | Sequence[str]N)rl   r1   rv   r   r   str | Sequence[str] | Noner2   r  )rl   r   r2   z0Iterator[tuple[str, str | Sequence[str] | None]])rl   r1   r2   zSequence[str])rl   r1   r   rp   r2   r   )rl   r1   r   rp   r2   z	list[str])*r5   r6   r7   r8   r9   classmethodrE   staticmethodrM   r@   rT   rX   r\   r`   re   rh   rm   rr   rz   r   r   r   r   r   r   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r:   r;   r+   r(   r=   r=   O   s+   -f f 2 2 ( ( 0 0 * * : : < < r r O O
  
 3 3
	
' !	F	F 	F 		F
 	F 
	F !## # 	#
 # # 
+#:  LL L 
	L 	" "  "  	" 
 
+" H 3 3
  
 8 8
 + +
 
 
 * *
 
 
 	+ 	+ W W  @ 
 /3	  ,	
 
$ * 0 0 , ,

 
r+   r=   c                      \ rS rSrSr\SS j5       r\SS j5       r\SS j5       r\SS j5       r	\SS j5       r
\SS j5       r\SS	 j5       rS
rg)Inputsi  z-Class for parsing and validating input items.c                    [         nU[        :X  a(  U S-  S:X  a	  U S-  S:w  d	  U S-  S:X  a  [        O[        nOU[        ;   a  [
        nSUs=:*  =(       a    U:*  $ s  $ )zValidate day.r   r   d   i  r   )
LONG_MONTHFEBFEB_LEAP_MONTH	FEB_MONTH	MONTHS_30SHORT_MONTH)yearmonthdaymax_dayss       r(   validate_dayInputs.validate_day  sa     C<+/!8q=tczQUY\_U_cdUd~ktHi"HC##8####r+   c                    [         R                  " S SS SU  3S5      R                  5       S   nUS:X  a  SnSUs=:*  =(       a    U:*  $ s  $ )zValidate week.   -r   z%m-%d-%Yr   5   )r   strptimeisocalendar)r  weekmax_weeks      r(   validate_weekInputs.validate_week  s[     $$t1RD$%8*EQQSTUVq=HD$$H$$$$r+   c                ,    SU s=:*  =(       a    S:*  $ s  $ )zValidate month.r   r  r;   )r  s    r(   validate_monthInputs.validate_month  s     ERr+   c                    SU :*  $ )zValidate year.r   r;   )r  s    r(   validate_yearInputs.validate_year  s     Dyr+   c                ,    SU s=:*  =(       a    S:*  $ s  $ )zValidate hour.r      r;   )hours    r(   validate_hourInputs.validate_hour  s     DBr+   c                ,    SU s=:*  =(       a    S:*  $ s  $ )zValidate minutes.r   r!   r;   )minutess    r(   validate_minutesInputs.validate_minutes  s     G!!r!!!!r+   c                |   SnUc  U$ US:X  a  [         R                  U5      nU(       a  [        UR                  S5      S5      n[        UR                  S5      S5      n[        UR                  S5      S5      nU R	                  U5      (       a1  U R                  U5      (       a  U R                  XVU5      (       a  XVU4nU$ US:X  a  [        R                  U5      nU(       ae  [        UR                  S5      S5      n[        UR                  S5      S5      nU R	                  U5      (       a  U R                  U5      (       a  XV4nU$ US:X  a  [        R                  U5      nU(       ae  [        UR                  S5      S5      n[        UR                  S5      S5      nU R	                  U5      (       a  U R                  XX5      (       a  XX4nU$ US:X  a  [        R                  U5      nU(       ae  [        UR                  S	5      S5      n	[        UR                  S
5      S5      n
U R                  U	5      (       a  U R                  U
5      (       a  X4nU$ US:X  Ga  [        R                  U5      nU(       a  [        UR                  S5      S5      n[        UR                  S5      S5      n[        UR                  S5      S5      n[        UR                  S	5      S5      n	[        UR                  S
5      S5      n
U R	                  U5      (       a^  U R                  U5      (       aH  U R                  XVU5      (       a1  U R                  U	5      (       a  U R                  U
5      (       a  XVXyU
4nU$ US;   a7  [        R                  U5      nU(       a  [        UR                  S5      5      4nU$ )zParse the input value.Ndater  
   r  r  r  timer&  r*  datetime-local)numberranger   )RE_DATEmatchr4   groupr"  r  r  RE_MONTHRE_WEEKr  RE_TIMEr'  r+  RE_DATETIMERE_NUMfloat)rC   ityper   parsedmr  r  r  r  r&  r*  s              r(   parse_valueInputs.parse_value  s+    =LF?e$A1776?B/AGGG,b1!''%."-$$T**s/A/A%/H/HSM]M]^bknMoMo"3/FN M gu%A1776?B/AGGG,b1$$T**s/A/A%/H/H"]F@ ? f_e$A1776?B/1776?B/$$T**s/@/@/L/L"\F2 1 f_e$A1776?B/aggi0"5$$T**s/C/CG/L/L"_F$ # &&!!%(A1776?B/AGGG,b1!''%."-1776?B/aggi0"5%%d++0B0B50I0IcN^N^_cloNpNp%%d++0D0DW0M0M"3g>F
 	 ))U#A 013r+   r;   N)r  r4   r  r4   r  r4   r2   rp   )r  r4   r  r4   r2   rp   )r  r4   r2   rp   )r  r4   r2   rp   )r&  r4   r2   rp   )r*  r4   r2   rp   )r=  r   r   r   r2   ztuple[float, ...] | None)r5   r6   r7   r8   r9   r  r  r  r  r"  r'  r+  r  r@  r:   r;   r+   r(   r  r    s    7$ $ % %    
  
  
 " "
 4 4r+   r  c                     \ rS rSrSr          S+S jrS,S jrS-S jrS.S jrS/S jr	S0S jr
S1S	 jrS2S
 jr        S3S jrS4S jrS5S jrS4S jrS6S jrS7S jrS8S9S jjrS7S jrS7S jrS:S jrS;S jrS<S jrS<S jrS=S jrS>S jrS<S jrS?S jrS@S jrS<S jrS<S jr SAS jr!SBS  jr"SCS! jr#S<S" jr$S<S# jr%SDS$ jr&SESFS% jjr'SGS& jr(SHS' jr)S<S( jr*S)r+g*)ICSSMatchi  zPerform CSS matching.c                @   U R                  U5        X l        / U l        / U l        / U l        Xl        Uc  0 OUU l        X@l        SU l        UnU R                  U5      nU(       a  UnU R                  U5      nU(       a  M  SnU R                  U5      (       d  UnOU R                  U5       H  nUn  O   Xpl        X%La  UOUU l        U R                  U5      U l        U R!                  U5      U l        U R"                  (       + =(       d    U R                  U l        g)r#   NF)rE   rD   cached_meta_langcached_default_formscached_indeterminate_forms	selectors
namespacesflagsiframe_restrictr~   rM   r   r}   scoper   has_html_namespacerr   is_xmlr   )	r&   rH  rL  rI  rJ  docr   r}   r   s	            r(   r)   CSSMatch.__init__  s    	& "$&!*,'" * 2"

$ %C__S)F f {{3D..s3 4 	#.UD
"&"2"24"8 &&s+;;A$*A*Ar+   c                @    U R                   =(       d    U R                  $ )z3Check if namespaces are supported in the HTML type.)rN  rM  r.   s    r(   supports_namespacesCSSMatch.supports_namespacesC  s     {{5d555r+   c                    SnUc  U$ U R                  5       (       a  U R                  U5      nU(       a  UnU$ [        nU$ )zGet tag namespace.r   )rR  r   r   )r&   rl   r   r   s       r(   
get_tag_nsCSSMatch.get_tag_nsH  sN     	:##%%b!B	  !Ir+   c                2    U R                  U5      [        :H  $ )z"Check if tag is in HTML namespace.)rU  r   ry   s     r(   rx   CSSMatch.is_html_tagW  s     r"h..r+   c                |    U R                  U5      nUb'  U R                  (       d  [        R                  " U5      $ U$ )r   )r   rN  r   rw   r&   rl   rv   s      r(   get_tagCSSMatch.get_tag\  s3       $#'#3DKKtzz$QTQr+   c                |    U R                  U5      nUb'  U R                  (       d  [        R                  " U5      $ U$ r   )r   rN  r   rw   )r&   rl   r   s      r(   
get_prefixCSSMatch.get_prefixb  s4     %%b)%+%7tzz&!WQWWr+   c           
     N   U R                  U5       GH  nU R                  U5      (       a  [        R                  [        R
                  " U R                  USS5      5      S5      nU R                  U5      nU(       a  US;   d  U R                  U5      (       a  Ub  M  U R                  U5      nUb  Us  $ M  U R                  U5      (       a  M  U HI  n[        R                  " U5      nUS;   d  M!  US:X  a  [        R                  O[        R                  s  s  $    GM     g)z%Get directionality from element text.dirr   N)bdiscriptstyletextarearu   ALRLri  )r   r@   DIR_MAPgetr   rw   r   r[  rx   	find_bidire   unicodedatabidirectionalctSEL_DIR_LTRSEL_DIR_RTL)r&   rl   r   	directionrv   r   cbidis           r(   rl  CSSMatch.find_bidih  s    %%b)D {{4   $KK

43M3MdTY[]3^(_aef	||D)d&VV((..) t,$ L  %%d++ "003++-1S[2>>bnnL 9 *@ r+   c                D   Sn[         R                  SU5      R                  5       nUR                  S5      nUR                  5       R                  S5      n[	        U5      n[	        U5      nSnSn	XH   n
XY   nUS:X  a  US:X  a  U
(       d  X:X  a  gU
S:w  a  X:w  d  U
S:X  a  US:X  a	  U(       d  SnUS-  nU	S-  n	U(       aJ  X:  aE  XH   n
 XY   nU
(       d  SnM   X:X  a  US-  nO[	        U5      S:X  a  SnM>  U	S-  n	U(       a  X:  a  ME  U$ ! [
         a    Sn Mb  f = f)zFilter the language tags.Tr  r   r   *F)RE_WILD_STRIPsubrw   splitr-   
IndexError)r&   
lang_rangelang_tagr5  rangessubtagslengthslengthrindexsindexrss               r(   extended_language_filter!CSSMatch.extended_language_filter  sC    "&&sJ7==?
!!#&.."((-Vg,NO Q;7a<af HQ#X'Q,qE!! AO  ! Q1 aKF5 8 1   	s   D DDc                   SnU R                  5       (       Ga  SnU(       a&  U R                  R                  U5      nUc  US:w  a  gOSnU R                  U5       H  u  pgU R	                  X5      u  pUc\  U R
                  (       a  X&:X  d?  U R
                  (       d3  [        R                  " U5      [        R                  " U5      :X  a  Un  U$ Mw  Ub  XX:w  a  US:w  a  M  U R
                  (       d/  [        R                  " U5      [        R                  " U	5      :w  a  OX):w  a  M  Un  U$     U$ U R                  U5       H8  u  pg[        R                  " U5      [        R                  " U5      :w  a  M5  Un  U$    U$ )z3Match attribute name and return value if it exists.Nrw  )rR  rI  rk  r   r   rN  r   rw   )
r&   rl   attrr   r   r   r   r   r   rv   s
             r(   match_attribute_nameCSSMatch.match_attribute_name  s`    ##%%E__((0:&C-,,R0 #'"6"6r"=	 :	4;;4::VZK[_c_i_ijk_lKl !, %  $Vs] BFDJJt$

4(88SWS_ A 1@  ,,R0::d#tzz!}4 1
 r+   c                   SnU R                  U5      nU R                  R                  S5      nUR                  c  SO$U R                  R                  UR                  5      nUR                  c  Ub	  XE:w  a  SnU$ UR                  b  UR                  S:X  a  U(       a  SnU$ UR                  (       a  UR                  S:w  a
  Ub  XF:w  a  SnU$ )z#Match the namespace of the element.Tr   Frw  )rU  rI  rk  r   )r&   rl   rD   r5  r   default_namespacetag_nss          r(   match_namespaceCSSMatch.match_namespace  s     OOB'	 OO//3zz)t/B/B3::/N::#4#@YEcE  jj$r)9iE 	 JJJJ#6>Y5HEr+   c                   SnU(       a  U H  nU R                  XR                  UR                  5      nU R                  (       a  UR                  (       a  UR                  OUR
                  nUc  Sn  U$ [        U[        5      (       a  UOSR                  U5      nUc  M  UR                  U5      b  M  Sn  U$    U$ )zMatch attributes.TFr   )
r  	attributer   rN  xml_type_patternpatternrH   r   r   r5  )r&   rl   
attributesr5  atempr  r   s           r(   match_attributesCSSMatch.match_attributes  s     00[[!((K04@R@R!,,XYXaXa<!E  !+4 5 5388D>?]]5)1!E   r+   c                    U R                   (       d-  UR                  b   [        R                  " UR                  5      OUR                  nUSL=(       a    X0R	                  U5      S4;  (       + $ )zMatch tag name.Nrw  )rN  rv   r   rw   r[  )r&   rl   rD   rv   s       r(   match_tagnameCSSMatch.match_tagname"  sY     -1KKCHH<P

388$VYV^V^ 0b)3//
 	
r+   c                p    SnUb0  U R                  X5      (       d  SnU R                  X5      (       d  SnU$ )zMatch the tag.TF)r  r  )r&   rl   rD   r5  s       r(   	match_tagCSSMatch.match_tag+  s?     ?''00%%b..r+   c                Z   Sn[        US   [        R                  5      (       a  U$ US   R                  [        :X  ac  U R                  XR                  S9nU(       dA  U(       a:  U R                  XB5      nU R                  X@R                  S9nU(       d	  U(       a  M:  U$ US   R                  [        :X  a3  U R                  XR                  S9nU(       a  U R                  XB5      nU$ US   R                  [        :X  aS  U R                  U5      nU(       d9  U(       a2  U R                  XR5      nU R                  U5      nU(       d	  U(       a  M2  U$ US   R                  [        :X  a?  U R                  U5      nU(       a'  U R                  U5      (       a  U R                  XR5      nU$ )zMatch past relationship.Fr   r   )rH   ro  SelectorNullrel_type
REL_PARENTr~   rK  match_selectorsREL_CLOSE_PARENTREL_SIBLINGr   REL_CLOSE_SIBLINGr@   )r&   rl   relationfoundr   r   s         r(   match_past_relationsCSSMatch.match_past_relations7  so    hqk2??33LA;:-__R3G3G_HF,,V>;O;OP    a[!!%55__R3G3G_HF,,V>  a[!![0++B/G,,W?//8  	 a[!!%66++B/G4;;w//,,W?r+   c                    SnU(       a  U R                   nOU R                  nU" XR                  S9 H  nU R                  Xb5      nU(       d  M    U$    U$ )zMatch future child.Fr   )r   r   rK  r  )r&   r   r  	recursiver5  childrenr   s          r(   match_future_childCSSMatch.match_future_childS  s\     //H,,Hf0D0DEE((9Eu	 F r+   c                |   Sn[        US   [        R                  5      (       a  U$ US   R                  [        :X  a  U R                  XS5      nU$ US   R                  [        :X  a  U R                  X5      nU$ US   R                  [        :X  aS  U R                  U5      nU(       d9  U(       a2  U R                  XB5      nU R                  U5      nU(       d	  U(       a  M2  U$ US   R                  [        :X  a?  U R                  U5      nU(       a'  U R                  U5      (       a  U R                  XB5      nU$ )zMatch future relationship.Fr   T)rH   ro  r  r  REL_HAS_PARENTr  REL_HAS_CLOSE_PARENTREL_HAS_SIBLINGr   r  REL_HAS_CLOSE_SIBLINGr@   )r&   rl   r  r  r   s        r(   match_future_relationsCSSMatch.match_future_relationsa  s    hqk2??33LA;>1++B$?E  a[!!%99++B9E  a[!!_4''+G,,W?++G4  	 a[!!%::''+G4;;w//,,W?r+   c                    Sn[        US   [        R                  5      (       d  US   R                  c  U$ US   R                  R	                  S5      (       a  U R                  X5      nU$ U R                  X5      nU$ )z%Match relationship to other elements.Fr   :)rH   ro  r  r  
startswithr  r  )r&   rl   r  r  s       r(   match_relationsCSSMatch.match_relationsx  s{     hqk2??33x{7K7K7SLA;**3////=E  --b;Er+   c                R    SnU H  nX@R                  USS5      :w  d  M  Sn  U$    U$ )zMatch element's ID.Tidr   F)r   )r&   rl   idsr  is        r(   match_idCSSMatch.match_id  s<     A..r4<<	  r+   c                R    U R                  U5      nSnU H  nXS;  d  M
  Sn  U$    U$ )zMatch element's classes.TF)r   )r&   rl   r   current_classesr  rs  s         r(   match_classesCSSMatch.match_classes  s=     **2.A'	  r+   c                   U R                  U5      nU(       a  U R                  U5      nU(       az  Ubw  U R                  U5      (       dA  U R                  U5      (       a  UR	                  5       (       d  U R                  U5      (       a  SnOU R                  U5      nU(       a  Ub  Mw  U(       a  U R                  U5      nU(       az  Ubw  U R                  U5      (       dA  U R                  U5      (       a  UR	                  5       (       d  U R                  U5      (       a  SnOU R                  U5      nU(       a  Ub  Mw  U$ )zMatch element as root.F)r   r   r@   rh   striprX   r   )r&   rl   r   r   s       r(   
match_rootCSSMatch.match_root  s    ,,r"''+Gg1KK((T-C-CG-L-LQXQ^Q^Q`Q`MM'**#G"//8G g1 mmB'Gg1KK((T-C-CG-L-LQXQ^Q^Q`Q`MM'**#G"mmG4G g1 r+   c                    U R                   UL $ )zMatch element as scope.)rL  ry   s     r(   match_scopeCSSMatch.match_scope  s     zzRr+   c                    U R                  U5      U R                  U5      :H  =(       a#    U R                  U5      U R                  U5      :H  $ )z!Match tag type for `nth` matches.)r[  rU  )r&   rl   r   s      r(   match_nth_tag_typeCSSMatch.match_nth_tag_type  sB     \\% DLL$44 <__U#tr'::	
r+   c                   SnU GH  nSnUR                   (       a#  U R                  XR                   5      (       d    U$ U R                  U5      nUc  [        SU R	                  U5      5      nUR
                  n[        U5      S-
  nU(       a  UOSnSn	UR                  n
UR                  nUR                  nSnSnU(       a  SOSnU(       a  X-  U-   OU
=nnU(       a  SnUS:  d  UU:  a  US:  a4  SU-
  nUb  US:X  a  OjSnX-  nU(       a  X-  U-   OU
=nnSU-
  nUU:  a  OFO5UU-
  nUb  US:X  a  O6SnX-  nU(       a  X-  U-   OU
=nnUU-
  nUU:  a  OUnUS:  a  Mw  UU:  a  M  UnU
S:  a(  US:  a   UnX-  nU(       a  X-  U-   OU
=nnUS:  a  M   SnUnU(       a  X-  U-   OU
=nnSUs=::  a	  US-   ::  a  O  OSnU R                  XXUS:  S9 H  nX-  n[        U[        R                  5      (       d  M(  UR                   (       a#  U R                  UUR                   5      (       d  M\  UR                  (       a  U R                  UU5      (       d  M  U	S-  n	U	U:X  a
  UUL a  SnO  OUUL d  M    O   UUL a  O8UnX-  nUS:  a  O+U(       a  X-  U-   OU
nUU:X  a  OSUs=::  a  US-   ::  a  M  O  U(       a  GM    U$    U$ )	zMatch `nth` elements.TFNr1   r   r   r   )r   r   )rH  r  r~   r   rm   r   r-   r  bnr   rH   rI   rP   of_typer  )r&   rl   nthmatchedr  r   r   
last_indexr   relative_indexr  r  varcount
count_incrfactoridxlast_idxadjustdiff_lowdiff	diff_highlowestr   s                           r(   	match_nthCSSMatch.match_nth  s*    AG{{4#7#7KK#H#Hv u __R(F~i)@)@)DE66DVqJ"&JAENAA##CEJRQF.1QY]q8C(  Agz!1Qw#$s7!-&A+!!#+:=Q1Dh 3w8+! , %(*$4	!-&B,!!"+:=Q1Dh"Z/9,!$(	+ Agz!14 q5(!&+:=Q1Dh ( "$J25Q1<h s,j1n,!..vFUVJ.WEOE%eSWW55 {{4+?+?q{{+S+S yy)@)@U)K)K "a'N%, B;&*G!{# X$ B;#19'*ai!ms?= s,j1n,> 7} | r+   c                    SnU R                  U5       HU  nU R                  U5      (       a  Sn  U$ U R                  U5      (       d  M6  [        R	                  U5      (       d  MR  Sn  U$    U$ )z)Check if element is empty (if requested).TF)r   r@   rh   RE_NOT_EMPTYsearch)r&   rl   is_emptyr   s       r(   match_emptyCSSMatch.match_empty(  ss     &&r*E{{5!!   ''..<3F3Fu3M3M  + r+   c                P    SnU H  nU R                  X5      (       a  M  SnM     U$ )zMatch selectors.TF)r  )r&   rl   rH  r5  sels        r(   match_subselectorsCSSMatch.match_subselectors5  s0     C''00  r+   c                \   SnSnU H  nUcD  UR                   (       a  U R                  XR                  S9nOU R                  XR                  S9nSnUR                   H:  nUR                   (       a  U H  nXx;   d  M
  Sn  O   U(       a    OM1  Xt;   d  M8  Sn  O   U(       a  M  SnM     U$ )z"Match element if it contains text.TNr   F)ownr   r   r   text)	r&   rl   containsr5  contentcontain_listr  r  rs  s	            r(   match_containsCSSMatch.match_contains>  s     $L##"//ll/KG"mmB,,mGGE$))##$9$(E! %    $ * 5) %* r+   c                \   SnSnU R                  USS9nU(       aM  UcJ  U R                  U5      S:X  a  U R                  U5      (       a  UnOU R                  USS9nU(       a  Uc  MJ  Ub  SnU R                   H  u  pgXcL d  M  SnXqL a  Sn  O   U(       d  U R	                  USS9 H  nU R                  U5      n	U	S:X  a    U$ U	S;   d  M%  U R                  USS5      n
U
(       d  MA  [        R                  " U
5      S	:X  d  M]  U R                  R                  X845        XL a  Sn  U$    U$ )
Match default.FNTr   form)inputbuttonrB   r   submit)	r~   r[  rx   rF  r   r   r   rw   r   )r&   rl   r5  r  r   
found_formftr   rv   r   s              r(   match_defaultCSSMatch.match_defaultZ  sA     t4||F#v-$2B2B62J2J4@	  J119!%Jw $ 2 !55dd5KE<<.Dv~  22 66ufbI1A(!: 55<<d]K!{(,! L r+   c                ,  ^  Sn[        [        T R                  US5      5      nS
U 4S jjnU" U5      nUGb\  SnT R                   H  u  pxn	XuL d  M  X:X  d  M  SnU	SL a  Sn  O   U(       Gd&  Sn
T R	                  USS9 H  nXL a  M	  T R                  U5      nUS:X  a  SnSnSnT R                  U5       H  u  nn[        R                  " U5      S:X  a  [        R                  " U5      S:X  a  SnO?[        R                  " U5      S:X  a	  UU:X  a  SnO[        R                  " U5      S	:X  a  SnU(       d  M  U(       d  M  U(       d  M  U" U5      UL d  M  Sn
  O   U
(       d  M    O   U
(       d  SnT R                  R                  XSU45        U$ )r  Frv   c                   > SnTR                  U SS9nUcO  TR                  U5      S:X  a  TR                  U5      (       a  Un U$ UnTR                  USS9nUc  Un U$ Uc  MO  U$ )zFind this input's form.NTr   r  )r~   r[  rx   )rl   r  r   last_parentr&   s       r(   get_parent_form5CSSMatch.match_indeterminate.<locals>.get_parent_form  s    D__R4_8F,<<'61d6F6Fv6N6N!D K %4@>&DK , Kr+   Tr   r  rB   radiocheckedr   )
r   r   r   rG  r   r[  r   r   rw   r   )r&   rl   r5  rv   r  r  r  r  r  r  r	  r   tag_nameis_radiocheckhas_namer   r   s   `                 r(   match_indeterminateCSSMatch.match_indeterminate  s    C33B?@	 r" J::a9!%JDy $ ; !55dd5KE{ #||E2H7*#( %#($($8$8$?DAq#zz!}64::a=G;S+/!%A&!8Q$Y+/!%A)!;(,'xEEhh?SXCY]aCa*. % %@ w' L(  E//66E7JKr+   c           	     f   SnU R                  5       nU R                  nU R                  nUnSnSn	U(       Gd	  U R                  U5      n
U R	                  U5       H  u  pU R                  X{5      u  pU(       a  U
(       a-  U R                  (       d  [        R                  " U5      OUS:X  dP  U(       d  M\  U
(       a  Me  U[        :X  d  Mq  U R                  (       d  Ub  [        R                  " U5      OUS:X  d  M  Un  O   Un	U R                  XpR                  S9nUc  U	nU R                  U5      nU	nO
U(       d  GM	  Uc2  U R                  (       a!  U R                   H  nX_S   L d  M  US   nM     UGc  U R                  (       a!  U(       Ga  U(       Ga  UR                  S:X  Ga  SnS Ha  nSnU R                  XpR                  S9 H6  nU R                  U5      U:X  d  M  U R!                  U5      (       d  M2  S	nUn  O   U(       a  Ma    O   U(       GaI  UGbE  U GH  n[#        U[$        R&                  5      (       a  U R                  U5      S
:X  a  U R!                  U5      (       a  SnSnU R	                  U5       H  u  p[        R                  " U5      S:X  a  [        R                  " U5      S:X  a  S	n[        R                  " U5      S:X  a  UnU(       d  M`  U(       d  Mi  UnU R                  R)                  [+        [,        U5      [+        [,        U5      45          O   Uc  GM    O   Uc+  U R                  R)                  [+        [,        U5      S45        UbG  U HA  nSnU H,  nU R/                  U[+        [,        U5      5      (       d  M*  S	nM.     U(       a  M@    U$    U$ )zMatch languages.FNlangr   r   r   html)r  headTmetaz
http-equivzcontent-languager  r   )rR  r}   rM  r   r   r   rN  r   rw   NS_XMLr~   r   rE  rv   r   r[  rx   rH   rI   rP   r   r   r   r  )r&   rl   langsr5  has_nsr}   rM  r   
found_langr   r   r   r   attr_nsr  cacher  rD   r   child2c_langr  patternsr  s                           r(   
match_langCSSMatch.match_lang  s8    ))+yy!44 
**62K,,V4 $ 4 4V ? K4;;djjm\]bh5h{{w&7H15AQD)W[`ff "#J 5 D__V||_DF~%)%5%5d%;") *. $"7"7..8#!&qJ /
 t{{7IdW[W`W`djWjE'!226\\2RE||E*c1d6F6Fu6M6M $!&	 S
 u ( +$F!&#''22t||F7Kv7UZ^ZjZjkqZrZr!&"&$($8$8$@DA#zz!}<ARdAd)-#zz!}	9*+%v''-4
 $ 5 5 < <d3otTWYcOd=e f % %A "- % %))00$sD/21FG !!'G44Wd3
>STT $  ( u " r+   c           	       ^  U[         R                  -  (       a  U[         R                  -  (       a  gUb  T R                  U5      (       d  g[        R                  [        R                  " T R                  USS5      5      S5      nUS;  a  X2:H  $ T R                  U5      nU(       a  Uc  [         R                  U:H  $ T R                  U5      nUS:H  nUS:H  nUS:H  nU(       a'  [        R                  " T R                  US	S5      5      OSn	U(       a  U	S
:X  a  Uc  [         R                  U:H  $ U(       a  U	S;   d  U(       a  US:X  a  U(       a*  SR                  U 4S jT R                  USS9 5       5      n
O![        [        T R                  USS5      5      n
U
(       ad  U
 HK  n[        R                   " U5      nUS;   d  M!  US:X  a  [         R                  O[         R                  nX2:H  s  $    [         R                  U:H  $ U(       a  [         R                  U:H  $ T R#                  T R%                  USS9U5      $ U(       a  Ub  US:X  aR  T R'                  U5      nUb  X2:H  $ U(       a  [         R                  U:H  $ T R#                  T R%                  USS9U5      $ T R#                  T R%                  USS9U5      $ )zCheck directionality.FNra  r   )Nr   r  re  rb  rB   tel)r  r  r!  urlemailr   c              3  X   >#    U  H  nTR                  U5      (       d  M  Uv   M!     g 7fr   )rh   ).0r   r&   s     r(   	<genexpr>%CSSMatch.match_dir.<locals>.<genexpr>6  s$     w1VZ^ZpZpquZv1Vs   *	*Tr   r   rf  ri  )ro  rp  rq  rx   rj  rk  r   rw   r   r   r[  r   r   r   r   rm  rn  	match_dirr~   rl  )r&   rl   directionalityrr  r   rv   is_inputis_textareais_bdir=  r   rs  rt  s   `            r(   r(  CSSMatch.match_dir  sd    BNN*~/N:T--b11 KK

4+E+Eb%QS+T UW[\	I%.. ,,r"y(>>^33 ||B7?j(JR

455b&"EFXZ9+<>>^33 %#LLQ\bkopbpw1B1B2QU1B1VwwS$"<"<R""MNA&44Q7D//6:ckBNNr~~	(::	  ~~77~~77>>$//"/"E~VV y(Y!^r*I$ 22~~77>>$//"/"E~VV ~~doobDoA>RRr+   c                   Sn[         R                  " U R                  US5      5      n[        R	                  U[        [        U R                  USS5      5      5      n[        R	                  U[        [        U R                  USS5      5      5      nUc  Uc  g[        R	                  U[        [        U R                  USS5      5      5      nUb[  US;   a  Ub  Xu:  a  SnU(       d
  Ub  Xv:  a  SnO9US	:X  a3  Ub  Ub  XV:  a  Xu:  a  Xv:  a  SnOUb  Xu:  a  SnU(       d
  Ub  Xv:  a  SnU[        R                  -  (       a  U(       + $ U$ )
a3  
Match range.

Behavior is modeled after what we see in browsers. Browsers seem to evaluate
if the value is out of range, and if not, it is in range. So a missing value
will not evaluate out of range; therefore, value is in range. Personally, I
feel like this should evaluate as neither in or out of range.
FrB   minNmaxr   )r.  r1  r  r  r2  r3  Tr0  )	r   rw   r   r  r@  r   r   ro  SEL_IN_RANGE)r&   rl   	conditionout_of_ranger=  mnmxr   s           r(   match_rangeCSSMatch.match_rangeQ  s8    

455b&ABtC1K1KBPUW[1\']^tC1K1KBPUW[1\']^ :"*""5$sD4N4NrSZ\`4a*bcVV>ej#'L#5:#'L&>bnzej'+~%*'+'BNuz'+#,r#><PLPr+   c                    U R                  U5      nUSL=(       aI    UR                  S5      S:H  =(       d.    UR                  S5      S:g  =(       d    U R                  U5      SL$ )a  
Match defined.

`:defined` is related to custom elements in a browser.

- If the document is XML (not XHTML), all tags will match.
- Tags that are not custom (don't have a hyphen) are marked defined.
- If the tag has a prefix (without or without a namespace), it will not match.

This is of course requires the parser to provide us with the proper prefix and namespace info,
if it doesn't, there is nothing we can do.
Nr  r   r  )r[  findr^  rZ  s      r(   match_definedCSSMatch.match_definedy  s_     ||B 		#"$ 0		#"$0#4/		
r+   c                <    SnU R                  U5      nUS;   a  SnU$ )z
Match placeholder shown according to HTML spec.

- text area should be checked if they have content. A single newline does not count as content.

F)r   
T)r   )r&   rl   r5  r  s       r(   match_placeholder_shown CSSMatch.match_placeholder_shown  s)     --#j Er+   c                   SnUR                   nUR                  nU(       a,  U R                  nU R                  nS[        0U l        SU l        U(       a  U R                  (       Ga  U GH  nUn[        U[        R                  5      (       a  M'  U R                  XR                  5      (       d  MI  UR                  [        R                  -  (       a  U R                  U5      (       d  M  UR                  [        R                  -  (       a  U R                  U5      (       d  M  UR                  [        R                  -  (       a  U R!                  U5      (       d  M  UR                  [        R"                  -  (       a  U R%                  U5      (       d  GM2  U R'                  XR(                  5      (       d  GMU  UR                  [        R*                  -  (       a  U R-                  U5      (       d  GM  UR.                  (       a#  U R1                  XR.                  5      (       d  GM  UR2                  (       a#  U R5                  XR2                  5      (       d  GM  U R7                  XR8                  5      (       d  GM  UR                  [:        -  (       a*  U R=                  XR                  [:        -  5      (       d  GM]  UR>                  (       a#  U RA                  XR>                  5      (       d  GM  URB                  (       a#  U RE                  XRB                  5      (       d  GM  URF                  (       a#  U RI                  XRF                  5      (       d  GM  UR                  [        RJ                  -  (       a  U RM                  U5      (       d  GM4  UR                  [        RN                  -  (       a  U RQ                  U5      (       d  GMo  UR                  [R        -  (       a*  U RU                  XR                  [R        -  5      (       d  GM  URV                  (       a#  U RY                  XRV                  5      (       d  GM  U(       + n  O   U(       a  WU l        WU l        U$ )z.Check if element matches one of the selectors.Fr  T)-is_notr   rI  rK  r   rH   ro  r  r  rD   rJ  SEL_DEFINEDr:  SEL_ROOTr  	SEL_SCOPEr  SEL_PLACEHOLDER_SHOWNr>  r  r  	SEL_EMPTYr  r  r  r   r  r  r  RANGESr6  r  r  rH  r  r  r  SEL_DEFAULTr  SEL_INDETERMINATEr  	DIR_FLAGSr(  r  r  )	r&   rl   rH  r5  rA  r   rI  rK  selectors	            r(   r  CSSMatch.match_selectors  s    !!## J"22O%x0DO#'D $,,,%h88~~b,,77>>BNN24;M;Mb;Q;Q>>BKK/8K8K>>BLL09I9I"9M9M>>B$<$<<TEaEabdEeEe~~b,,77>>BLL09I9I"9M9M<<b,,(G(G##D,>,>rCSCS,T,T,,R1D1DEE>>F*43C3CBY_H_3`3`==]])K)K%%d.E.EbJ\J\.].]$$T-A-A"FWFW-X-X>>BNN24;M;Mb;Q;Q >>B$8$88AYAYZ\A]A]>>I-dnnRZcIc6d6d$$T-@-@EVEV-W-W"
y &~ (DO#2D r+   c              #     #    US:  a  SOUnU R                  U R                  5       H1  nU R                  U5      (       d  M  Uv   Uc  M$  US-  nUS:  d  M1    g   g7f)z&Match all tags under the targeted tag.r   N)r   rD   r5  )r&   limitlimr   s       r(   selectCSSMatch.select  sY      aidU--dhh7Ezz%  ?1HCQw 8s   =AA	AAc                    U R                   nSnUc5  Ub2  U R                  U5      (       a  UnOU R                  U5      nUc  Ub  M2  U$ )Match closest ancestor.N)rD   r5  r~   )r&   currentclosests      r(   rU  CSSMatch.closest   sQ     ((o'"5zz'""!//'2	 o'"5
 r+   c                    U R                  U R                  5       Vs/ s H>  n[        U[        R                  5      (       d  M$  U R                  U5      (       d  M<  UPM@     sn$ s  snf )zFilter tag's children.)r   rD   rH   rI   rP   r5  r&   rD   s     r(   filterCSSMatch.filter  sV      ,,TXX6
6C#sww' ,0JJsO 6
 	
 
s   #A&A&A&c                    U R                  U5      (       + =(       a3    U R                  U5      =(       a    U R                  XR                  5      $ zMatch.)rM   r@   r  rH  ry   s     r(   r5  CSSMatch.match  s9     ;;r?"ct{{2c4;O;OPRTbTb;ccr+   )rF  rG  rE  rJ  rM  rK  r   rN  rI  r}   rL  rH  rD   N)
rH  ct.SelectorListrL  r   rI  ct.Namespaces | NonerJ  r4   r2   r3   )r2   rp   )rl   r   r2   r   r   r   r   )rl   r1   r2   r   )r|  r   r}  r   r2   rp   )rl   r1   r  r   r   r   r2   r  )rl   r1   rD   zct.SelectorTagr2   rp   )rl   r1   r  z tuple[ct.SelectorAttribute, ...]r2   rp   )rl   r1   rD   zct.SelectorTag | Noner2   rp   )rl   r1   r  r^  r2   rp   r   )r   r1   r  r^  r  rp   r2   rp   )rl   r1   r  tuple[str, ...]r2   rp   )rl   r1   r   r`  r2   rp   r   )rl   r1   r   r1   r2   rp   )rl   r1   r  ztuple[ct.SelectorNth, ...]r2   rp   )rl   r1   rH  ztuple[ct.SelectorList, ...]r2   rp   )rl   r1   r  ztuple[ct.SelectorContains, ...]r2   rp   )rl   r1   r  ztuple[ct.SelectorLang, ...]r2   rp   )rl   r   r)  r4   r2   rp   )rl   r1   r2  r4   r2   rp   )rl   r1   rH  r^  r2   rp   r   )rN  r4   r2   r   )r2   r   )r2   list[bs4.Tag]),r5   r6   r7   r8   r9   r)   rR  rU  rx   r[  r^  rl  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r(  r6  r:  r>  r  rP  rU  rY  r5  r:   r;   r+   r(   rC  rC    s2   'B"'B 'B )	'B
 'B 
'BR6
/
RX#J6p33 3 	3
 
$3j*&

8.	4 

cJ8&P<|Tl9Sv&QP
.Rh

dr+   rC  c                     ^  \ rS rSr% SrS\S'   S\S'   S\S'   S	\S
'   S\S'   Sr          SU 4S jjrSS jrSS jr	SS jr
SS jrSSS jjrSSS jjrSS jr\rSrU =r$ )	SoupSievei  z-Compiled Soup Sieve selector matching object.r   r  r^  rH  r_  rI  zdict[str, str]customr4   rJ  )r  rH  rI  re  rJ  _hashc                (   > [         TU ]  UUUUUS9  g)r#   )r  rH  rI  re  rJ  N)superr)   )r&   r  rH  rI  re  rJ  	__class__s         r(   r)   SoupSieve.__init__%  s&     	! 	 	
r+   c                v    [        U R                  XR                  U R                  5      R	                  U5      $ r\  )rC  rH  rI  rJ  r5  rX  s     r(   r5  SoupSieve.match7  s+     __djjIOOPSTTr+   c                t    [        U R                  XR                  U R                  5      R	                  5       $ )rS  )rC  rH  rI  rJ  rU  rX  s     r(   rU  SoupSieve.closest<  s(     __djjIQQSSr+   c                J   [        U[        R                  5      (       a9  [        U R                  XR
                  U R                  5      R                  5       $ U Vs/ s H9  n[        R                  U5      (       a  M  U R                  U5      (       d  M7  UPM;     sn$ s  snf )aY  
Filter.

`CSSMatch` can cache certain searches for tags of the same document,
so if we are given a tag, all tags are from the same document,
and we can take advantage of the optimization.

Any other kind of iterable could have tags from different documents or detached tags,
so for those, we use a new `CSSMatch` for each item in the iterable.
)
rH   rI   rP   rC  rH  rI  rJ  rY  r`   r5  )r&   iterabler   s      r(   rY  SoupSieve.filterA  sp     h((DNNHootzzRYY[[%-mXTX5Q5QRV5WD\`\f\fgk\lDXmmms   B ?B B c                >    U R                  USS9nU(       a  US   $ S$ )zSelect a single tag.r   )rN  r   N)rP  )r&   rD   r   s      r(   
select_oneSoupSieve.select_oneR  s'     {{3a{(tAw(D(r+   c                6    [        U R                  X5      5      $ )zSelect the specified tags.)listiselectr&   rD   rN  s      r(   rP  SoupSieve.selectX  s     DLL,--r+   c              #     #    [        U R                  XR                  U R                  5      R	                  U5       Sh  vN   g N7f)zIterate the specified tags.N)rC  rH  rI  rJ  rP  rx  s      r(   rw  SoupSieve.iselect]  s1      DNNC$**MTTUZ[[[s   >A AAc           	     x    SU R                   < SU R                  < SU R                  < SU R                  < S3	$ )zRepresentation.zSoupSieve(pattern=z, namespaces=z	, custom=z, flags=))r  rI  re  rJ  r.   s    r(   __repr__SoupSieve.__repr__b  s@     ! 0doo=P Qkk_HTZZN!=	
r+   r;   )
r  r   rH  r^  rI  r_  re  zct.CustomSelectors | NonerJ  r4   )rD   r1   r2   rp   )rD   r1   r2   r   )rp  zIterable[bs4.Tag]r2   rb  ra  )rD   r1   rN  r4   r2   rb  )rD   r1   rN  r4   r2   r   )r2   r   )r5   r6   r7   r8   r9   __annotations__	__slots__r)   r5  rU  rY  rs  rP  rw  r~  __str__r:   __classcell__)ri  s   @r(   rd  rd    s    7L$$JRI

 #
 )	

 *
 
$U
T
n").
\

 Gr+   rd  );r9   
__future__r   r   r   r   rer   ro  rm  rI   typingr   r	   r
   r   r   r   compiler  r   r  r  r  r  r  r  r  r  r   r  rp  rq  rJ  r1  SEL_OUT_OF_RANGErG  rj  r;  r9  r7  r8  r4  r:  rx  r  r	  r  r  r  r
  DAYS_IN_WEEKr    r=   r  rC  	Immutablerd  pickle_registerr;   r+   r(   <module>r     s    "   	   
 I I I zz.)JJ'	 
     )	/NNR^^+		2..	. >>>> 
G	H
**B
C::BC
**A
B
**S
Tjjk 

=>	
	" "(^
 ^
Bd dN@d| @dF P Pf   9 r+   