U
    ~fhw                     @  s  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Zddddddddddddddddddddd d!d"d#d$d%hZd&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=hZd>d?d@dAdBdCdDdEhZd)d/dFhZdGdHdIdJdKdLhZeeB eB eB eB ZdMZdNe dOZdPZdQe dRe dOZdSe dTZdSe dUe dVZdWe dXe dYZ dZe d[e d\Z!d]e d^e d_e  d`Z"dQe dae dbe" dce dde deZ#dfe  Z$dge  Z%dhe  die  djZ&dke dle  dme  dOe# Z'dne  doe dpZ(dne  doe dqZ)dre  dOZ*dsZ+e dtZ,due( Z-dve  Z.dwe) dxe! dye dze d{e e d|e d{e e d}Z/d~e) de! de dZ0e) de" dQe de d{e" de dtZ1e) de dtZ2e de de d{Z3e) de" dQe de d{e" de dtZ4e5de dej6Z7e5de de dVej6Z8e5de de dej6Z9e5de" de de dej:Z;e5eZ<e5de d{Z=e5e dZ>e5de* dej:Z?dZ@dZAdZBdZCdZDdZEdZFdZGdZHdZIdZJdZKdZLdZMeeMdddddddddZNddddZOdddddZPdddddddZQdddddZRG dd dZSG dd deSZTG dd dZUG dd dZVeVdjWeBeFB dÍZXeVdăjWeBeFB dÍZYeVdŃjWeBeFB eEB dÍZZeVdƃjWeBeFB eGB dÍZ[eVdǃjWeBeFB dÍZ\eVdȃjWeBeFB dÍZ]eVdɃjWeBeFB dÍZ^eVdʃjWeBeFB dÍZ_eVd˃jWeBeFB eKB dÍZ`eVd̃jWeBdÍZaeVd̓jWeBeFB dÍZbeVd΃jWeBeFB dÍZceVdσjWeBeIB eFB dÍZdeVdσjWeBeJB eFB dÍZeeVdЃjWeBeFB dÍZfeVdуjWeBeFB dÍZgdS )zCSS selector parser.    )annotationsN)	lru_cache   )util)	css_match)	css_types)SelectorSyntaxError)MatchAnyIteratorcasti  	:any-link:empty:first-child:first-of-type	:in-range:open:out-of-range:last-child:last-of-type:link:only-child:only-of-type:root:checked:default	:disabled:enabled:indeterminate	:optional:placeholder-shown
:read-only:read-write	:required:scope:defined:mutedz:activez	:autofillz
:bufferingz:currentz:focusz:focus-visiblez:focus-withinz:fullscreenz:futurez:hostz:hoverz:local-linkz:pastz:pausedz:picture-in-picturez:playingz:popover-openz:seekingz:stalledz:targetz:target-withinz:user-invalidz:volume-lockedz:visited	:contains:-soup-contains:-soup-contains-own:has:isz:matches:not:wherez:host-context:dir:lang
:nth-child:nth-last-child:nth-last-of-type:nth-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))z8
(?:(?:-?(?:[^\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+)z*(?P<cmp>[!~^|*$]?=)z*(?P<value>z)(?:z*(?P<case>[is]))?)?z*\]z\#z\.z(?P<tag_ns>(?:z|\*)?\|)?(?P<tag_name>z|\*)z\[z*(?P<attr_ns>(?:z|\*)?\|)?(?P<attr_name>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*$$,                 @         i   i   i  )maxsizestrzct.Namespaces | Nonezct.CustomSelectors | Noneintzcm.SoupSieve)pattern
namespacescustomflagsreturnc                 C  s(   t |}t| t| ||d |||S )zCached CSS compile.rJ   rK   )process_customcmZ	SoupSieve	CSSParserprocess_selectors)rH   rI   rJ   rK   custom_selectors rS   8/tmp/pip-unpacked-wheel-f1_lti45/soupsieve/css_parser.py_cached_css_compile   s    	rU   NonerL   c                   C  s   t   dS )zPurge the cache.N)rU   cache_clearrS   rS   rS   rT   _purge_cache   s    rY   z dict[str, str | ct.SelectorList])rJ   rL   c                 C  sn   i }| dk	rj|   D ]T\}}t|}t|dkrDtd| d||kr\td| d||t|< q|S )zProcess custom.Nz
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)rJ   rR   keyvaluenamerS   rS   rT   rN      s    
rN   Fbool)contentstringrL   c                 C  s$   ddddd}|st nt|| S )zs
    Unescape CSS value.

    Strings allow for spanning the value on multiple strings by escaping a new line.
    
Match[str]rF   )mrL   c                 S  sn   |  dr8t|  ddd d}|dkr.t}t|}n2|  drV|  ddd }n|  drfd}nd}|S )	z(Replace with the appropriate substitute.r   Nr@   r   r=         � )grouprG   UNICODE_REPLACEMENT_CHARchr)rg   	codepointra   rS   rS   rT   replace   s    



zcss_unescape.<locals>.replace)
RE_CSS_ESCRE_CSS_STR_ESCsub)rd   re   ro   rS   rS   rT   r_      s    r_   )identrL   c                 C  s  g }t | }|dko| d dk}|dkr@|r@|d|   n@t| D ]4\}}t|}|dkrn|d qHd|  krdksn |dkr|d|dd	 qH|dks|r|dkrd
|  krdkrn n|d|dd	 qH|dksb|dksbd
|  krdksbn d
|  kr*dksbn d|  krDdksbn d|  kr^dkrnn n|| qH|d|  qHd|S )zEscape identifier.r   -r   \ri         xr<   0   9   )-   _   rC   A   Z   a   z   rj   )lenappend	enumerateordjoin)rs   re   lengthZ
start_dashindexcrn   rS   rS   rT   escape  sP    , 

 

 

 
r   c                   @  sD   e Zd ZdZddddddZdddd	Zdd
d
ddddZdS )SelectorPatternSelector pattern.rF   rV   )rb   rH   rL   c                 C  s&   || _ t|tjtjB tjB | _dS )Initialize.N)rb   recompileIXU
re_pattern)selfrb   rH   rS   rS   rT   __init__2  s    zSelectorPattern.__init__rW   c                 C  s   | j S )	Get name.)rb   r   rS   rS   rT   get_name8  s    zSelectorPattern.get_namerG   Match[str] | Noneselectorr   rK   rL   c                 C  s   | j ||S )Match the selector.)r   r]   )r   r   r   rK   rS   rS   rT   r]   =  s    zSelectorPattern.matchN__name__
__module____qualname____doc__r   r   r]   rS   rS   rS   rT   r   /  s   r   c                   @  sB   e Zd ZdZdddddZddd	d
ZdddddddZdS )SpecialPseudoPatternr   zCtuple[tuple[str, tuple[str, ...], str, type[SelectorPattern]], ...]rV   )patternsrL   c                 C  sh   i | _ |D ]6}|d }|d ||d }|d D ]}|| j |< q0q
d| _tttjtjB tjB | _dS )r   r   rh   r=   r   N)	r   matched_namer   r   PAT_PSEUDO_CLASS_SPECIALr   r   r   re_pseudo_name)r   r   prb   rH   pseudorS   rS   rT   r   F  s    zSpecialPseudoPattern.__init__rF   rW   c                 C  s   | j dkrdS | j  S )r   Nrj   )r   r   r   rS   rS   rT   r   S  s    zSpecialPseudoPattern.get_namerG   r   r   c                 C  sV   d}| j ||}|rRtt|d}| j|}|rR||||}|rR|| _|S )r   Nrb   )	r   r]   r   r[   r_   rk   r   getr   )r   r   r   rK   r   rg   rb   rH   rS   rS   rT   r]   X  s    zSpecialPseudoPattern.matchNr   rS   rS   rS   rT   r   C  s   r   c                   @  sP   e Zd ZdZdddddZddd	d
dZddddZddddZeZdS )	_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.
    r
   rV   )kwargsrL   c                 K  s   | dd| _| dg | _| dg | _| dg | _| dg | _| dg | _| dg | _| d	d| _| d
g | _	| dg | _
| dd| _| dd| _dS )r   tagNidsclasses
attributesnth	selectors	relationsrel_typecontainslangrK   r   no_matchF)r   r   r   r   r   r   r   r   r   r   r   rK   r   )r   r   rS   rS   rT   r   q  s    z_Selector.__init__list[_Selector]ct.SelectorList)r   rL   c                 C  s<   |r0|d }|j |dd  t| gS t S dS )zFreeze relation.r   r   N)r   extendctSelectorListfreeze)r   r   selrS   rS   rT   _freeze_relations  s
    z_Selector._freeze_relationszct.Selector | ct.SelectorNullrW   c                 C  sh   | j rt S t| jt| jt| jt| jt| j	t| j
| | j| jt| jt| j| jS dS )zFreeze self.N)r   r   ZSelectorNullZSelectorr   tupler   r   r   r   r   r   r   r   r   r   rK   r   rS   rS   rT   r     s    
z_Selector.freezerF   c                 C  sf   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=r4   )r   r   r   r   r   r   r   r   r   r   rK   r   r   rS   rS   rT   __str__  s    dz_Selector.__str__N)	r   r   r   r   r   r   r   r   __repr__rS   rS   rS   rT   r   h  s   

r   c                   @  s  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dPdddddddZd d!d"d"d#d$d%Zd d!d"d"d#d&d'Zd d!d"d"d#d(d)Zd d!d"d*d"d+d,d-d.Zd d!d"d*d"d/d0d1Zd dd"d*dd"d2d3d4Zd d!d"d5ddd6d7d8d9Zd d!d"d5d5d"d"dd:d;	d<d=Zd d!d"d"d#d>d?Z d d!d"d"d#d@dAZ!d d!d"d"d#dBdCZ"d d!d"d"d#dDdEZ#dQd*dddFdGdHdIZ$dd*dJdKdLZ%dRdddFdMdNdOZ&dS )SrP   zParse CSS selectors.pseudo_closepseudo_contains)r'   r(   r)   pseudo_nth_child)r0   r1   pseudo_nth_type)r3   r2   pseudo_lang)r/   
pseudo_dir)r.   pseudo_class_custompseudo_classpseudo_elementampat_ruleidclassr   	attributecombineNr   rF   z'dict[str, str | ct.SelectorList] | NonerG   rV   )r   rJ   rK   rL   c                 C  s8   | dd| _|| _| jtj@ | _|dkr.i n|| _dS )r    ri   N)ro   rH   rK   r   DEBUGdebugrJ   )r   r   rJ   rK   rS   rS   rT   r     s    zCSSParser.__init__r   rf   rc   )r   rg   has_selectorrL   c                 C  s^  d}| d}| dr(t| dnd}| drLt| ddd nd}t| d}d}	d}
d}|r|d	kr|tjnd
tjB }n&t|dkrtjtjB }d}	ntj}|r| ddrt| ddd d}nt| d}|sd}n|drtdt	| |}n|dr<tdt	| |}n|dr`tdt	| |}n|dr|r~t
|rdnt	|}td| |}nJ|drtdt	| |}n&tdt	| |}|drd}|	r |r t|j}
t||||
}|rJt }|j| t| gdd}|j| n|j| d}|S )z8Create attribute selector from the returned regex match.FcmpcaseNZattr_nsrj   	attr_nameir   typeTra   "'r   r9   z^%s.*r:   z.*?%s$r8   z.*?%s.*~z[^\s\S]z7.*?(?:(?<=^)|(?<=[ \t\r\n\f]))%s(?=(?:[ \t\r\n\f]|$)).*r5   z^%s(?:-.*)?$z^%s$!)rk   r   r[   r_   r   r   DOTALL
startswithr   r   RE_WSsearchrH   r   ZSelectorAttributer   r   r   r   r   r   )r   r   rg   r   Zinverseopr   nsattrZis_typeZpattern2ra   rK   rH   Zsel_attrZsub_selZnot_listrS   rS   rT   parse_attribute_selector  sZ    
$ z"CSSParser.parse_attribute_selectorc                 C  sH   | dr t| ddd nd}t| d}t|||_d}|S )z#Parse tag pattern from regex match.Ztag_nsNr   Ztag_nameT)rk   r_   r   SelectorTagr   )r   r   rg   r   prefixr   rS   rS   rT   parse_tag_pattern  s
    $zCSSParser.parse_tag_patternc                 C  s   t t|d}| j|}|dkrNtd| d|d | j|dt	|t
