U
    luf                     @   s  d Z ddlZddlZddlZddlmZmZ ddlmZ ddl	m
Z
mZmZmZmZ ddlmZmZmZmZmZmZ ddlmZ dd	d
ddddddddddgZedZdddddgZedd ZG dd deZG dd ded Z G d!d de Z!G d"d de"Z#G d#d$ d$Z$e$ Z%G d%d& d&e&Z'G d'd( d(Z(d)d Z)G d*d+ d+Z*e* Z+d,d Z,G d-d dZ-G d.d deZ.G d/d0 d0eZ/G d1d	 d	e e/d Z0G d2d dZ1G d3d
 d
e0Z2d4d5 Z3G d6d7 d7e/Z4G d8d9 d9e0e4d Z5dS ):z
    pygments.lexer
    ~~~~~~~~~~~~~~

    Base lexer classes.

    :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS.
    :license: BSD, see LICENSE for details.
    N)apply_filtersFilter)get_filter_by_name)ErrorTextOther
Whitespace
_TokenType)get_bool_optget_int_optget_list_optmake_analysatorFutureguess_decode)	regex_optLexer
RegexLexerExtendedRegexLexerDelegatingLexerLexerContextincludeinheritbygroupsusingthisdefaultwordsline_rez.*?
)s   ﻿utf-8)s     zutf-32)s     zutf-32be)s   zutf-16)s   zutf-16bec                 C   s   dS )N         xr    r    2/tmp/pip-unpacked-wheel-7eq1ciah/pygments/lexer.py<lambda>"       r$   c                   @   s   e Zd ZdZdd ZdS )	LexerMetaz
    This metaclass automagically converts ``analyse_text`` methods into
    static methods which always return float values.
    c                 C   s(   d|krt |d |d< t| |||S )Nanalyse_text)r   type__new__)Zmcsnamebasesdr    r    r#   r)   +   s    zLexerMeta.__new__N)__name__
__module____qualname____doc__r)   r    r    r    r#   r&   %   s   r&   c                   @   sj   e Zd ZdZdZg Zg Zg Zg ZdZ	dZ
dZdd Zdd Zdd	 Zd
d Zdd ZdddZdd ZdS )r   a  
    Lexer for a specific language.

    See also :doc:`lexerdevelopment`, a high-level guide to writing
    lexers.

    Lexer classes have attributes used for choosing the most appropriate
    lexer based on various criteria.

    .. autoattribute:: name
       :no-value:
    .. autoattribute:: aliases
       :no-value:
    .. autoattribute:: filenames
       :no-value:
    .. autoattribute:: alias_filenames
    .. autoattribute:: mimetypes
       :no-value:
    .. autoattribute:: priority

    Lexers included in Pygments should have an additional attribute:

    .. autoattribute:: url
       :no-value:

    Lexers included in Pygments may have additional attributes:

    .. autoattribute:: _example
       :no-value:

    You can pass options to the constructor. The basic options recognized
    by all lexers and processed by the base `Lexer` class are:

    ``stripnl``
        Strip leading and trailing newlines from the input (default: True).
    ``stripall``
        Strip all leading and trailing whitespace from the input
        (default: False).
    ``ensurenl``
        Make sure that the input ends with a newline (default: True).  This
        is required for some lexers that consume input linewise.

        .. versionadded:: 1.3

    ``tabsize``
        If given and greater than 0, expand tabs in the input (default: 0).
    ``encoding``
        If given, must be an encoding name. This encoding will be used to
        convert the input string to Unicode, if it is not already a Unicode
        string (default: ``'guess'``, which uses a simple UTF-8 / Locale /
        Latin1 detection.  Can also be ``'chardet'`` to use the chardet
        library, if it is installed.
    ``inencoding``
        Overrides the ``encoding`` if given.
    Nr   c                 K   s   || _ t|dd| _t|dd| _t|dd| _t|dd| _|dd	| _|d
pZ| j| _g | _	t
|ddD ]}| | qpdS )a  
        This constructor takes arbitrary options as keyword arguments.
        Every subclass must first process its own options and then call
        the `Lexer` constructor, since it processes the basic
        options like `stripnl`.

        An example looks like this:

        .. sourcecode:: python

           def __init__(self, **options):
               self.compress = options.get('compress', '')
               Lexer.__init__(self, **options)

        As these options must all be specifiable as strings (due to the
        command line usage), there are various utility functions
        available to help with that, see `Utilities`_.
        stripnlTstripallFensurenltabsizer   encodingguessZ
