
    EZc              
       F   d Z ddlZddlZddlZddlZddlmZmZmZmZm	Z	m
Z
mZ dedefdZ G d de      Z G d	 d
ee      Zed   Zedef   Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d d      Z G d  d!      Z G d" d#      Z G d$ d%      Z  ejB                  d&      Z" ejB                  d'      Z# ejB                  d(      Z$d)edee   fd*Z%d+d,dee   fd-Z&d+d,de
eee   f   fd.Z'	 dUd+d,d/e(de
eee   f   fd0Z)d+d,ded1   fd2Z*d+d,de
d1ef   fd3Z+d+d,dee   fd4Z,d5ed+d,defd6Z-d7ed1   de
e.e.f   fd8Z/ G d9 d1e
eee   f         Z0 G d: d;e0      Z1 G d< d=      Z2ejf                  r G d> d?ejh                        Z5d@edd?fdAZ6 e6dB      Z7 e6dC      Z8 e6dD      Z9 e6dE      Z: e6dF       e6dG      dHZ; ejB                  dI      jx                  Z= ejB                  e2j|                  ej~                        jx                  Z@ ejB                  dJ      jx                  ZA ej                  dKdL      ZCdMdNdefdOZDdPedefdQZEdRedee0   fdSZF G dT d,      ZGy)Va  
    cssselect.parser
    ================

    Tokenizer, parser and parsed objects for CSS selectors.


    :copyright: (c) 2007-2012 Ian Bicking and contributors.
                See AUTHORS for more details.
    :license: BSD, see LICENSE for more details.

    N)IterableIteratorListOptionalSequenceTupleUnionstringreturnc                 ^    | j                  d      j                         j                  d      S )z(Lower-case, but only in the ASCII range.utf8)encodelowerdecode)r
   s    2/usr/lib/python3/dist-packages/cssselect/parser.pyascii_lowerr      s%    == &&(//77    c                       e Zd ZdZy)SelectorErrorzCommon parent for :class:`SelectorSyntaxError` and
    :class:`ExpressionError`.

    You can just use ``except SelectorError:`` when calling
    :meth:`~GenericTranslator.css_to_xpath` and handle both exceptions types.

    N__name__
__module____qualname____doc__ r   r   r   r      s    r   r   c                       e Zd ZdZy)SelectorSyntaxErrorz3Parsing a selector that does not match the grammar.Nr   r   r   r   r   r   %   s    =r   r   )ElementHashClassFunctionPseudoAttribNegationRelationMatchingSpecificityAdjustmentCombinedSelectorFunctionalPseudoElementc                   \    e Zd ZdZd
dedee   ddfdZdefdZ	defdZ
deeeef   fd	Zy)Selectoru"  
    Represents a parsed selector.

    :meth:`~GenericTranslator.selector_to_xpath` accepts this object,
    but ignores :attr:`pseudo_element`. It is the user’s responsibility
    to account for pseudo-elements and reject selectors with unknown
    or unsupported pseudo-elements.

    Ntreepseudo_elementr   c                 Z    || _         |t        |t              st        |      }|| _        y N)parsed_tree
isinstancer)   r   r-   )selfr,   r-   s      r   __init__zSelector.__init__F   s.    %jI`.a(8N* -r   c                     t        | j                  t              rt        | j                        }n| j                  rd| j                  z  }nd}| j                  j
                  d| j                  |dS )N::%s [])r1   r-   r)   repr	__class__r   r0   )r2   r-   s     r   __repr__zSelector.__repr__`   s^    d))+BC!$"5"56N  #d&9&99NN!^^44d6F6FWWr   c                 ,   t        | j                  t              rd| j                  j                         z  }n| j                  rd| j                  z  }nd}| j                  j                         |}t        |      dkD  r|j                  d      }|S )z8Return a CSS representation for this selector (a string)r5   r6      *)r1   r-   r)   	canonicalr0   lenlstrip)r2   r-   ress      r   r?   zSelector.canonicali   s    d))+BC#d&9&9&C&C&EEN  #d&9&99NN((224nEs8a<**S/C
r   c                 j    | j                   j                         \  }}}| j                  r|dz  }|||fS )zReturn the specificity_ of this selector as a tuple of 3 integers.

        .. _specificity: http://www.w3.org/TR/selectors/#specificity

        r=   )r0   specificityr-   r2   abcs       r   rD   zSelector.specificityv   s;     ""..01aFA!Qwr   r/   )r   r   r   r   Treer   PseudoElementr3   strr;   r?   r   intrD   r   r   r   r+   r+   ;   sX    -T -8M3J -VZ -4X# X3 	U3S=1 	r   r+   c                   T    e Zd ZdZdededdfdZdefdZdefdZde	e