js| j|= t|| j| jdjtd}|| 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.
        rb   NzUndefined custom selector 'z' found at position r   rM   rK   T)r   r[   r_   rk   rJ   r   r   endrH   
isinstancer   r   rP   rK   rQ   
FLG_PSEUDOr   r   )r   r   rg   r   r   r   rS   rS   rT   parse_pseudo_class_custom'  s*      
z#CSSParser.parse_pseudo_class_customz Iterator[tuple[str, Match[str]]]ztuple[bool, bool])r   rg   r   	iselectoris_htmlrL   c                 C  s0  d}t t|d}|dr&d}|rN|tkrN| |||||d}n|s|tkr|dkrz| jt	j
O  _n|dkr| jt	jO  _d}n|dkr| jt	jO  _n|d	kr| jt	jO  _n|d
kr|jt n|dkr|jt n|dkr|jt np|dkr8|jt nV|dkrR|jt n<|dkrl|jt n"|dkr|jt n|dkr|jt n|dkr|jt n|dkr|jt n|dkr|jt n|dkr|jt n|dkr"|jt nl|dkr<|jt nR|dkrV|jt n8|dkr|jt	 dddddt	!  n
|dkr|jt	 dddddt	!  n|dkr|jt	 dddddt	!  n|dkr|jt	 dddddt	!  n|dkrL|j"t	 dddddt	! t	 dddddt	! g nB|dkr|j"t	 dddddt	! t	 dddddt	! g d}n|r|t#kr| $||dt%t&B  d|_'d}n`|s|t(krd|_'d}nD|t)krt*d | d!| j+|,dnt*d!| d"| j+|,d||fS )#zParse pseudo class.Frb   openTr   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   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   r[   r_   rk   PSEUDO_COMPLEXparse_pseudo_openr   PSEUDO_SIMPLErK   r   ZSEL_ROOTZSEL_DEFINED	SEL_SCOPEZ	SEL_EMPTYr   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_SHOWNr   SelectorNthr   r   PSEUDO_COMPLEX_NO_MATCHparse_selectorsr   FLG_OPENr   PSEUDO_SIMPLE_NO_MATCHPSEUDO_SUPPORTEDr   rH   start)r   r   rg   r   r   r   Zcomplex_pseudor   rS   rS   rT   parse_pseudo_classC  s    
