inencodingfiltersr    N)optionsr
   r1   r2   r3   r   r4   getr5   r7   r   
add_filter)selfr8   filter_r    r    r#   __init__   s    zLexer.__init__c                 C   s(   | j rd| jj| j f S d| jj S d S )Nz<pygments.lexers.%s with %r>z<pygments.lexers.%s>)r8   	__class__r-   r;   r    r    r#   __repr__   s
    zLexer.__repr__c                 K   s&   t |tst|f|}| j| dS )z8
        Add a new stream filter to this lexer.
        N)
isinstancer   r   r7   append)r;   r<   r8   r    r    r#   r:      s    
zLexer.add_filterc                 C   s   dS )a  
        A static method which is called for lexer guessing.

        It should analyse the text and return a float in the range
        from ``0.0`` to ``1.0``.  If it returns ``0.0``, the lexer
        will not be selected as the most probable one, if it returns
        ``1.0``, it will be selected immediately.  This is used by
        `guess_lexer`.

        The `LexerMeta` metaclass automatically wraps this function so
        that it works like a static method (no ``self`` or ``cls``
        parameter) and the return value is automatically converted to
        `float`. If the return value is an object that is boolean `False`
        it's the same as if the return values was ``0.0``.
        Nr    )textr    r    r#   r'      s    zLexer.analyse_textc           	   
   C   s  t |ts| jdkr"t|\}}n| jdkrzddl}W n, tk
rd } ztd|W 5 d}~X Y nX d}tD ].\}}||rn|t|d 	|d} qqn|dkr|
|dd }|	|dpd	d}|}n&|	| j}|d
r|td
d }n|d
r|td
d }|dd}|dd}| jrB| }n| jrT|d}| jdkrl|| j}| jr|ds|d7 }|S )zVApply preprocessing such as decoding the input, removing BOM and normalizing newlines.r6   chardetr   NzkTo enable chardet encoding guessing, please install the chardet library from http://chardet.feedparser.org/replacei   r5   r   u   ﻿z

)rA   strr5   r   rD   ImportError_encoding_map
startswithlendecodedetectr9   rE   r2   stripr1   r4   
expandtabsr3   endswith)	r;   rC   _rD   edecodedbomr5   encr    r    r#   _preprocess_lexer_input   sJ    






zLexer._preprocess_lexer_inputFc                    s4      fdd}| }|s0t| j }|S )ae  
        This method is the basic interface of a lexer. It is called by
        the `highlight()` function. It must process the text and return an
        iterable of ``(tokentype, value)`` pairs from `text`.

        Normally, you don't need to override this method. The default
        implementation processes the options recognized by all lexers
        (`stripnl`, `stripall` and so on), and then yields all tokens
        from `get_tokens_unprocessed()`, with the ``index`` dropped.

        If `unfiltered` is set to `True`, the filtering mechanism is
        bypassed even if filters are defined.
        c                  3   s$     D ]\} }}||fV  q
d S N)get_tokens_unprocessed)rR   tvr;   rC   r    r#   streamer	  s    z"Lexer.get_tokens.<locals>.streamer)rW   r   r7   )r;   rC   Z
unfilteredr]   streamr    r\   r#   
get_tokens   s    
zLexer.get_tokensc                 C   s   t dS )aS  
        This method should process the text and return an iterable of
        ``(index, tokentype, value)`` tuples where ``index`` is the starting
        position of the token within the input text.

        It must be overridden by subclasses. It is recommended to
        implement it as a generator to maximize effectiveness.
        N)NotImplementedErrorr\   r    r    r#   rY     s    	zLexer.get_tokens_unprocessed)F)r-   r.   r/   r0   r*   aliases	filenamesZalias_filenames	mimetypespriorityurlZ_exampler=   r@   r:   r'   rW   r_   rY   r    r    r    r#   r   1   s    9/
)	metaclassc                   @   s$   e Zd ZdZefddZdd ZdS )r   a   
    This lexer takes two lexer as arguments. A root lexer and
    a language lexer. First everything is scanned using the language
    lexer, afterwards all ``Other`` tokens are lexed using the root
    lexer.

    The lexers from the ``template`` lexer package use this base lexer.
    c                 K   s0   |f || _ |f || _|| _tj| f| d S rX   )