e
e
f   fd	Zy)
r    z(
    Represents selector.class_name
    selector
class_namer   Nc                      || _         || _        y r/   )rN   rO   )r2   rN   rO   s      r   r3   zClass.__init__   s     $r   c                 h    | j                   j                  d| j                  d| j                  dS )Nr7   .r8   )r:   r   rN   rO   r2   s    r   r;   zClass.__repr__   s!    "nn55t}}dooVVr   c                 T    | j                   j                         d| j                  S )NrR   )rN   r?   rO   rS   s    r   r?   zClass.canonical   s    --113T__EEr   c                 R    | j                   j                         \  }}}|dz  }|||fS Nr=   rN   rD   rE   s       r   rD   zClass.specificity   .    --++-1a	Q!Qwr   r   r   r   r   rI   rK   r3   r;   r?   r   rL   rD   r   r   r   r    r       sT    % %3 %4 %W# WF3 FU3S=1 r   r    c                   P    e Zd ZdZdeded   fdZdefdZdee   fdZ	defd	Z
y
)r)   ax  
    Represents selector::name(arguments)

    .. attribute:: name

        The name (identifier) of the pseudo-element, as a string.

    .. attribute:: arguments

        The arguments of the pseudo-element, as a list of tokens.

        **Note:** tokens are not part of the public API,
        and may change between cssselect versions.
        Use at your own risks.

    name	argumentsTokenc                 2    t        |      | _        || _        y r/   )r   r[   r\   )r2   r[   r\   s      r   r3   z FunctionalPseudoElement.__init__   s    %	"r   r   c                     | j                   j                  d| j                  d| j                  D cg c]  }|j                   c}dS c c}w )Nz[::()])r:   r   r[   r\   valuer2   tokens     r   r;   z FunctionalPseudoElement.__repr__   s;    NN##II&*nn5UU[[5
 	
 6s   Ac                 T    | j                   D cg c]  }|j                   c}S c c}w r/   r\   typerc   s     r   argument_typesz&FunctionalPseudoElement.argument_types       (,7u

777   %c                 j    dj                  d | j                  D              }| j                  d|dS )Nr6   c              3   <   K   | ]  }|j                           y wr/   css.0rd   s     r   	<genexpr>z4FunctionalPseudoElement.canonical.<locals>.<genexpr>        ?uuyy{?   r`   ))joinr\   r[   r2   argss     r   r?   z!FunctionalPseudoElement.canonical   s)    ww???99d++r   N)r   r   r   r   rK   r   r3   r;   r   rh   r?   r   r   r   r)   r)      sG    "#S #Xg-> #
# 
8S	 8,3 ,r   c                   p    e Zd ZdZdededed   ddfdZdefd	Zde	e   fd
Z
defdZdeeeef   fdZy)r!   z(
    Represents selector:name(expr)
    rN   r[   r\   r]   r   Nc                 @    || _         t        |      | _        || _        y r/   )rN   r   r[   r\   )r2   rN   r[   r\   s       r   r3   zFunction.__init__   s     %	"r   c           
          | j                   j                  d| j                  d| j                  d| j                  D cg c]  }|j
                   c}dS c c}w )Nr7   :r`   ra   )r:   r   rN   r[   r\   rb   rc   s     r   r;   zFunction.__repr__   sB    NN##MMII&*nn5UU[[5	
 	
 6s    Ac                 T    | j                   D cg c]  }|j                   c}S c c}w r/   rf   rc   s     r   rh   zFunction.argument_types   ri   rj   c                     dj                  d | j                  D              }| j                  j                         d| j                  d|dS )Nr6   c              3   <   K   | ]  }|j                           y wr/   rm   ro   s     r   rq   z%Function.canonical.<locals>.<genexpr>   rr   rs   r{   r`   rt   )ru   r\   rN   r?   r[   rv   s     r   r?   zFunction.canonical   s8    ww???"mm557DIIr   c                 R    | j                   j                         \  }}}|dz  }|||fS rV   rW   rE   s       r   rD   zFunction.specificity   rX   r   )r   r   r   r   rI   rK   r   r3   r;   r   rh   r?   r   rL   rD   r   r   r   r!   r!      so    # #S #Xg=N #SW #

# 
8S	 8J3 JU3S=1 r   r!   c                   T    e Zd ZdZdededdfdZdefdZdefdZde	e
e
e
f   fd	Zy)
r"   z#
    Represents selector:ident
    rN   identr   Nc                 2    || _         t        |      | _        y r/   )rN   r   r   )r2   rN   r   s      r   r3   zPseudo.__init__   s      '
r   c                 h    | j                   j                  d| j                  d| j                  dS )Nr7   r{   r8   )r:   r   rN   r   rS   s    r   r;   zPseudo.__repr__   s!    "nn55t}}djjQQr   c                 T    | j                   j                         d| j                  S )Nr{   )rN   r?   r   rS   s    r   r?   zPseudo.canonical   s    --113TZZ@@r   c                 R    | j                   j                         \  }}}|dz  }|||fS rV   rW   rE   s       r   rD   zPseudo.specificity   rX   r   rY   r   r   r   r"   r"      sT    ( (c (d (R# RA3 AU3S=1 r   r"   c                   T    e Zd ZdZdededdfdZdefdZdefdZde	e
e
e
f   fd	Zy)
r$   z.
    Represents selector:not(subselector)
    rN   subselectorr   Nc                      || _         || _        y r/   )rN   r   )r2   rN   r   s      r   r3   zNegation.__init__   s     &r   c                 h    | j                   j                  d| j                  d| j                  dS )Nr7   :not(ra   r:   r   rN   r   rS   s    r   r;   zNegation.__repr__   s#    #'>>#:#:DMM4K[K[\\r   c                     | j                   j                         }t        |      dkD  r|j                  d      }| j                  j                         d|dS )Nr=   r>   r   rt   )r   r?   r@   rA   rN   r2   subsels     r   r?   zNegation.canonical   sG    !!++-v;?]]3'F#}}668&AAr   c                     | j                   j                         \  }}}| j                  j                         \  }}}||z   ||z   ||z   fS r/   rN   rD   r   r2   a1b1c1a2b2c2s          r   rD   zNegation.specificity  M    ]]..0
B%%113
BBwRb((r   )r   r   r   r   rI   r3   rK   r;   r?   r   rL   rD   r   r   r   r$   r$      sT    ' 'D 'T ']# ]B3 B)U3S=1 )r   r$   c                   T    e Zd ZdZdedddefdZdefdZdefd	Z	de
eeef   fd
Zy)r%   z.
    Represents selector:has(subselector)
    rN   
combinatorr]   r   c                 .    || _         || _        || _        y r/   rN   r   r   r2   rN   r   r   s       r   r3   zRelation.__init__  s     $&r   r   c                 h    | j                   j                  d| j                  d| j                  dS )Nr7   :has(ra   r   rS   s    r   r;   zRelation.__repr__  s)    NN##MM
 	
r   c                    	 | j                   d   j                         }t        |      dkD  r|j	                  d      }| j
                  j                         d|dS # t        $ r | j                   j                         }Y dw xY w)Nr   r=   r>   r   rt   )r   r?   	TypeErrorr@   rA   rN   r   s     r   r?   zRelation.canonical  sx    	2%%a(224F v;?]]3'F#}}668&AA	  	2%%//1F	2s   A #BBc                     | j                   j                         \  }}}	 | j                  d   j                         \  }}}||z   ||z   ||z   fS # t        $ r! | j                  j                         \  }}}Y 7w xY w)N)rN   rD   r   r   r   s          r   rD   zRelation.specificity"  s    ]]..0
B	8))"-99;JBB BwRb((  	8))557JBB	8s   !A 'A98A9N)r   r   r   r   rI   r+   r3   rK   r;   r?   r   rL   rD   r   r   r   r%   r%     sR    ' '7 ' '

# 
B3 B)U3S=1 )r   r%   c                   V    e Zd ZdZdedee   fdZdefdZdefdZ	de
eeef   fdZy	)
r&   z/
    Represents selector:is(selector_list)
    rN   selector_listc                      || _         || _        y r/   rN   r   r2   rN   r   s      r   r3   zMatching.__init__0       *r   r   c           
          | j                   j                  d| j                  ddj                  t	        t
        | j                              dS )Nr7   :is(, ra   r:   r   rN   ru   mapr9   r   rS   s    r   r;   zMatching.__repr__4  9    NN##MMIIc$ 2 234
 	
r   c                    g }| j                   D ]2  }|j                         }|j                  |j                  d             4 | j                  j                         ddj                  t        t        |            dS )Nr>   r   r   rt   r   r?   appendrA   rN   ru   r   rK   r2   selector_argumentssselargs       r   r?   zMatching.canonical;  sj    ## 	:A[[]F%%fmmC&89	: #mm5573sL^C_9`aar   c                 :    t        d | j                  D              S )Nc              3   <   K   | ]  }|j                           y wr/   )rD   )rp   xs     r   rq   z'Matching.specificity.<locals>.<genexpr>C  s     ?q1==??rs   )maxr   rS   s    r   rD   zMatching.specificityB  s    ?D,>,>???r   N)r   r   r   r   rI   r   r3   rK   r;   r?   r   rL   rD   r   r   r   r&   r&   +  sQ    + +htn +
# 
b3 b@U3S=1 @r   r&   c                   V    e Zd ZdZdedee   fdZdefdZdefdZ	de
eeef   fdZy	)
r'   zz
    Represents selector:where(selector_list)
    Same as selector:is(selector_list), but its specificity is always 0
    rN   r   c                      || _         || _        y r/   r   r   s      r   r3   zSpecificityAdjustment.__init__L  r   r   r   c           
          | j                   j                  d| j                  ddj                  t	        t
        | j                              dS )Nr7   :where(r   ra   r   rS   s    r   r;   zSpecificityAdjustment.__repr__P  r   r   c                    g }| j                   D ]2  }|j                         }|j                  |j                  d             4 | j                  j                         ddj                  t        t        |            dS )Nr>   r   r   rt   r   r   s       r   r?   zSpecificityAdjustment.canonicalW  so    ## 	:A[[]F%%fmmC&89	: MM##%IIc#123
 	