$
"
"
"




zCSSParser.parse_pseudo_class)r   rg   r   r   rL   c                 C  s.  |  }|drd}nd}tt|d |d< t|d| }|dkr\d}d}	d	}
n|d
krrd}d}	d	}
nttt t	|}|
dr|
ddkrdnd}|
d}|d}
|dr|d7 }n|
r||dd 7 }n||7 }|
dr|
ddkrdnd}|
dr,||
d7 }nd}t|d}t|d}	|d }|dkr|
dr|| ||dttB }nt}|dkr|jt||
|	dd| n&|dkr&|jt||
|	dd	| nV|dkr|jt||
|	d	dt  n*|dkr&|jt||
|	d	d	t  d	}|S )zParse `nth` pseudo.r   Z_child_typerb   r   Zevenr=   r   TZoddr   s1rt   rj   an1Nr   s2b0
   Zofr0   Fr1   r3   r2   )	groupdictr   r   r[   r_   r   r	   rF   RE_NTHr]   rk   endswithr   rG   r  r   r   r  CSS_NTH_OF_S_DEFAULTr   r   r   r  r   )r   r   rg   r   r   ZmdictZpostfixrd   r  r  varZ	nth_partsZ_s1r  Z_s2Z
pseudo_selZnth_selrS   rS   rT   parse_pseudo_nth  sX    	
 