root_lexerlanguage_lexerneedler   r=   )r;   Z_root_lexerZ_language_lexerZ_needler8   r    r    r#   r=   '  s    zDelegatingLexer.__init__c                 C   s   d}g }g }| j |D ]H\}}}|| jkrP|rF|t||f g }||7 }q||||f q|rx|t||f t|| j|S )N )rh   rY   ri   rB   rL   do_insertionsrg   )r;   rC   Zbuffered
insertionsZ
lng_bufferirZ   r[   r    r    r#   rY   -  s    


z&DelegatingLexer.get_tokens_unprocessedN)r-   r.   r/   r0   r   r=   rY   r    r    r    r#   r     s   	c                   @   s   e Zd ZdZdS )r   zI
    Indicates that a state should include rules from another state.
    Nr-   r.   r/   r0   r    r    r    r#   r   D  s   c                   @   s   e Zd ZdZdd ZdS )_inheritzC
    Indicates the a state should inherit from its superclass.
    c                 C   s   dS )Nr   r    r?   r    r    r#   r@   O  s    z_inherit.__repr__N)r-   r.   r/   r0   r@   r    r    r    r#   ro   K  s   ro   c                   @   s    e Zd ZdZdd Zdd ZdS )combinedz:
    Indicates a state combined from multiple states.
    c                 G   s   t | |S rX   )tupler)   )clsargsr    r    r#   r)   Z  s    zcombined.__new__c                 G   s   d S rX   r    )r;   rs   r    r    r#   r=   ]  s    zcombined.__init__N)r-   r.   r/   r0   r)   r=   r    r    r    r#   rp   U  s   rp   c                   @   sF   e Zd ZdZdd ZdddZdddZdd	d
Zdd Zdd Z	dS )_PseudoMatchz:
    A pseudo match object constructed from a string.
    c                 C   s   || _ || _d S rX   )_text_start)r;   startrC   r    r    r#   r=   g  s    z_PseudoMatch.__init__Nc                 C   s   | j S rX   )rv   r;   argr    r    r#   rw   k  s    z_PseudoMatch.startc                 C   s   | j t| j S rX   )rv   rL   ru   rx   r    r    r#   endn  s    z_PseudoMatch.endc                 C   s   |rt d| jS )NzNo such group)
IndexErrorru   rx   r    r    r#   groupq  s    z_PseudoMatch.groupc                 C   s   | j fS rX   )ru   r?   r    r    r#   groupsv  s    z_PseudoMatch.groupsc                 C   s   i S rX   r    r?   r    r    r#   	groupdicty  s    z_PseudoMatch.groupdict)N)N)N)
r-   r.   r/   r0   r=   rw   rz   r|   r}   r~   r    r    r    r#   rt   b  s   


rt   c                     s   d fdd	}|S )zL
    Callback that yields multiple actions for each group in the match.
    Nc                 3   s   t  D ]\}}|d krqqt|tkrR||d }|r||d ||fV  q||d }|d k	r|r|||d |_|| t||d ||D ]}|r|V  qq|r| |_d S )N   )	enumerater(   r	   r|   rw   posrt   rz   )lexermatchctxrm   actiondataitemrs   r    r#   callback  s&     
zbygroups.<locals>.callback)Nr    )rs   r   r    r   r#   r   }  s    c                   @   s   e Zd ZdZdS )_ThiszX
    Special singleton used for indicating the caller class.
    Used by ``using``.
    Nrn   r    r    r    r#   r     s   r   c                    sj   i dkr: d}t|ttfr.|d< nd|fd<  tkrTdfdd	}nd	 fdd	}|S )
a  
    Callback that processes the match with a different lexer.

    The keyword arguments are forwarded to the lexer, except `state` which
    is handled separately.

    `state` specifies the state that the new lexer will start in, and can
    be an enumerable such as ('root', 'inline', 'string') or a simple
    string which is assumed to be on top of the root state.

    Note: For that to work, `_other` must not be an `ExtendedRegexLexer`.
    statestackrootNc                 3   sj   r | j | jf }n| }| }|j| f D ]\}}}|| ||fV  q<|rf| |_d S rX   )updater8   r>   rw   rY   r|   rz   r   r   r   r   Zlxsrm   rZ   r[   )	gt_kwargskwargsr    r#   r     s    zusing.<locals>.callbackc                 3   s^    | j  f }| }|j| fD ]\}}}|| ||fV  q0|rZ| |_d S rX   )r   r8   rw   rY   r|   rz   r   r   _otherr   r   r    r#   r     s    
)N)N)poprA   listrq   r   )r   r   r   r   r    r   r#   r     s    