r   c                      y)Nr   r   r   r   rS   s    r   rD   z!SpecificityAdjustment.specificitya  s    r   N)r   r   r   r   rI   r   r3   rK   r;   r?   r   rL   rD   r   r   r   r'   r'   F  sM    
+ +d4j +
# 

3 
U3S=1 r   r'   c                       e Zd ZdZej
                  dedee   deddddd	dfd
       Z	ej
                  dedee   dededdd	dfd       Z	dedee   dededed   d	dfdZ	d	efdZ
d	efdZd	eeeef   fdZy)r#   z>
    Represents selector[namespace|attrib operator value]
    rN   	namespaceattriboperatorztyping.Literal["exists"]rb   Nr   c                      y r/   r   r2   rN   r   r   r   rb   s         r   r3   zAttrib.__init__j  s     	r   r]   c                      y r/   r   r   s         r   r3   zAttrib.__init__u  s     	r   c                 J    || _         || _        || _        || _        || _        y r/   )rN   r   r   r   rb   r   s         r   r3   zAttrib.__init__{  s'     !" 
r   c                    | j                   r| j                   d| j                  }n| j                  }| j                  dk(  r)| j                  j                  d| j
                  d|dS | j                  j                  d| j
                  d|d| j                  dt        j                  d| j                        j                  d
