
    A>qjs                    D   d Z ddlmZ ddlZddlmZ ddlmZ ddlmZ	 ddlm
Z dd	lmZ ddlZdd
lmZmZmZmZ ddlmZ ddlmZ ddlZ ej0                         Z ej4                         ZdZdZh dZh dZh dZ h dZ!h dZ"eez  e z  e!z  e"z  Z#dZ$de$ dZ%dZ&de% de& dZ'de% dZ(de% de$ dZ)de( de( d Z*d!e' d"e' d#Z+d$e$ d%e$ d&e* dZ,de' d'e' d(e, d)e' d*e' d+Z-d,e* Z.d-e* Z/d.e* d/e* d0Z0d1e' d2e* d3e* de- d4	Z1d5e* d6e' d7Z2d5e* d6e' d8Z3d9e* dZ4d:Z5e' d;Z6d<e2 Z7d=e* Z8d>e3 d?e+ d@e' dAe& d+e% e' dBe& d+e% e' dCZ9dDe3 dEe+ dFe' dGZ:e3 dHe, de' dIe' d+e, dJe' d;Z;e3 dKe' d;Z<e' dLe% dMe' d+Z=e3 dHe, de' dIe' d+e, dJe' d;Z> ej~                  dNe' dOej                        ZA ej~                  dNe% dPe$ dej                        ZB ej~                  dQe' dRe' dSej                        ZC ej~                  dTe, dUe' dIe' dVej                        ZE ej~                  e%      ZF ej~                  dWe' d+      ZG ej~                  dXe& dY      ZH ej~                  dWe4 dZej                        ZI ej~                  e3ej                  ej                  z  ej                  z        ZKd[ZLd\ZMdZNd]ZOd^ZPd_ZQd`ZRdaZSdbZTdcZUddZVdeZWdfZXdgZY eeYh      	 	 	 	 	 	 	 	 	 	 ddi       ZZddjZ[ddkZ\dddlZ]ddmZ^ G dn do      Z_ G dp dqe_      Z` G dr ds      Zae G dt du             Zb G dv dweecebej                  z  f         Ze ebdxeNeRz        Zf ebdyeNeRz        Zg ebdzeNeRz  eQz        Zh ebd{eNeRz  eSz        Zi ebd|eNeRz        Zj ebd}eNeRz        Zk ebd~eNeRz        Zl ebdeNeRz        Zm ebdeNeRz  eWz        Zn ebdeNeRz        Zo ebdeNeRz        Zp ebdeNeRz  eUz        Zq ebdeNeRz  eVz        Zr ebdeNeRz        Zs ebdeNeRz        Zt ebdeN      Zu G d d      Zvy)zCSS selector parser.    )annotationsN)	lru_cache   )util)	css_match)	css_types)SelectorSyntaxError)MatchAnyIteratorcast)	dataclass)UserDicti  i    >   :link:open:root:empty:muted:scope:checked:default:defined:enabled	:any-link	:disabled	:in-range	:optional	:required
:read-only:last-child:only-child:read-write:first-child:last-of-type:only-of-type:out-of-range:first-of-type:indeterminate:placeholder-shown>   :past:focus:hover:active:future:paused:target:playing:seeking:stalled:visited	:autofill
:buffering:fullscreen:local-link:focus-within:popover-open:user-invalid:focus-visible:target-within:volume-locked:picture-in-picture:host:current>   :matches:is:has:not:where	:contains:-soup-contains:-soup-contains-own>   :host-contextr@   rA   >   :dir:lang
:nth-child:nth-of-type:nth-last-child:nth-last-of-typez(?:\r\n|(?!\r\n)[\n\f\r])z	(?:[ \t]|)z(?:/\*(?:[^*]|\*(?!/))*\*/)z(?:|z(?:\\(?:[a-f0-9]{1,6}z?|[^\r\n\f]|$))z?|[^\r\n\f]|$|z))z;
(?:(?:--|-?(?:[^\x00-\x2f\x30-\x40\x5B-\x5E\x60\x7B-\x9f]|z:))
(?:[^\x00-\x2c\x2e\x2f\x3A-\x40\x5B-\x5E\x60\x7B-\x9f]|z)*)
z (?:[-+])?(?:[0-9]+n?|n)(?:(?<=n)z	*(?:[-+])z*(?:[0-9]+))?z(?:"(?:\\(?:.|z)|[^\\"\r\n\f])*?"|'(?:\\(?:.|z)|[^\\'\r\n\f])*?'|z*(?P<cmp>[!~^|*$]?=)z*(?P<value>z)(?:z*(?P<case>[is]))?)?*z\#z\.z(?P<tag_ns>(?:z|\*)?\|)?(?P<tag_name>z|\*)z\[z*(?P<attr_ns>(?:z|\*)?\|)?(?P<attr_name>z\]z
(?P<name>:z)(?P<open>\(z*)?z*)z(?P<name>:(?=--)&z*\):z@Pz
(?P<pseudo_nth_child>z
(?P<nth_child>z|even|odd))(?:z*\)|(?P<of>z*ofz*))
z
(?P<pseudo_nth_type>z
(?P<nth_type>z|even|odd))z*\)
z(?P<values>z*,z)*)z(?P<dir>ltr|rtl)z*?(?P<relation>[,+>~]|z(?![,+>~]))z(?:(\\[a-f0-9]{1,6}z?)|(\\[^\r\n\f])|(\\$))z?)|(\\[^\r\n\f])|(\\$)|(\\z'(?P<s1>[-+])?(?P<a>[0-9]+n?|n)(?:(?<=n)z*(?P<s2>[-+])z*(?P<b>[0-9]+))?z(?:(?P<value>z)|(?P<split>z*))^z$^(?:[ \t]|(?:\n\r|(?!\n\r)[\n\f\r])|z)*$,                 @         i   i   i  )maxsizec                ~    t        |      }t        j                  | t        | ||      j	                         |||      S )zCached CSS compile.customflags)process_customcm	SoupSieve	CSSParserprocess_selectors)pattern
namespacesre   rf   custom_selectorss        S/opt/rentech/trading_bot/.venv/lib/python3.12/site-packages/soupsieve/css_parser.py_cached_css_compilerp      sH     &f-<<#	
 


 
    c                 ,    t         j                          y)zPurge the cache.N)rp   cache_clear rq   ro   _purge_cacheru      s     ##%rq   c                    i }| r| j                         D ]_  \  }}t        j                  |      }t        j	                  |      t        d| d      ||v rt        d| d      ||t        |      <   a |S )zProcess custom.z