c                   @   s   e Zd ZdZdd ZdS )r   z
    Indicates a state or state action (e.g. #pop) to apply.
    For example default('#pop') is equivalent to ('', Token, '#pop')
    Note that state tuples may be used as well.

    .. versionadded:: 2.0
    c                 C   s
   || _ d S rX   )r   )r;   r   r    r    r#   r=     s    zdefault.__init__N)r-   r.   r/   r0   r=   r    r    r    r#   r     s   c                   @   s"   e Zd ZdZdddZdd ZdS )	r   z
    Indicates a list of literal words that is transformed into an optimized
    regex that matches any of the words.

    .. versionadded:: 2.0
    rj   c                 C   s   || _ || _|| _d S rX   )r   prefixsuffix)r;   r   r   r   r    r    r#   r=     s    zwords.__init__c                 C   s   t | j| j| jdS )Nr   r   )r   r   r   r   r?   r    r    r#   r9     s    z	words.getN)rj   rj   )r-   r.   r/   r0   r=   r9   r    r    r    r#   r     s   
c                   @   sJ   e Zd ZdZdd Zdd Zdd Zdd	 ZdddZdd Z	dd Z
d
S )RegexLexerMetazw
    Metaclass for RegexLexer, creates the self._tokens attribute from
    self.tokens on the first instantiation.
    c                 C   s    t |tr| }t||jS )zBPreprocess the regular expression component of a token definition.)rA   r   r9   recompiler   )rr   regexrflagsr   r    r    r#   _process_regex  s    
zRegexLexerMeta._process_regexc                 C   s&   t |tks"t|s"td|f |S )z5Preprocess the token component of a token definition.z2token type must be simple type or callable, not %r)r(   r	   callableAssertionError)rr   tokenr    r    r#   _process_token  s    zRegexLexerMeta._process_tokenc                 C   s  t |trd|dkrdS ||kr$|fS |dkr0|S |dd dkrRt|dd  S dsbtd| nt |trd	| j }|  jd
7  _g }|D ],}||kstd| || ||| q|||< |fS t |tr |D ] }||ks|dkstd| q|S dstd| dS )z=Preprocess the state transition action of a token definition.#pop#pushN   z#pop:Fzunknown new state %rz_tmp_%dr   zcircular state ref %r)r   r   zunknown new state zunknown new state def %r)	rA   rH   intr   rp   _tmpnameextend_process_staterq   )rr   	new_stateunprocessed	processedZ	tmp_stateitokensZistater    r    r#   _process_new_state   s>    



 z!RegexLexerMeta._process_new_statec                 C   s  t |tkstd| |d dks0td| ||kr@|| S g  }||< | j}|| D ].}t|tr||ks~td| || ||t| qZt|trqZt|t	r| 
|j||}|tdjd|f qZt |tkstd| z| |d ||}W n> tk
rD }	 ztd	|d || |	f |	W 5 d}	~	X Y nX | |d
 }
t|dkrhd}n| 
|d ||}|||
|f qZ|S )z%Preprocess a single state definition.zwrong state name %rr   #zinvalid state name %rzcircular state reference %rrj   Nzwrong rule def %rz+uncompilable regex %r in state %r of %r: %sr      )r(   rH   r   flagsrA   r   r   r   ro   r   r   r   rB   r   r   r   rq   r   	Exception
ValueErrorr   rL   )rr   r   r   r   tokensr   Ztdefr   rexerrr   r    r    r#   r   #  sJ    



 zRegexLexerMeta._process_stateNc                 C   s<   i  }| j |< |p| j| }t|D ]}| ||| q$|S )z-Preprocess a dictionary of token definitions.)_all_tokensr   r   r   )rr   r*   	tokendefsr   r   r    r    r#   process_tokendefO  s
    zRegexLexerMeta.process_tokendefc           
   
   C   s   i }i }| j D ]}|jdi }| D ]\}}||}|dkr||||< z|t}W n tk