S )N|existsr7   z]] r]   )	r   r   r   r:   r   rN   typingcastrb   )r2   r   s     r   r;   zAttrib.__repr__  s    >> $<F[[F==H$#'>>#:#:DMM6RR ''GTZZ066 r   c                 J   | j                   r| j                   d| j                  }n| j                  }| j                  dk(  r|}n>|| j                  t        j                  d| j
                        j                         }| j                  j                         d|dS )Nr   r   r]   r7   r8   )	r   r   r   r   r   rb   rn   rN   r?   )r2   r   ops      r   r?   zAttrib.canonical  su    >> $<F[[F==H$B#T]]FKK4T4X4X4Z[B==224b99r   c                 R    | j                   j                         \  }}}|dz  }|||fS rV   rW   rE   s       r   rD   zAttrib.specificity  rX   r   )r   r   r   r   r   overloadrI   r   rK   r3   r;   r?   r   rL   rD   r   r   r   r#   r#   e  s     __ C= 	
 -  
  __)1#@COR[b	 
 C= 	
    
#  :3 :U3S=1 r   r#   c                   b    e Zd ZdZd
dee   dee   ddfdZdefdZdefdZde	e
e
e
f   fd	Zy)r   zU
    Represents namespace|element

    `None` is for the universal selector '*'

    Nr   elementr   c                      || _         || _        y r/   )r   r   )r2   r   r   s      r   r3   zElement.__init__  s    "r   c                 V    | j                   j                  d| j                         dS )Nr7   r8   )r:   r   r?   rS   s    r   r;   zElement.__repr__  s    >>22DNN4DEEr   c                 `    | j                   xs d}| j                  r| j                  d|}|S )Nr>   r   )r   r   )r2   r   s     r   r?   zElement.canonical  s*    ,,%#>>!%9Gr   c                     | j                   ryy)N)r   r   r=   r   r   rS   s    r   rD   zElement.specificity  s    <<r   )NN)r   r   r   r   r   rK   r3   r;   r?   r   rL   rD   r   r   r   r   r     s[    (3- # Z^ F# F3 U3S=1 r   r   c                   T    e Zd ZdZdededdfdZdefdZdefdZde	e
e
e
f   fd	Zy)
r   z 
    Represents selector#id
    rN   idr   Nc                      || _         || _        y r/   )rN   r   )r2   rN   r   s      r   r3   zHash.__init__  s     r   c                 h    | j                   j                  d| j                  d| j                  dS )Nr7   #r8   )r:   r   rN   r   rS   s    r   r;   zHash.__repr__  s!    "nn55t}}dggNNr   c                 T    | j                   j                         d| j                  S )Nr   )rN   r?   r   rS   s    r   r?   zHash.canonical  s    --113TWW==r   c                 R    | j                   j                         \  }}}|dz  }|||fS rV   rW   rE   s       r   rD   zHash.specificity  rX   r   rY   r   r   r   r   r     sR     3 4 O# O>3 >U3S=1 r   r   c                   T    e Zd ZdedededdfdZdefdZdefdZdee	e	e	f   fd	Z