$





"
 zCSSParser.parse_pseudo_nth)r   rb   r   r   r   rL   c                 C  sZ   t tB }|dkr|tO }n"|dkr,|tO }n|dkr<|tO }|j| ||| d}|S )z"Parse pseudo with opening bracket.r,   r*   )r-   r+   T)r   r  FLG_NOTFLG_RELATIVEFLG_FORGIVEr   r   r  )r   r   rb   r   r   r   rK   rS   rS   rT   r     s    


zCSSParser.parse_pseudo_openr   ztuple[bool, _Selector, str])r   rg   r   r   r   r   rL   c                 C  s   | d }|st}|tkrJ||_|d j| dt }|t  nH|rf||_|d j| n$|dd tkrtd| | j	|d| }t }d}|||fS )Parse combinator tokens.relationr   r7   r   Nz%The multiple combinators at position F)
rk   stripWS_COMBINATORCOMMA_COMBINATORr   r   r   r   r   rH   )r   r   rg   r   r   r   r   
combinatorrS   rS   rT   parse_has_combinator  s*    zCSSParser.parse_has_combinatorztuple[bool, _Selector])	r   rg   r   r   r   	is_pseudo
is_forgiver   rL   c	           
      C  s   | d }	|	st}	|sf|r&|	tkrBtd|	 d| d| j||	tkrd|_|dd= || nh|	tkr|js|st	
