HEX
Server: LiteSpeed
System: Linux php-prod-1.spaceapp.ru 5.15.0-157-generic #167-Ubuntu SMP Wed Sep 17 21:35:53 UTC 2025 x86_64
User: sport3497 (1034)
PHP: 8.1.33
Disabled: NONE
Upload Files
File: //usr/local/CyberCP/lib64/python3.10/site-packages/soupsieve/__pycache__/css_match.cpython-310.pyc
o

�hz��@s�dZddlmZddlmZddlmZddlZddlmZddl	Z	ddl
Z
ddlmZm
Z
mZmZmZmZmZe�d	�Ze�d
�ZdZdZd
ZdZdZdZdZdZdZdZejej BZ!ej"ej#BZ$ejej dd�Z%e�d�Z&e�d�Z'e�d�Z(e�d�Z)e�d�Z*e�d�Z+e�d�Z,dZ-dZ.dZ/d Z0d!Z1d"Z2d#Z3Gd$d%�d%�Z4Gd&d'�d'�Z5Gd(d)�d)�Z6Gd*d+�d+e5�Z7Gd,d-�d-ej8�Z9e�:e9�dS).zCSS matcher.�)�annotations)�datetime�)�utilN)�	css_types)�Iterator�Iterable�Any�Callable�Sequencer	�castz[^ 	
]z	[^ 	
]+� �>�~�+z: z:>z:~z:+zhttp://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@s$eZdZdZddd�Zd
d	d
�ZdS)�_FakeParentz�
    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.
    �element�bs4.Tag�return�NonecCs|g|_dS)�Initialize.N)�contents)�selfr�r&�F/usr/local/CyberCP/lib/python3.10/site-packages/soupsieve/css_match.py�__init__D�z_FakeParent.__init__�intcCs
t|j�S)zLength.)�lenr$�r%r&r&r'�__len__I�
z_FakeParent.__len__N)rr r!r")r!r*)�__name__�
__module__�__qualname__�__doc__r(r-r&r&r&r'r;s
rc@s�eZdZdZedgdd��Zedhdd��Zedhd
d��Zedhdd��Z	edhdd��Z
edhdd��Zedhdd��Zedhdd��Z
edhdd��Zedidd��Zedjd!d"��Zdjd#d$�Zdkd%d&�Zdldmd*d+�Z	,	'	'dndod1d2�Z	,	'	'	'dpdqd4d5�Z	'dldrd6d7�Z	'	'dsdtd8d9�Zdldud:d;�Zedvd=d>��Zedwd?d@��ZedvdAdB��ZedxdCdD��ZedldydEdF��Zedzd{dHdI��ZedldydJdK��ZedjdLdM��Z ed|dQdR��Z!ed}dUdV��Z"e	,d~ddZd[��Z#ed�d]d^��Z$ed�d`da��Z%dld�dbdc�Z&dld�dedf�Z'd,S)��_DocumentNavz#Navigate a Beautiful Soup document.�tagr	r!r"cCs |�|�stdt|�����dS)z%Check if valid input tag or document.z:Expected a BeautifulSoup 'Tag', but instead received type N)�is_tag�	TypeError�type)�clsr4r&r&r'�assert_valid_inputRs
�z_DocumentNav.assert_valid_input�obj�bs4.element.PageElement | None�boolcC�t|tj�S)zIs `BeautifulSoup` object.)�
isinstance�bs4�
BeautifulSoup�r:r&r&r'�is_docZr)z_DocumentNav.is_doccCr=)zIs tag.)r>r?�TagrAr&r&r'r5_r)z_DocumentNav.is_tagcCr=)zIs declaration.)r>r?�DeclarationrAr&r&r'�is_declarationdr)z_DocumentNav.is_declarationcCr=)z	Is CDATA.)r>r?�CDatarAr&r&r'�is_cdatair)z_DocumentNav.is_cdatacCr=)zIs processing instruction.)r>r?�ProcessingInstructionrAr&r&r'�is_processing_instructionnr)z&_DocumentNav.is_processing_instructioncCst|tjj�S)zIs navigable string.)r>r?r�NavigableStringrAr&r&r'�is_navigable_strings�z _DocumentNav.is_navigable_stringcCst|tjtjtjtjtjf�S)zIs special string.)r>r?�CommentrDrFrH�DoctyperAr&r&r'�is_special_stringxsz_DocumentNav.is_special_stringcCs|�|�o
|�|�S)z Check if node is content string.)rKrO)r8r:r&r&r'�is_content_string}sz_DocumentNav.is_content_string�elr rcCst|�S)z'Create fake parent for a given element.)r�rQr&r&r'�create_fake_parent��z_DocumentNav.create_fake_parent�bs4.Tag | NonecCs|duot|j�S)z2Check if element (or document) is from a XML tree.N)r<�_is_xmlrRr&r&r'�is_xml_tree��z_DocumentNav.is_xml_treecCs:|durdSt|�|�r|jnt�|j�dko|�|��S)z Check if element is an `iframe`.NF�iframe)r<rW�namer�lower�is_html_tag�r%rQr&r&r'�	is_iframe�s �z_DocumentNav.is_iframecCs:|jo|j|u}|s|�|�}|duo|jo|�|�}|S)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_htmlr^)r%rQr_�parentr&r&r'�is_root�s

