B ÙË`W›ã @sUdZddlZddlZddlmZddlmZddlmZddlm Z ddlm Z ej rlddl Z dd lmZe d ejej¡Ze d ejej¡Zed d ddddddddddg ƒZeddddddgƒZejejejejejejdœZ ej!e"ej#ej$fe%d<Gd d!„d!ƒZ&dS)"z8Parse tokens from the lexer into nodes for the compiler.éNé)Únodes)ÚTemplateAssertionError)ÚTemplateSyntaxError)Údescribe_token)Údescribe_token_expr)Ú EnvironmentÚ_ImportIncludeÚ _MacroCallÚforÚifÚblockZextendsÚprintZmacroZincludeÚfromÚimportÚsetÚwithÚ autoescapeÚeqÚneÚltZlteqÚgtZgteq)ÚaddÚsubÚmulÚdivÚfloordivÚmodÚ _math_nodesc @s eZdZdZdƒdeejeejeejeddœdd„Zdefeeje ej eddœd d „Z ejeej ej ed feje dd œd d„Zd„eeje ddœdd„Zd…ejej ed feje ddœdd„Zd†ejej ed fedœdd„Zd‡eje ejdœdd„Zejejej ejfdœdd„Zdˆej ed feej ejdœd d!„Zejejejfdœd"d#„Zejdœd$d%„Zejdœd&d'„Z ej!dœd(d)„Z"ej#dœd*d+„Z$ej%dœd,d-„Z&ej'dœd.d/„Z(e)ee)d0œd1d2„Z*ej+dœd3d4„Z,ej-dœd5d6„Z.ej/dœd7d8„Z0e1dd9œd:d;„Z2ej3dœdd?„Z6ej7dœd@dA„Z8ej9dœdBdC„Z:e;je;jd‹eeejej ed feejej?ej=ej fdIœdKdG„Z>dŒeej@dLœdMdN„ZAej@dœdOdP„ZBej@dœdQdR„ZCej@dœdSdT„ZDej@dœdUdV„ZEej@dœdWdX„ZFej@dœdYdZ„ZGej@dœd[d\„ZHej@dœd]d^„ZIej@dœd_d`„ZJdeej@daœdbdc„ZKej@dœddde„ZLdŽeeejej ed feejej ej@fdfœdgdh„ZMej dœdidj„ZNejOdœdkdl„ZPej@ej@d9œdmdn„ZQej@ej@d9œdodp„ZRej@ejejSejTfd9œdqdr„ZUej@dœdsdt„ZVej dœdudv„ZWej@ejXd9œdwdx„ZYdejej@eejej@dyœdzd{„ZZej@ej@d9œd|d}„Z[dejej ed fej ejd~œdd€„Z\ej]dœdd‚„Z^dS)‘ÚParserz…This is the central parsing class Jinja uses. It's passed to extensions and can be used to parse expressions or statements. Nr)Ú environmentÚsourceÚnameÚfilenameÚstateÚreturncCst||_| ||||¡|_||_||_d|_i|_x,| ¡D] }x|jD]}|j |j|<qFWq:Wd|_ g|_ g|_ dS)NFr) r Ú _tokenizeÚstreamr"r#ÚclosedÚ extensionsZiter_extensionsZtagsÚparseÚ_last_identifierÚ _tag_stackÚ_end_token_stack)Úselfr r!r"r#r$Ú extensionÚtag©r1ú>/opt/alt/python37/lib/python3.7/site-packages/jinja2/parser.pyÚ__init__3s zParser.__init__z te.NoReturn)ÚmsgÚlinenoÚexcr%cCs(|dkr|jjj}||||j|jƒ‚dS)z Convenience method that raises `exc` with the message, passed line number or last line number as well as the current name and filename. N)r'Úcurrentr5r"r#)r.r4r5r6r1r1r2ÚfailJs  z Parser.fail.)r"Úend_token_stackr5r%cCsÔtƒ}x|D]}| tt|ƒ¡q W|rDd tttt|dƒƒ¡}nd}|dkrXdg}nd|›dg}|r |dk rŽ||krŽ| d|›d¡n| d|›d¡|jr¾| d|jd›d¡| d  |¡|¡dS) Nz or éÿÿÿÿzUnexpected end of template.zEncountered unknown tag Ú.z\You probably made a nesting mistake. Jinja is expecting this tag, but currently looking for z*Jinja was looking for the following tags: z/The innermost block that needs to be closed is ú ) rÚupdateÚmaprÚjoinÚreprÚappendr,r8)r.r"r9r5ZexpectedZexprsZcurrently_lookingÚmessager1r1r2Ú _fail_ut_eofXs( zParser._fail_ut_eof)r"r5r%cCs| ||j|¡dS)z¤Called if the parser encounters an unknown tag. Tries to fail with a human readable error message that could help to identify the problem. N)rCr-)r.r"r5r1r1r2Úfail_unknown_tag€szParser.fail_unknown_tag)Ú end_tokensr5r%cCs.t|jƒ}|dk r| |¡| d||¡dS)z9Like fail_unknown_tag but for end of template situations.N)Úlistr-rArC)r.rEr5Ústackr1r1r2Úfail_eof‰s  zParser.fail_eof)Úextra_end_rulesr%cCs,|jjjdkrdS|dk r(|jj |¡SdS)zAre we at the end of a tuple?)Ú variable_endÚ block_endÚrparenTNF)r'r7ÚtypeÚtest_any)r.rIr1r1r2Ú is_tuple_end”s zParser.is_tuple_end)r5r%cCs8|jd7_t tj¡}tjj|d|j›|d|S)zDReturn a new free identifier as :class:`~jinja2.nodes.InternalName`.rZfi)r5)r+ÚobjectÚ__new__rÚ InternalNameÚNoder3)r.r5Úrvr1r1r2Úfree_identifieržs zParser.free_identifier)r%cCsÒ|jj}|jdkr | d|j¡|j |j¡d}zŠ|jtkrZt |d|jjj›ƒ}|ƒS|jdkrl|  ¡S|jdkr~|  ¡S|j   |j¡}|dk rœ||ƒS|j ¡d}| |j|j¡Wd|rÌ|j ¡XdS) zParse a single statement.r"ztag name expectedTZparse_ÚcallÚfilterNF)r'r7rMr8r5r,rAÚvalueÚ_statement_keywordsÚgetattrÚparse_call_blockÚparse_filter_blockr)ÚgetÚpoprD)r.ÚtokenZpop_tagÚfÚextr1r1r2Úparse_statement¥s*     zParser.parse_statementF)rEÚ drop_needler%cCsL|j d¡|j d¡| |¡}|jjjdkr:| |¡|rHt|jƒ|S)aRParse multiple statements into a list until one of the end tokens is reached. This is used to parse the body of statements as it also parses template data if appropriate. The parser checks first if the current token is a colon and skips it if there is one. Then it checks for the block end and parses until if one of the `end_tokens` is reached. Per default the active token in the stream at the end of the call is the matched end token. If this is not wanted `drop_needle` can be set to `True` and the end token is removed. ÚcolonrKÚeof)r'Úskip_ifÚexpectÚsubparser7rMrHÚnext)r.rErcÚresultr1r1r2Úparse_statementsÂs     zParser.parse_statementscCsft|jƒj}|jdd}|j d¡r<| ¡}tj|||dS| d¡}|j ddd}tj ||||dS)zParse an assign statement.T)Úwith_namespaceÚassign)r5N)z name:endset)rc) rir'r5Úparse_assign_targetrfÚ parse_tuplerÚAssignÚ parse_filterrkÚ AssignBlock)r.r5ÚtargetÚexprZ filter_nodeÚbodyr1r1r2Ú parse_setßs    zParser.parse_setc Csž|j d¡j}|jdd}|j d¡|jddd}d}|j d ¡rL| ¡}|j d ¡}| d ¡}t|jƒj d krxg}n|jd dd}t j |||||||dS)zParse a for loop.zname:for)zname:in)rIzname:inF)zname:recursive)Ú with_condexprrINzname:ifzname:recursive)z name:endforz name:elseZendfor)z name:endforT)rc)r5) r'rgr5rnrorfÚparse_expressionrkrirXrÚFor)r.r5rsÚiterÚtestÚ recursiveruÚelse_r1r1r2Ú parse_forês      zParser.parse_forcCsœtj|j d¡jd}}x||jdd|_| d¡|_g|_ g|_ t |jƒ}| d¡rxtj|jj jd}|j   |¡qn| d¡r’|jdd d |_ PqW|S) zParse an if construct.zname:if)r5F)rw)z name:elifz name:elsez name:endifz name:elifz name:else)z name:endifT)rc)rÚIfr'rgr5ror{rkruZelif_r}rir7rA)r.Únoderjr_r1r1r2Úparse_ifýs     zParser.parse_ifcCs–tjt|jƒjd}g}g}xX|jjjdkrt|r<|j d¡| ¡}|  d¡|  |¡|j d¡|  |  ¡¡qW||_ ||_ |jddd|_|S) N)r5rKÚcommaÚparamrm)z name:endwithT)rc)rÚWithrir'r5r7rMrgrnÚset_ctxrArxÚtargetsÚvaluesrkru)r.r€r†r‡rsr1r1r2Ú parse_withs    zParser.parse_withcCsDtjt|jƒjd}t d| ¡¡g|_|jddd|_ t  |g¡S)N)r5r)zname:endautoescapeT)rc) rZScopedEvalContextModifierrir'r5ÚKeywordrxÚoptionsrkruÚScope)r.r€r1r1r2Úparse_autoescape szParser.parse_autoescapecCs¢tjt|jƒjd}|j d¡j|_|j d¡|_ |j d¡|_ |jj j dkrX|  d¡|jddd |_|j rŒtd d „|jDƒƒsŒ|  d ¡|j d |j¡|S)N)r5r"z name:scopedz name:requiredrzpBlock names in Jinja have to be valid Python identifiers and may not contain hyphens, use an underscore instead.)z name:endblockT)rccss0|](}|jD]}t|tjƒo$|j ¡Vq qdS)N)rÚ isinstanceÚ TemplateDataÚdataÚisspace)Ú.0ruZchildr1r1r2ú ;sz%Parser.parse_block..z7Required blocks can only contain comments or whitespacezname:)rÚBlockrir'r5rgrXr"rfZscopedZrequiredr7rMr8rkruÚall)r.r€r1r1r2Ú parse_block&s  zParser.parse_blockcCs"tjt|jƒjd}| ¡|_|S)N)r5)rÚExtendsrir'r5rxÚtemplate)r.r€r1r1r2Ú parse_extendsDs zParser.parse_extends)r€Údefaultr%cCsH|jj dd¡r>|j ¡ d¡r>t|jƒjdk|_|j ¡n||_|S)Nz name:withz name:withoutz name:contextr) r'r7rNÚlookr{rirXÚ with_contextÚskip)r.r€r™r1r1r2Úparse_import_contextIs zParser.parse_import_contextcCsbtjt|jƒjd}| ¡|_|jj d¡rP|j  ¡ d¡rPd|_ |j  d¡nd|_ |  |d¡S)N)r5z name:ignorez name:missingTéF) rÚIncluderir'r5rxr—r7r{ršZignore_missingrœr)r.r€r1r1r2Ú parse_includeUs zParser.parse_includecCsFtjt|jƒjd}| ¡|_|j d¡|jddj |_ |  |d¡S)N)r5zname:asT)Ú name_onlyF) rÚImportrir'r5rxr—rgrnr"rsr)r.r€r1r1r2Ú parse_importas   zParser.parse_importcstjtˆjƒjd‰ˆ ¡ˆ_ˆj d¡gˆ_t dœ‡‡fdd„ }x¶ˆjrXˆj d¡ˆjj j dkrì|ƒrnPˆj dd }|j  d ¡r˜ˆjd |jtd ˆj d ¡rƈj dd }ˆj |j |j f¡nˆj |j ¡|ƒsèˆjj j dkrøPqFˆj d¡qFWtˆdƒsdˆ_ˆS)N)r5z name:import)r%csBˆjjjdkr>ˆj ¡ d¡r>tˆjƒjdkˆ_ˆj ¡dSdS)N>Úwithoutrz name:contextrTF)r'r7rXršr{rir›rœr1)r€r.r1r2Ú parse_contextns z(Parser.parse_from..parse_contextr‚r"T)r¡Ú_z4names starting with an underline can not be imported)r6zname:asr›F)rÚ FromImportrir'r5rxr—rgÚnamesÚboolr7rMrnr"Ú startswithr8rrfrAÚhasattrr›)r.r¥rsÚaliasr1)r€r.r2Ú parse_fromhs6        zParser.parse_from)r€r%cCsžg}|_g}|_|j d¡xl|jjjdkrŒ|r@|j d¡|jdd}| d¡|j d¡rr|  |  ¡¡n|r€|  d¡|  |¡q"W|j d¡dS) NÚlparenrLr‚T)r¡rƒrmz-non-default argument follows default argument) ÚargsÚdefaultsr'rgr7rMrnr…rfrArxr8)r.r€r¯r°Úargr1r1r2Úparse_signature–s        zParser.parse_signaturecCsvtjt|jƒjd}|jjjdkr.| |¡n g|_g|_ |  ¡}t |tj ƒs\|  d|j¡||_|jddd|_|S)N)r5r®z expected call)z name:endcallT)rc)rÚ CallBlockrir'r5r7rMr²r¯r°rxrÚCallr8rVrkru)r.r€Z call_noder1r1r2r[¦s  zParser.parse_call_blockcCs8tjt|jƒjd}|jddd|_|jddd|_|S)N)r5T)Ú start_inline)zname:endfilter)rc) rÚ FilterBlockrir'r5rqrWrkru)r.r€r1r1r2r\µszParser.parse_filter_blockcCsBtjt|jƒjd}|jddj|_| |¡|jddd|_ |S)N)r5T)r¡)z name:endmacro)rc) rÚMacrorir'r5rnr"r²rkru)r.r€r1r1r2Ú parse_macro»s  zParser.parse_macrocCsTtjt|jƒjd}g|_x4|jjjdkrN|jr<|j d¡|j |  ¡¡qW|S)N)r5rKr‚) rÚOutputrir'r5r7rMrgrArx)r.r€r1r1r2Ú parse_printÂs zParser.parse_printzte.Literal[True])Ú with_tupler¡r%cCsdS)Nr1)r.r»r¡r1r1r2rnËszParser.parse_assign_targetT)r»r¡rIrlr%cCsdS)Nr1)r.r»r¡rIrlr1r1r2rnÑscCsÄ|rN|j ¡jdkrN|j d¡}t|jƒ|j d¡}tj|j|j|jd}nL|rt|j d¡}tj |jd|jd}n&|rˆ|j d|d}n|  ¡}|  d¡|  ¡sÀ| dt|ƒj ¡›|j¡|S)aParse an assignment target. As Jinja allows assignments to tuples, this function can parse all allowed assignment targets. Per default assignments to tuples are parsed, that can be disable however by setting `with_tuple` to `False`. If only assignments to names are wanted `name_only` can be set to `True`. The `extra_end_rules` parameter is forwarded to the tuple parsing function. If `with_namespace` is enabled, a namespace assignment may be parsed. Údotr")r5ZstoreT)Ú simplifiedrIzcan't assign to )r'ršrMrgrirÚNSRefrXr5ÚNameroÚ parse_primaryr…Z can_assignr8Ú__name__Úlower)r.r»r¡rIrlr_Úattrrsr1r1r2rnÛs"      )rwr%cCs|r | ¡S| ¡S)zºParse an expression. Per default all expressions are parsed, if the optional `with_condexpr` parameter is set to `False` conditional expressions are not parsed. )Úparse_condexprÚparse_or)r.rwr1r1r2rxszParser.parse_expressioncCsf|jjj}| ¡}xN|j d¡r`| ¡}|j d¡r>| ¡}nd}tj||||d}|jjj}qW|S)Nzname:ifz name:else)r5)r'r7r5rÅrfrÄrZCondExpr)r.r5Zexpr1Zexpr2Zexpr3r1r1r2rÄs   zParser.parse_condexprcCsJ|jjj}| ¡}x2|j d¡rD| ¡}tj|||d}|jjj}qW|S)Nzname:or)r5)r'r7r5Ú parse_andrfrZOr)r.r5ÚleftÚrightr1r1r2rÅs zParser.parse_orcCsJ|jjj}| ¡}x2|j d¡rD| ¡}tj|||d}|jjj}qW|S)Nzname:and)r5)r'r7r5Ú parse_notrfrZAnd)r.r5rÇrÈr1r1r2rÆ&s zParser.parse_andcCs4|jj d¡r,t|jƒj}tj| ¡|dS| ¡S)Nzname:not)r5) r'r7r{rir5rÚNotrÉÚ parse_compare)r.r5r1r1r2rÉ/s zParser.parse_notcCsÚ|jjj}| ¡}g}xª|jjj}|tkrLt|jƒ| t  || ¡¡¡nh|j  d¡rp| t  d| ¡¡¡nD|jj  d¡r²|j  ¡  d¡r²|j  d¡| t  d| ¡¡¡nP|jjj}qW|sÊ|Stj|||dS)Nzname:inÚinzname:notržZnotin)r5)r'r7r5Ú parse_math1rMÚ_compare_operatorsrirArZOperandrfr{ršrœZCompare)r.r5rtZopsÚ token_typer1r1r2rË5s&     zParser.parse_comparecCsb|jjj}| ¡}xJ|jjjdkr\t|jjj}t|jƒ| ¡}||||d}|jjj}qW|S)N)rr)r5)r'r7r5Ú parse_concatrMrri)r.r5rÇÚclsrÈr1r1r2rÍLs  zParser.parse_math1cCsb|jjj}| ¡g}x*|jjjdkr>t|jƒ| | ¡¡qWt|ƒdkrT|dStj ||dS)NÚtilderr)r5) r'r7r5Ú parse_math2rMrirAÚlenrZConcat)r.r5r¯r1r1r2rÐWs    zParser.parse_concatcCsb|jjj}| ¡}xJ|jjjdkr\t|jjj}t|jƒ| ¡}||||d}|jjj}qW|S)N)rrrr)r5)r'r7r5Ú parse_powrMrri)r.r5rÇrÑrÈr1r1r2rÓas  zParser.parse_math2cCsV|jjj}| ¡}x>|jjjdkrPt|jƒ| ¡}tj|||d}|jjj}qW|S)NÚpow)r5)r'r7r5Ú parse_unaryrMrirZPow)r.r5rÇrÈr1r1r2rÕls  zParser.parse_pow)Ú with_filterr%cCsˆ|jjj}|jjj}|dkr.parseFr‚TrzExpected an expression, got rà)r5)r'r7r5rÀrxrÚExprrgrOrArMr8rÚTuple) r.r½rwrIrår5r*r¯Zis_tupler1)r.r2roªs2    zParser.parse_tuplecCsn|j d¡}g}x@|jjjdkrP|r0|j d¡|jjjdkr@P| | ¡¡qW|j d¡tj||jdS)NræÚrbracketr‚)r5) r'rgr7rMrArxrÚListr5)r.r_Úitemsr1r1r2réìs   zParser.parse_listcCs”|j d¡}g}xf|jjjdkrv|r0|j d¡|jjjdkr@P| ¡}|j d¡| ¡}| tj|||jd¡qW|j d¡tj ||jdS)NrçZrbracer‚rd)r5) r'rgr7rMrxrArZPairr5ÚDict)r.r_rïÚkeyrXr1r1r2rêøs    zParser.parse_dictcCsFx@|jjj}|dks|dkr(| |¡}q|dkr<| |¡}qPqW|S)Nr¼rær®)r'r7rMÚparse_subscriptÚ parse_call)r.r€rÏr1r1r2rÙs   zParser.parse_postfixcCs`xZ|jjj}|dkr | |¡}q|dkrB|jjjdkrB| |¡}q|dkrV| |¡}qPqW|S)NÚpiper"Úisr®)r'r7rMrqrXÚ parse_testró)r.r€rÏr1r1r2rÚs    zParser.parse_filter_exprcCs t|jƒ}|jdkr„|jj}t|jƒ|jdkrFtj||jd|jdS|jdkr^| d|j¡tj |j|jd}tj ||d|jdS|jdkrg}x0|jjjdkrÄ|r´|j  d ¡|  |  ¡¡q–W|j  d¡t|ƒd krè|d }ntj|d|jd}tj ||d|jdS| d |j¡dS) Nr¼r"rà)r5rãzexpected name or numberrærír‚rrzexpected subscript expression)rir'rMr7rÚGetattrrXr5r8rèÚGetitemrgrAÚparse_subscribedrÔrì)r.r€r_Z attr_tokenr±r¯r1r1r2rò#s.          zParser.parse_subscriptcCsò|jjj}|jjjdkr*t|jƒdg}n*| ¡}|jjjdkrD|St|jƒ|g}|jjjdkrn| d¡n(|jjjdkrŒ| | ¡¡n | d¡|jjjdkrØt|jƒ|jjjdkrÌ| | ¡¡qâ| d¡n | d¡tj|d|iŽS)Nrd)rír‚r5) r'r7r5rMrirxrArZSlice)r.r5r¯r€r1r1r2rùBs*        zParser.parse_subscribedc s€ˆj d¡‰g}g}d}d}d}tddœ‡‡fdd„ }x.ˆjjjdkrf|rjˆj d¡ˆjjjdkrjPˆjjjdkr ||dkoˆ|dkƒtˆjƒˆ ¡}nÀˆjjjd krÎ||dkƒtˆjƒˆ ¡}n’ˆjjjd kr4ˆj ¡jd kr4||dkƒˆjjj}ˆj  d ¡ˆ ¡}|  t j |||j d ¡n,||dkoN|dkoN| ƒ|  ˆ ¡¡d}q:Wˆj d¡||||fS)Nr®F)rtr%cs|sˆ dˆj¡dS)Nz+invalid syntax for function call expression)r8r5)rt)r.r_r1r2Úensurejsz&Parser.parse_call_args..ensurerLr‚rrÖr"rmrž)r5T)r'rgr©r7rMrirxršrXrœrArr‰r5) r.r¯ÚkwargsÚdyn_argsÚ dyn_kwargsZ require_commarúrñrXr1)r.r_r2Úparse_call_argsbs@           zParser.parse_call_argscCs0|jj}| ¡\}}}}tj||||||jdS)N)r5)r'r7rþrr´r5)r.r€r_r¯rûrürýr1r1r2ró“szParser.parse_call)r€rµr%c Cs¾x¸|jjjdks|r¸|s"t|jƒ|j d¡}|j}x2|jjjdkrft|jƒ|d|j d¡j7}q6W|jjjdkrˆ| ¡\}}}}ng}g}d}}tj|||||||j d}d}qW|S)Nrôr"r¼r;r®)r5F) r'r7rMrirgrXrþrZFilterr5) r.r€rµr_r"r¯rûrürýr1r1r2rqšs"   zParser.parse_filterc Cs$t|jƒ}|jj d¡r(t|jƒd}nd}|j d¡j}x2|jjjdkrlt|jƒ|d|j d¡j7}qrär®rærçr"rárãz name:elsezname:orzname:andzname:isz'You cannot chain multiple tests with is)r5)rir'r7r{rgrXrMrþrNr8rÀrÙrZTestr5rÊ) r.r€r_Znegatedr"rürýrûr¯Zarg_noder1r1r2rö±s6      zParser.parse_test)rEr%csLg‰g‰ˆj}|dk r"|j |¡ddœ‡‡fdd„ }zúxî|jr&|jj}|jdkr||jrp|tj|j|jdƒt |jƒq:|jdkr®t |jƒ||j ddƒ|j  d ¡q:|jd kr|ƒt |jƒ|dk rä|jjj |ŽräˆS|  ¡}t|tƒrˆ |¡n ˆ |¡|j  d ¡q:td ƒ‚q:W|ƒWd|dk rF|j ¡XˆS) N)r%cs8ˆr4ˆdj}ˆ tjˆdd…|d¡ˆdd…=dS)Nr)r5)r5rArr¹)r5)ruÚ data_bufferr1r2Ú flush_dataås z#Parser.subparse..flush_datar)r5Zvariable_beginT)rwrJZ block_beginrKzinternal parsing error)rAr-r'r7rMrXrrŽr5rirorgrNrbrrFÚextendÚAssertionErrorr^)r.rEZadd_datarr_rTr1)rurÿr2rhÛsB               zParser.subparsecCs"tj| ¡dd}| |j¡|S)z0Parse the whole template into a `Template` node.r)r5)rÚTemplaterhZset_environmentr )r.rjr1r1r2r* s z Parser.parse)NNN)N)NN)N)N)F)..)TFNF)TFNF)T)T)FTNF)F)N)_rÁÚ __module__Ú __qualname__Ú__doc__ÚstrÚtZOptionalr3rÚintÚTyper8rîrìrCrDrHr©rOrrRrUZUnionrSrbrkrprrrvryr~rrr„rˆr‹rŒr“r•r–r˜r rrŸr r¢r£r§r­r r²r³r[r¶r\r·r¸r¹rºÚtypingZoverloadr¿rnr¾rërxrÄrÅrÆrÉrËrÍrÐrÓrÕr×rÀrorérðrêrÙrÚr÷røròrùrþr´rórqrörhrr*r1r1r1r2r.s¬ $  "   . " $       $<   1+/r)'rr rrârÚ exceptionsrrZlexerrrZ TYPE_CHECKINGZtyping_extensionsZter rZTypeVarr¢rŸr r·r³r Ú frozensetrYrÎZAddZSubZMulZDivZFloorDivZModrrðrr rëÚ__annotations__rr1r1r1r2ÚsB      $