The name 'z)' is not a valid custom pseudo-class namezThe custom selector 'z' has already been registered)itemsr   lower	RE_CUSTOMmatchr	   KeyErrorcss_unescape)re   rn   keyvaluenames        ro   rg   rg      s      ,,. 	9JC::c?Dt$,)Jtf<e*fgg''!6tf<YZ[[38\$/0	9 rq   c                F    dd}|st         nt        j                  ||       S )zs
    Unescape CSS value.

    Strings allow for spanning the value on multiple strings by escaping a new line.
    c                   | j                  d      r6t        | j                  d      dd d      }|dk(  rt        }t        |      }|S | j                  d      r| j                  d      dd }|S | j                  d      rd}|S d}|S )	z(Replace with the appropriate substitute.r   Nr]   r   rZ         � )groupintUNICODE_REPLACEMENT_CHARchr)m	codepointr~   s      ro   replacezcss_unescape.<locals>.replace  s     771:AGGAJqrNB/IA~4		NE  WWQZGGAJqrNE  WWQZE  Erq   )r   
Match[str]returnstr)
RE_CSS_ESCRE_CSS_STR_ESCsub)contentstringr   s      ro   r|   r|     s     " %J.==gwOOrq   c                z   g }t        |       }|dkD  xr | d   dk(  }|dk(  r|r|j                  d|         nt        |       D ]  \  }}t        |      }|dk(  r|j                  d       (d|cxk  rdk  sn |dk(  r|j                  d|dd	       Q|dk(  s|r*|dk(  r%d
|cxk  rdk  rn n|j                  d|dd	       |dv s:|dk\  s5d
|cxk  rdk  s*n d
|cxk  rdk  sn d|cxk  rdk  sn d|cxk  rdk  rn n|j                  |       |j                  d|         dj	                  |      S )zEscape identifier.r   -r   \r         xrY   0   9   )-   _   r`   A   Z   a   z   r   )lenappend	enumerateordjoin)identr   length
start_dashindexcr   s          ro   escaper     sG    FZF!/aCJ{z5'l#!%( 	(HE1AID h')+t+	T0A9Q-q121*
$)B[W[B[9Q-q12\)Y$->49C\X\C\*d*	0IT0ItW`OhdhOha 1#h'	( 776?rq   c                  :    e Zd ZdZddZedd       Zd	dZd
dZy)SelectorPatternSelector pattern.c                .    || _         || _        d| _        y)Initialize.N)r   rl   _re_pattern)selfr   rl   s      ro   __init__zSelectorPattern.__init__;  s     	37rq   c                (   t         5  | j                  Ut        j                  | j                  t        j
                  t        j                  z  t        j                  z        | _        ddd       | j                  S # 1 sw Y   | j                  S xY w)z1Retrieve the compiled regular expression pattern.N)RE_LOCKr   recompilerl   IXUr   s    ro   
re_patternzSelectorPattern.re_patternB  sn      	P'#%::dllBDD244K"$$<N#O 	P 	P s   A"A==Bc                    | j                   S )	Get name.)r   r   s    ro   get_namezSelectorPattern.get_nameK  s     yyrq   c                :    | j                   j                  ||      S )Match the selector.)r   rz   )r   selectorr   rf   s       ro   rz   zSelectorPattern.matchP  s     $$Xu55rq   N)r   r   rl   r   r   None)r   zre.Pattern[str]r   r   r   r   r   r   rf   r   r   zMatch[str] | None)	__name__
__module____qualname____doc__r   propertyr   r   rz   rt   rq   ro   r   r   8  s(    8    
6rq   r   c                  (    e Zd ZdZddZddZddZy)	SpecialPseudoPatternr   c                    i | _         |D ]/  }|d   } |d   ||d         }|d   D ]  }|| j                   |<    1 d| _        y)r   r   r   rZ   r   N)patternsmatched_name)r   r   pr   rl   pseudos         ro   r   zSpecialPseudoPattern.__init__Y  sd      	0AQ4Dad41&GA$ 0(/f%0	0 !rq   c                R    | j                   dS | j                   j                         S )r   r   )r   r   r   s    ro   r   zSpecialPseudoPattern.get_namee  s)     &&.rPD4E4E4N4N4PPrq   c                   d}t         j                  ||      }|rft        j                  t	        |j                  d                  }| j                  j                  |      }|r|j                  |||      }|r|| _        |S )r   Nr   )	RE_PSEUDO_CLASS_SPECIALrz   r   rx   r|   r   r   getr   )r   r   r   rf   r   r   r   rl   s           ro   rz   zSpecialPseudoPattern.matchj  sr     #))(E:::l1776?;<Dmm''-G x>(/D%rq   N)r   zCtuple[tuple[str, tuple[str, ...], str, type[SelectorPattern]], ...]r   r   r   r   )r   r   r   r   r   r   rz   rt   rq   ro   r   r   V  s    
!Q
rq   r   c                  4    e Zd ZdZddZddZd	dZd
dZeZy)	_Selectorz
    Intermediate selector class.

    This stores selector data for a compound selector as we are acquiring them.
    Once we are done collecting the data for a compound selector, we freeze
    the data in an object that can be pickled and hashed.
    c                ,   |j                  dd      | _        |j                  dg       | _        |j                  dg       | _        |j                  dg       | _        |j                  dg       | _        |j                  dg       | _        |j                  dg       | _        |j                  d	d      | _        |j                  d