y)
r(   rN   r   r   r   Nc                 6    |J || _         || _        || _        y r/   r   r   s       r   r3   zCombinedSelector.__init__  s$    ### $&r   c                     | j                   dk(  rd}n| j                   }| j                  j                  d| j                  d|d| j                  dS )Nr   z
<followed>r7   r8   )r   r:   r   rN   r   )r2   combs     r   r;   zCombinedSelector.__repr__  s?    ??c!D??D!%!8!8$--tO_O_``r   c                     | j                   j                         }t        |      dkD  r|j                  d      }| j                  j                         d| j
                  d|S )Nr=   r>   r   )r   r?   r@   rA   rN   r   r   s     r   r?   zCombinedSelector.canonical  sM    !!++-v;?]]3'F!]]446PPr   c                     | j                   j                         \  }}}| j                  j                         \  }}}||z   ||z   ||z   fS r/   r   r   s          r   rD   zCombinedSelector.specificity  r   r   )r   r   r   rI   rK   r3   r;   r?   r   rL   rD   r   r   r   r(   r(     sV    ' '3 'T 'd 'a# aQ3 Q)U3S=1 )r   r(   z%^[ \t\r\n\f]*([a-zA-Z]+)[ \t\r\n\f]*$z6^[ \t\r\n\f]*([a-zA-Z]*)#([a-zA-Z0-9_-]+)[ \t\r\n\f]*$z?^[ \t\r\n\f]*([a-zA-Z]*)\.([a-zA-Z][a-zA-Z0-9_-]*)[ \t\r\n\f]*$rn   c           	      <   t         j                  |       }|r%t        t        |j	                  d                  gS t
        j                  |       }|Bt        t        t        |j	                  d      xs d      |j	                  d                  gS t        j                  |       }|Bt        t        t        |j	                  d      xs d      |j	                  d                  gS t        t        |             }| |_        t        t        |            S )a  Parse a CSS *group of selectors*.

    If you don't care about pseudo-elements or selector specificity,
    you can skip this and use :meth:`~GenericTranslator.css_to_xpath`.

    :param css:
        A *group of selectors* as a string.
    :raises:
        :class:`SelectorSyntaxError` on invalid selectors.
    :returns:
        A list of parsed :class:`Selector` objects, one for each
        selector in the comma-separated group.

    r=   r   N   )_el_rematchr+   r   group_id_rer   	_class_rer    TokenStreamtokenizesourcelistparse_selector_group)rn   r   streams      r   parser     s      LLEQ89::LLEgekk!n.DEu{{ST~VWXXOOC Ewu{{1~/EFTUWXYY#'FFM$V,--r   r   r   c              #      K   | j                          	 t        t        |         | j                         dk(  r!| j	                          | j                          ny Iw)NDELIM,)skip_whitespacer+   parse_selectorpeeknext)r   s    r   r   r   +  sP     

v.//;;=N*KKM""$ s   AAc                 z   t        |       \  }}	 | j                          | j                         }|dv r	 ||fS |rt        d|z        |j	                  ddd      rCt        j                  t        | j                         j                        }| j                          nd}t        |       \  }}t        |||      })N)EOFNr   4Got pseudo-element ::%s not at the end of a selector+>~r   )parse_simple_selectorr   r   r   is_delimr   r   rK   r   rb   r(   )r   resultr-   r   r   next_selectors         r   r   r   6  s    26:FN
 {{}22 >!! %FW  ==c3'S&++-*=*=>J""$ J(=f(E%~!&*mD% r   inside_negationc                 ^
   | j                          t        | j                        }| j                         }|j                  dk(  s|dk(  ru|j                  dk(  r| j                         j                  }n| j                          d }| j                         dk(  r!| j                          | j                         }n	|}d }nd x}}t        ||      }d }	 | j                         }|j                  dv s|j                  dddd      s|r|d	k(  rn|rt        d
|z        |j                  dk(  r>t        |t        j                  t        | j                         j                              }n|dk(  r,| j                          t        || j!                               }nZ|dk(  r,| j                          t        d | j!                               }n)|dk(  r| j                          t#        ||       }n|dk(  r| j                          | j                         dk(  rZ| j                          | j!                         }| j                         dk(  r%| j                          t%        |t'        |             }| j!                         }|j)                         dv rt        |      }| j                         dk7  rt+        ||      }t-        |      dk(  rt        | j                        dk(  st        | j                        dk(  r| j                  d   j                  dk(  st        | j                        dk\  r| j                  d   j                  d      s]t        | j                        dk\  r:| j                  d   j                  dk(  r| j                  d   j                  d      st        d      | j                          | j                          |j)                         dk(  rj|rt        d      t/        | d      \  }	}
| j                         }|
rt        d|
d|j0                        |d	k7  rt        d |      t3        ||	      }n|j)                         d!k(  rt5        |       \  }}t7        |||      }nz|j)                         d"v rt9        |       }t;        ||      }nP|j)                         d#k(  rt9        |       }t=        ||      }n%t?        ||t'        |             }nt        d$|      %t        | j                        |k(  rt        d$| j                               ||fS )%NIDENTr   r>   r   r   )Sr   r   r  r  r  r   rt   r  HASHr   rR   )r   r7   )r   r{   )r   r`   )z
first-linezfirst-letterbeforeafterzPseudo[Element[*]:scope]r      r   r     zJGot immediate child pseudo-element ":scope" not at the start of a selectornotzGot nested :not()T)r	  Got pseudo-element ::z inside :not() at zExpected ')', got has)matchesiswherezExpected selector, got ) r   r@   usedr   rg   r   rb   next_ident_or_starr   r  r   r   r   r   rK   r    
next_identparse_attribr)   parse_argumentsr   r"   r9   r  posr$   parse_relative_selectorr%   parse_simple_selector_argumentsr&   r'   r!   )r   r	  selector_startr   r   r   r  r-   r   argumentargument_pseudo_elementr   r   r\   	selectorss                  r   r  r  N  sk    %N;;=DyyGt~599++IKKMI;;=N*KKM//1GGI"")9g.F.2N
{{}II%}}S#sC0DN$:%FW  99&&++c6;;=3F3F"GHF^#KKM66#4#4#67F^#KKMT6#4#4#67F^#KKM!&&1F^#KKM{{}.!'!2!2!4;;=N2KKM%<&(?&N %%'E{{} QQ "%U{{}..<#==FKK(A-,1fkk!n6I6IS6P,1fkk"o6N6Ns6S,1 &B 4 4 ; &B 8 8 = 2=  KKM""${{}%"-.ABB4ID511 {{}*-2DHH>  >)-.NOO!&(3%'(?(G%
I!&*i@"33;FC	!&)4');FC	.vyA!&%1HI%T&KLLq r 6;;>)!"PQQ>!!r   r]   c                     g }	 | j                          | j                         }|j                  dv s|dv r|j                  |       n|dk(  r|S t	        d|      Z)Nr  STRINGNUMBER)r   r  r   -r  Expected an argument, got )r   r   rg   r   r   )r   r\   r   s      r   r"  r"    se    !I
 {{}9955Aa9aT"^#%&NOO r   c                    | j                          d}| j                         }|dv r#|}| j                          | j                         }nt        ddd      }	 |j                  dv s|dv r(|t	        j
                  t        |j                        z  }n%|d	k(  rt        |      }||d   fS t        d
