ÿØÿàJFIFÿþ ÿÛC       ÿÛC ÿÀÿÄÿÄ"#QrÿÄÿÄ&1!A"2qQaáÿÚ ?Øy,æ/3JæÝ¹È߲؋5êXw²±ÉyˆR”¾I0ó2—PI¾IÌÚiMö¯–þrìN&"KgX:Šíµ•nTJnLK„…@!‰-ý ùúmë;ºgµŒ&ó±hw’¯Õ@”Ü— 9ñ-ë.²1<yà‚¹ïQÐU„ہ?.’¦èûbß±©Ö«Âw*VŒ) `$‰bØÔŸ’ëXÖ-ËTÜíGÚ3ð«g Ÿ§¯—Jx„–’U/ÂÅv_s(Hÿ@TñJÑãõçn­‚!ÈgfbÓc­:él[ðQe 9ÀPLbÃãCµm[5¿ç'ªjglå‡Ûí_§Úõl-;"PkÞÞÁQâ¼_Ñ^¢SŸx?"¸¦ùY騐ÒOÈ q’`~~ÚtËU¹CڒêV  I1Áß_ÿÙ eYc @sdZddlmZddlmZmZddlmZmZddl m Z e dddd d d d d ddddg Z e ddddddgZ iejd6ejd6ejd6ejd6ejd6ejd6ZdefdYZd S(!s jinja2.parser ~~~~~~~~~~~~~ Implements the template parser. :copyright: (c) 2017 by the Jinja Team. :license: BSD, see LICENSE for more details. i(tnodes(tTemplateSyntaxErrortTemplateAssertionError(tdescribe_tokentdescribe_token_expr(timaptfortiftblocktextendstprinttmacrotincludetfromtimporttsettwitht autoescapeteqtnetlttlteqtgttgteqtaddtsubtmultdivtfloordivtmodtParsercBseZdZd3d3d3dZd3edZdZd3dZd3d3dZ d3dZ d3dZ dZ e d Zd Zd Zd Zd ZdZdZdZdZdZdZdZdZdZdZdZdZee d3e dZ edZ!dZ"dZ#dZ$dZ%d Z&d!Z'd"Z(d#Z)d$Z*ed%Z+d&Z,e ed3e d'Z-d(Z.d)Z/d*Z0d+Z1d,Z2d-Z3d.Z4e d/Z5d0Z6d3d1Z7d2Z8RS(4sThis is the central parsing class Jinja2 uses. It's passed to extensions and can be used to parse expressions or statements. cCs||_|j|||||_||_||_t|_i|_x8|jD]*}x!|j D]}|j |j|CsisUnexpected end of template.sEncountered unknown tag '%s'.s_You probably made a nesting mistake. Jinja is expecting this tag, but currently looking for %s.s-Jinja was looking for the following tags: %s.s4The innermost block that needs to be closed is '%s'.t (textendRRtjoinR3tappendR+R8(R-R"tend_token_stackR5texpectedtexprstcurrently_lookingtmessage((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt _fail_ut_eof=s*          cCs|j||j|S(sCalled if the parser encounters an unknown tag. Tries to fail with a human readable error message that could help to identify the problem. (RDR,(R-R"R5((s1/usr/lib/python2.7/site-packages/jinja2/parser.pytfail_unknown_tag\scCs>t|j}|dk r+|j|n|jd||S(s9Like fail_unknown_tag but for end of template situations.N(tlistR,R3R>RD(R-t end_tokensR5tstack((s1/usr/lib/python2.7/site-packages/jinja2/parser.pytfail_eofcs cCs<|jjjdkrtS|dk r8|jjj|StS(sAre we at the end of a tuple?t variable_endt block_endtrparen(RJRKRLN(R!R4ttypetTrueR3ttest_anyR$(R-textra_end_rules((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt is_tuple_endjs  cCsE|jd7_tjtj}tjj|d|jd||S(sDReturn a new free identifier as :class:`~jinja2.nodes.InternalName`.isfi%dR5(R*tobjectt__new__Rt InternalNametNodeR2(R-R5trv((s1/usr/lib/python2.7/site-packages/jinja2/parser.pytfree_identifierrs cCs|jj}|jdkr1|jd|jn|jj|jt}z|jt kryt |d|jjjS|jdkr|j S|jdkr|j S|j j|j}|dk r||S|jjt}|j|j|jWd|r|jjnXdS(sParse a single statement.R"stag name expectedtparse_tcalltfilterN(R!R4RMR8R5R+R>tvalueRNt_statement_keywordstgetattrtparse_call_blocktparse_filter_blockR&tgetR3tpopR$RE(R-ttokentpop_tagtext((s1/usr/lib/python2.7/site-packages/jinja2/parser.pytparse_statementys(      cCsn|jjd|jjd|j|}|jjjdkrT|j|n|rjt|jn|S(sRParse 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. tcolonRKteof(R!tskip_iftexpecttsubparseR4RMRItnext(R-RGt drop_needletresult((s1/usr/lib/python2.7/site-packages/jinja2/parser.pytparse_statementss cCst|jj}|jdt}|jjdrX|j}tj||d|S|j d}|j ddt}tj |||d|S(sParse an assign statement.twith_namespacetassignR5s name:endsetRlN(s name:endset( RkR!R5tparse_assign_targetRNRht parse_tupleRtAssignt parse_filterR3Rnt AssignBlock(R-R5ttargetR:t filter_nodetbody((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt parse_sets   c Cs|jjdj}|jdd }|jjd|jdtdd }d}|jjdrv|j}n|jjd}|j d}t |jj d krg}n|j dd t }t j||||||d |S(sParse a for loop.sname:forRPsname:int with_condexprsname:recursivesname:ifs name:endfors name:elsetendforRlR5(sname:in(sname:recursiveN(s name:endfors name:else(s name:endfor(R!RiR5RqRrR$R3Rhtparse_expressionRnRkR[RNRtFor(R-R5Rvtiterttestt recursiveRxtelse_((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt parse_fors  cCstjd|jjdj}}x|jdt|_|jd|_ g|_ g|_ t |j}|jdrtjd|jj j}|j j|q(n*|jdr|jd dt|_ nPq(W|S( sParse an if construct.R5sname:ifRzs name:elifs name:elses name:endifRl(s name:elifs name:elses name:endif(s name:endif(RtIfR!RiR5RrR$RRnRxtelif_RRkR4R>RN(R-tnodeRmRb((s1/usr/lib/python2.7/site-packages/jinja2/parser.pytparse_ifs"%    cCstjdt|jj}g}g}x|jjjdkr|jjj}|rj|jjdn|j}|j d|j ||jjd|j |j q-W||_ ||_ |jddt|_|S( NR5RKtcommatparamRps name:endwithRl(s name:endwith(RtWithRkR!R5R4RMRiRqtset_ctxR>R|ttargetstvaluesRnRNRx(R-RRRR5Rv((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt parse_withs"       cCsdtjdt|jj}tjd|jg|_|jddt |_ tj |gS(NR5Rsname:endautoescapeRl(sname:endautoescape( RtScopedEvalContextModifierRkR!R5tKeywordR|toptionsRnRNRxtScope(R-R((s1/usr/lib/python2.7/site-packages/jinja2/parser.pytparse_autoescapes   cCstjdt|jj}|jjdj|_|jjd|_ |jj j dkrp|j dn|j d dt|_|jjd|j|S( NR5R"s name:scopedRspBlock names in Jinja have to be valid Python identifiers and may not contain hyphens, use an underscore instead.s name:endblockRlsname:(s name:endblock(RtBlockRkR!R5RiR[R"RhtscopedR4RMR8RnRNRx(R-R((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt parse_blockscCs1tjdt|jj}|j|_|S(NR5(RtExtendsRkR!R5R|ttemplate(R-R((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt parse_extendsscCsh|jjjddr[|jjjdr[t|jjdk|_|jjn ||_|S(Ns name:withs name:withouts name:contextR( R!R4ROtlookRRkR[t with_contexttskip(R-Rtdefault((s1/usr/lib/python2.7/site-packages/jinja2/parser.pytparse_import_contexts  cCstjdt|jj}|j|_|jjjdrv|jj jdrvt |_ |jj dn t |_ |j|t S(NR5s name:ignores name:missingi(RtIncludeRkR!R5R|RR4RRRNtignore_missingRR$R(R-R((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt parse_includes  cCsetjdt|jj}|j|_|jjd|jdt j |_ |j |t S(NR5sname:ast name_only(RtImportRkR!R5R|RRiRqRNR"RvRR$(R-R((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt parse_import)s cstjdtjjj_jjdg_fd}x jrwjjdnjj j dkrT|rPnj dt }|j jdrjd|jd tnjjd rj dt }jj|j |j fnjj|j |sMjj j dkrdPqdq[jjdq[Wtd st_nS( NR5s name:importcs]jjjdkrYjjjdrYtjjdk_jjtSt S(NRtwithouts name:context(RR( R!R4R[RRRkRRRNR$((RR-(s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt parse_context6s  RR"Rt_s4names starting with an underline can not be importedR7sname:asR(Rt FromImportRkR!R5R|RRitnamesR4RMRqRNR"t startswithR8RRhR>thasattrR$R(R-RRvtalias((RR-s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt parse_from0s4       cCsg|_}g|_}|jjdx|jjjdkr|r[|jjdn|jdt}|jd|jj dr|j |j n|r|j dn|j |q-W|jjddS(NtlparenRLRRRRps-non-default argument follows default argument( targstdefaultsR!RiR4RMRqRNRRhR>R|R8(R-RRRtarg((s1/usr/lib/python2.7/site-packages/jinja2/parser.pytparse_signatureVs   cCstjdt|jj}|jjjdkrC|j|ng|_g|_ |j |_ t |j tj s|jd|jn|jddt|_|S(NR5Rs expected calls name:endcallRl(s name:endcall(Rt CallBlockRkR!R5R4RMRRRR|RYt isinstancetCallR8RnRNRx(R-R((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyR^fs  cCsRtjdt|jj}|jddt|_|j ddt|_ |S(NR5t start_inlinesname:endfilterRl(sname:endfilter( Rt FilterBlockRkR!R5RtR3RNRZRnRx(R-R((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyR_ts   cCs_tjdt|jj}|jdtj|_|j||j ddt|_ |S(NR5Rs name:endmacroRl(s name:endmacro( RtMacroRkR!R5RqRNR"RRnRx(R-R((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt parse_macro{s    cCsytjdt|jj}g|_xK|jjjdkrt|jr[|jjdn|jj|j q*W|S(NR5RKR( RtOutputRkR!R5R4RMRiR>R|(R-R((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt parse_prints  cCs|rs|jjjdkrs|jjd}t|j|jjd}tj|j|jd|j}ns|r|jjd}tj |jdd|j}n:|r|j dt d|}n |j }|j d|js|jd|jjj|jn|S(sParse an assignment target. As Jinja2 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. tdotR"R5tstoret simplifiedRPscan't assign to %r(R!RRMRiRkRtNSRefR[R5tNameRrRNt parse_primaryRt can_assignR8t __class__t__name__tlower(R-t with_tupleRRPRoRbtattrRv((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRqs"  $!     cCs|r|jS|jS(sParse an expression. Per default all expressions are parsed, if the optional `with_condexpr` parameter is set to `False` conditional expressions are not parsed. (tparse_condexprtparse_or(R-Rz((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyR|s cCs|jjj}|j}xs|jjdr|j}|jjdr]|j}nd}tj|||d|}|jjj}qW|S(Nsname:ifs name:elseR5( R!R4R5RRhRR3RtCondExpr(R-R5texpr1texpr2texpr3((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRs  cCsk|jjj}|j}xI|jjdrf|j}tj||d|}|jjj}qW|S(Nsname:orR5(R!R4R5t parse_andRhRtOr(R-R5tlefttright((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRs  cCsk|jjj}|j}xI|jjdrf|j}tj||d|}|jjj}qW|S(Nsname:andR5(R!R4R5t parse_notRhRtAnd(R-R5RR((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRs  cCsJ|jjjdr@t|jj}tj|jd|S|jS(Nsname:notR5( R!R4RRkR5RtNotRt parse_compare(R-R5((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRscCs5|jjj}|j}g}x|jjj}|tkrnt|j|jtj ||jn|jj dr|jtj d|jn`|jjj dr|jj j dr|jj d|jtj d|jnP|jjj}q$W|s|Stj||d|S(Nsname:intinsname:notitnotinR5(R!R4R5t parse_math1RMt_compare_operatorsRkR>RtOperandRhRRRtCompare(R-R5R:topst token_type((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRs&   """cCs|jjj}|j}xi|jjjdkrt|jjj}t|j|j}|||d|}|jjj}qW|S(NRRR5(RR(R!R4R5t parse_concatRMt _math_nodesRk(R-R5RtclsR((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRs   cCs|jjj}|jg}x9|jjjdkrYt|j|j|jq!Wt|dkrt|dStj |d|S(NttildeiiR5( R!R4R5t parse_math2RMRkR>tlenRtConcat(R-R5R((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRs cCs|jjj}|j}xi|jjjdkrt|jjj}t|j|j}|||d|}|jjj}qW|S(NRRRRR5(RRRR(R!R4R5t parse_powRMRRk(R-R5RRR((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRs   cCs{|jjj}|j}xY|jjjdkrvt|j|j}tj||d|}|jjj}qW|S(NtpowR5(R!R4R5t parse_unaryRMRkRtPow(R-R5RR((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRs   cCs|jjj}|jjj}|dkrXt|jtj|jtd|}nF|dkrt|jtj |jtd|}n |j }|j |}|r|j |}n|S(NRR5R( R!R4RMR5RkRtNegRR$tPosRt parse_postfixtparse_filter_expr(R-t with_filterRR5R((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRs  !  ! cCs|jj}|jdkr|jdkrNtj|jdkd|j}nH|jdkrxtjdd|j}ntj|jd d|j}t |jne|jd kr7t |j|jg}|j}x<|jjjd kr|j |jjjt |jqWtjd j |d|}n|jdkrqt |jtj|jd|j}n|jdkrt |j|j dt }|jjdnY|jdkr|j}n;|jdkr|j}n|jdt||j|S(NR"ttruetfalseRNR$R5tnoneR3tloadtstringttintegertfloatRtexplicit_parenthesesRLtlbrackettlbracesunexpected '%s'(RRRNR$(RRN(RR3(RR(R!R4RMR[RtConstR5R3RRkR>R=RrRNRit parse_listt parse_dictR8R(R-RbRtbufR5((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyR(s<    !  c sjjj}|r!j}n!|r3j}nfd}g}t}xn|rjjjdnj|r}Pn|j|jjj dkrt }nPjjj}qQW|s|r|dS|sj dt jjqnt j|dd|S(sWorks 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. csjdtS(NRz(R|R$((R-(s1/usr/lib/python2.7/site-packages/jinja2/parser.pytdRRis Expected an expression, got '%s'RR5(R!R4R5RR|R$RiRQR>RMRNR8RRtTuple( R-RRzRPRR5R)Rtis_tuple((R-s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRrJs2    cCs|jjd}g}x^|jjjdkrx|rI|jjdn|jjjdkrbPn|j|jqW|jjdtj|d|jS(NRtrbracketRR5( R!RiR4RMR>R|RtListR5(R-Rbtitems((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRscCs|jjd}g}x|jjjdkr|rI|jjdn|jjjdkrbPn|j}|jjd|j}|jtj||d|jqW|jjdtj |d|jS(NRtrbraceRRfR5( R!RiR4RMR|R>RtPairR5tDict(R-RbRtkeyR[((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRs  &cCscx\|jjj}|dks*|dkr<|j|}q|dkrZ|j|}qPqW|S(NRRR(R!R4RMtparse_subscriptt parse_call(R-RR((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRs cCsx|jjj}|dkr0|j|}q|dkrc|jjjdkrc|j|}q|dkr|j|}qPqW|S(NtpipeR"tisR(R!R4RMRtR[t parse_testR(R-RR((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRs ! cCst|j}|jdkr|jj}t|j|jdkretj||jdd|jS|jdkr|jd|jntj |jd|j}tj ||dd|jS|jdkrg}xE|jjjdkr|r|jj d n|j |j qW|jj dt|d krM|d }ntj|dd|j}tj ||dd|jS|jd |jdS( NRR"RR5Rsexpected name or numberRRRiisexpected subscript expression(RkR!RMR4RtGetattrR[R5R8RtGetitemRiR>tparse_subscribedRR(R-RRbt attr_tokenRR((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRs.    cCsR|jjj}|jjjdkr=t|jdg}n;|j}|jjjdkrb|St|j|g}|jjjdkr|jdn8|jjjdkr|j|jn |jd|jjjdkr2t|j|jjjdkr"|j|jq?|jdn |jdtj d||S(NRfRRR5(RR(RR( R!R4R5RMRkR3R|R>RtSlice(R-R5RR((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyR s*        c s'jjdg}g}d}}t}fd}xjjjdkr|rjjdjjjdkrPqnjjjdkr||dko|dktjj}njjjdkr||dktjj}n||dko0|dkjjjdkrjjjdkrjjj }jj d j} |j t j || d | jn|| |j jt}qCWjjd|dkr||||fSt j|||||d jS( NRcs |sjdjndS(Ns+invalid syntax for function call expression(R8R5(R:(R-Rb(s1/usr/lib/python2.7/site-packages/jinja2/parser.pytensures RLRRRR"RpiR5(R!RiR3R$R4RMRkR|RR[RR>RRR5RNR( R-RRtkwargstdyn_argst dyn_kwargst require_commaRRR[((R-Rbs1/usr/lib/python2.7/site-packages/jinja2/parser.pyRsF       c Csx |jjjdks|r|s4t|jn|jjd}|j}xC|jjjdkrt|j|d|jjdj7}qRW|jjjdkr|jd\}}}}ng}g}d}}tj ||||||d|j }t }qW|S(NRR"Rt.RR5( R!R4RMRkRiR[RR3RtFilterR5R$( R-RRRbR"RRRR((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyRt s"  !  c Cst|j}|jjjdr:t|jt}nt}|jjdj}xC|jjjdkrt|j|d|jjdj7}qXWd}}g}|jjjdkr|j d\}}}}nn|jjjdkrF|jjj d d d  rF|jjjdr4|j dn|j g}ng}tj||||||d|j}|rtj|d|j}n|S(Nsname:notR"RRRRRRRRs name:elsesname:orsname:andsname:iss'You cannot chain multiple tests with isR5(R"RRRRRR(RkR!R4RRNR$RiR[RMR3RROR8RRtTestR5R( R-RRbtnegatedR"RRRR((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyR 4s6   !    csggj}|dk r4|jj|nfd}zUxG|jr|jj}|jdkr|jr|tj|jd|j nt |jqL|jdkrt |j||j dt |jj dqL|jdkr|t |j|dk r8|jjj|r8S|j}t|trcj|n j||jj dqLtd qLW|Wd|dk r|jjnXS( Ncs;r7dj}jtjd|2ndS(NiR5(R5R>RR(R5(Rxt data_buffer(s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt flush_data[s tdataR5tvariable_beginRzRJt block_beginRKsinternal parsing error(R>R3R,R!R4RMR[Rt TemplateDataR5RkRrRNRiROReRRFR<tAssertionErrorRa(R-RGtadd_dataRRbRV((RxRs1/usr/lib/python2.7/site-packages/jinja2/parser.pyRjSsD            cCs/tj|jdd}|j|j|S(s0Parse the whole template into a `Template` node.R5i(RtTemplateRjtset_environmentR(R-Rm((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyR)sN(9Rt __module__t__doc__R3R2RR8RDRERIRQRWReR$RnRyRRRRRRRRRRRR^R_RRRNRqR|RRRRRRRRRRRRrRRRRRR RRtR RjR)(((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyR sl              &         "6     /   0N(R$tjinja2Rtjinja2.exceptionsRRt jinja2.lexerRRtjinja2._compatRt frozensetR\RtAddtSubtMultDivtFloorDivtModRRRR(((s1/usr/lib/python2.7/site-packages/jinja2/parser.pyt s