g       | _	        |j                  dg       | _
        |j                  dd      | _        |j                  dd      | _        y)r   tagNidsclasses
attributesnth	selectors	relationsrel_typecontainslangrf   r   no_matchF)r   r   r   r   r   r   r   r   r   r   r   rf   r   )r   kwargss     ro   r   z_Selector.__init__  s     ::eT*::eR(zz)R0 **\26::eR(K4K4

:t4

:r2JJvr*	ZZ+


:u5rq   c                    |rG|d   }|j                   j                  |dd        t        j                  |j	                         g      S t        j                         S )zFreeze relation.r   r   N)r   extendctSelectorListfreeze)r   r   sels      ro   _freeze_relationsz_Selector._freeze_relations  sL     A,CMM  12/??CJJL>22??$$rq   c                   | j                   rt        j                         S t        j                  | j                  t        | j                        t        | j                        t        | j                        t        | j                        t        | j                        | j                  | j                        | j                  t        | j                        t        | j                        | j                         S )zFreeze self.)r   r   SelectorNullSelectorr   tupler   r   r   r   r   r   r   r   r   r   rf   r   s    ro   r   z_Selector.freeze  s     ==??$$;;dhhdll#doo&dhhdnn%&&t~~6dmm$dii 

 rq   c                @   d| j                   d| j                  d| j                  d| j                  d| j                  d| j
                  d| j                  d| j                  d	| j                  d
| j                  d| j                  d| j                  dS )zString representation.z_Selector(tag=z, ids=z
, classes=z, attributes=z, nth=z, selectors=z, relations=z, rel_type=z, contains=z, lang=z, flags=z, no_match=rQ   )r   r   r   r   r   r   r   r   r   r   rf   r   r   s    ro   __str__z_Selector.__str__  s     TXXLtxxl*T\\DTTabfbqbqat u88,l4>>*<LHZ [(DMM3DGDII=X`aeakak`n o(+	
rq   N)r   r   r   r   )r   list[_Selector]r   ct.SelectorList)r   zct.Selector | ct.SelectorNullr   )	r   r   r   r   r   r   r   r   __repr__rt   rq   ro   r   r   z  s"    6 %(
 Hrq   r   c                  &    e Zd ZU dZded<   ded<   y)
CSSPatternz<A CSS pattern that hasn't been processed by `CSSParser` yet.r   r   r   rf   N)r   r   r   r   __annotations__rt   rq   ro   r   r     s    FMJrq   r   c                       e Zd ZdZddZddZy)PseudoSelectorMapzPseudo selector map.c                "    || j                   |<   y)z	Set item.N)datar   r}   r~   s      ro   __setitem__zPseudoSelectorMap.__setitem__  s     		#rq   c                    t         5  | j                  |   }t        |t              r>t	        |j
                        j                  |j                        }|| j                  |<   ddd       |S # 1 sw Y   S xY w)z	Get item.rf   N)SEL_LOCKr   
isinstancer   rj   r   rk   rf   r   s      ro   __getitem__zPseudoSelectorMap.__getitem__  si      	'IIcNE%,!%..1CC%++CV!&		#		' 	' s   AA//A9N)r}   r   r~   zCSSPattern | ct.SelectorListr   r   )r}   r   r   r   )r   r   r   r   r   r  rt   rq   ro   r   r     s    
	rq   r   zhtml|*:is(a, area)[href]z\
    html|*:is(input[type=checkbox], input[type=radio])[checked], html|option[selected]
    z
    :checked,

    /*
    This pattern must be at the end.
    Special logic is applied to the last selector.
    */
    html|form html|*:is(button, input)[type="submit"]
    aF  
    html|input[type="checkbox"][indeterminate],
    html|input[type="radio"]:is(:not([name]), [name=""]):not([checked]),
    html|progress:not([value]),

    /*
    This pattern must be at the end.
    Special logic is applied to the last selector.
    */
    html|input[type="radio"][name]:not([name='']):not([checked])
    a  
    html|*:is(input:not([type=hidden]), button, select, textarea, fieldset, optgroup, option, fieldset)[disabled],
    html|optgroup[disabled] > html|option,
    html|fieldset[disabled] > html|*:is(input:not([type=hidden]), button, select, textarea, fieldset),
    html|fieldset[disabled] >
        html|*:not(legend:nth-of-type(1)) html|*:is(input:not([type=hidden]), button, select, textarea, fieldset)
    z|
    html|*:is(input:not([type=hidden]), button, select, textarea, fieldset, optgroup, option, fieldset):not(:disabled)
    z,html|*:is(input, textarea, select)[required]z2html|*:is(input, textarea, select):not([required])aW  
    html|input:is(
        :not([type]),
        [type=""],
        [type=text],
        [type=search],
        [type=url],
        [type=tel],
        [type=email],
        [type=password],
        [type=number]
    )[placeholder]:not([placeholder='']):is(:not([value]), [value=""]),
    html|textarea[placeholder]:not([placeholder=''])
    a  
    html|*:is(
        textarea,
        input:is(
            :not([type]),
            [type=""],
            [type=text],
            [type=search],
            [type=url],
            [type=tel],
            [type=email],
            [type=number],
            [type=password],
            [type=date],
            [type=datetime-local],
            [type=month],
            [type=time],
            [type=week]
        )
    ):not([readonly], :disabled),
    html|*:is([contenteditable=""], [contenteditable="true" i])
    zhtml|*:not(:read-write)z
    html|input:is(
        [type="date"],
        [type="month"],
        [type="week"],
        [type="time"],
        [type="datetime-local"],
        [type="number"],
        [type="range"]
    ):is(
        [min],
        [max]
    )
    z html|*:is(details, dialog)[open]zhtml|*:is(video, audio)[muted]z*|*c                     e Zd ZdZ ede       eddeefddeefdde	efd	d