dd|_|j| || |dd= n&|j| |	|_|dd= || t }d}||fS )	r  r   zThe combinator 'z' at position z , must have a selector before itTNr8   F)rk   r!  r"  r#  r   rH   r   r   r   r   r   r   r   r   r   )
r   r   rg   r   r   r   r&  r'  r   r$  rS   rS   rT   parse_combinator,  s6    




zCSSParser.parse_combinatorc                 C  sN   | d}|dr.|jt|dd  n|jt|dd  d}|S )zParse HTML classes and ids.r   .r   NT)rk   r   r   r   r_   r   )r   r   rg   r   r   rS   rS   rT   parse_class_id\  s    

zCSSParser.parse_class_idc           
      C  s   t t|d}|dkr(tdt |dk}t|d}g }t|D ]J}|dr\qL|d}	|		drt|	d	d
 d}	nt|	}	|
|	 qL|j
t|| d}|S )zParse contains.rb   r'   z\The pseudo class ':contains' is deprecated, ':-soup-contains' should be used moving forward.r)   valuessplitra   )r   r   r   r   T)r   r[   r_   rk   warningswarnFutureWarning	RE_VALUESfinditerr   r   r   r   ZSelectorContains)
r   r   rg   r   r   Zcontains_ownr+  r   tokenra   rS   rS   rT   parse_pseudo_containsg  s(    


zCSSParser.parse_pseudo_containsc                 C  s~   | d}g }t|D ]J}| dr(q| d}|drPt|dd d}nt|}|| q|jt| d}|S )zParse pseudo language.r+  r,  ra   r   r   r   T)	rk   r0  r1  r   r_   r   r   r   ZSelectorLang)r   r   rg   r   r+  r   r2  ra   rS   rS   rT   parse_pseudo_lang  s    



zCSSParser.parse_pseudo_langc                 C  s6   t |ddkrtjntj}| j|O  _d}|S )zParse pseudo direction.dirZltrT)r   r[   rk   r   ZSEL_DIR_LTRZSEL_DIR_RTLrK   )r   r   rg   r   ra   rS   rS   rT   parse_pseudo_dir  s     zCSSParser.parse_pseudo_dirr   )r   r   rK   rL   c              
   C  s  t  }g }d}d}g }dt }	t|t@ }
t|t@ }t|t@ }t|t@ }t|t@ }t|t@ }t|t	@ }t|t
@ }t|t@ }t|t@ }t|t@ }| jr6|rtd |
rtd |rtd |rtd |rtd |rtd |rtd	 |rtd
 |rtd |r(td |r6td |rH|t   zft|\}}|dkrztd|d n&|dkr| jtjO  _d}n|dkr| |||}n|dkr| |||||\}}n|dkrtd|d n|dkr| |||}n|dkr8| ||||}nh|dkrT| |||}nL|dkrt| |||}d}n,|dkr|s|std|d | j|dd|_|