rp   Y q(Y nX |||< q(||d}|dkrq(||||d < z|t}	W n tk
r   Y q(X ||	 ||< q(q|S )a  
        Merge tokens from superclasses in MRO order, returning a single tokendef
        dictionary.

        Any state that is not defined by a subclass will be inherited
        automatically.  States that *are* defined by subclasses will, by
        default, override that state in the superclass.  If a subclass wishes to
        inherit definitions from a superclass, it can use the special value
        "inherit", which will cause the superclass' state definition to be
        included at that point in the state.
        r   Nr   )__mro____dict__r9   itemsindexr   r   r   )
rr   r   inheritablectoksr   r   ZcuritemsZinherit_ndxZnew_inh_ndxr    r    r#   get_tokendefsW  s0    


zRegexLexerMeta.get_tokendefsc                 O   sL   d| j kr:i | _d| _t| dr(| jr(n| d|  | _tj	| f||S )z:Instantiate cls after preprocessing its token definitions._tokensr   token_variantsrj   )
r   r   r   hasattrr   r   r   r   r(   __call__)rr   rs   kwdsr    r    r#   r     s    
zRegexLexerMeta.__call__)N)r-   r.   r/   r0   r   r   r   r   r   r   r   r    r    r    r#   r     s   #,
1r   c                   @   s$   e Zd ZdZejZi ZdddZdS )r   z
    Base for simple stateful regular expression-based lexers.
    Simplifies the lexing process so that you need only
    provide a list of states and regular expressions.
    r   c                 c   s  d}| j }t|}||d  }|D ](\}}}	|||}
|
r"|dk	rrt|tkrb|||
 fV  n|| |
E dH  |
 }|	dk	rHt|	tr|	D ]D}|dkrt|dkr|	  q|dkr|
|d  q|
| qnbt|	trt|	t|kr|dd= n
||	d= n,|	dkr*|
|d  nds<td|	 ||d  } qq"zP|| d	krd
g}|d
 }|td	fV  |d7 }W q|t|| fV  |d7 }W q tk
r   Y qY qX qdS )z~
        Split ``text`` into (tokentype, text) pairs.

        ``stack`` is the initial stack (default: ``['root']``)
        r   r   Nr   r   r   Fwrong state def: %rrF   r   )r   r   r(   r	   r|   rz   rA   rq   rL   r   rB   r   absr   r   r   r{   )r;   rC   r   r   r   Z
statestackstatetokensrexmatchr   r   mr   r    r    r#   rY     sR    




z!RegexLexer.get_tokens_unprocessedN)r   )	r-   r.   r/   r0   r   	MULTILINEr   r   rY   r    r    r    r#   r     s   c                   @   s"   e Zd ZdZdddZdd ZdS )r   z9
    A helper object that holds lexer position data.
    Nc                 C   s*   || _ || _|pt|| _|p"dg| _d S )Nr   )rC   r   rL   rz   r   )r;   rC   r   r   rz   r    r    r#   r=     s    zLexerContext.__init__c                 C   s   d| j | j| jf S )NzLexerContext(%r, %r, %r))rC   r   r   r?   r    r    r#   r@     s
      zLexerContext.__repr__)NN)r-   r.   r/   r0   r=   r@   r    r    r    r#   r     s   
c                   @   s   e Zd ZdZdddZdS )r   zE
    A RegexLexer that uses a context object to store its state.
    Nc                 c   s<  | j }|st|d}|d }n|}||jd  }|j}|D ]`\}}}|||j|j}	|	r:|dk	rt|tkr|j||	 fV  |	 |_n$|| |	|E dH  |s||jd  }|dk	rt	|t
r|D ]P}
|
dkrt|jdkr|j  q|
dkr|j|jd  q|j|
 qnlt	|trZt|t|jkrL|jdd= n|j|d= n0|dkrx|j|jd  ndstd	| ||jd  } q6q:zz|j|jkrW q8||j d
krdg|_|d }|jtd
fV  | jd7  _W q6|jt||j fV  | jd7  _W q6 tk
r4   Y q8Y q6X q6dS )z
        Split ``text`` into (tokentype, text) pairs.
        If ``context`` is given, use this lexer context instead.
        r   r   r   Nr   r   r   Fr   rF   )r   r   r   rC   r   rz   r(   r	   r|   rA   rq   rL   r   rB   r   r   r   r   r   r{   )r;   rC   contextr   r   r   r   r   r   r   r   r    r    r#   rY     s`    