z_DocumentNav.is_rootF�	no_iframe�!Iterator[bs4.element.PageElement]ccs0�|dur|r|�|�s|jEdHdSdSdS)z$Get contents or contents in reverse.N)r^r$�r%rQrdr&r&r'�get_contents�s��z_DocumentNav.get_contentsN�start�
int | None�reverse�Iterator[bs4.Tag]cCs|�|||d|�S)zGet tag children.T)�get_children)r%rQrhrjrdr&r&r'�get_tag_children�s	z_DocumentNav.get_tag_children�tagsccs��|durX|r|�|�sZt|j�d}|dur|r|nd}n|}|r$dn|d}|r,dnd}	d|kr8|kr\ndS||kr^|j|}
||	7}|rO|�|
�rR|
V||ks?dSdSdSdSdS)z
Get children.Nrr���)r^r+r$r5)r%rQrhrjrnrd�last�index�end�incr�noder&r&r'rl�s$�

��	z_DocumentNav.get_childrenccs�|j|d|d�EdHdS)z!Specifically get tag descendants.T)rnrdN)�get_descendantsrfr&r&r'�get_tag_descendants�s�z _DocumentNav.get_tag_descendantsccs��|dure|r|�|�sgd}|jD]W}|dur||urqd}t|tj�r_|r[|�|�r[|jdur4|j}n|}t|tj�rM|jrM|jd}t|tj�rM|js?|j}|V|durZdSq|Vq|sd|VqdSdSdS)zGet descendants.Nro)r^�descendantsr>r?rC�next_siblingr$�next_element)r%rQrnrd�	next_good�child�
last_childr&r&r'ru�s6�


���z_DocumentNav.get_descendantscCs0|dur|jnd}|r|dur|�|�rd}|S)zGet parent.N)rbr^)r%rQrdrbr&r&r'r`sz_DocumentNav.get_parent�
str | NonecC�|dur|jSdS�zGet tag.N)rZrRr&r&r'�get_tag_name	rXz_DocumentNav.get_tag_namecCs|jS)�Get prefix.)�prefixrRr&r&r'�get_prefix_namesz_DocumentNav.get_prefix_namecCr~)zGet namespace `URI`.N)�	namespacerRr&r&r'�get_urirXz_DocumentNav.get_uricCs|j|dd�S)�Get next sibling tag.T)rn)�get_next)r8rQr&r&r'�get_next_tagsz_DocumentNav.get_next_tagcC�T|j}|rt|tj�s|dur|j}|rt|tj�s|dus|r(t|tj�s(d}|S)r�N)rxr>r?rC�r8rQrn�siblingr&r&r'r�!��z_DocumentNav.get_nextTcCs|�|d�S)�Get previous sibling tag.T)�get_previous)r8rQrnr&r&r'�get_previous_tag.sz_DocumentNav.get_previous_tagcCr�)r�N)�previous_siblingr>r?rCr�r&r&r'r�4r�z_DocumentNav.get_previouscCs&|dur	t|d�nd}t|o|tk�S)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�)�getattrr<�NS_XHTML)rQ�nsr&r&r'�has_html_nsAs	z_DocumentNav.has_html_ns�	attr_name�str�tuple[str | None, str | None]cCs$|durdSt|dd�t|dd�fS)z7Return namespace and attribute name without the prefix.N)NNr�rZ)r�)rQr�r&r&r'�split_namespaceMsz_DocumentNav.split_namespace�value�str | Sequence[str]cCs�|durdSt|t�r
|St|t�r|�d�St|t�rDg}|D]!}t|ttf�s6t|t�r6|�t|��q |�tt|�|���q |St|�S)z6Normalize the value to be a string or list of strings.N��utf8)r>r��bytes�decoder�appendr�normalize_value)r8r��	new_value�vr&r&r'r�Vs