|      | j                         }p)Nr6   )r.  r/  )r   r  )r   r  r   r   r   r#  r+  )r  r  r  r1  )
r   r   r]   rg   r   r   rK   rb   r   r   )r   r   r   r   r  s        r   r$  r$    s    
K;;=DOO
 {{}7CQ/

9955Aa9a6;;sDJJ77K^#;'Fvay((%&NOO{{} r   c                 D   g }	 t        | d      \  }}|rt        d|d      | j                          | j                         }|dv r2| j                          | j                          |j	                  |       n'|dk(  r|j	                  |       	 |S t        d|      )NTr  z inside functionr   r  r1  )r  r   r   r   r   )r   r\   r  r-   r   s        r   r%  r%    s    I
!6vt!D%=KM  	 {{}22KKM""$V$^#V$  &&NOO! r   rN   c                 "   |j                          |j                         }|/|j                         dk7  rt        d|j                               |j                         dk(  rM|j	                          |j                         dk(  rd }|j	                          d}n|}|j                         }d }nd x}}||j                          |j	                         }|dk(  r't        | |t        j                  t        |      dd       S |dk(  rd}no|j                  dd	d
ddd      rK|j                         dk(  r8t        j                  t        |j                        dz   }|j	                          nt        d|      |j                          |j	                         }|j                  dvrt        d|      |j                          |j	                         }|dk7  rt        d|      t        | |t        j                  t        |      ||      S )Nr  zExpected '|', got )r   =z|=)r   r8   r   r6  ^$r>   r  r   !zOperator expected, got )r  r,  zExpected string or ident, got zExpected ']', got )r   r  r   r   r   r   r#   r   r   rK   r  rb   rg   )rN   r   r   r   r   r   rb   s          r   r!  r!    s   
&&(F~&++->9!FKKM"KLL {{}&;;=N*IKKMBI&&(FB	B	z {{}>!(Iv{{3/GSWXX^#B]]3S#sC8fkkm~>]S$**-3BKKM%T&KLL
KKMEzz,,!"OPP
;;=D~!D"BCC(Iv{{3'?UKKr   tokensc                    | D ]  }|j                   dk(  st        d       dj                  d | D              j                         }|dk(  ry|dk(  ry|d	k(  ry
d	|vrdt	        |      fS |j                  d	d      \  }}|sd}n$|dk(  s|dk(  rt	        |dz         }nt	        |      }|sd}||fS t	        |      }||fS )zv
    Parses the arguments for :nth-child() and friends.

    :raises: A list of tokens
    :returns: :``(a, b)``

    r,  z$String tokens not allowed in series.r6   c              3   d   K   | ](  }t        j                  t        |j                         * y wr/   )r   r   rK   rb   ro   s     r   rq   zparse_series.<locals>.<genexpr>1  s     B%C-Bs   .0odd)r   r=   even)r   r   n)r=   r   r   r=   r0  r  1)rg   