e
efddeeff       ede       ede       ede       ede       ede       ede       ede       ede       ede       ede      fZ ei dededededededededed e d!e!d"e"d#e#d$e$d%e%d&e&d'e'      Z(	 	 d:	 	 	 	 	 	 	 d;d)Z)d<d*Z*d=d+Z+d=d,Z,d=d-Z-	 	 	 	 	 	 	 	 	 	 	 	 d>d.Z.	 	 	 	 	 	 	 	 	 	 d?d/Z/	 	 	 	 	 	 	 	 	 	 	 	 d@d0Z0	 	 	 	 	 	 	 	 	 	 	 	 	 	 dAd1Z1	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dBd2Z2d=d3Z3d=d4Z4d=d5Z5d=d6Z6	 	 dC	 	 	 	 	 	 	 dDd7Z7dEd8Z8dCdFd9Z9y()Grj   zParse CSS selectors.pseudo_closepseudo_contains)rG   rH   rI   pseudo_nth_child)rM   rO   pseudo_nth_type)rN   rP   pseudo_lang)rL   
pseudo_dir)rK   pseudo_class_custompseudo_classpseudo_elementampat_ruleidclassr   	attributecombiner   r   r   r   r(   r   r   r   r   r   r   r   r"   r   r&   r)   
<nth-of-s>Nc                    |j                  dd      | _        || _        | j                  t        j                  z  | _        |i n|| _        d| _        y)r    r   Nr   )r   rl   rf   r   DEBUGdebugre   count)r   r   re   rf   s       ro   r   zCSSParser.__init__  sG      ''9
ZZ$**,
"Nb
rq   c                N    | j                   t        kD  rt        dt               y)z!Check the current selector count.z/Selector exceeds pseudo-class nesting limit of N)r  SELECTOR_LIMIT
ValueErrorr   s    ro   check_countzCSSParser.check_count  s)     ::&N~N^_`` 'rq   c                   d}|j                  d      }|j                  d      r$t        j                  |j                  d            nd}|j                  d      rt        |j                  d      dd       nd}t        |j                  d            }d}	d}
d}|r)|d	k(  rt        j
                  nd
t        j                  z  }nLt        j                  |      dk(  r$t        j
                  t        j                  z  }d}	nt        j                  }|rY|j                  d      j                  d      rt        |j                  d      dd d      }nt        |j                  d            }|sd}n|j                  d      r4|sdnt	        j                  |      }t	        j                  d|z  |      }n_|j                  d      r4|sdnt	        j                  |      }t	        j                  d|z  |      }n|j                  d      r3|sdnt	        j                  |      }t	        j                  d|z  |      }n|j                  d      rH|rt        j                  |      rdnt	        j                  |      }t	        j                  d|z  |      }n}|j                  d      r-t	        j                  dt	        j                  |      z  |      }n?t	        j                  dt	        j                  |      z  |      }|j                  d      rd}|	r!|rt	        j                  |j                        }
t        j                  ||||
      }|rjt               }|j                   j#                  |       t        j$                  |j'                         gdd      }|j(                  j#                  |       d}|S |j                   j#                  |       d}|S )z8Create attribute selector from the returned regex match.FcmpcaseNattr_nsr   	attr_nameir   typeTr~   "'r   rV   z(?!)z^%s.*rW   z.*?%s$rS   z.*?%s.*~z7.*?(?:(?<=^)|(?<=[ \t\r\n\f]))%s(?=(?:[ \t\r\n\f]|$)).*rR   z^%s(?:-.*)?$z^%s$!)r   r   rx   r|   r   r   DOTALL
startswithr   r   RE_WSsearchrl   r   SelectorAttributer   r   r   r   r   r   )r   r   r   has_selectorinverseopr   nsattris_typepattern2r~   rf   rl   sel_attrsub_selnot_lists                    ro   parse_attribute_selectorz"CSSParser.parse_attribute_selector  s    WWU^./ggfotzz!''&/*467ggi6H\!''),Sb12bAGGK01!S[RTTa299<EZZ'DD299$EGIIEwww**:6$QWWW%5a%;TB$QWWW%56G]]3 $)Gbii.>EjjE!159G]]3 $)Gbii.>EjjU!2E:G]]3 $)Gbii.>Ejje!3U;G]]3 $)ELL,?GRYYuEUEjj![^c!cejkG]]3jj299U3C!CUKG jj299U+;!;UCG}}S!wzz'//2H ''b'8DkG%%h/(8'94GHMM  *  NN!!(+rq   c                    |j                  d      rt        |j                  d      dd       nd}t        |j                  d            }t        j                  ||      |_        d}|S )z#Parse tag pattern from regex match.tag_nsNr"  tag_nameT)r   r|   r   SelectorTagr   )r   r   r   r0  prefixr   s         ro   parse_tag_patternzCSSParser.parse_tag_pattern  s\     :;9Jaggh/45PT177:./..f-rq   c                   t        j                  t        |j                  d                  }| j                  j                  |      }|;t        d| d|j                  d       | j                  |j                  d            t        |t        j                        sR| j                  |= t        || j                  | j                        j                  t              }|| j                  |<   | xj                   |j                   z  c_        | j#                          |j$                  j'                  |       d}|S )z
        Parse custom pseudo class alias.

        Compile custom selectors as we need them. When compiling a custom selector,
        set it to `None` in the dictionary so we can avoid an infinite loop.
        r   zUndefined custom selector 'z' found at position r   rd   r   T)r   rx   r|   r   re   r   r	   endrl   r  r   r   rj   rf   rk   