rd}qn td|d | j|dn|dkr,|r|  |||||	|\}}}	n| !||||||||\}}nt|dkrF| "|||}nZ|d kr|rxtd!|d d"| j|d| #|||}n|d#kr| $|||}|%d}qLW n t&k
r   Y nX |
r|std$| | j||rJ|j's
|s
t(d%d&|_'|r(|	|_)|d' j*| n |j*+| |d&d&= || n0|rz|r\|szd|_|d&d&= || d}|std| | j||rtj,|d' _|rtj-|d' _|rtj.|d' _|rtj/|d' _|rtj0|d' _t1d(d) |D ||S )*zParse selectors.Fr7   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: Truer   zAt-rules found at position r   r   Tr   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 r8   Nr   c                 S  s   g | ]}|  qS rS   )r   ).0srS   rS   rT   
<listcomp>R  s     z-CSSParser.parse_selectors.<locals>.<listcomp>)2r   r"  rc   r  r   r  r  FLG_HTMLFLG_DEFAULTFLG_INDETERMINATEFLG_IN_RANGEFLG_OUT_OF_RANGEFLG_PLACEHOLDER_SHOWNr  r   printr   nextNotImplementedErrorr  rK   r   r   r   r  r3  r  r4  r6  r   rH   r   r%  r(  r   r   r*  r   StopIterationr   r   r   r   r   ZSEL_DEFAULTZSEL_INDETERMINATEZSEL_IN_RANGEZSEL_OUT_OF_RANGEZSEL_PLACEHOLDER_SHOWNr   )r   r   r   rK   r   r   r   closedr   r   Zis_openr&  Zis_relativeis_notr   Z
is_defaultZis_indeterminateZis_in_rangeZis_out_of_rangeZis_placeholder_shownr'  r`   rg   rS   rS   rT   r    s2   	










            






	zCSSParser.parse_selectors)rH   rL   c           	   
   c  sl  t |}|r|dnd}t|}|r8|dd n
t|d }| jrXtd| ||krXd}| jD ]d}|	||| j
}|rl| }| jrtd| d|dd|d  |d}||fV   qql|dkrX|| }|dkrd	| }nR|d
krd| }n<|dkr"d| }n&|dkr8d| }nd|d| }t|| j|qX| jrhtd dS )zIterate selector tokens.r   r   z## PARSING: NzTOKEN: 'z' --> z at position [z)Malformed attribute selector at position r)  z%Malformed class selector at position #z"Malformed id selector at position r7   z,Malformed pseudo-class selector at position zInvalid character z
 position z## END PARSING)RE_WS_BEGINr   r   	RE_WS_ENDr  r   r   r@  
css_tokensr]   rK   r   rk   r   rH   )	r   rH   rg   r   r   vrb   r   msgrS   rS   rT   selector_iterT  s>    



&




zCSSParser.selector_iter)r   rK   rL   c                 C  s   |  | | j||S )zProcess selectors.)r  rM  rH   )r   r   rK   rS   rS   rT   rQ   }  s    zCSSParser.process_selectors)Nr   )r   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_COMBINErJ  r   r   r   r   r  r  r   r%  r(  r*  r3  r4  r6  r  rM  rQ   rS   rS   rS   rT   rP     s\   



  F	fA+0   8)rP   zhtml|*:is(a, area)[href]r   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=''])
    z*|*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]
    )F)hr   
__future__r   r   	functoolsr   rj   r   r   rO   r   r   r   r-  typingr	   r
   r   r   rl   r   r	  r   r  ZPSEUDO_SPECIALr
  NEWLINEZWSZCOMMENTSZWSCZCSS_ESCAPESZCSS_STRING_ESCAPES
IDENTIFIERZNTHZVALUEZATTRrY  rZ  r[  r\  rU  r   rT  rW  rN  rV  rX  rP  rQ  rR  rS  r]  rO  r   r   rp   rq   r  r   r0  r   rH  rI  r\   r#  r"  r   r  r  r;  r:  r<  r  r=  r>  r?  r  	_MAXCACHErU   rY   rN   r_   r   r   r   r   rP   rQ   r   r   r   r   r   r   r   r   r  r  r  r   r  r  r   r   rS   rS   rS   rT   <module>   s  	$




(("
%D     `