ValueErrorru   striprL   split)r:  rd   r   rF   rG   a_as_intb_as_ints          r   parse_seriesrF  &  s      E::!CDDE 	B6BBHHJAEz	
f	
c
!|#a&y773?DAq	
cQ#Xq3w<q6 X q6Xr   c            	           e Zd ZU ej                  dddededd fd       Zej                  dddddedd fd	       Zdedee   dedd fd
ZdefdZ	dede
fdZeed<   edefd       Zedee   fd       ZdefdZy)r]   type_zAtyping.Literal["IDENT", "HASH", "STRING", "S", "DELIM", "NUMBER"]rb   r#  r   c                      y r/   r   clsrH  rb   r#  s       r   __new__zToken.__new__O  s     	r   ztyping.Literal["EOF"]Nc                      y r/   r   rJ  s       r   rL  zToken.__new__X  s    r   c                 D    t         j                  | ||f      }||_        |S r/   )tuplerL  r#  )rK  rH  rb   r#  objs        r   rL  zToken.__new__\  s"    mmC%0
r   c                 N    d| j                   | j                  | j                  fz  S )Nz<%s '%s' at %i>)rg   rb   r#  rS   s    r   r;   zToken.__repr__a  s      DIItzz488#DDDr   valuesc                 @    | j                   dk(  xr | j                  |v S )Nr   )rg   rb   )r2   rR  s     r   r  zToken.is_delimd  s    yyG#<

f(<<r   c                     | d   S )Nr   r   rS   s    r   rg   z
Token.typei      Awr   c                     | d   S rV   r   rS   s    r   rb   zToken.valuem  rU  r   c                     | j                   dk(  rt        | j                        S t        j                  t
        | j                        S )Nr,  )rg   r9   rb   r   r   rK   rS   s    r   rn   z	Token.cssq  s2    99 

##;;sDJJ//r   )r   r   r   r   r   rK   rL   rL  r   r;   boolr  __annotations__propertyrg   rb   rn   r   r   r   r]   r]   N  s   __R  	
 
  __3 D s w  C  C G 