FLG_PSEUDOr  r  r   r   )r   r   r   r0  r   r   s         ro   parse_pseudo_class_customz#CSSParser.parse_pseudo_class_custom  s    L9:;;??6*%-fX5I!%%PQ(Ta  (BOO4F# DJJj1  #+DKK

hnn$
X&rq   c                   d}t        j                  t        |j                  d                  }|j                  d      rd}|r0|t        v r(| j                  |||||j                  d            }||fS |s>|t        v r5|dk(  r%|xj                  t        j                  z  c_        n|dk(  r'|xj                  t        j                  z  c_        d}n|dk(  r%|xj                  t        j                  z  c_        n|d	k(  r%|xj                  t        j                  z  c_        n|| j                  v r[| j                  |   }| xj                  |j                  z  c_        | j!                          |j"                  j%                  |       n|d
k(  rG|j&                  j%                  t        j(                  dddddt        j*                                      n|dk(  rG|j&                  j%                  t        j(                  dddddt        j*                                      n|dk(  rG|j&                  j%                  t        j(                  dddddt        j*                                      n8|dk(  rF|j&                  j%                  t        j(                  dddddt        j*                                      n|dk(  rr|j&                  j-                  t        j(                  dddddt        j*                               t        j(                  dddddt        j*                               g       nv|dk(  rq|j&                  j-                  t        j(                  dddddt        j*                               t        j(                  dddddt        j*                               g       d}||fS |rB|t.        v r:| j1                  ||j                  d      t2        t4        z         d|_        d}||fS |s|t8        v rd|_        d}||fS |t:        v r*t=        d| d| j>                  |jA                  d            t=        d| d| j>                  |jA                  d            )zParse pseudo class.Fr   openTr   r   r   r   r   r#   r   r    r'   r$   r!   r%   z!Invalid syntax for pseudo class 'r(  z' was detected as a pseudo-class and is either unsupported or invalid. If the syntax was not intended to be recognized as a pseudo-class, please escape the colon.)!r   rx   r|   r   PSEUDO_COMPLEXparse_pseudo_openrB  PSEUDO_SIMPLErf   r   SEL_ROOTSEL_DEFINED	SEL_SCOPE	SEL_EMPTYPSEUDO_SELECTORSr  r  r   r   r   SelectorNthr   r   PSEUDO_COMPLEX_NO_MATCHparse_selectorsrC  FLG_OPENr   PSEUDO_SIMPLE_NO_MATCHPSEUDO_SUPPORTEDr	   rl   start)	r   r   r   r0  	iselectoris_htmlcomplex_pseudor   pseudo_selectors	            ro   parse_pseudo_classzCSSParser.parse_pseudo_class,  s    L9:776?!Nf611#v|YXYX]X]^_X`aLx W$$w  Fm$; 		R[[(	:%		R^^+	8#		R\\)	8#		R\\)	4000"&"7"7"?

o333
  "$$_5>)r~~a5%IZ[\=(r~~a5$HYZ[++r~~a4HYZ[?*r~~a4rGXYZ=(q%E5"//BSTq%E4ARS ?*q%D%ARSq%D$@QR  L, W$$+ *A A  AEE!Hj86KLCLL$ W$$#  F.D$DCLL W$$ ''%3F81=
  &F8 n n
	 rq   c                X   |j                         }|j                  d      rd}nd}t        j                  t	        |d               |d<   t        j                  |j                  d|z               }|dk(  rd}d}	d	}
n|d
k(  rd}d}	d	}
nt        t        t           t        j                  |            }|j                  d      r|j                  d      dk(  rdnd}|j                  d      }|j                  d      }
|j                  d      r|dz  }n|
r	||dd z  }n||z  }|j                  d      r|j                  d      dk(  rdnd}|j                  d      r||j                  d      z  }nd}t        |d      }t        |d      }	|d   }|dk(  r|j                  d      r.| j                  ||j                  d      t         t"        z        }n>| j$                  d   }| xj&                  |j&                  z  c_        | j)                          |dk(  r7|j*                  j-                  t/        j0                  ||
|	dd|             d	}|S |dk(  r3|j*                  j-                  t/        j0                  ||
|	dd	|             d	}|S |dk(  rI|j*                  j-                  t/        j0                  ||
|	d	dt/        j2                                      d	}|S |dk(  rE|j*                  j-                  t/        j0                  ||
|	d	d	t/        j2                                      d	}|S )zParse `nth` pseudo.r  _child_typer   r   evenrZ   r   Toddr   s1r   r   an1Nr"  s2b0
   ofr  rM   FrO   rN   rP   )	groupdictr   r   rx   r|   r   r
   r   RE_NTHrz   r   endswithr,  r   rQ  rB  rC  rR  rN  r  r  r   r   r   rO  r   )r   r   r   r0  rV  mdictpostfixr   r`  rd  var	nth_parts_s1ra  _s2
pseudo_selnth_sels                    ro   parse_pseudo_nthzCSSParser.parse_pseudo_nthy  s    99'(GG

<f#>?f**UYYuw78fBBCBBCU3Zg)>?I".9??43HC3O#UWC$A**S/C||C s
q"vq".9??43HC3O#UWCs#ys++S"BS"B6]
hwwt}..y!%%(JQYDYZ //=

gmm+
  "\)r~~b#r5%QR  00r~~b#r5$PQ  ^+r~~b#r4HYZ[  22r~~b#r4rGXYZrq   c                    t         t        z  }|dk(  r
|t        z  }n|dk(  r
|t        z  }n|dv r	|t        z  }|j
                  j                  | j                  |||             d}|S )z"Parse pseudo with opening bracket.rE   rD   )rF   rC   T)rC  rR  FLG_NOTFLG_RELATIVEFLG_FORGIVEr   r   rQ  )r   r   r   r0  rV  r   rf   s          ro   rH  zCSSParser.parse_pseudo_open  so     X%6>WEV^\!E&&[ ET11)UEJKrq   c                   |j                  d      j                         }|st        }|t        k(  rH||_        |d   j
                  j                  |       dt        z   }|j                  t                      nS|r&||_        |d   j
                  j                  |       n&|dd t        k7  rt        d| | j                  |      d|z   }t               }d}|||fS )Parse combinator tokens.relationr"  rU   r   Nz%The multiple combinators at position F)
r   stripWS_COMBINATORCOMMA_COMBINATORr   r   r   r   r	   rl   )r   r   r   r0  r   r   r   
combinators           ro   parse_has_combinatorzCSSParser.parse_has_combinator  s     WWZ(..0
&J))#CLbM##**3/]*HY[)'"''..s3!". *;E7CLL  Z'HkS(**rq   c	                L   |j                  d      j                         }	|	st        }	|sP|r	|	t        k7  rt	        d|	 d| d| j
                  |      |	t        k(  rd|_        |dd= |j                  |       n|	t        k(  r[|j                  s|st        j                  dd      |_        |j                  j                  |       |j                  |       |dd= n8|j                  j                  |       |	|_        |dd= |j                  |       t               }d}||fS )	rz  r{  zThe combinator 'z' at position z , must have a selector before itTNrS   F)r   r|  r}  r~  r	   rl   r   r   r   r   r>  r   r   r   r   )
r   r   r   r0  r   r   	is_pseudo
is_forgiver   r  s
             ro   parse_combinatorzCSSParser.parse_combinator  s    WWZ(..0
&J/?!?)&zl.GghLL  --#aL  %--wwy nnS$7CG$$Y/  %aL$$Y/)aL  %kS  rq   c                    |j                  d      }|j                  d      r+|j                  j                  t	        |dd              d}|S |j
                  j                  t	        |dd              d}|S )zParse HTML classes and ids.r   .r   NT)r   r,  r   r   r|   r   )r   r   r   r0  r   s        ro   parse_class_idzCSSParser.parse_class_id.  sq     771:s#KK|HQRL9:  GGNN<56rq   c                6   t        j                  t        |j                  d                  }|dk(  rt	        j
                  dt               |dk(  }t        |j                  d            }g }t        j                  |      D ]b  }|j                  d      r|j                  d      }	|	j                  d      rt        |	d	d
 d      }	nt        |	      }	|j                  |	       d |j                  j                  t        j                  ||             d}|S )zParse contains.r   rG   z\The pseudo class ':contains' is deprecated, ':-soup-contains' should be used moving forward.rI   valuessplitr~   )r(  r'  r   r"  T)r   rx   r|   r   warningswarnFutureWarning	RE_VALUESfinditerr,  r   r   r   SelectorContains)
r   r   r   r0  r   contains_ownr  r   tokenr~   s
             ro   parse_pseudo_containszCSSParser.parse_pseudo_contains9  s     L9:[ MMn !66aggh/0''/ 	#E{{7#KK(E
+$U1R[$7$U+OOE"	# 	B//,GHrq   c                   |j                  d      }g }t        j                  |      D ]b  }|j                  d      r|j                  d      }|j                  d      rt	        |dd d      }nt	        |      }|j                  |       d |j                  j                  t        j                  |             d}|S )zParse pseudo language.r  r  r~   r&  r   r"  T)	r   r  r  r,  r|   r   r   r   SelectorLang)r   r   r   r0  r  r   r  r~   s           ro   parse_pseudo_langzCSSParser.parse_pseudo_langR  s     "''/ 		#E{{7#KK(E
+$U1R[$7$U+OOE"		# 	12rq   c                    t        j                  |j                  d            dk(  rt        j                  nt        j
                  }|xj                  |z  c_        d}|S )zParse pseudo direction.dirltrT)r   rx   r   r   SEL_DIR_LTRSEL_DIR_RTLrf   )r   r   r   r0  r~   s        ro   parse_pseudo_dirzCSSParser.parse_pseudo_dirg  sD     #'**QWWU^"<"E2>>		U	rq   c           
        t               }g }d}d}g }dt        z   }	| j                  }
t        |t        z        }t        |t
        z        }t        |t        z        }t        |t        z        }t        |t        z        }t        |t        z        }t        |t        z        }t        |t        z        }t        |t        z        }t        |t        z        }t        |t        z        }| j                  r|rt!        d       |rt!        d       |rt!        d       |rt!        d       |rt!        d       |rt!        d       |rt!        d	       |rt!        d
       |rt!        d       |rt!        d       |rt!        d       |r|j#                  t                      	 	 t%        |      \  }}|dvr%| xj                  dz  c_        | j'                          |dk(  rt)        d|j+                  d             |dk(  r'|xj,                  t.        j0                  z  c_        d}n|dk(  r| j3                  |||      }n|dk(  r| j5                  |||||      \  }}n|dk(  rt)        d|j+                  d             |dk(  r| j7                  |||      }n|dv r| j9                  ||||      }n~|dk(  r| j;                  |||      }nd|dk(  r| j=                  |||      }d}nH|dk(  r|sA|s8t?        d|j+                  d       | j@                  |j+                  d            d|_!        |rd}nt?        d|j+                  d       | j@                  |j+                  d            |d k(  r9|r| jE                  |||||	|      \  }}}	n| jG                  ||||||||      \  }}n|d!k(  r| jI                  |||      }nk|d"k(  rO|r9t?        d#|j+                  d       d$| j@                  |j+                  d            | jK                  |||      }n|d%v r| jM                  |||      }|jO                  d      }	 |r|st?        d&| | j@                  |      |r|jR                  s|st/        jT                  d'd(      |_)        |r&|	|_+        |d)   jX                  j#                  |       nW|jX                  j[                  |       |d(d(= |j#                  |       n%|r#|r|sd|_!        |d(d(= |j#                  |       d}|st?        d| | j@                  |      |rt.        j\                  |d)   _        |rt.        j^                  |d)   _        |rt.        j`                  |d)   _        |rt.        jb                  |d)   _        |rt.        jd                  |d)   _        t/        jf                  |D cg c]  }|ji                          c}||| j                  |