z_DocumentNav.normalize_valuerZ�default�str | Sequence[str] | NonecCsl|}|jrz|�|j|�}W|StyY|Sw|j��D]\}}t�|�|kr3|�|�}|Sq |S)zGet attribute by name.)rVr��attrs�KeyError�itemsrr[)r8rQrZr�r��kr�r&r&r'�get_attribute_by_namews 	��
�z"_DocumentNav.get_attribute_by_name�0Iterator[tuple[str, str | Sequence[str] | None]]ccs6�|dur|j��D]\}}||�|�fVq
dSdS)zIterate attributes.N)r�r�r�)r8rQr�r�r&r&r'�iter_attributes�s��z_DocumentNav.iter_attributes�
Sequence[str]cCs0|�|dg�}t|t�rt�|�}ttt|�S)zGet classes.�class)r�r>r��	RE_NOT_WS�findallrr)r8rQ�classesr&r&r'�get_classes�s

z_DocumentNav.get_classescs"d��fdd��j||d�D��S)z	Get text.r�c�g|]	}��|�r|�qSr&�rP��.0rtr,r&r'�
<listcomp>�s��z)_DocumentNav.get_text.<locals>.<listcomp>�rd)�joinrurfr&r,r'�get_text�s

��z_DocumentNav.get_text�	list[str]cs�fdd��j||d�D�S)z
Get Own Text.cr�r&r�r�r,r&r'r��s

��z-_DocumentNav.get_own_text.<locals>.<listcomp>r�)rgrfr&r,r'�get_own_text�s
�z_DocumentNav.get_own_text)r4r	r!r")r:r;r!r<)rQr r!r�rQrUr!r<�rQr r!r<�F)rQrUrdr<r!re)NFF)
rQrUrhrirjr<rdr<r!rk)NFFF)rQrUrhrirjr<rnr<rdr<r!re)rQrUrdr<r!rk)FF)rQrUrnr<rdr<r!re)rQrUrdr<r!rU�rQrUr!r}�rQr r!r}�rQr r!rU)rQr rnr<r!r;)T)rQr rnr<r!rU)rQrUr�r�r!r�)r�r	r!r��N)rQr rZr�r�r�r!r�)rQrUr!r�)rQr r!r�)rQr rdr<r!r�)rQr rdr<r!r�)(r/r0r1r2�classmethodr9�staticmethodrBr5rErGrIrKrOrPrSrWr^rcrgrmrlrvrur`r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r&r&r&r'r3Os�


����$ �
r3c@sreZdZdZeddd	��Zed dd��Zed!d
d��Zed"dd��Zed#dd��Z	ed$dd��Z
ed%dd��ZdS)&�Inputsz-Class for parsing and validating input items.�yearr*�month�dayr!r<cCs^t}|tkr|ddkr|ddks|ddkrtnt}n|tvr#t}d|ko,|kSS)z
Validate day.rr�di�r)�
LONG_MONTH�FEB�FEB_LEAP_MONTH�	FEB_MONTH�	MONTHS_30�SHORT_MONTH)r�r�r��max_daysr&r&r'�validate_day�s.zInputs.validate_day�weekcCsHt�d�dd�d|��d���d}|dkrd}d|ko!|kSS)zValidate week.��-rz%m-%d-%Yr�5)r�strptime�isocalendar)r�r��max_weekr&r&r'�
validate_week�s$zInputs.validate_weekcC�d|ko	dkSS)zValidate month.rr�r&)r�r&r&r'�validate_month��zInputs.validate_monthcCsd|kS)zValidate year.rr&)r�r&r&r'�
validate_year�rTzInputs.validate_year�hourcCr�)zValidate hour.r�r&)r�r&r&r'�
validate_hour�r�zInputs.validate_hour�minutescCr�)zValidate minutes.r�;r&)r�r&r&r'�validate_minutes�r�zInputs.validate_minutes�ityper�r�r}�tuple[float, ...] | NonecCstd}|dur|S|dkrCt�|�}|rAt|�d�d�}t|�d�d�}t|�d�d�}|�|�rA|�|�rA|�|||�rA|||f}|S|dkrnt�|�}|rlt|�d�d�}t|�d�d�}|�|�rl|�|�rl||f}|S|dkr�t�|�}|r�t|�d�d�}t|�d�d�}|�|�r�|�	||�r�||f}|S|dkr�t
�|�}|r�t|�d	�d�}	t|�d
�d�}
|�|	�r�|�|
�r�|	|
f}|S|dk�r#t
�|�}|�r!t|�d�d�}t|�d�d�}t|�d�d�}t|�d	�d�}	t|�d
�d�}
|�|��r!|�|��r!|�|||��r!|�|	��r!|�|
��r!||||	|
f}|S|dv�r8t�|�}|�r8t|�d
��f}|S)zParse the input value.N�dater��
r�r�r��timer�r��datetime-local)�number�ranger�)�RE_DATE�matchr*�groupr�r�r��RE_MONTH�RE_WEEKr��RE_TIMEr�r��RE_DATETIME�RE_NUM�float)r8r�r��parsed�mr�r�r�r�r�r�r&r&r'�parse_value�sz
"
'�
 �
�

�
�����
�
zInputs.parse_valueN)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*r!r<)r�r�r�r}r!r�)
r/r0r1r2r�r�r�r�r�r�r�r�r�r&r&r&r'r��s 
r�c@s�eZdZdZd~dd
�Zddd�Zd�dd�Zd�dd�Zd�dd�Zd�dd�Z	d�dd�Z
d�d"d#�Zd�d'd(�Zd�d+d,�Z
d�d/d0�Zd�d1d2�Zd�d4d5�Zd�d7d8�Zd�d�d<d=�Zd�d>d?�Zd�d@dA�Zd�dDdE�Zd�dGdH�Zd�dIdJ�Zd�dKdL�Zd�dNdO�Zd�dRdS�Zd�dTdU�Zd�dWdX�Zd�d[d\�Zd�d]d^�Zd�d_d`�Zd�dcdd�Z d�dfdg�Z!d�didj�Z"d�dkdl�Z#d�dmdn�Z$d�dodp�Z%d�d�dtdu�Z&d�dvdw�Z'd�dydz�Z(d�d{d|�Z)d}S)��CSSMatchzPerform CSS matching.�	selectors�ct.SelectorList�scoperU�
namespaces�ct.Namespaces | None�flagsr*r!r"c	Cs�|�|�||_g|_g|_g|_||_|durin||_||_d|_|}|�	|�}|r5|}|�	|�}|s,d}|�
|�s?|}n
|�|�D]}|}||_||urR|n||_
|�|�|_|�|�|_|jpg|j|_dS)r#NF)r9r4�cached_meta_lang�cached_default_forms�cached_indeterminate_formsr�r�r��iframe_restrictr`rBrmr_r�r��has_html_namespacerW�is_xmlra)	r%r�r�r�r��docrbr_r{r&r&r'r(s4
	

