fқ>UdZddlZddlZddlmZddlmZddlmZddlm Z ddlm Z ejr ddl Z dd lmZej d ej"ej$Zej d ej(ej*Zegd Zegd Zej4ej6ej8ej:ej<ej>dZ ejBe"ejFejHfe%d<GddZ&y)z8Parse tokens from the lexer into nodes for the compiler.N)nodes)TemplateAssertionError)TemplateSyntaxError)describe_token)describe_token_expr) Environment_ImportInclude _MacroCall) forifblockextendsprintmacroincludefromimportsetwith autoescape)eqneltlteqgtgteq)addsubmuldivfloordivmod _math_nodesc eZdZdZ dSdddedej edej edej ed df d Zdefd ed ej e d ejed dfdZ dej edejejedfd ej e d dfdZ dTded ej e d dfdZ dUdej ejedfd ej e d dfdZ dTdej ejedfd efdZdTd ej e d ej(fdZd ej,ej.ejej.ffdZ dVdejedfded ejej.fdZd ej,ej4ej6ffdZd ej:fdZd ej>fdZ d ejBfdZ"d ejFfd Z$d ejJfd!Z&d ejNfd"Z(d#e)d$ed e)fd%Z*d ejVfd&Z,d ejZfd'Z.d ej^fd(Z0d#e1d dfd)Z2d ejffd*Z4d ejjfd+Z6d ejnfd,Z8d ejrfd-Z:e;jx dWd.ed/d0d ejzfd1Z>e;jx dXd.ed/edej ejedfd2ed ej,ej~ejzejff d3Z> dXd.ed/edej ejedfd2ed ej,ej~ejzejff d4Z>dYd5ed ejfd6ZAd ejfd7ZBd ejfd8ZCd ejfd9ZDd ejfd:ZEd ejfd;ZFd ejfd<ZGd ejfd=ZHd ejfd>ZId ejfd?ZJdYd@ed ejfdAZKd ejfdBZL dZdCed5edej ejedfdDed ej,ejejff dEZMd ejfdFZNd ejfdGZPd#ejd ejfdHZQd#ejd ejfdIZRd#ejd ej,ejejffdJZUd ejfdKZVd ejejejejejej ejej ejffdLZXd#ejd ejfdMZZ dVd#ej ejdNed ej ejfdOZ[d#ejd ejfdPZ\ dTdej ejedfd ejej.fdQZ]d ejfdRZ_y)[ParserzThis is the central parsing class Jinja uses. It's passed to extensions and can be used to parse expressions or statements. N environmentr sourcenamefilenamestatereturnc$||_|j|||||_||_||_d|_i|_|jD],}|jD]}|j|j |<.d|_ g|_ g|_ y)NFr) r' _tokenizestreamr)r*closed extensionsiter_extensionstagsparse_last_identifier _tag_stack_end_token_stack)selfr'r(r)r*r+ extensiontags V/var/lib/jenkins/workspace/mettalog/venv/lib/python3.12/site-packages/jinja2/parser.py__init__zParser.__init__5s'!++FD(EJ       %446I ~~'0$&7!"');=msglinenoexcz te.NoReturnc| |jjj}||||j|j)zConvenience method that raises `exc` with the message, passed line number or last line number as well as the current name and filename. )r/currentr?r)r*)r8r>r?r@s r;failz Parser.failLs7 >[[((//F#vtyy$--88r=end_token_stack.c t}|D]!}|jtt|#|r1dj tt tt|d}nd}|dg}nd|dg}|r1|||vr|j d|dn|j d|d|jr"|j d|jdd|jd j ||y) 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  ) rupdatemaprjoinreprappendr6rC)r8r)rDr?expectedexprscurrently_lookingmessages r; _fail_ut_eofzParser._fail_ut_eofZs  #u$E OOC 3U; <% 17D#1?23FGH2 !%  <45G1$;|j||j|y)zCalled if the parser encounters an unknown tag. Tries to fail with a human readable error message that could help to identify the problem. N)rRr7)r8r)r?s r;fail_unknown_tagzParser.fail_unknown_tags $ 5 5v>r= end_tokensczt|j}||j||jd||y)z9Like fail_unknown_tag but for end of template situations.N)listr7rMrR)r8rUr?stacks r;fail_eofzParser.fail_eofs8 T**+  ! LL $ $v.r=extra_end_rulesc|jjjdvry|%|jjj|Sy)zAre we at the end of a tuple?) variable_end block_endrparenTF)r/rBtypetest_any)r8rZs r; is_tuple_endzParser.is_tuple_endsD ;;   # #'N N  (;;&&//@ @r=c|xjdz c_tjtj}tj j |d|j||S)zDReturn a new free identifier as :class:`~jinja2.nodes.InternalName`.rfir?)r5object__new__r InternalNameNoder<)r8r?rvs r;free_identifierzParser.free_identifiersS " ^^E.. / B"T%:%:$; +>+D+D*E"FGs ##%{{f$,,.##%{{h&..0##%//%%ekk2C4y##% OO   !G  ! !%++u|| <##%w##%s&*AG1 G1 G1.G1AG11H drop_needlec*|jjd|jjd|j|}|jjj dk(r|j ||rt|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. colonr]eof)r/skip_ifexpectsubparserBr_rYnext)r8rUr{results r;parse_statementszParser.parse_statementssr G$ ;'z* ;;   # #u , MM* %    r=cdt|jj}|jd}|jj dr(|j }t j|||S|jd}|jdd}t j||||S)zParse an assign statement.T)with_namespaceassignrdN)z name:endsetr{) rr/r?parse_assign_targetr parse_tuplerAssign parse_filterr AssignBlock)r8r?targetexpr filter_nodebodys r; parse_setzParser.parse_setsdkk")))))> ;;  x (##%D<<V< <''- $$%54$H  d6JJr=c &|jjdj}|jd}|jjd|j dd}d}|jj d r|j }|jj d }|jd }t|jjd k(rg}n|jd d}tj|||||||S)zParse a for loop.zname:for)name:in)rZrF)name:recursive) with_condexprrZNname:ifr) name:endfor name:elseendfor)rTrrd) r/rr?rrrparse_expressionrrrorFor)r8r?ritertest recursiverelse_s r; parse_forzParser.parse_fors##J/66)),)G 9%1D   ;;  y )((*DKK''(89 $$%AB   " "h .E))*:)MEyytUD)FSSr=c4tj|jjdjx}} |j d|_|jd|_g|_ g|_ t|j}|j drPtj|jjj}|jj||j dr|jd d |_ |S) zParse an if construct.rrdTFr) name:elifr name:endifrr)rr)rIfr/rr?rrrrelif_rrrBrM)r8noderrvs r;parse_ifzParser.parse_ifs (:(:9(E(L(LMMv((u(=DI--.VWDIDJDJ%Ezz+&xxt{{':':'A'AB ##D)K(#44_RV4W  r=c`tjt|jj}g}g}|jj j dk7r|r|jjd|j}|jd|j||jjd|j|j|jj j dk7r||_ ||_ |jdd|_|S) Nrdr]commaparamr)z name:endwithTr)rWithrr/r?rBr_rrset_ctxrMrtargetsvaluesrr)r8rrrrs r; parse_withzParser.parse_withszzdkk!2!9!9:&(%'kk!!&&+5 ""7+--/F NN7 # NN6 " KK  x ( MM$//1 2kk!!&&+5  ))*;)N  r=ctjt|jj}tj d|j g|_|jdd|_ tj|gS)Nrdr)zname:endautoescapeTr) rScopedEvalContextModifierrr/r?KeywordroptionsrrScoper8rs r;parse_autoescapezParser.parse_autoescape"sh..d4;;6G6N6NO lD4I4I4KLM ))*At)T {{D6""r=ctjt|jj}|jj dj |_|jjd|_ |jjd|_ |jjjdk(r|jd|jdd |_|jrY|jD]J}t!|tj"rt%d |jDs:|jd L|jjd |jz|S) Nrdr)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:endblockTrc3K|]<}t|tj xs|jj >ywN) isinstancer TemplateDatadataisspace).0 output_nodes r; z%Parser.parse_block..>sKB$#;0B0BCC6&++33556BsAAz7Required blocks can only contain comments or whitespacezname:)rBlockrr/r?rror)rscopedrequiredrBr_rCrrrOutputany)r8r body_nodes r; parse_blockzParser.parse_block(s{{$t{{"3":":;KK&&v.44 kk))-8  ++O< ;;   # #u , II?  ))*<$)O ==!YY !)U\\:cB(1B? IIWX ' Gdii/0 r=ctjt|jj}|j |_|SNrd)rExtendsrr/r?rtemplaters r; parse_extendszParser.parse_extendsHs4}}D$5$<$<=--/  r=rdefaultc8|jjjddrl|jjj drCt |jj dk(|_|jj|S||_|S)Nz name:withz name:without name:contextr) r/rBr`lookrrro with_contextskip)r8rrs r;parse_import_contextzParser.parse_import_contextMs~ ;;   ' '  kk %%n5 $T[[ 1 7 76 AD  KK    !(D  r=ctjt|jj}|j |_|jjjdrL|jjjdr#d|_ |jjdnd|_ |j|dS)Nrdz name:ignorez name:missingTF) rIncluderr/r?rrrBrrignore_missingrrrs r; parse_includezParser.parse_includeYs}}D$5$<$<=--/ ;;   # #M 2t{{7G7G7I7N7N 8 #'D  KK  Q "'D ((t44r=c.tjt|jj}|j |_|jjd|jdj|_ |j|dS)Nrdname:asT name_onlyF) rImportrr/r?rrrrr)rrrs r; parse_importzParser.parse_importeso||4 #4#;#;<--/  9%...>CC ((u55r=ctjtjjj _jjdg_dtffd } jrjjdjjjdk(r|rnjd}|jjd r"jd |jt jj#d rDjd}jj%|j|jfn%jj%|j|s#jjjdk7rnjjdot'd sd_S)Nrdz name:importr,c jjjdvrkjjj drBt jjdk(_jjyy)N>rwithoutrrTF)r/rBrorrrrr)rr8sr; parse_contextz(Parser.parse_from..parse_contextrso{{""((-++""$)).9$($5$;$;v$E!   "r=Trr)r_z4names starting with an underline can not be imported)r@rrF)r FromImportrr/r?rrrnamesboolrBr_rr) startswithrCrrrMhasattrr)r8rraliasrs` @r; parse_fromzParser.parse_fromlstDKK'8'?'?@--/  =)  t zz ""7+{{""''61 ?11D1A;;))#.IIN 2 ;;&&y1 44t4DEJJ%%v{{EJJ&?@JJ%%fkk2 ?dkk&9&9&>&>'&I ""6*+,t^, %D  r=c`gx}|_gx}|_|jjd|jjj dk7r|r|jjd|j d}|jd|jjdr |j|jn|r|jd|j||jjj dk7r|jjdy) Nlparenr^rTrrrz-non-default argument follows default argument) argsdefaultsr/rrBr_rrrrMrrC)r8rrrargs r;parse_signaturezParser.parse_signaturesty#%%4= 8$kk!!&&(2 ""7+**T*:C KK {{""8, 5 5 78 IJ KK kk!!&&(2 8$r=ctjt|jj}|jj j dk(r|j|ng|_g|_ |j}t|tjs|jd|j||_|jdd|_|S)Nrdrz expected call)z name:endcallTr)r CallBlockrr/r?rBr_rrrrrCallrCrmrr)r8r call_nodes r;rszParser.parse_call_blocksd4;;&7&>&>? ;;   # #x /   &DIDM))+ )UZZ0 IIot{{ 3 ))*;)N  r=ctjt|jj}|j dd|_|jdd|_|S)NrdT) start_inline)zname:endfilterr) r FilterBlockrr/r?rrnrrrs r;rtzParser.parse_filter_blocksU  T[[(9(@(@A''4'@ ))*=4)P  r=ctjt|jj}|j dj |_|j||jdd|_ |S)NrdTr)z name:endmacror) rMacrorr/r?rr)rrrrs r; parse_macrozParser.parse_macrose{{$t{{"3":":;,,t,<AA  T"))*<$)O  r=ctjt|jj}g|_|jj j dk7rt|jr|jjd|jj|j|jj j dk7rt|S)Nrdr]r) rrrr/r?rBr_rrMrrs r; parse_printzParser.parse_prints||4 #4#;#;< kk!!&&+5zz ""7+ JJ  d335 6kk!!&&+5 r= with_tuplerzte.Literal[True]cyr)r8rrs r;rzParser.parse_assign_targetsr=rcyrr)r8rrrZrs r;rzParser.parse_assign_targets9KK&&v.E  ;;%%f-D[[djjNF KK&&v.EZZ WU\\JF))#_*++- NN7 #  " II"4<#8#8#>#>#@"CDfmm  r=rcF|r|jS|jS)zParse an expression. Per default all expressions are parsed, if the optional `with_condexpr` parameter is set to `False` conditional expressions are not parsed. )parse_condexprparse_or)r8rs r;rzParser.parse_expressions" &&( (}}r=c|jjj}|j}|jj dr|j}|jj dr|j }nd}t j||||}|jjj}|jj dr|S)Nrrrd)r/rBr?rrrrCondExpr)r8r?expr1expr2expr3s r;rzParser.parse_condexpr s$$++ kk!!),MMOE{{"";/++-NN5%vFE[[((//Fkk!!), r=cd|jjj}|j}|jj drd|j}t j |||}|jjj}|jj drd|S)Nname:orrd)r/rBr? parse_andrrOrr8r?leftrights r;rzParser.parse_ors$$++~~kk!!),NN$E88D%7D[[((//Fkk!!), r=cd|jjj}|j}|jj drd|j}t j |||}|jjj}|jj drd|S)Nname:andrd)r/rBr? parse_notrrAndrs r;rzParser.parse_and$s$$++~~kk!!*-NN$E99T58D[[((//Fkk!!*- r=c|jjjdrDt|jj}t j |j|S|jS)Nname:notrd) r/rBrrr?rNotr parse_compare)r8r?s r;rzParser.parse_not-sU ;;   # #J /$++&--F99T^^-f= =!!##r=c|jjj}|j}g} |jjj}|t vrIt |j|jtj||jn|jjdr4|jtjd|jn|jjjdrx|jjjdrO|jjd|jtjd|jnn"|jjj}|s|Stj|||S)Nrinr"rnotinrd)r/rBr? parse_math1r__compare_operatorsrrMrOperandrrrrCompare)r8r?rops token_types r;r$zParser.parse_compare3sL$$++!,,11J//T[[! 5==T5E5E5GHI$$Y/ 5==t/?/?/ABC$$))*5$++:J:J:L:Q:Q;   # 5==$2B2B2DEF[[((//FK}}T3v66r=c|jjj}|j}|jjjdvrt |jjj}t |j|j}||||}|jjj}|jjjdvr|S)N)rrrd)r/rBr? parse_concatr_r$rr8r?rclsrs r;r(zParser.parse_math1Js$$++  "kk!!&&.8dkk11667C  %%'EtU62D[[((//F kk!!&&.8  r=c|jjj}|jg}|jjjdk(rXt |j|j |j|jjjdk(rXt|dk(r|dStj||S)Ntilderrrd) r/rBr? parse_math2r_rrMlenrConcat)r8r?rs r;r/zParser.parse_concatUs$$++  "#kk!!&&'1   KK((* +kk!!&&'1 t9>7N||D00r=c|jjj}|j}|jjjdvrt |jjj}t |j|j}||||}|jjj}|jjjdvr|S)N)r r!r"r#rd)r/rBr? parse_powr_r$rr0s r;r4zParser.parse_math2_s$$++~~kk!!&&*KKdkk11667C  NN$EtU62D[[((//F kk!!&&*KK  r=c|jjj}|j}|jjjdk(rt |j|j}t j|||}|jjj}|jjjdk(r|S)Npowrd)r/rBr? parse_unaryr_rrPowrs r;r8zParser.parse_powjs$$++!kk!!&&%/  $$&E99T58D[[((//F kk!!&&%/  r= with_filterc|jjj}|jjj}|dk(rD KK  x ( ZZ: %??$D  ZZ8 #??$D  II N5$9#<=u|| L r=rrOcxjjj}|r j}n%|r j}ndt j ffd }g}d} |rjjdj|rn^|j|jjjdk(rd}nn!jjj}|s:|r|dS|s1jdtjjt j|d| S) aWorks like `parse_expression` but if multiple expressions are delimited by a comma a :class:`~jinja2.nodes.Tuple` node is created. This method could also return a regular expression instead of a tuple if no commas where found. The default parsing mode is a full tuple. If `simplified` is `True` only names and literals are parsed. The `no_condexpr` parameter is forwarded to :meth:`parse_expression`. Because tuples do not require delimiters and may end in a bogus comma an extra hint is needed that marks the end of a tuple. For example for loops support tuples between `for` and `in`. In that case the `extra_end_rules` is set to ``['name:in']``. `explicit_parentheses` is true if the parsing was triggered by an expression in parentheses. This is used to figure out if an empty tuple is a valid expression or not. r,c(jdS)NFr)r)r8sr;r4z!Parser.parse_tuple..parses,,5,AAr=FTrrzExpected an expression, got rJrd)r/rBr?r rrExprrrarMr_rCrTuple) r8rrrZrOr?r4ris_tuples ` r;rzParser.parse_tuples2$$++ &&E ))E B5:: B$& ""7+  1 KK {{""''72[[((//FAw ( *4;;+>+>?BD {{477r=c|jjd}g}|jjjdk7r|r|jjd|jjjdk(rnC|j |j |jjjdk7r|jjdt j||jS)NrPrbracketrrd) r/rrBr_rMrrListr?)r8rvitemss r;rSzParser.parse_lists "":.$&kk!!&&*4 ""7+{{""'':5 LL..0 1 kk!!&&*4 :&zz% 55r=c|jjd}g}|jjjdk7r|r|jjd|jjjdk(rn|j }|jjd|j }|j t j|||j|jjjdk7r|jjdt j||jS)NrQrbracerr}rd) r/rrBr_rrMrPairr?Dict)r8rvr^keyros r;rTzParser.parse_dicts ""8,$&kk!!&&(2 ""7+{{""''83'')C KK  w '))+E LLCszzB Ckk!!&&(2 8$zz% 55r=c |jjj}|dk(s|dk(r|j|}n|dk(r|j |}n |SW)NrrPr)r/rBr_parse_subscript parse_callr8rr-s r;rAzParser.parse_postfixs^,,11JU"jJ&>++D1x't, r=c |jjj}|dk(r|j|}nT|dk(r5|jjjdk(r|j |}n|dk(r|j |}n |S)Npiper)isr)r/rBr_rro parse_testrfrgs r;rBzParser.parse_filter_exprs,,11JV#((.v%$++*=*=*C*Ct*Kt,x't, r=cTt|j}|jdk(r|jj}t|j|jdk(r-t j ||j d|jS|jdk7r|jd|jt j|j |j}t j||d|jS|jdk(rg}|jjjdk7r`|r|jjd |j|j|jjjdk7r`|jjdt|d k(r|d }n"t j|d|j}t j||d|jS|jd |jy) Nrr)rJrdrMzexpected name or numberrPr\rrrzexpected subscript expression)rr/r_rBrGetattrror?rCrRGetitemrrMparse_subscribedr5rY)r8rrv attr_tokenrrs r;rezParser.parse_subscript!sT[[! :: ,,J  &(}}***F5<<I- 3Z5F5FG++j..z7H7HIC==sF5<<H H :: #')D++%%**j8KK&&w/ D1134++%%**j8 KK  z *4yA~1gkk$u||D==sF5<<H H 15<<@r=c|jjj}|jjjdk(rt |jdg}nM|j }|jjjdk7r|St |j|g}|jjjdk(r|j dnS|jjjdvr |j |j n|j d|jjjdk(rit |j|jjjdvr |j |j n#|j dn|j dtj|d|iS)Nr})r\rr?) r/rBr?r_rrrMrSlice)r8r?rrs r;rozParser.parse_subscribed@s^$$++ ;;   # #w .  6D((*D{{""''72  6D ;;   # #w . KK  [[ % %-B B KK--/ 0 KK  ;;   # #w .  {{""''/DD D1134 D! KK {{40&00r=c0 jjd g}g}d}d}d}dtddf fd }jjjdk7r|r@jjdjjjdk(rnډjjjdk(r7||duxr|dut jj }nYjjjd k(r1||dut jj }njjjd k(rjjjd k(r||dujjj}jjd j }|jtj|||j n4||duxr |duxr| |jj d}jjjdk7rjjd||||fS)NrFrr,cD|sjdjyy)Nz+invalid syntax for function call expression)rCr?)rr8rvs r;ensurez&Parser.parse_call_args..ensureos GVr=r^rr r:r)rrrdT)r/rrrBr_rrrrorrMrrr?) r8rkwargsdyn_args dyn_kwargs require_commarurcrorvs ` @r;parse_call_argszParser.parse_call_args`s+ ""8,   W W$ Wkk!!&&(2 ""7+;;&&++x7{{""''50x4'>J$,>?T[[!002$$))U2zT)*T[[!!224 KK'',,6 ((*//8;:-.++--33CKK$$Q' 113EMM%--U5<<"PQ8t+Q d0BQ6zRKK 5 5 78 MAkk!!&&(2D 8$VXz11r=c|jj}|j\}}}}tj||||||j Sr)r/rBrzrrr?)r8rrvrrvrwrxs r;rfzParser.parse_callsG ##-1-A-A-C*fh zz$fh 5<<XXr=rc |jjjdk(s|rW|st|j|jj d}|j }|jjjdk(rdt|j|d|jj dj zz }|jjjdk(rd|jjjdk(r|j \}}}}ng}g}dx}}tj|||||||j}d}|jjjdk(rS|rW|S)Nrir)rrGrrdF) r/rBr_rrrorzrFilterr?) r8rrrvr)rrvrwrxs r;rzParser.parse_filters<kk!!&&&0LT[[!KK&&v.E;;D++%%**e3T[[!dkk008>>>>++%%**e3{{""''83595I5I5K2fh (,,:<<dD&(Ju||D!L#kk!!&&&0L$ r=c bt|j}|jjjdrt|jd}nd}|jj dj }|jjj dk(rdt|j|d|jj dj zz }|jjj dk(rddx}}g}|jjj dk(r|j\}}}}n|jjj dvr|jjjd d d s[|jjjd r|jd |j} |j| } | g}ng}tj|||||||j}|r!tj||j}|S)Nr"TFr)rrGr>r)rNrQrrKrMrPrrrzname:isz'You cannot chain multiple tests with isrd)rr/rBrrror_rzr`rCr rArTestr?r#) r8rrvnegatedr)rwrxrvrarg_nodes r;rkzParser.parse_testsT[[! ;;   # #J /  GG{{!!&)//kk!!&&%/   C$++,,V4::: :Dkk!!&&%/!%$:(* ;;   # #x /151E1E1G .D&(J [[ % %*  ++%%..{IzR{{""'' 2 CD))+H))(3H:DDzz $fh 5<<  99T%,,7D r=cggj}||jj|d fd } |jr|jj}|jdk(rT|j r1|t j|j |jt|jn1|jdk(rIt|j||jd|jjdn|jdk(r|t|j|B|jjj|r||jjSS|j}t|t rj#|nj||jjd n t%d |jr|||jjS#||jjwwxYw) Ncr>dj}jtjdd|dd=yy)Nrrd)r?rMrr)r?r data_buffers r; flush_dataz#Parser.subparse..flush_datas<$Q.. ELLQGHNr=rrdvariable_beginTrr\ block_beginr]zinternal parsing error)r,N)rMr7r/rBr_rorrr?rrrr`rrrzrrWextendAssertionError)r8rUadd_datarrvrirrs @@r;rzParser.subparses$&*, %%  !  ! ! ( ( 4 #  ,++ ++::'{{ !3!3EKK !UV%ZZ#33%T--D-ABKK&&~6ZZ=0L%!-2N$++2E2E2N2N#3 $%%%))+&--/B!"d+ B BKK&&{3()ABB1++4 L%%%))+ %%%))+&sD/H"A6H"=H""Ictj|jd}|j|j|S)z0Parse the whole template into a `Template` node.rrd)rTemplaterset_environmentr')r8rs r;r4z Parser.parse s1 :t//0 r=)NNNr)NN)F)..)TFNF)T)FTNF)`r  __module__ __qualname____doc__strtOptionalr<rintTyperCr]rYrRrTrYrrarrgrjUnionrhrzrrrrrrrrrrrrrrrrr rrrrrrrr rrrsrrtrrrrtypingoverloadrrrrXrrrrrr$r(r/r4r8r;r rrSrbrTrArBrmrnrerorrzrrfrrkrrr4rr=r;r&r&0s!%$(!% >">>jjo > **S/ > zz# > >4#'+> 9  9 3 9VV' ( 9  9&-jjo&-S 12&- 3 &-  &-R48??!"C? ?59"& /JJqwwsCx01 / 3 /  /@D zz!''#s(*;< ajjoASAS&QVVEJJ5G)G!H&<BG''#s(+:>  : K1775<<1B1B#BC KT599T&%(($EJJ"#%++# U[[@u}} " -1    5u}} 56ell6(E,,(T%J%4% %// E$5$5 U[[U\\ __FI1C  __ 9=$ <<<AGGCH$56 <  < ejj%++5 6 << 9=$ (((AGGCH$56 (  ( ejj%++5 6 (Tdejj  %**5::$5::$ 7uzz7. UZZ 1ejj1 UZZ 5::tuzz$ uzz H!"9=%* @8@8@8AGGCH$56 @8 # @8 ejj( ) @8D 6EJJ 6 6EJJ 6 %**   ejj UZZ AJJA  - .A>1%**1@62  uzz u}} 5:: 5::  62pYuzzYejjYBGJJuzz*:> EJJ .$uzz$ejj$N;?/**QWWS#X%67/  /bu~~r=r&)'rrrrLr exceptionsrrlexerrr TYPE_CHECKINGtyping_extensionster'r TypeVarrrr rrr frozensetrpr)AddSubMulDivFloorDivModr$rbrrrX__annotations__r&rr=r;rs> .+!&??"(+U\\5==I QYY|U[[%// B   GH 99 99 99 99 99 0 QVVC ++ ,aar=