z
        S # tP        $ r Y w xY wc c}w )*zParse selectors.FrU   z    is_pseudo: Truez    is_open: Truez    is_relative: Truez    is_not: Truez    is_html: Truez    is_default: Truez    is_indeterminate: Truez    is_in_range: Truez    is_out_of_range: Truez    is_placeholder_shown: Truez    is_forgive: TrueT)r  r  r   r  zAt-rules found at position r   r  r  r  r  z!Pseudo-element found at position r  )r  r  r	  r
  r  z Expected a selector at position z)Unmatched pseudo-class close at position r  r  r   zTag name found at position z instead of at the start)r  r  z"Unclosed pseudo-class at position rS   Nr"  )5r   r}  r  boolrR  rC  rw  rv  FLG_HTMLFLG_DEFAULTFLG_INDETERMINATEFLG_IN_RANGEFLG_OUT_OF_RANGEFLG_PLACEHOLDER_SHOWNrx  r  printr   nextr  NotImplementedErrorrU  rf   r   rL  rD  rZ  r  rt  r  r  r	   rl   r   r  r  r:  r@  r  rB  StopIterationr   r>  r   r   r   SEL_DEFAULTSEL_INDETERMINATESEL_IN_RANGESEL_OUT_OF_RANGESEL_PLACEHOLDER_SHOWNr   r   )r   rV  r   rf   r   r   r0  closedr   r   r  is_openr  is_relativeis_notrW  