E# E= = = 
Hc   x}  0S 0r   c                   (    e Zd Zdedd fdZdefdZy)EOFTokenr#  r   c           	      Z    t        j                  dt        j                  | dd |            S )Nr\  r   )r   r   r]   rL  )rK  r#  s     r   rL  zEOFToken.__new__y  s"    {{:u}}S%s'KLLr   c                 8    d| j                   | j                  fz  S )Nz
<%s at %i>)rg   r#  rS   s    r   r;   zEOFToken.__repr__|  s    tyy$((333r   N)r   r   r   rL   rL  rK   r;   r   r   r   r\  r\  x  s$    M# M* M4# 4r   r\  c                   H    e Zd ZdZedz   Zdez   ZdZdedeZdedeZy)	TokenMacrosz&\\([0-9a-f]{1,6})(?:\r\n|[ \n\r\t\f])?z|\\[^\n\r\f0-9a-f]z\\(?:\n|\r\n|\r|\f)|z
[^\0-\177]z[_a-z0-9-]|r   z[_a-z]|N)	r   r   r   unicode_escapeescapestring_escapenonasciinmcharnmstartr   r   r   r`  r`    s5    >N33F+f4MH#)84F &1Gr   r`  c            
       .    e Zd Z	 ddedededed   fdZy)		MatchFuncr
   r#  endposr   re.Match[str]c                      y r/   r   )r2   r
   r#  ri  s       r   __call__zMatchFunc.__call__  s     r   N)..)r   r   r   rK   rL   r   rl  r   r   r   rh  rh    s/    =@		$'	7:	o&	r   rh  patternc                 ~    t        j                  | t        t              z  t         j                        j
                  S r/   )recompilevarsr`  
IGNORECASEr   )rm  s    r   _compilers    s'    ::g[ 112==AGGGr   z[ \t\r\n\f]+z[+-]?(?:[0-9]*\.[0-9]+|[0-9]+)z#(?:%(nmchar)s)+z -?(?:%(nmstart)s)(?:%(nmchar)s)*z!([^\n\r\f\\']|%(string_escape)s)*z!([^\n\r\f\\"]|%(string_escape)s)*)'"z\\(.)z\\(?:\n|\r\n|\r|\f)r   r=   r   rj  c                 x    t        | j                  d      d      }|t        j                  kD  rd}t	        |      S )Nr=      i  )rL   r   sys
maxunicodechr)r   	codepoints     r   _replace_unicoder|    s1    EKKNB'I3>>!	y>r   rb   c                 F    t        t        |       } t        t        |       } | S r/   )_sub_unicode_escaper|  _sub_simple_escape_replace_simple)rb   s    r   unescape_identr    s      0%8E6ELr   r   c              #     K   d}t        |       }||k  r"t        | |      }|r t        dd|       |j                         }5t	        | |      }|rLt        t        t        t        |j                                     }t        d||       |j                         }t        | |      }|rOt        t        t        t        |j                         dd              }t        d||       |j                         }| |   }|t        v rt        |   | |dz         }|sJ d       |j                         }||k(  rt        d	|z        | |   |k7  rt        d
|z        t        t        t        t        t        d|j                                           }t        d||       |dz   }t        | |      }|r1|j                         }t        d||       |j                         }|dz   }| || dk(  r!| j                  d|      }|dk(  r|}n|dz  }
t        d| |   |       |dz  }||k  r"||k(  sJ t!        |       y w)Nr   r3  r  r   r  r=   r  z)Should have found at least an empty matchzUnclosed string at %szInvalid string at %sr6   r,  r-  r   z/*z*/r   r   )r@   _match_whitespacer]   end_match_identr  r  r~  r|  r   _match_hash_match_string_by_quoter   _sub_newline_escape_match_numberfindr\  )r   r#  len_sr   rb   quoteend_pospos2s           r   r   r     sV    
CFE
+!!-S#&&))+CQC(&!45Eu{{}!UE ,,))+CA3'&!45Eu{{}UVUWGX!YE s++))+C#***51!qAEEEE5iikG%)*AC*GHHzU")*@3*FGG&#$46I"ekkm6\]E %--A+CaS)KKME%--))+CQwS;$&&t$CbyqGQsVS))qw +z %<<
3-s   H4I8Ic                   l    e Zd Zddee   dee   ddfdZdefdZdefdZ	defdZ
dee   fd	Zdd
Zy)r   Nr:  r   r   c                     g | _         t        |      | _        || _        d | _        d| _        | j                  j                  | _        y NF)r  iterr:  r   peeked_peeking__next__
next_token)r2   r:  r   s      r   r3   zTokenStream.__init__  s:    !#	6l'+++..r   c                 D   | j                   rhd| _         | j                  j                  t        j                  t
        | j                               t        j                  t
        | j                        S | j                         }| j                  j                  |       |S r  )r  r  r   r   r   r]   r  r  r2   r   s     r   r   zTokenStream.next  si    ==!DMIIV[[<=;;udkk22??$DIIT"Kr   c                     | j                   s| j                         | _        d| _         t        j                  t
        | j                        S )NT)r  r  r  r   r   r]   rS   s    r   r   zTokenStream.peek  s3    }}//+DK DM{{5$++..r   c                     | j                         }|j                  dk7  rt        d|      t        j                  t
        |j                        S )Nr  zExpected ident, got )r   rg   r   r   r   rK   rb   r  s     r   r   zTokenStream.next_ident  s<    yy{99%$&HII{{3

++r   c                     | j                         }|j                  dk(  r|j                  S |dk(  ry t        d|      )Nr  r  zExpected ident or '*', got )r   rg   rb   r   r  s     r   r  zTokenStream.next_ident_or_star  s<    yy{99::^#%&OPPr   c                 d    | j                         }|j                  dk(  r| j                          y y )Nr  )r   rg   r   )r2   r   s     r   r   zTokenStream.skip_whitespace#  s'    yy{99IIK r   r/   )r   N)r   r   r   r   r]   r   rK   r3   r   r   r   r  r   r   r   r   r   r     s`    /x / /QU /e /e /,C ,QHSM Qr   )F)Hr   rx  ro  r   r   r   r   r   r   r   r   r	   rK   r   	Exceptionr   SyntaxErrorr   rI   rJ   r+   r    r)   r!   r"   r$   r%   r&   r'   r#   r   r   r(   rp  r   r   r   r   r   r   rX  r  r"  r$  r%  r!  rL   rF  r]   r\  r`  TYPE_CHECKINGProtocolrh  rs  r  r  r  r  r  subr  ra  Ir~  r  methodcallerr  r|  r  r   r   r   r   r   <module>r     s    	   M M M8 8 8
I >- > 
 /45D DN *", ",J > *) )0 )  )F@ @6 >D DN 8 *) ): 
<	= 
M	N BJJYZ	.s .tH~ .P 8H3E "= "U4-9P3P-Q "2 49q"q",0q"
4-(()q"h
PM 
Pd7m 
PM eGX<M6N .M d4j ,'L4 'L 'L6 'LT"'* "uS#X "P'0E#x}$% '0T4u 42 2 
FOO Hc Hk H _- :;)*:;	6	7	6	7 
  RZZ)--  bjj!;!;RTTBFF  bjj!78<<  ((''3O  # # A A AH+ +r   