z)ExtendedRegexLexer.get_tokens_unprocessed)NN)r-   r.   r/   r0   rY   r    r    r    r#   r     s   c              	   c   s  t | } zt| \}}W n  tk
r8   |E dH  Y dS X d}d}|D ]\}}}|dkr\|}d}	|r|t| |kr||	||  }
|
r|||
fV  |t|
7 }|D ]"\}}}|||fV  |t|7 }q|| }	zt| \}}W q` tk
r   d}Y qY q`X q`|	t|k rF||||	d fV  |t||	 7 }qF|r|pHd}|D ]$\}}}|||fV  |t|7 }qNzt| \}}W n  tk
r   d}Y qY nX q:dS )ag  
    Helper for lexers which must combine the results of several
    sublexers.

    ``insertions`` is a list of ``(index, itokens)`` pairs.
    Each ``itokens`` iterable should be inserted at position
    ``index`` into the token stream given by the ``tokens``
    argument.

    The result is a combined token stream.

    TODO: clean up the code here.
    NTr   F)iternextStopIterationrL   )rl   r   r   r   realposZinsleftrm   rZ   r[   ZoldiZtmpvalZit_indexZit_tokenZit_valuepr    r    r#   rk   O  sN    

rk   c                   @   s   e Zd ZdZdd ZdS )ProfilingRegexLexerMetaz>Metaclass for ProfilingRegexLexer, collects regex timing info.c                    sL   t |tr t|j|j|jdn|t|tjf fdd	}|S )Nr   c                    s`    j d fddg}t }| ||}t }|d  d7  < |d  || 7  < |S )Nr   r   r   r   )
_prof_data
setdefaulttimer   )rC   r   endposinfot0rest1rr   Zcompiledr   r   r    r#   
match_func  s    z:ProfilingRegexLexerMeta._process_regex.<locals>.match_func)	rA   r   r   r   r   r   r   sysmaxsize)rr   r   r   r   r   r    r   r#   r     s    

z&ProfilingRegexLexerMeta._process_regexN)r-   r.   r/   r0   r   r    r    r    r#   r     s   r   c                   @   s"   e Zd ZdZg ZdZdddZdS )ProfilingRegexLexerzFDrop-in replacement for RegexLexer that does profiling of its regexes.   r   c                 #   s    j ji  t ||E d H   j j }tdd | D  fdddd}tdd |D }t	  t	d j j
t||f  t	d	 t	d
d  t	d |D ]}t	d|  qt	d	 d S )Nc                 s   sN   | ]F\\}}\}}|t |d dddd |d| d| | fV  qdS )zu'z\\\NA   i  )reprrO   rE   ).0r   rnrZ   r    r    r#   	<genexpr>  s     
z=ProfilingRegexLexer.get_tokens_unprocessed.<locals>.<genexpr>c                    s
   |  j  S rX   )_prof_sort_indexr!   r?   r    r#   r$     r%   z<ProfilingRegexLexer.get_tokens_unprocessed.<locals>.<lambda>T)keyreversec                 s   s   | ]}|d  V  qdS )   Nr    )r   r"   r    r    r#   r     s     z2Profiling result for %s lexing %d chars in %.3f mszn==============================================================================================================z$%-20s %-64s ncalls  tottime  percall)r   r   zn--------------------------------------------------------------------------------------------------------------z%-20s %-65s %5d %8.4f %8.4f)r>   r   rB   r   rY   r   sortedr   sumprintr-   rL   )r;   rC   r   rawdatar   Z	sum_totalr,   r    r?   r#   rY     s(    
z*ProfilingRegexLexer.get_tokens_unprocessedN)r   )r-   r.   r/   r0   r   r   rY   r    r    r    r#   r     s   r   )6r0   r   r   r   Zpygments.filterr   r   Zpygments.filtersr   Zpygments.tokenr   r   r   r   r	   Zpygments.utilr
   r   r   r   r   r   Zpygments.regexoptr   __all__r   r   rJ   staticmethodZ_default_analyser(   r&   r   r   rH   r   ro   r   rq   rp   rt   r   r   r   r   r   r   r   r   r   r   rk   r   r   r    r    r    r#   <module>   sd   
        
 m'2 )aH@