�
zCSSMatch.__init__r<cCs|jp|jS)z3Check if namespaces are supported in the HTML type.)rrr,r&r&r'�supports_namespacesCr)zCSSMatch.supports_namespacesrQr�cCs6d}|dur|S|��r|�|�}|r|}|St}|S)zGet tag namespace.r�N)rr�r�)r%rQr�r�r&r&r'�
get_tag_nsHs
�zCSSMatch.get_tag_nscCs|�|�tkS)z"Check if tag is in HTML namespace.)rr�r]r&r&r'r\WrLzCSSMatch.is_html_tagr}cC�&|�|�}|dur|jst�|�S|Sr)r�rrr[�r%rQrZr&r&r'�get_tag\�
zCSSMatch.get_tagr cCr)r�N)r�rrr[)r%rQr�r&r&r'�
get_prefixbrzCSSMatch.get_prefixric
Cs�|�|�D]Z}|�|�r=t�t�|�|dd��d�}|�|�}|r%|dvs.|�|�r.|dur/q|�	|�}|dur<|Sq|�
|�rCq|D]}t�|�}|dvr^|dkrWt
jnt
jSqEqdS)z%Get directionality from element text.�dirr�N)�bdi�script�style�textarearY��AL�R�Lr)rlr5�DIR_MAP�getrr[r�r
r\�	find_bidirO�unicodedata�
bidirectional�ct�SEL_DIR_LTR�SEL_DIR_RTL)r%rQrt�	directionrZr��c�bidir&r&r'rhs0

��


��zCSSMatch.find_bidi�
lang_range�lang_tagcCs*d}t�d|���}|�d�}|���d�}t|�}t|�}d}d}	||}
||	}|dkr:|dkr:|
s:|
|kr:dS|
dkrB|
|ksL|
dkrN|dkrN|sNd}|d7}|	d7}	|r�||kr�||}
z||	}Wntyqd}YqVw|
swd}qV||
kr�|d7}n	t|�dkr�d}qV|	d7}	|r�||ks\|S)zFilter the language tags.Tr�rr�*F)�
RE_WILD_STRIP�subr[�splitr+�
IndexError)r%r!r"r��ranges�subtags�length�slength�rindex�sindex�r�sr&r&r'�extended_language_filter�sF
$�
�z!CSSMatch.extended_language_filter�attrr�r�c
Csd}|��rsd}|r|j�|�}|dur|dkrdSnd}|�|�D]N\}}|�||�\}}	|durL|jr9||ksF|jsKt�|�t�|�krK|}|Sq"|dusX||krY|dkrYq"|jsgt�|�t�|	�krln||	krlq"|}|S|S|�|�D]\}}t�|�t�|�kr�qx|}|S|S)z3Match attribute name and return value if it exists.Nr#)rr�rr�r�rrr[)
r%rQr1r�r�r�r�r�r�rZr&r&r'�match_attribute_name�s<�(�$�zCSSMatch.match_attribute_namer4�ct.SelectorTagcCs�d}|�|�}|j�d�}|jdurdn|j�|j�}|jdur,|dur,||kr,d}|S|jdur<|jdkr<|r<d}|S|jrN|jdkrN|dusL||krNd}|S)z#Match the namespace of the element.Tr�NFr#)rr�rr�)r%rQr4r�r��default_namespace�tag_nsr&r&r'�match_namespace�s