is_defaultis_indeterminateis_in_rangeis_out_of_rangeis_placeholder_shownr  r}   r   ss                            ro   rQ  zCSSParser.parse_selectorso  s    k		&

 ux'(+,	5</0ego&ux'(%+-.
(9 9:5</0u'778#E,A$AB%+-.
 ::+,)*-.())*,-23-.12#67,- Y[)H	iQ99JJ!OJ$$& )#-0KAGGTUJ<.XYYE\II-I#'L11#'#A#A#q,#WLN*,0,C,CCLZcel,m)L',,-0QRSRYRYZ[R\Q].^__--#'#=#=c1l#SLCC#'#8#8ay#YLM)#'#9#9#q,#OLL(#'#8#8a#NL"GN*')"5"B1771:, O $ !
# 
 (,!%1GPQ
|T LLGGAJ 
 I%"6:6O6OL)Xu73c8 -1,A,AL)Y	S]_d-)c K'#'#@#@a#VLE\#19!''!*E]^ LLGGAJ 
 $(#9#9#q,#OLO+#'#6#6sA|#LLaK P D 6%4UG<  779..d3'"''..s3$$Y/aL  % )CL!S!L &25':  "$..IbM"$"6"6IbM"$//IbM"$"5"5IbM"$":":IbM I>q
>QUQ[Q[^cQcddq  		p  ?s   %J&W3 X3	X ?X c              #  2  K   t         j                  |      }|r|j                  d      nd}t        j                  |ddd         }|r|j                  d      nd}t	        |      d|z   z
  }| j
                  rt        d|       ||k  rd}| j                  D ]  }|j                  ||| j                        }|s#|j                         }| j
                  r2t        d| d|j                  d      d|j                  d              |j                  d      }||f  n |P||   }|d	k(  rd
| }	n)|dk(  rd| }	n|dk(  rd| }	n|dk(  rd| }	nd|d| }	t        |	| j                  |      ||k  r| j
                  rt        d       yyw)zIterate selector tokens.r   Nr"  r   z## PARSING: zTOKEN: 'z' --> z at position [z)Malformed attribute selector at position r  z%Malformed class selector at position #z"Malformed id selector at position rU   z,Malformed pseudo-class selector at position zInvalid character z
 position z## END PARSING)RE_WS_BEGINr.  rB  	RE_WS_ENDr   r  r  