���zCSSMatch.match_namespace�
attributes� tuple[ct.SelectorAttribute, ...]cCs�d}|rD|D]=}|�||j|j�}|jr|jr|jn|j}|dur&d}|St|t�r-|nd�|�}|dur7q|�	|�durCd}|Sq|S)zMatch attributes.TNFr
)
r2�	attributer�r�xml_type_pattern�patternr>r�r�r�)r%rQr7r��a�tempr;r�r&r&r'�match_attributess$��zCSSMatch.match_attributescCs>|js|jdurt�|j�n|j}|duo||�|�dfvS)zMatch tag name.Nr#)rrZrr[r
)r%rQr4rZr&r&r'�
match_tagname"s"�zCSSMatch.match_tagname�ct.SelectorTag | NonecCs0d}|dur|�||�sd}|�||�sd}|S)zMatch the tag.TNF)r6r?)r%rQr4r�r&r&r'�	match_tag+szCSSMatch.match_tag�relationcCsd}t|dtj�r|S|djtkr3|j||jd�}|s1|r1|�||�}|j||jd�}|s1|s|S|djtkrL|j||jd�}|rJ|�||�}|S|djt	krm|�
|�}|sk|rk|�||�}|�
|�}|sk|s\|S|djtkr�|�
|�}|r�|�|�r�|�||�}|S)zMatch past relationship.Frr�)
r>r�SelectorNull�rel_type�
REL_PARENTr`r�match_selectors�REL_CLOSE_PARENT�REL_SIBLINGr��REL_CLOSE_SIBLINGr5)r%rQrB�foundrbr�r&r&r'�match_past_relations7s6��
�

��
zCSSMatch.match_past_relationsFrb�	recursivecCsDd}|r|j}n|j}|||jd�D]
}|�||�}|r|Sq|S)zMatch future child.Fr�)rvrmrrF)r%rbrBrLr��childrenr{r&r&r'�match_future_childSs�zCSSMatch.match_future_childcCs�d}t|dtj�r|S|djtkr|�||d�}|S|djtkr+|�||�}|S|djtkrL|�|�}|sJ|rJ|�	||�}|�|�}|sJ|s;|S|djt
kre|�|�}|re|�|�re|�	||�}|S)zMatch future relationship.FrT)r>rrCrD�REL_HAS_PARENTrN�REL_HAS_CLOSE_PARENT�REL_HAS_SIBLINGr�rF�REL_HAS_CLOSE_SIBLINGr5)r%rQrBrJr�r&r&r'�match_future_relationsas*�
�

��
zCSSMatch.match_future_relationscCsVd}t|dtj�s|djdur|S|dj�d�r#|�||�}|S|�||�}|S)z%Match relationship to other elements.FrN�:)r>rrCrD�
startswithrSrK)r%rQrBrJr&r&r'�match_relationsxs�zCSSMatch.match_relations�ids�tuple[str, ...]cCs.d}|D]}||�|dd�krd}|Sq|S)zMatch element's ID.T�idr�F)r�)r%rQrWrJ�ir&r&r'�match_id�s�zCSSMatch.match_idr�cCs.|�|�}d}|D]}||vrd}|Sq	|S)zMatch element's classes.TF)r�)r%rQr��current_classesrJrr&r&r'�
match_classes�s
�zCSSMatch.match_classescCs�|�|�}|r3|�|�}|r3|dur3|�|�s%|�|�r |��s%|�|�r(d}n|�|�}|r3|dus|ra|�|�}|ra|dura|�|�sS|�|�rN|��sS|�|�rVd}n|�|�}|ra|dus@|S)zMatch element as root.NF)rcr�r5rP�striprGr�)r%rQrcr�r&r&r'�
match_root�s<

����
�
����
�zCSSMatch.match_rootcCs
|j|uS)zMatch element as scope.)r�r]r&r&r'�match_scope�r.zCSSMatch.match_scoper{cCs(|�|�|�|�ko|�|�|�|�kS)z!Match tag type for `nth` matches.)r
r)r%rQr{r&r&r'�match_nth_tag_type�s�zCSSMatch.match_nth_tag_type�nth�tuple[ct.SelectorNth, ...]cCsd}|D�]�}d}|jr|�||j�s|S|�|�}|dur'td|�|��}|j}t|�d}|r4|nd}d}	|j}
|j}|j	}d}
d}|rIdnd}|rS|
|
|n|
}}|r�d}|dksc||kr�|dkr�d|}|durt|dkrtnNd}|
|7}
|r�|
|
|n|
}}d|}||kr�n3n*||}|dur�|dkr�n%d}|
|7}
|r�|
|
|n|
}}||}||kr�n
|}|dksc||ksc|
}|
dkr�|dkr�|
}|
|7}
|r�|
|
|n|
}}|dks�d}|}
|r�|
|
|n|
}}d|kr�|dk�r�nn�d}|j
|||dkd�D]E}||7}t|tj
��s�q
|j�r*|�||j��s*�q
|j�r7|�||��s7�q
|	d7}	|	|k�rJ||u�rHd}nn	||u�rQn�q
||u�rYn,|}|
|7}
|
dk�ren |�rn|
|
|n|
}||k�rvnd|k�r�|dk�sn|�s�|Sq|S)	zMatch `nth` elements.TFNr rrro)rhrj)r�rFr`rrSrpr+r<�b�nrlr>r?rC�of_typera)r%rQrb�matchedrerbrp�
last_indexrq�relative_indexr<rd�var�count�
count_incr�factor�idx�last_idx�adjust�diff_low�diff�	diff_high�lowestr{r&r&r'�	match_nth�s�
[
����


�


��zCSSMatch.match_nthcCsJd}|�|�D]}|�|�rd}|S|�|�r"t�|�r"d}|Sq|S)z)Check if element is empty (if requested).TF)rlr5rP�RE_NOT_EMPTY�search)r%rQ�is_emptyr{r&r&r'�match_empty(s
��zCSSMatch.match_empty�tuple[ct.SelectorList, ...]cCs"d}|D]
}|�||�sd}q|S)zMatch selectors.TF)rF)r%rQr�r��selr&r&r'�match_subselectors5s�zCSSMatch.match_subselectors�contains�tuple[ct.SelectorContains, ...]c	Cs�d}d}|D]C}|dur |jr|j||jd�}n|j||jd�}d}|jD]}|jr<|D]
}||vr6d}nq,|r;n
q%||vrDd}nq%|sId}q|S)z"Match element if it contains text.TNr�F)�ownr�rar��text)	r%rQr}r��content�contain_listrJr�rr&r&r'�match_contains>s4
����zCSSMatch.match_containscCsd}d}|j|dd�}|r-|dur-|�|�dkr |�|�r |}n|j|dd�}|r-|dus|dur�d}|jD]\}}||urHd}||urFd}nq6|s�|j|dd�D]3}|�|�}	|	dkr`|S|	dvr�|�|dd�}
|
r�t�|
�d	kr�|j�||f�||ur�d}|SqR|S)
�Match default.FNTr��form)�input�buttonr7r��submit)	r`r
r\rrvr�rr[r�)r%rQr�r�rb�
found_form�f�tr{rZr�r&r&r'�
match_defaultZsB��
��zCSSMatch.match_defaultcs\d}tt��|d��}d�fdd�}||�}|d	ur�d}�jD]\}}}	||ur6||kr6d
}|	d
ur4d
}nq|s�d}
�j|d
d�D]\}||urIqB��|�}|dkr�d}
d}d}��|�D]<\}}t�|�d
krrt�|�dkrrd
}
nt�|�dkr�||kr�d
}n	t�|�dkr�d
}|
r�|r�|r�||�|ur�d
}
nq]|
r�nqB|
s�d
}�j�	|||f�|S)r�FrZrQr r!rUcsld}�j|dd�}|dur4��|�dkr��|�r|}	|S|}�j|dd�}|dur0|}	|S|dus
|S)zFind this input's form.NTr�r�)r`r
r\)rQr�rb�last_parentr,r&r'�get_parent_form�s��	z5CSSMatch.match_indeterminate.<locals>.get_parent_formNTr�r�r7�radio�checkedr�)
rr�r�rrvr
r�rr[r�)r%rQr�rZr�r�r�r�rerZr�r{�tag_name�is_radio�check�has_namer�r�r&r,r'�match_indeterminate�sR�
��zCSSMatch.match_indeterminate�langs�tuple[ct.SelectorLang, ...]cCs�d}|��}|j}|j}|}d}d}	|sq|�|�}
|�|�D]8\}}|�||�\}
}|r.|
r:|js6t�|�n|dksR|rV|
sV|
t	krV|jsN|durNt�|�n|dkrV|}nq|}	|j
||jd�}|duro|	}|�|�}|	}n|r|dur�|jr�|jD]}||dur�|d}q{|du�rA|jr�|�rA|�rA|j
dk�rAd}dD]%}d}|j||jd�D]}|�|�|kr�|�|�r�d	}|}nq�|s�nq�|�rA|du�rA|D]`}t|tj��r)|�|�d
k�r)|�|��r)d}d}|�|�D]8\}}t�|�dk�rt�|�dk�rd	}t�|�d
k�r|}|�r(|�r(|}|j�tt|�tt|�f�nq�|du�r0nq�|du�rA|j�tt|�df�|du�rf|D]}d}|D]}|�|tt|���r\d	}�qN|�sd|S�qH|S)zMatch languages.FN�langr�rr�html)r��headT�metaz
http-equivzcontent-languager�r�)rr_rr�r�r�rrr[�NS_XMLr`rar�rZrmr
r\r>r?rCr�rr�r0)r%rQr�r��has_nsr_rrb�
found_langrpr�r�r��attr_nsr1�cacherJr4r{�child2�c_langr��patternsr;r&r&r'�
match_lang�s�
���� �
�
�(��* �
�

��zCSSMatch.match_lang�directionalityc
	s|tj@r|tj@rdS|dus��|�sdSt�t���|dd��d�}|dvr-||kS��	|�}|r=|dur=tj|kS��
|�}|dk}|dk}|dk}|rZt���|d	d��nd}	|rk|	d
krk|durktj|kS|rq|	dvss|r�|dkr�|r�d��fd
d��j|dd�D��}
n
t
t��|dd��}
|
r�|
D]}t�|�}|dvr�|dkr�tjntj}||kSq�tj|kS|r�tj|kS���j|dd�|�S|r�|dus�|dkr���|�}|dur�||kS|r�tj|kS���j|dd�|�S���j|dd�|�S)zCheck directionality.FNr
r�)Nrr�rrr7�tel)r�rwr��url�emailrc3s�|]
}��|�r|VqdSr�r�r�r,r&r'�	<genexpr>6s�z%CSSMatch.match_dir.<locals>.<genexpr>Tr�r�rr)rrrr\rrrr[r�rcr
r�rgrr�rr�	match_dirr`r)
r%rQr�rrcrZ�is_input�is_textarea�is_bdir�r�rr r&r,r'r�sP



$
�



zCSSMatch.match_dir�	conditionc
Cs2d}t�|�|d��}t�|tt|�|dd���}t�|tt|�|dd���}|dur1|dur1dSt�|tt|�|dd���}|dur�|dvr^|durQ||krQd}|s]|dur]||kr]d}n1|d	kr�|dury|dury||kry||krx||krxd}n|dur�||kr�d}|s�|dur�||kr�d}|tj@r�|S|S)
ac
        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.
        Fr7�minN�maxr�)r�r�r�r�r�r�Tr�)	rr[r�r�r�rr�r�SEL_IN_RANGE)r%rQr��out_of_ranger��mn�mxr�r&r&r'�match_rangeQs0
��zCSSMatch.match_rangecCs<|�|�}|duo|�d�dkp|�d�dkp|�|�duS)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�rorT)r
�findrr	r&r&r'�
match_definedys
��zCSSMatch.match_definedcCsd}|�|�}|dvr
d}|S)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%rQr�r�r&r&r'�match_placeholder_shown�s

z CSSMatch.match_placeholder_shownc	Cs
d}|j}|j}|r|j}|j}dti|_d|_|r|jr�|D]�}|}t|tj�r*q|�||j	�s2q|j
tj@r>|�|�s>q|j
tj
@rJ|�|�sJq|j
tj@rV|�|�sVq|j
tj@rb|�|�sbq|�||j�sjq|j
tj@rv|�|�svq|jr�|�||j�s�q|jr�|�||j�s�q|�||j�s�q|j
t@r�|�||j
t@�s�q|jr�|� ||j�s�q|j!r�|�"||j!�s�q|j#r�|�$||j#�s�q|j
tj%@r�|�&|�s�q|j
tj'@r�|�(|�s�q|j
t)@r�|�*||j
t)@�s�q|j+r�|�,||j+�s�q|}|�r||_||_|S)z.Check if element matches one of the selectors.Fr�T)-�is_notrar�rr�r>rrCrAr4r��SEL_DEFINEDr��SEL_ROOTr_�	SEL_SCOPEr`�SEL_PLACEHOLDER_SHOWNr�rurb�	SEL_EMPTYryrWr[r�r]r>r7�RANGESr�r�r�r�r|rBrV�SEL_DEFAULTr��SEL_INDETERMINATEr��	DIR_FLAGSr�r}r�)	r%rQr�r�r�rar�r�selectorr&r&r'rF�sn

zCSSMatch.match_selectorsr�limitrkccsV�|dkrdn|}|�|j�D]}|�|�r(|V|dur(|d8}|dkr(dSqdS)z&Match all tags under the targeted tag.rN)rvr4r�)r%r��limr{r&r&r'�select�s�
��zCSSMatch.selectcCsH|j}d}|dur"|dur"|�|�r|}n|�|�}|dur"|dus
|S)�Match closest ancestor.N)r4r�r`)r%�current�closestr&r&r'r�s

�zCSSMatch.closest�
list[bs4.Tag]cs�fdd����j�D�S)zFilter tag's children.cs&g|]}t|tj�r��|�r|�qSr&)r>r?rCr�)r�r4r,r&r'r�s
���z#CSSMatch.filter.<locals>.<listcomp>)rgr4r,r&r,r'�filters

�zCSSMatch.filtercCs$|�|�o|�|�o|�||j�S�zMatch.)rBr5rFr�r]r&r&r'r�s$zCSSMatch.matchN)
r�r�r�rUr�r�r�r*r!r")r!r<)rQrUr!r�r�r�r�)rQr r!ri)r!r�r"r�r!r<)rQr r1r�r�r}r!r�)rQr r4r3r!r<)rQr r7r8r!r<)rQr r4r@r!r<)rQr rBr�r!r<r�)rbr rBr�rLr<r!r<)rQr rWrXr!r<)rQr r�rXr!r<r�)rQr r{r r!r<)rQr rbrcr!r<)rQr r�rzr!r<)rQr r}r~r!r<)rQr r�r�r!r<)rQrUr�r*r!r<)rQr r�r*r!r<)rQr r�r�r!r<�r)r�r*r!rk)r!rU)r!r�)*r/r0r1r2r(rrr\r
rrr0r2r6r>r?rArKrNrSrVr[r]r_r`raruryr|r�r�r�r�r�r�r�r�rFr�r�r�r�r&r&r&r'r�sP

)