CSS_TOKENSrz   rf   r   r   rU  r	   rl   )
r   rl   r   r   offsetrB  vr   r   msgs
             ro   selector_iterzCSSParser.selector_iter+  s     w'a1WTrT]+qA'la&j)::L,-slA__ GGGUDJJ7::<DzzfQWWQZN-PQPWPWXYPZ|\]EE!HE'M yEN 8EeWMC#XA%IC#X>ugFC#XHPC.qe:eWEC)#t||UCC5 sl6 ::"# s   B;F>B?F>Fc                Z    | j                  | j                  | j                        ||      S )zProcess selectors.)rQ  r  rl   )r   r   rf   s      ro   rk   zCSSParser.process_selectorsU  s(     ##D$6$6t||$DeUSSrq   )Nr   )r   r   re   z'dict[str, str | ct.SelectorList] | Nonerf   r   r   r   r   r   )r   r   r   r   r0  r  r   r  )r   r   r   r   r0  r  rV   Iterator[tuple[str, Match[str]]]rW  r  r   ztuple[bool, bool])
r   r   r   r   r0  r  rV  r  r   r  )r   r   r   r   r0  r  rV  r  r   r   r   r  )r   r   r   r   r0  r  r   r   r   r   r   r   r   ztuple[bool, _Selector, str])r   r   r   r   r0  r  r   r   r   r   r  r  r  r  r   r   r   ztuple[bool, _Selector])r   r   )rV  r  r   r   rf   r   r   r   )rl   r   r   r  )r   r   rf   r   r   r   ):r   r   r   r   r   PAT_PSEUDO_CLOSEr   PAT_PSEUDO_CONTAINSPAT_PSEUDO_NTH_CHILDPAT_PSEUDO_NTH_TYPEPAT_PSEUDO_LANGPAT_PSEUDO_DIRPAT_PSEUDO_CLASS_CUSTOMPAT_PSEUDO_CLASSPAT_PSEUDO_ELEMENTPAT_AMPPAT_AT_RULEPAT_ID	PAT_CLASSPAT_TAGPAT_ATTRPAT_COMBINEr  r   CSS_LINKCSS_CHECKEDCSS_DEFAULTCSS_INDETERMINATECSS_DISABLEDCSS_ENABLEDCSS_REQUIRED	CSS_MUTEDCSS_OPENCSS_OPTIONALCSS_READ_ONLYCSS_READ_WRITECSS_IN_RANGECSS_OUT_OF_RANGECSS_PLACEHOLDER_SHOWNCSS_NTH_OF_S_DEFAULTrN  r   r  r:  r@  rD  rZ  rt  rH  r  r  r  r  r  r  rQ  r  rk   rt   rq   ro   rj   rj   o  s    	(89 &K'#	 $%FH\^mn"$IK^`op
O_My./J	
 	-/FG(89(*<=w'	;/f%+w'X.	;/3J: )	
X	
	
 	
 		

 /	
 	
 	
 	
 i	
 X	
 	
 -	
 >	
 	
 -	
  !"7!	
" .#	
2 ;?	 8 	
 
aIV>K%K% K% 	K%
 4K% K% 
K%ZAA A 	A
 4A 
AF  	
 4  
.)+)+ )+ 	)+
 #)+ )+ )+ 
%)+V.!.! .! 	.!
 #.! #.! .! .! .! 
 .!`	2* 	ze3ze ze 	ze
 
zex($TTrq   rj   )
rl   r   rm   zct.Namespaces | Nonere   ct.CustomSelectors | Nonerf   r   r   zcm.SoupSiever  )re   r  r   z dict[str, str | ct.SelectorList])F)r   r   r   r  r   r   )r   r   r   r   )wr   
__future__r   r   	functoolsr   r   r   r   rh   r   r   r	   r  typingr
   r   r   r   dataclassesr   collectionsr   	threadingLockr   RLockr  r   r  rI  rS  rG  rP  PSEUDO_SPECIALrT  NEWLINEWSCOMMENTSWSCCSS_ESCAPESCSS_STRING_ESCAPES
IDENTIFIERNTHVALUEATTRr  r  r  r  r  PAT_PSEUDO_CLASS_SPECIALr  r  r  r  r  r  r  r  r  r  r  r   r   r   r   rj  r   r  r-  r  r  ry   r   r   r~  r}  rC  rv  rw  r  r  r  rR  r  r  r  rx  	_MAXCACHErp   ru   rg   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  rj   rt   rq   ro   <module>r     s
    " 	     %  - - !   
)..
9??! < 8	  !#99NJMddguu  ''!)	RD(1(O</t>'"M ;;F- H88C} E

 
*#iuMJG9$B7)K^_i^jjkn
cU&se;ugT#FYZ]Y^^_` zl	*	J<'=j\
N%j\1HTUVZU[[]^ LSA (LRH -j\; 
e3< *+, J< ./ 0e>#k(1RDS
RSTVSWX[W\ ] 
-. /U+cU # 
 //{5'SEC5PQRWQXX[\_[``cd-..>se3G,RDC5B23;ugSRPSuTUV[U\\_`c_ddgh  RZZ05LMrttT
4RD8RSZR[[]^`b`d`de	>se=QTPUUefhjhlhl	mBJJ-wl3%r#cJBDDQ	

2bjjAcU!%BJJ>xjKL	BJJ!34A6=	$"**%=rttbdd{RTT?QR    

    	 9$ & 	
  ,&P686 6<!? !HA AH   j2??&B!BC * 0*x2GH 	  K' 
 --   	  	 H*W_J_`NPZ]ePef" 11 $ , /4 4j86KL L($  ,, $ 8*x:OP7h9NO	!%4 iT iTrq   