%
8
5


	










e

	

(
>
V
;
(

T

r�cs�eZdZUdZded<ded<ded<ded	<d
ed<dZd)�fdd�Zd*dd�Zd+dd�Zd,dd�Z	d+dd�Z
d-d.d"d#�Zd-d/d%d&�Zd0d'd(�Z
e
Z�ZS)1�	SoupSievez-Compiled Soup Sieve selector matching object.r�r;r�r�r�r�zdict[str, str]�customr*r�)r;r�r�r�r��_hash�ct.CustomSelectors | Nonecst�j|||||d�dS)r#)r;r�r�r�r�N)�superr()r%r;r�r�r�r���	__class__r&r'r(%s

�zSoupSieve.__init__r4r r!r<cCst|j||j|j��|�Sr�)r�r�r�r�r��r%r4r&r&r'r�7szSoupSieve.matchrUcCst|j||j|j���S)r�)r�r�r�r�r�r�r&r&r'r�<szSoupSieve.closest�iterable�Iterable[bs4.Tag]r�cs6t|tj�rt�j|�j�j���S�fdd�|D�S)a�
        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.
        cs$g|]}t�|�s��|�r|�qSr&)r�rKr�r�r,r&r'r�Ps$z$SoupSieve.filter.<locals>.<listcomp>)r>r?rCr�r�r�r�r�)r%r�r&r,r'r�AszSoupSieve.filtercCs|j|dd�}|r
|dSdS)zSelect a single tag.r)r�rN)r�)r%r4rnr&r&r'�
select_oneRszSoupSieve.select_onerr�cCst|�||��S)zSelect the specified tags.)�list�iselect�r%r4r�r&r&r'r�XszSoupSieve.selectrkccs&�t|j||j|j��|�EdHdS)zIterate the specified tags.N)r�r�r�r�r�r�r&r&r'r�]s�$zSoupSieve.iselectc	Cs&d|j�d|j�d|j�d|j�d�	S)zRepresentation.zSoupSieve(pattern=z
, namespaces=z	, custom=z, flags=�))r;r�r�r�r,r&r&r'�__repr__bs���zSoupSieve.__repr__)
r;r�r�r�r�r�r�r�r�r*)r4r r!r<)r4r r!rU)r�r�r!r�r�)r4r r�r*r!r�)r4r r�r*r!rk)r!r�)r/r0r1r2�__annotations__�	__slots__r(r�r�r�r�r�r�r��__str__�
__classcell__r&r&r�r'r�s"





r�);r2�
__future__rrr�r�rerrrr?�typingrrr	r
rr�compilervr�rErGrHrIrOrPrQrRr�r�rrr�r��SEL_OUT_OF_RANGEr�rr�r�r�r�r�r�r$r�r�r�r�r�r��DAYS_IN_WEEKrr3r�r��	Immutabler��pickle_registerr&r&r&r'�<module>sv$

�




�
cgS