o
    'èh“! ã                   @   s  d Z ddlZddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ dd	lmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlmZ d
dlm Z  d
dl!m"Z" ej#r…ddl$Z%d
dl&m'Z' ej(dej)dej*f dZ+dddddd d!d"d#œZ,d$e+d%e+fd&d'„Z-d(e.d%ej)d)ej/d*gdf fd+d,„Z0d(e.d%ej)d)ej1d*gdf fd-d.„Z2		/	0dNd1ej3d2d3d4ej4e. d5ej4e. d6ej4ej5 d7e6d8e6d%ej4e. fd9d:„Z7d;ej*d%e6fd<d=„Z8d>ej9ej: d?ej9e. d%ej;e. fd@dA„Z<G dBdC„ dCƒZ=G dDd*„ d*ƒZ>G dEdF„ dFe?ƒZ@G dGdH„ dHe"ƒZAG dIdJ„ dJe"ƒZBG dKdL„ dLeCƒZDG dMd)„ d)e"ƒZEdS )Oz0Compiles nodes from the parser into Python code.é    N)Úcontextmanager)Úupdate_wrapper)ÚStringIO)Úchain)Ú	iskeyword)Úescape)ÚMarkupé   )Únodes)ÚTemplateAssertionError)ÚSymbols)ÚVAR_LOAD_ALIAS)ÚVAR_LOAD_PARAMETER)ÚVAR_LOAD_RESOLVE)ÚVAR_LOAD_UNDEFINED)ÚEvalContext)Ú	Optimizer)Ú_PassArg)Úconcat)ÚNodeVisitor)ÚEnvironmentÚF.)Úboundz==z!=ú>z>=ú<z<=Úinznot in)ÚeqÚneÚgtÚgteqÚltÚlteqr   ÚnotinÚfÚreturnc              
      s2   dddt jdddtjdtjf
‡ fdd	„}t|ˆ ƒS )
NÚselfÚCodeGeneratorÚnodeÚframeÚFrameÚkwargsr$   c                    sJ   | j d ur|jjs| j  ||j¡}||kr|  ||¡S ˆ | ||fi |¤ŽS ©N)Ú	optimizerÚeval_ctxÚvolatileÚvisit)r%   r'   r(   r*   Únew_node©r#   © úK/var/www/html/olx_land/venv/lib/python3.10/site-packages/jinja2/compiler.pyÚnew_func.   s
   zoptimizeconst.<locals>.new_func)r
   ÚExprÚtÚAnyr   )r#   r4   r2   r1   r3   Úoptimizeconst-   s   ÿÿÿÿþ
r8   Úopr&   r)   c              	      ó(   t dddtjdtdd f‡ fdd„ƒ}|S )Nr%   r&   r'   r(   r$   c                    s”   | j jr'ˆ | j jv r'|  dˆ ›d¡ |  |j|¡ |  d¡ |  |j|¡ n|  d¡ |  |j|¡ |  dˆ › d¡ |  |j|¡ |  d¡ d S )Nz environment.call_binop(context, ú, ú(ú ú))ÚenvironmentÚ	sandboxedÚintercepted_binopsÚwriter/   ÚleftÚright©r%   r'   r(   ©r9   r2   r3   Úvisitor>   s   ÿ

z_make_binop.<locals>.visitor)r8   r
   ÚBinExprr)   ©r9   rG   r2   rF   r3   Ú_make_binop=   s   "rJ   c              	      r:   )Nr%   r&   r'   r(   r$   c                    s`   | j jrˆ | j jv r|  dˆ ›d¡ |  |j|¡ n|  dˆ  ¡ |  |j|¡ |  d¡ d S )Nzenvironment.call_unop(context, r;   r<   r>   )r?   r@   Úintercepted_unopsrB   r/   r'   rE   rF   r2   r3   rG   U   s   ÿz_make_unop.<locals>.visitor)r8   r
   Ú	UnaryExprr)   rI   r2   rF   r3   Ú
_make_unopR   s   "rM   FTr'   r?   r   ÚnameÚfilenameÚstreamÚ
defer_initÚ	optimizedc                 C   sH   t | tjƒs
tdƒ‚| ||||||¡}| | ¡ |du r"|j ¡ S dS )z+Generate the python source for a node tree.z Can't compile non template nodesN)Ú
isinstancer
   ÚTemplateÚ	TypeErrorÚcode_generator_classr/   rP   Úgetvalue)r'   r?   rN   rO   rP   rQ   rR   Ú	generatorr2   r2   r3   Úgeneratee   s   
ÿ

rY   Úvaluec                 C   s†   | du s| t u s| tu rdS t| ƒttttttt	hv rdS t| ƒt
ttthv r0tdd„ | D ƒƒS t| ƒtu rAtdd„ |  ¡ D ƒƒS dS )z)Does the node have a safe representation?NTc                 s   s    | ]}t |ƒV  qd S r+   ©Úhas_safe_repr)Ú.0Úvr2   r2   r3   Ú	<genexpr>†   s   € z has_safe_repr.<locals>.<genexpr>c                 s   s$    | ]\}}t |ƒot |ƒV  qd S r+   r[   ©r]   Úkr^   r2   r2   r3   r_   ‰   s   €" F)ÚNotImplementedÚEllipsisÚtypeÚboolÚintÚfloatÚcomplexÚrangeÚstrr   ÚtupleÚlistÚsetÚ	frozensetÚallÚdictÚitems©rZ   r2   r2   r3   r\   }   s   r\   r
   Únamesc                 C   s<   t |ƒ}z| D ]}| |¡ qW |jS  ty   Y |jS w )z”Check if the names passed are accessed undeclared.  The return value
    is a set of all the undeclared names from the sequence of names found.
    )ÚUndeclaredNameVisitorr/   ÚVisitorExitÚ
undeclared)r
   rs   rG   r'   r2   r2   r3   Úfind_undeclaredŽ   s   ÿþþrw   c                   @   s,   e Zd Zdejejejf ddfdd„ZdS )ÚMacroRefr'   r$   Nc                 C   s   || _ d| _d| _d| _d S ©NF)r'   Úaccesses_callerÚaccesses_kwargsÚaccesses_varargs©r%   r'   r2   r2   r3   Ú__init__ž   s   
zMacroRef.__init__)	Ú__name__Ú
__module__Ú__qualname__r6   ÚUnionr
   ÚMacroÚ	CallBlockr~   r2   r2   r2   r3   rx      s    $rx   c                	   @   sh   e Zd ZdZ		ddedejd  deje ddfdd„Zdd
d„Z	dde
dd fdd„Zddd„Ze	ZdS )r)   z&Holds compile time information for us.Nr-   ÚparentÚlevelr$   c                 C   s~   || _ || _|d u rt|d| _d| _d | _d | _nt|j|d| _|j| _|j| _|j| _d| _d| _d| _	d| _
d| _d S )N©r†   F)r-   r…   r   ÚsymbolsÚrequire_output_checkÚbufferÚblockÚtoplevelÚ	rootlevelÚ
loop_frameÚblock_frameÚ
soft_frame)r%   r-   r…   r†   r2   r2   r3   r~   ¨   s    
zFrame.__init__úte.Selfc                 C   s*   t  | j¡}|j | j¡ | j ¡ |_|S )z!Create a copy of the current one.)ÚobjectÚ__new__Ú	__class__Ú__dict__Úupdaterˆ   Úcopy©r%   Úrvr2   r2   r3   r—   Û   s   z
Frame.copyFÚisolatedc                 C   s&   |rt | j| jjd dS t | j| ƒS )zReturn an inner frame.r	   r‡   )r)   r-   rˆ   r†   )r%   rš   r2   r2   r3   Úinnerâ   s   zFrame.innerc                 C   s   |   ¡ }d|_d|_|S )a&  Return a soft frame.  A soft frame may not be modified as
        standalone thing as it shares the resources with the frame it
        was created of, but it's not a rootlevel frame any longer.

        This is only used to implement if-statements and conditional
        expressions.
        FT)r—   r   r   r˜   r2   r2   r3   Úsoftè   s   z
Frame.soft)NN)r$   r‘   ©F)r   r€   r   Ú__doc__r   r6   ÚOptionalrf   r~   r—   re   r›   rœ   Ú__copy__r2   r2   r2   r3   r)   ¥   s"    üþýü
û
3
c                   @   ó   e Zd ZdZdS )ru   z?Exception used by the `UndeclaredNameVisitor` to signal a stop.N©r   r€   r   rž   r2   r2   r2   r3   ru   ø   ó    ru   c                   @   sV   e Zd ZdZddd„Zdejddfdd„Zdejddfd	d
„Z	dej
ddfdd„ZdS )ÚDependencyFinderVisitorz.A visitor that collects filter and test calls.r$   Nc                 C   s   t ƒ | _t ƒ | _d S r+   )rm   ÚfiltersÚtests©r%   r2   r2   r3   r~   ÿ   s   z DependencyFinderVisitor.__init__r'   c                 C   ó   |   |¡ | j |j¡ d S r+   )Úgeneric_visitr¥   ÚaddrN   r}   r2   r2   r3   Úvisit_Filter  ó   
z$DependencyFinderVisitor.visit_Filterc                 C   r¨   r+   )r©   r¦   rª   rN   r}   r2   r2   r3   Ú
visit_Test  r¬   z"DependencyFinderVisitor.visit_Testc                 C   ó   dS )zStop visiting at blocks.Nr2   r}   r2   r2   r3   Úvisit_Block  ó    z#DependencyFinderVisitor.visit_Block©r$   N)r   r€   r   rž   r~   r
   ÚFilterr«   ÚTestr­   ÚBlockr¯   r2   r2   r2   r3   r¤   ü   s    
r¤   c                   @   sP   e Zd ZdZdeje ddfdd„Zdej	ddfdd	„Z
dejddfd
d„ZdS )rt   z¡A visitor that checks if a name is accessed without being
    declared.  This is different from the frame visitor as it will
    not stop at closure frames.
    rs   r$   Nc                 C   s   t |ƒ| _t ƒ | _d S r+   )rm   rs   rv   )r%   rs   r2   r2   r3   r~     s   
zUndeclaredNameVisitor.__init__r'   c                 C   sL   |j dkr|j| jv r| j |j¡ | j| jkrtƒ ‚d S | j |j¡ d S )NÚload)ÚctxrN   rs   rv   rª   ru   Údiscardr}   r2   r2   r3   Ú
visit_Name  s   ÿz UndeclaredNameVisitor.visit_Namec                 C   r®   )zStop visiting a blocks.Nr2   r}   r2   r2   r3   r¯   !  r°   z!UndeclaredNameVisitor.visit_Block)r   r€   r   rž   r6   ÚIterablerj   r~   r
   ÚNamer¸   r´   r¯   r2   r2   r2   r3   rt     s
    rt   c                   @   r¡   )ÚCompilerExitz¼Raised if the compiler encountered a situation where it just
    doesn't make sense to further process the code.  Any block that
    raises such an exception is not further processed.
    Nr¢   r2   r2   r2   r3   r»   %  r£   r»   c                   @   sŠ	  e Zd ZU 			dídddeje deje dejej d	ed
eddfdd„Ze	defdd„ƒZ
dededdfdd„Zdefdd„Zdeddfdd„Z	dîdededdfdd„Zdïdd„Zdðd eddfd!d"„Zdñded#ejej ddfd$d%„Zdeddfd&d'„Z	dñd(eded#ejej ddfd)d*„Zd+ejej deddfd,d-„Zd.eddfd/d0„Z	1dòd.ed#ejej d2eddfd3d4„Zdòd#ejej d2eddfd5d6„Z	dñd#ejejejej f ded7ejej!eej"f  ddfd8d9„Z#d+ejej ddfd:d;„Z$deddfd<d=„Z%dîded>eddfd?d@„Z&dódCedDedefdEdF„Z'dedefdGdH„Z(d#ejej)ej*f dedej+ee,f fdIdJ„Z-dKe,deddfdLdM„Z.d#ejdefdNdO„Z/dedefdPdQ„Z0dïdRdS„Z1deddfdTdU„Z2dïdVdW„Z3dXeddfdYdZ„Z4dXeddfd[d\„Z5dïd]d^„Z6defd_d`„Z7defdadb„Z8dedefdcdd„Z9dXedefdedf„Z:dïdgdh„Z;deddfdidj„Z<	dñd#ej=deje ddfdkdl„Z>d#ej?deddfdmdn„Z@d#ejAdeddfdodp„ZBd#ejCdeddfdqdr„ZDd#ejejEejFf deddfdsdt„ZGd#ejEdeddfdudv„ZHd#ejFdeddfdwdx„ZId#ejJdeddfdydz„ZKd#ejLdeddfd{d|„ZMd#ej)deddfd}d~„ZNd#ej*deddfdd€„ZOd#ejPdeddfdd‚„ZQd#ejRdeddfdƒd„„ZSd#ejTdeddfd…d†„ZUG d‡dˆ„ dˆejVƒZWeXd‰ej"dej"fdŠd‹„ƒZYdZZejeW e[dŒ< deWfddŽ„Z\dejej" defdd‘„Z]d#ej^ded’eWdefd“d”„Z_d#ej^ded’eWddfd•d–„Z`d#ej^ded’eWddfd—d˜„Zad#ejbdeddfd™dš„Zcd#ejddeddfd›dœ„Zed#ejfdeddfddž„Zgd#ejhdeddfdŸd „Zid#ejjdeddfd¡d¢„Zkd#ejldeddfd£d¤„Zmd#ejndeddfd¥d¦„Zod#ej+deddfd§d¨„Zpd#ejqdeddfd©dª„Zrd#ejsdeddfd«d¬„Zteud­ƒZveud®ƒZweud¯ƒZxeud°ƒZyeud±ƒZzeud²ƒZ{eud³ƒZ|eud´ƒZ}eudµƒZ~ed­ƒZ€ed®ƒZed¶ƒZ‚eƒd#ej„deddfd·d¸„ƒZ…eƒd#ej†deddfd¹dº„ƒZ‡d#ejˆdeddfd»d¼„Z‰eƒd#ejŠdeddfd½d¾„ƒZ‹eƒd#ejŒdeddfd¿dÀ„ƒZd#ejŽdeddfdÁdÂ„Zed#ejejej f dedÃedej‘d fdÄdÅ„ƒZ’eƒd#ejdeddfdÆdÇ„ƒZ“eƒd#ej deddfdÈdÉ„ƒZ”eƒd#ej•deddfdÊdË„ƒZ–eƒ	dîd#ejdedÌeddfdÍdÎ„ƒZ—d#ej˜deddfdÏdÐ„Z™d#ejšdeddfdÑdÒ„Z›d#ejœdeddfdÓdÔ„Zd#ejždeddfdÕdÖ„ZŸd#ej deddfd×dØ„Z¡d#ej¢deddfdÙdÚ„Z£d#ej¤deddfdÛdÜ„Z¥d#ej¦deddfdÝdÞ„Z§d#ej¨deddfdßdà„Z©d#ejªdeddfdádâ„Z«d#ej¬deddfdãdä„Z­d#ej®deddfdådæ„Z¯d#ej°deddfdçdè„Z±d#ej²deddfdédê„Z³d#ej´deddfdëdì„ZµdS )ôr&   NFTr?   r   rN   rO   rP   rQ   rR   r$   c                 C   s²   |d u rt ƒ }|| _|| _|| _|| _d| _|| _d | _|r#t|ƒ| _i | _	i | _
d| _d| _d| _i | _i | _g | _d | _d| _d| _d| _d| _d| _g | _g | _dg| _d S )NFr   r	   TÚcontext)r   r?   rN   rO   rP   Úcreated_block_contextrQ   r,   r   Úimport_aliasesÚblocksÚextends_so_farÚhas_known_extendsÚcode_linenor¦   r¥   Ú
debug_infoÚ_write_debug_infoÚ
_new_linesÚ
_last_lineÚ_first_writeÚ_last_identifierÚ_indentationÚ_assign_stackÚ_param_def_blockÚ_context_reference_stack)r%   r?   rN   rO   rP   rQ   rR   r2   r2   r3   r~   -  s8   	
zCodeGenerator.__init__c                 C   s
   | j d uS r+   )r,   r§   r2   r2   r3   rR   v  s   
zCodeGenerator.optimizedÚmsgÚlinenozte.NoReturnc                 C   s   t ||| j| jƒ‚)z*Fail with a :exc:`TemplateAssertionError`.)r   rN   rO   )r%   rÍ   rÎ   r2   r2   r3   Úfail|  ó   zCodeGenerator.failc                 C   s   |  j d7  _ d| j › S )zGet a new unique identifier.r	   Út_)rÈ   r§   r2   r2   r3   Útemporary_identifier€  s   z"CodeGenerator.temporary_identifierr(   c                 C   s    |   ¡ |_|  |j› d¡ dS )z7Enable buffering for the frame from that point onwards.z = []N)rÒ   rŠ   Ú	writeline©r%   r(   r2   r2   r3   rŠ   …  s   
zCodeGenerator.bufferÚforce_unescapedc                 C   s¤   |sF|j jr6|  d¡ |  ¡  |  d|j› d¡ |  ¡  |  d¡ |  ¡  |  d|j› d¡ |  ¡  dS |j jrF|  d|j› d¡ dS |  d|j› d¡ dS )z(Return the buffer contents of the frame.zif context.eval_ctx.autoescape:zreturn Markup(concat(ú))úelse:zreturn concat(r>   N)r-   r.   rÓ   ÚindentrŠ   ÚoutdentÚ
autoescape)r%   r(   rÕ   r2   r2   r3   Úreturn_buffer_contentsŠ  s   

z$CodeGenerator.return_buffer_contentsc                 C   s   |  j d7  _ dS )zIndent by one.r	   N©rÉ   r§   r2   r2   r3   rØ   ž  rÐ   zCodeGenerator.indentr	   Ústepc                 C   s   |  j |8  _ dS )zOutdent by step.NrÜ   )r%   rÝ   r2   r2   r3   rÙ   ¢  rÐ   zCodeGenerator.outdentr'   c                 C   s2   |j du r|  d|¡ dS |  |j › d|¡ dS )z%Yield or write into the frame buffer.Núyield ú.append()rŠ   rÓ   )r%   r(   r'   r2   r2   r3   Ústart_write¦  s   
zCodeGenerator.start_writec                 C   s   |j dur|  d¡ dS dS )z1End the writing process started by `start_write`.Nr>   )rŠ   rB   rÔ   r2   r2   r3   Ú	end_write­  s   
ÿzCodeGenerator.end_writeÚsc                 C   s$   |   ||¡ |  |¡ |  |¡ dS )z4Simple shortcut for start_write + write + end_write.N)rà   rB   rá   )r%   râ   r(   r'   r2   r2   r3   Úsimple_write²  s   
zCodeGenerator.simple_writer
   c                 C   s<   z|   d¡ |D ]}|  ||¡ qW dS  ty   Y dS w )z•Visit a list of nodes as block in a frame.  If the current frame
        is no buffer a dummy ``if 0: yield None`` is written automatically.
        ÚpassN)rÓ   r/   r»   )r%   r
   r(   r'   r2   r2   r3   Ú
blockvisitº  s   
ÿÿzCodeGenerator.blockvisitÚxc                 C   s€   | j r8| js)| j d| j  ¡ |  j| j 7  _| jdur)| j | j| jf¡ d| _d| _| j d| j ¡ d| _ | j |¡ dS )z&Write a string into the output stream.Ú
NFz    r   )	rÅ   rÇ   rP   rB   rÂ   rÄ   rÃ   ÚappendrÉ   )r%   ræ   r2   r2   r3   rB   Å  s   
zCodeGenerator.writer   Úextrac                 C   s   |   ||¡ |  |¡ dS )z!Combination of newline and write.N)ÚnewlinerB   )r%   ræ   r'   ré   r2   r2   r3   rÓ   Ó  s   zCodeGenerator.writelinec                 C   sB   t | jd| ƒ| _|dur|j| jkr|j| _|j| _dS dS dS )z/Add one or more newlines before the next write.r	   N)ÚmaxrÅ   rÎ   rÆ   rÄ   )r%   r'   ré   r2   r2   r3   rê   Ú  s
   þzCodeGenerator.newlineÚextra_kwargsc           	      C   s°  t dd„ tdd„ |jD ƒ|pdƒD ƒƒ}|jD ]}|  d¡ |  ||¡ q|sP|jD ]}|  d¡ |  ||¡ q*|durP| ¡ D ]\}}|  d|› d|› ¡ q@|jr_|  d¡ |  |j|¡ |rÃ|jdurl|  d	¡ n|  d
¡ |jD ]}|  |j	›d¡ |  |j
|¡ |  d¡ qt|dur¤| ¡ D ]\}}|  |›d|› d¡ q”|jdur¼|  d¡ |  |j|¡ |  d¡ dS |  d¡ dS |jdurÖ|  d¡ |  |j|¡ dS dS )a+  Writes a function call to the stream for the current node.
        A leading comma is added automatically.  The extra keyword
        arguments may not include python keywords otherwise a syntax
        error could occur.  The extra keyword arguments should be given
        as python dict.
        c                 s   s     | ]}t t t|¡ƒV  qd S r+   )Úis_python_keywordr6   Úcastrj   )r]   ra   r2   r2   r3   r_   ï  s
   € ÿ
ÿz*CodeGenerator.signature.<locals>.<genexpr>c                 s   ó    | ]}|j V  qd S r+   )Úkey©r]   ræ   r2   r2   r3   r_   ñ  ó   € r2   r;   Nú=z, *z
, **dict({z, **{ú: z}, **r>   Ú}z, **)Úanyr   r*   ÚargsrB   r/   rq   Údyn_argsÚ
dyn_kwargsrð   rZ   )	r%   r'   r(   rì   Úkwarg_workaroundÚargÚkwargrð   rZ   r2   r2   r3   Ú	signatureá  sH   þ











þzCodeGenerator.signaturec              
   C   s  t ƒ }|D ]}| |¡ q| j|jdf| j|jdffD ]h\}}}t|ƒD ]^}||vr0|  ¡ ||< |  d¡ |  ¡  |  || › d|› d|›d¡ |  ¡  |  d¡ |  ¡  |  d¡ |  d	|| › d
¡ |  ¡  |  d|dd… › d|›d¡ |  ¡  |  ¡  q$qdS )aæ  Find all filter and test names used in the template and
        assign them to variables in the compiled namespace. Checking
        that the names are registered with the environment is done when
        compiling the Filter and Test nodes. If the node is in an If or
        CondExpr node, the check is done at runtime instead.

        .. versionchanged:: 3.0
            Filters and tests in If and CondExpr nodes are checked at
            runtime instead of compile time.
        r¥   r¦   útry:z = environment.ú[ú]zexcept KeyError:z@internalcodeúdef z
(*unused):zraise TemplateRuntimeError("No Néÿÿÿÿú named z	 found."))	r¤   r/   r¥   r¦   ÚsortedrÒ   rÓ   rØ   rÙ   )r%   r
   rG   r'   Úid_maprs   Ú
dependencyrN   r2   r2   r3   Úpull_dependencies  s<   ýþ
 

ÿÿ
ìøzCodeGenerator.pull_dependenciesc              	   C   s¬   g }|j j ¡ D ]<\}\}}|tkrq|tkr(|  |› d|  ¡ › d|›d¡ q|tkr7|  |› d|› ¡ q|tkrA| 	|¡ qt
dƒ‚|rT|  d |¡› d¡ d S d S )Nú = r<   r>   zunknown load instructionú
 = missing)rˆ   Úloadsrq   r   r   rÓ   Úget_resolve_funcr   r   rè   ÚNotImplementedErrorÚjoin)r%   r(   ÚundefsÚtargetÚactionÚparamr2   r2   r3   Úenter_frameH  s   "ÿzCodeGenerator.enter_frameÚwith_python_scopec                 C   sF   |sg }|j jD ]}| |¡ q|r!|  d |¡› d¡ d S d S d S )Nr  r	  )rˆ   r
  rè   rÓ   r  )r%   r(   r  r  r  r2   r2   r3   Úleave_frameX  s   ûzCodeGenerator.leave_frameúasync Ú Úasync_valueÚ
sync_valuec                 C   s   | j jr|S |S r+   )r?   Úis_async)r%   r  r  r2   r2   r3   Úchoose_async`  ó   zCodeGenerator.choose_asyncc                 C   s   |   ¡ › d|› S )Nr  )r  )r%   rN   r2   r2   r3   Úfuncc  s   zCodeGenerator.funcc                 C   sŠ  |  ¡ }|j |¡ t|ƒ}d}tƒ }g }t|jƒD ] \}}|jdkr%|}|jdv r0| |j¡ | 	|j 
|j¡¡ qt|jdƒ}	d|	v rr|durfz|j|t|jƒ   W n tye   |  d|j¡ Y n
w | 	|j d¡¡ d|_d|	v r†d|vr†| 	|j d¡¡ d|_d|	v ršd|vrš| 	|j d¡¡ d|_d	|_|j |¡ |  |  d
¡› dd |¡› d|¡ |  ¡  |  |¡ |  |¡ |  |¡ t|jƒD ]V\}}|j 
|j¡}
|  d|
› d¡ |  ¡  z|j|t|jƒ  }W n ty   |  |
› d|j›d|j›d¡ Y nw |  |
› d¡ |  ||¡ |  |
¡ |   ¡  qÍ|  !¡  |  "|j|¡ | j#|dd | j$|dd |   ¡  ||fS )z/Dump the function def of a macro or call block.NÚcaller)r*   Úvarargs)r  r*   r  zhWhen defining macros or call blocks the special "caller" argument must be omitted or be given a default.Tr*   r  FÚmacror<   r;   ú):úif ú is missing:z = undefined("parameter z was not provided", name=r>   r  )rÕ   ©r  )%r›   rˆ   Úanalyze_noderx   rm   Ú	enumerater÷   rN   rª   rè   Úrefrw   ÚbodyÚdefaultsÚlenÚ
IndexErrorrÏ   rÎ   Údeclare_parameterrz   r{   r|   r‰   rÓ   r  r  rØ   rŠ   r  Úpush_parameter_definitionsr/   Úmark_parameter_storedrÙ   Úpop_parameter_definitionsrå   rÛ   r  )r%   r'   r(   Ú	macro_refÚexplicit_callerÚskip_special_paramsr÷   Úidxrû   rv   r&  Údefaultr2   r2   r3   Ú
macro_bodyf  sz   

üÿ$


ÿÿÿ

zCodeGenerator.macro_bodyr/  c                 C   sr   d  dd„ |jjD ƒ¡}t|jddƒ}t|jjƒdkr|d7 }|  d|›d	|› d
|j›d|j›d|j›d¡ dS )z<Dump the macro definition for the def created by macro_body.r;   c                 s   s    | ]}t |jƒV  qd S r+   )ÚreprrN   rñ   r2   r2   r3   r_   »  s   € z*CodeGenerator.macro_def.<locals>.<genexpr>rN   Nr	   ú,zMacro(environment, macro, z, (z), z, context.eval_ctx.autoescape))	r  r'   r÷   Úgetattrr)  rB   r{   r|   rz   )r%   r/  r(   Ú	arg_tuplerN   r2   r2   r3   Ú	macro_def¹  s   ÿÿþÿzCodeGenerator.macro_defc                 C   s*   d|j › }| jdur|› d| j›}|S )z.Return a human readable position for the node.zline Nú in )rÎ   rN   )r%   r'   r™   r2   r2   r3   ÚpositionÅ  s   
zCodeGenerator.positionc                 C   s*   d  dd„ |j ¡  ¡ D ƒ¡}d|› dS )Nr;   c                 s   s"    | ]\}}|›d |› V  qdS ©rô   Nr2   )r]   rN   r  r2   r2   r3   r_   Í  s
   € ÿ
ÿz3CodeGenerator.dump_local_context.<locals>.<genexpr>Ú{rõ   )r  rˆ   Údump_storesrq   )r%   r(   Úitems_kvr2   r2   r3   Údump_local_contextÌ  s   
þz CodeGenerator.dump_local_contextc                 C   s6   |   d¡ |   d¡ |   d¡ |   d¡ |   d¡ dS )z·Writes a common preamble that is used by root and block functions.
        Primarily this sets up common local helpers and enforces a generator
        through a dead branch.
        z$resolve = context.resolve_or_missingz!undefined = environment.undefinedzconcat = environment.concatzcond_expr_undefined = Undefinedzif 0: yield NoneN©rÓ   r§   r2   r2   r3   Úwrite_commonsÓ  s
   



zCodeGenerator.write_commonsc                 C   s   | j  |j ¡ ¡ dS )aQ  Pushes all parameter targets from the given frame into a local
        stack that permits tracking of yet to be assigned parameters.  In
        particular this enables the optimization from `visit_Name` to skip
        undefined expressions for parameters in macros as macros can reference
        otherwise unbound parameters.
        N)rË   rè   rˆ   Údump_param_targetsrÔ   r2   r2   r3   r,  à  s   z(CodeGenerator.push_parameter_definitionsc                 C   s   | j  ¡  dS )z+Pops the current parameter definitions set.N)rË   Úpopr§   r2   r2   r3   r.  é  s   z'CodeGenerator.pop_parameter_definitionsr  c                 C   s   | j r| j d  |¡ dS dS )z€Marks a parameter in the current parameter definitions as stored.
        This will skip the enforced undefined checks.
        r  N)rË   r·   ©r%   r  r2   r2   r3   r-  í  s   ÿz#CodeGenerator.mark_parameter_storedc                 C   s   | j  |¡ d S r+   )rÌ   rè   rE  r2   r2   r3   Úpush_context_referenceô  r  z$CodeGenerator.push_context_referencec                 C   s   | j  ¡  d S r+   )rÌ   rD  r§   r2   r2   r3   Úpop_context_reference÷  s   z#CodeGenerator.pop_context_referencec                 C   s
   | j d S )Nr  ©rÌ   r§   r2   r2   r3   Úget_context_refú  s   
zCodeGenerator.get_context_refc                 C   s    | j d }|dkrdS |› dS )Nr  r¼   Úresolvez.resolverH  rE  r2   r2   r3   r  ý  s   

zCodeGenerator.get_resolve_funcc                 C   s   |   ¡ › d|  |¡› dS )Nz	.derived(r>   )rI  r@  rÔ   r2   r2   r3   Úderive_context  s   zCodeGenerator.derive_contextc                 C   s   | j sdS || j d v S )z4Checks if a given target is an undeclared parameter.Fr  )rË   rE  r2   r2   r3   Úparameter_is_undeclared  s   z%CodeGenerator.parameter_is_undeclaredc                 C   s   | j  tƒ ¡ dS )z+Pushes a new layer for assignment tracking.N)rÊ   rè   rm   r§   r2   r2   r3   Úpush_assign_tracking  rÐ   z"CodeGenerator.push_assign_trackingc                 C   s–  | j  ¡ }|js|js|jr|sdS dd„ |D ƒ}t|ƒdkrWtt|ƒƒ}|j 	|¡}|jr;|  
d|›d|› ¡ dS |jrK|  
d|›d|› ¡ dS |  
d|›d|› ¡ n>|jr`|  
d	¡ n|jri|  
d
¡ n|  
d¡ tt|ƒƒD ]\}}|r|  d¡ |j 	|¡}|  |›d|› ¡ qt|  d¡ |jsÅ|jsÇ|rÉt|ƒdkr°|  
d|d ›d¡ dS d ttt|ƒƒ¡}|  
d|› d¡ dS dS dS dS )zoPops the topmost level for assignment tracking and updates the
        context variables if necessary.
        Nc                 S   s    g | ]}|d d… dkr|‘qS )Nr	   Ú_r2   rñ   r2   r2   r3   Ú
<listcomp>  s     z5CodeGenerator.pop_assign_tracking.<locals>.<listcomp>r	   z_loop_vars[ú] = z_block_vars[úcontext.vars[z_loop_vars.update({z_block_vars.update({úcontext.vars.update({r;   rô   ú})úcontext.exported_vars.add(r   r>   zcontext.exported_vars.update((rÖ   )rÊ   rD  r   rŽ   rŒ   r)  ÚnextÚiterrˆ   r&  rÓ   r%  r  rB   r  Úmapr5  )r%   r(   ÚvarsÚpublic_namesrN   r&  r2  Ú	names_strr2   r2   r3   Úpop_assign_tracking  sL   
ÿþýü


ûz!CodeGenerator.pop_assign_trackingc              	   C   s8  |d u sJ dƒ‚t | j| jƒ}ddlm} ddlm} | jjr&t|| ƒ}nt|ƒ}|  dd 	|¡ ¡ | j
r9dnd}| tj¡d u}| tj¡D ]}	|	j| jv r]|  d	|	j›d
|	j¡ |	| j|	j< qI| tj¡D ]:}
|
j| jvr¤|
j}|  ¡  | j|< }d|v r™| dd¡\}}|  d|› d|› d|› ¡ qj|  d|› d|› ¡ qj|  d| j›¡ | j|  d¡› d|› ddd |  ¡  |  ¡  t|ƒ}dt|jdƒv rà|j d¡}|  |› d¡ |j  |¡ d |_!|_"|oñ| j# |_$|rú|  d¡ |  %|¡ |  &|j¡ |  '|j|¡ | j(|dd |  )¡  |rh| j#s'|  ¡  |  d¡ |  ¡  | jjs6|  d¡ n)|  d¡ |  d¡ |  ¡  |  d¡ |  ¡  |  d ¡ |  )¡  |  )¡  |  d!¡ |  )d| j#  ¡ | j *¡ D ]ƒ\}}	|  |  d"| ¡› d|› d|	d¡ |  ¡  |  ¡  t|ƒ}d|_+t|	jd#ƒ}d|v r«|j d¡}|  |› d¡ d$|v rÄ|j d$¡}|  |› d%|›d&|› d'¡ |j  |	¡ ||_,|  d(¡ |  %|¡ |  &|	j¡ |  '|	j|¡ | j(|dd |  )¡  qmd 	d)d*„ | jD ƒ¡}| jd+|› d,dd d- 	d.d*„ | j-D ƒ¡}|  d/|›¡ d S )0Nzno root frame allowedr	   )Úasync_exported)Úexportedzfrom jinja2.runtime import r;   r  z, environment=environmentzblock z defined twiceÚ.zfrom z import z as zimport zname = Úrootz(context, missing=missingr   )ré   r%   r§   z = TemplateReference(context)Tzparent_template = Noner#  úif parent_template is not None:z4yield from parent_template.root_render_func(context)z0agen = parent_template.root_render_func(context)rþ   zasync for event in agen:zyield eventzfinally: await agen.aclose()Úblock_)r%   Úsuperrb  z = context.super(z, block_r>   z_block_vars = {}c                 s   s    | ]
}|›d |› V  qdS )z: block_Nr2   rñ   r2   r2   r3   r_   ²  s   € z/CodeGenerator.visit_Template.<locals>.<genexpr>z
blocks = {rõ   ú&c                 s   s"    | ]\}}|› d |› V  qdS )ró   Nr2   r`   r2   r2   r3   r_   ´  s   €  zdebug_info = ).r   r?   rN   Úruntimer\  r]  r  r  rÓ   r  rQ   Úfindr
   ÚExtendsÚfind_allr´   r¿   rÏ   rÎ   ÚImportedNameÚ
importnamer¾   rÒ   Úrsplitr  rØ   rB  r)   rw   r'  rˆ   r+  r$  rŒ   r   rÁ   r‰   r  r  rå   r  rÙ   rq   r   r‹   rÃ   )r%   r'   r(   r-   r\  r]  Úexported_namesÚenvenvÚhave_extendsr‹   Úimport_ÚimpÚaliasÚmoduleÚobjr&  rN   r   rv   Úblocks_kv_strÚdebug_kv_strr2   r2   r3   Úvisit_Template=  s²   €ÿ








ý



zCodeGenerator.visit_Templatec                 C   sP  d}|j r| jr
dS | jdkr|  d¡ |  ¡  |d7 }|jr%|  |¡}n|  ¡ }|jrJ|  d|j	›d|¡ |  ¡  |  d|j	›d|¡ |  
¡  | jjsb|jdu rb|  d	|j	›d
|› d|¡ n?|  d|j	›d
|› d¡ |  d¡ |  ¡  |  |  ¡ › d|¡ |  ¡  |  d|¡ |  
¡  |  
¡  |  d|  dd¡› ¡ |  
|¡ dS )z.Call a block and register it for the template.r   Núif parent_template is None:r	   zif len(context.blocks[z]) <= 1:z+raise TemplateRuntimeError("Required block z not found")zyield from context.blocks[z][0](r>   zgen = context.blocks[rþ   úfor event in gen:Úeventú	finally: úawait gen.aclose()úgen.close())rŒ   rÁ   rÀ   rÓ   rØ   ÚscopedrK  rI  ÚrequiredrN   rÙ   r?   r  rŠ   r  rã   )r%   r'   r(   r†   r¼   r2   r2   r3   r¯   ·  sL   

þÿ
þÿzCodeGenerator.visit_Blockc                 C   sÄ   |j s
|  d|j¡ | jdkr*| js|  d¡ |  ¡  |  d¡ | jr&tƒ ‚|  ¡  |  d|¡ |  	|j
|¡ |  d| j›d¡ |  d¡ |  ¡  |  d	¡ |  ¡  |jrYd
| _|  jd7  _dS )zCalls the extender.z,cannot use extend from a non top-level scoper   r`  z5raise TemplateRuntimeError("extended multiple times")z+parent_template = environment.get_template(r;   r>   z9for name, parent_block in parent_template.blocks.items():z8context.blocks.setdefault(name, []).append(parent_block)Tr	   N)rŒ   rÏ   rÎ   rÀ   rÁ   rÓ   rØ   r»   rÙ   r/   ÚtemplaterB   rN   r   rE   r2   r2   r3   Úvisit_Extendsè  s(   




zCodeGenerator.visit_Extendsc                    sž  |j rˆ d¡ ˆ ¡  d}t|jtjƒr+t|jjtƒrd}nt|jjt	t
fƒr*d}nt|jtjtjfƒr7d}ˆ d|› d|¡ ˆ |jˆ ¡ ˆ dˆj›d¡ |j rtˆ ¡  ˆ d	¡ ˆ ¡  ˆ d
¡ ˆ ¡  ˆ d¡ ˆ ¡  d‡ ‡fdd„}|jr²ˆ dˆ ˆ ¡› d¡ ˆ d¡ ˆ ¡  ˆ ˆ ¡ › d¡ |ƒ  ˆ ¡  ˆ dˆ dd¡› ¡ nˆjjr¿ˆ d¡ |ƒ  nˆ d¡ |j rÍˆ ¡  dS dS )zHandles includes.rþ   Úget_or_select_templateÚget_templateÚselect_templateztemplate = environment.r<   r;   r>   zexcept TemplateNotFound:rä   r×   r$   Nc                      s    ˆ  ¡  ˆ dˆ ¡ ˆ ¡  d S )Nrx  )rØ   rã   rÙ   r2   ©r(   r%   r2   r3   Ú	loop_body-  s   z.CodeGenerator.visit_Include.<locals>.loop_bodyzNgen = template.root_render_func(template.new_context(context.get_all(), True, rÖ   rw  ry  rz  r{  zGfor event in (await template._get_default_module_async())._body_stream:z6yield from template._get_default_module()._body_streamr±   )Úignore_missingrÓ   rØ   rS   r~  r
   ÚConstrZ   rj   rk   rl   ÚTupleÚListr/   rB   rN   rÙ   Úwith_contextr@  r  r?   r  )r%   r'   r(   Ú	func_namer„  r2   rƒ  r3   Úvisit_Include  s^   
€


þÿ
ÿÿ
ÿzCodeGenerator.visit_Includec                 C   sŠ   |   |  d¡› d¡ |  |j|¡ |   d| j›d¡ |jr7d|  d¡› }|   |› d|  |¡› d¡ d S |   d	|  d¡› d
¡ d S )Núawait zenvironment.get_template(r;   z).Úmake_moduleÚ_asyncz(context.get_all(), True, r>   Ú_get_default_modulez	(context))rB   r  r/   r~  rN   r‰  r@  )r%   r'   r(   Úf_namer2   r2   r3   Ú_import_commonL  s   ÿzCodeGenerator._import_commonc                 C   st   |   |j |j¡› d|¡ |jr|  d|j›d¡ |  ||¡ |jr6|j d¡s8|   d|j›d¡ dS dS dS )zVisit regular imports.r  rQ  rP  rN  úcontext.exported_vars.discard(r>   N)rÓ   rˆ   r&  r  rŒ   rB   r‘  Ú
startswithrE   r2   r2   r3   Úvisit_Import[  s   ÿzCodeGenerator.visit_Importc              	      s¼  |   |¡ |  d¡ |  |ˆ ¡ g }g }|jD ]k}t|tƒr#|\}}n|}|  ˆ j |¡› d|›d¡ |  dˆ j |¡› d¡ |  	¡  |  
|¡ dd¡ dd	¡}d
|› d|›}|  ˆ j |¡› d|›d|›d¡ |  ¡  ˆ jr‚| |¡ | d¡s‚| |¡ q|r´t|ƒdkrŸ|d }|  d|›dˆ j |¡› ¡ nd ‡ fdd„|D ƒ¡}	|  d|	› d¡ |rÜt|ƒdkrÉ|  d|d ›d¡ dS d tt|ƒ¡}
|  d|
› d¡ dS dS )zVisit named imports.zincluded_template = z = getattr(included_template, z
, missing)r!  r"  r=  z{{rõ   z}}z9the template {included_template.__name__!r} (imported on z%) does not export the requested name z = undefined(fz, name=r>   rN  r	   r   rQ  rP  r;   c                 3   s&    | ]}|›d ˆ j  |¡› V  qdS r<  )rˆ   r&  )r]   rN   ©r(   r2   r3   r_     s   € 
ÿz1CodeGenerator.visit_FromImport.<locals>.<genexpr>rR  rS  r’  z)context.exported_vars.difference_update((rÖ   N)rê   rB   r‘  rs   rS   rk   rÓ   rˆ   r&  rØ   r;  ÚreplacerÙ   rŒ   rè   r“  r)  r  rW  r5  )r%   r'   r(   Ú	var_namesÚdiscarded_namesrN   rp  r;  ÚmessageÚnames_kvrZ  r2   r•  r3   Úvisit_FromImportf  s`   




ÿÿÿþÿÿ


€ ÿ
ÿûzCodeGenerator.visit_FromImportc                 C   s|  |  ¡ }d|_|  ¡ }|  ¡ }|jp)dt|jdddƒv p)tdd„ | tj¡D ƒƒ}d }|r4|j	 
d¡}|j	j|dd	 |jrG|j	j|d
d	 |jrÂ|  ¡ }|j	j|dd	 |  |  |¡› d|j¡ |  ¡  |  |¡ |  |  dd¡¡ |  |j|¡ |  d¡ |  |  dd¡¡ |  d¡ |  ¡  |  d|j¡ |  |j|¡ |  d¡ |  ¡  |  d¡ |  |j|¡ |  d¡ | j|dd |jrÞ|  |  d¡› d|¡ |  ¡  |  |¡ |j|_|rè|  |› d¡ | tj¡D ]}	|	jdkr|	jdkr|  d|	j¡ qî|jr|  ¡ }
|  |
› d¡ |  |  dd¡|¡ |  |j|¡ |r8|  d|› d|  d¡› d¡ n|  d¡ |jrI|  |› d¡ |jrS|  d ¡ n!| jj r`|s`|  d!¡ |  |j!|¡ | jj rt|st|  d"¡ |jr}|  d"¡ |jr‡|  d#¡ n
|  |rŽd$nd¡ |  ¡  |  |¡ |  d%¡ |  "|j#|¡ |jr²|  |
› d&¡ |  ¡  | j||joÀ|j d |jré|  d|
› d¡ |  ¡  |  |¡ |  "|j|¡ |  |¡ |  ¡  |jr,|  $|¡ |  ¡  |  %||¡ |  |  d'¡› d(¡ | jj r|  d!¡ |  |j!|¡ | jj r"|  d"¡ |  d)¡ |  &|¡ | j'r<| j'd*  (|j	j)¡ d S d S )+NTÚloop)r'  )Úonly)rœ  c                 s   rï   r+   )r|  )r]   r‹   r2   r2   r3   r_   ª  rò   z*CodeGenerator.visit_For.<locals>.<genexpr>r'  )Ú
for_branchÚelseÚtestz(fiter):z
async for zfor r:  zauto_aiter(fiter)Úfiterú:r!  rÞ   é   r#  z%(reciter, loop_render_func, depth=0):r	  Ústorez8Can't assign to special loop variable in for-loop targetz = 1r;   ÚAsynczLoopContext(r<   Úreciterzauto_aiter(r>   z&, undefined, loop_render_func, depth):z, undefined):z_loop_vars = {}z = 0rŒ  zloop(z, loop)r  )*r›   rŽ   Ú	recursiverw   Úiter_child_nodesrö   rg  r
   r´   rˆ   r+  r$  Úelse_r   rÒ   rÓ   r  rØ   r  r  r/   r  rB   rÙ   r  rŠ   rº   r¶   rN   rÏ   rÎ   r?   r  rV  rå   r'  rÛ   rà   rá   rÊ   Údifference_updateÚstores)r%   r'   r(   rŽ   Ú
test_frameÚ
else_frameÚextended_loopÚloop_refÚloop_filter_funcrN   Úiteration_indicatorr2   r2   r3   Ú	visit_For  sÖ   ÿÿü





ÿ
þ€ 





ÿ








ÿzCodeGenerator.visit_Forc                 C   sÎ   |  ¡ }|  d|¡ |  |j|¡ |  d¡ |  ¡  |  |j|¡ |  ¡  |j	D ]#}|  d|¡ |  |j|¡ |  d¡ |  ¡  |  |j|¡ |  ¡  q(|j
re|  d¡ |  ¡  |  |j
|¡ |  ¡  d S d S )Nr!  r¢  zelif r×   )rœ   rÓ   r/   r   rB   rØ   rå   r'  rÙ   Úelif_r©  )r%   r'   r(   Úif_framer³  r2   r2   r3   Úvisit_If(  s(   




üzCodeGenerator.visit_Ifc                 C   s|   |   ||¡\}}|  ¡  |jr)|j d¡s|  d|j›d¡ |  d|j›d¡ |  |j |j¡› d¡ |  	||¡ d S )NrN  rT  r>   rQ  rP  r  )
r4  rê   rŒ   rN   r“  rB   rÓ   rˆ   r&  r9  )r%   r'   r(   Úmacro_framer/  r2   r2   r3   Úvisit_Macro=  s   zCodeGenerator.visit_Macroc                 C   sR   |   ||¡\}}|  d¡ |  ||¡ |  ||¡ | j|j|dd |  |¡ d S )Nz	caller = T)Úforward_caller)r4  rÓ   r9  rà   Ú
visit_CallÚcallrá   )r%   r'   r(   Ú
call_framer/  r2   r2   r3   Úvisit_CallBlockG  s   
zCodeGenerator.visit_CallBlockc                 C   sh   |  ¡ }|j |¡ |  |¡ |  |¡ |  |j|¡ |  ||¡ |  |j	|¡ |  
|¡ |  |¡ d S r+   )r›   rˆ   r$  r  rŠ   rå   r'  rà   r«   Úfilterrá   r  )r%   r'   r(   Úfilter_framer2   r2   r3   Úvisit_FilterBlockO  s   


zCodeGenerator.visit_FilterBlockc                 C   s|   |  ¡ }|j |¡ |  |¡ t|j|jƒD ]\}}|  ¡  |  ||¡ |  	d¡ |  ||¡ q|  
|j|¡ |  |¡ d S )Nr  )r›   rˆ   r$  r  ÚzipÚtargetsÚvaluesrê   r/   rB   rå   r'  r  )r%   r'   r(   Ú
with_framer  Úexprr2   r2   r3   Ú
visit_WithZ  s   

zCodeGenerator.visit_Withc                 C   s   |   |¡ |  |j|¡ d S r+   )rê   r/   r'   rE   r2   r2   r3   Úvisit_ExprStmtf  r¬   zCodeGenerator.visit_ExprStmtc                   @   s4   e Zd ZU ejejdef  ed< eje ed< dS )zCodeGenerator._FinalizeInfo.ÚconstÚsrcN)r   r€   r   r6   rŸ   ÚCallablerj   Ú__annotations__r2   r2   r2   r3   Ú_FinalizeInfoj  s   
 rË  rZ   c                 C   s   t | ƒS )z¼The default finalize function if the environment isn't
        configured with one. Or, if the environment has one, this is
        called on that function's output for constants.
        )rj   rr   r2   r2   r3   Ú_default_finalizen  s   zCodeGenerator._default_finalizeÚ	_finalizec                    sÆ   ˆj durˆj S ˆj }‰ d}ˆjjrYd}ˆjj‰tjdtjdtjdi t ˆ¡¡}d}|du r?dt	j
dt	j
f‡ ‡fdd	„}n|› |› d
}|dkrYdt	j
dt	j
f‡ ‡‡fdd	„}ˆ ||¡ˆ_ ˆj S )a‰  Build the finalize function to be used on constants and at
        runtime. Cached so it's only created once for all output nodes.

        Returns a ``namedtuple`` with the following attributes:

        ``const``
            A function to finalize constant data at compile time.

        ``src``
            Source code to output around nodes to be evaluated at
            runtime.
        Nzenvironment.finalize(r¼   úcontext.eval_ctxr?   rZ   r$   c                    s   ˆ ˆ| ƒƒS r+   r2   rr   )r3  Úenv_finalizer2   r3   Úfinalizeš  s   z.CodeGenerator._make_finalize.<locals>.finalizer;   c                    s   ˆ ˆˆj | ƒƒS r+   )r?   rr   ©r3  rÏ  r%   r2   r3   rÐ  ¢  r  )rÍ  rÌ  r?   rÐ  r   r¼   Úeval_contextÚgetÚfrom_objr6   r7   rË  )r%   rÐ  rÈ  Úpass_argr2   rÑ  r3   Ú_make_finalizex  s.   

ýÿüzCodeGenerator._make_finalizeÚgroupc                 C   s   t t|ƒƒS )z™Given a group of constant values converted from ``Output``
        child nodes, produce a string to write to the template module
        source.
        )r5  r   )r%   r×  r2   r2   r3   Ú_output_const_repr¨  s   z CodeGenerator._output_const_reprrÐ  c                 C   s:   |  |j¡}|jjrt|ƒ}t|tjƒrt|ƒS | |¡S )aC  Try to optimize a child of an ``Output`` node by trying to
        convert it to constant, finalized data at compile time.

        If :exc:`Impossible` is raised, the node is not constant and
        will be evaluated at runtime. Any other exception will also be
        evaluated at runtime for easier debugging.
        )	Úas_constr-   rÚ   r   rS   r
   ÚTemplateDatarj   rÇ  )r%   r'   r(   rÐ  rÇ  r2   r2   r3   Ú_output_child_to_const¯  s   

z$CodeGenerator._output_child_to_constc                 C   sP   |j jr
|  d¡ n|j jr|  d¡ n|  d¡ |jdur&|  |j¡ dS dS )zXOutput extra source code before visiting a child of an
        ``Output`` node.
        z1(escape if context.eval_ctx.autoescape else str)(zescape(zstr(N)r-   r.   rB   rÚ   rÈ  ©r%   r'   r(   rÐ  r2   r2   r3   Ú_output_child_preÄ  s   

ÿzCodeGenerator._output_child_prec                 C   s&   |   d¡ |jdur|   d¡ dS dS )zWOutput extra source code after visiting a child of an
        ``Output`` node.
        r>   N)rB   rÈ  rÜ  r2   r2   r3   Ú_output_child_postÔ  s   

ÿz CodeGenerator._output_child_postc           	   
   C   sä  |j r| jrd S |  d¡ |  ¡  |  ¡ }g }|jD ]A}z|js*t|tjƒs*t 	¡ ‚|  
|||¡}W n tj	tfyC   | |¡ Y qw |rUt|d tƒrU|d  |¡ q| |g¡ q|jd ur~t|ƒdkrq|  |j› d¡ n	|  |j› d¡ |  ¡  |D ]P}t|tƒr¡|  |¡}|jd u r™|  d| ¡ q€|  |d ¡ q€|jd u r­|  d|¡ n|  |¡ |  |||¡ |  ||¡ |  |||¡ |jd urÐ|  d¡ q€|jd urç|  ¡  |  t|ƒdkrädnd	¡ |j rð|  ¡  d S d S )
Nrv  r  r	   rß   z	.extend((rÞ   r6  r>   rÖ   )r‰   rÁ   rÓ   rØ   rÖ  r
   rÇ  rS   rÚ  Ú
ImpossiblerÛ  Ú	Exceptionrè   rl   rŠ   r)  rØ  rê   rÝ  r/   rÞ  rB   rÙ   )	r%   r'   r(   rÐ  r'  ÚchildrÇ  ÚitemÚvalr2   r2   r3   Úvisit_Outputß  s`   

ý
ú
û







€
ÿzCodeGenerator.visit_Outputc                 C   s°   |   ¡  tƒ }| tj¡D ]+}|j|v rq| |j¡ |j |j¡}|  	d|› d¡ |  
¡  |  	d¡ |  ¡  q|  |¡ |  |j|¡ |  d¡ |  |j|¡ |  |¡ d S )Nzif not isinstance(z, Namespace):zMraise TemplateRuntimeError("cannot assign attribute on non-namespace object")r  )rM  rm   rg  r
   ÚNSRefrN   rª   rˆ   r&  rÓ   rØ   rÙ   rê   r/   r  rB   r'   r[  )r%   r'   r(   Ú	seen_refsÚnsrefr&  r2   r2   r3   Úvisit_Assign.  s$   
ÿ


zCodeGenerator.visit_Assignc                 C   s¶   |   ¡  | ¡ }d|_|j |¡ |  |¡ |  |¡ |  |j|¡ |  	|¡ |  
|j|¡ |  d¡ |jd ur@|  |j|¡ n
|  d|j› d¡ |  d¡ |  |¡ |  |¡ d S )NFz9 = (Markup if context.eval_ctx.autoescape else identity)(úconcat(r>   )rM  r›   r‰   rˆ   r$  r  rŠ   rå   r'  rê   r/   r  rB   r½  r«   r[  r  )r%   r'   r(   r   r2   r2   r3   Úvisit_AssignBlockM  s    






zCodeGenerator.visit_AssignBlockc              	   C   s¨   |j dkr|js|js|jr| jr| jd  |j¡ |j |j¡}|j dkrM|j 	|¡}|d ur;|d t
kr;|  |¡rM|  d|j›d|› d|› d¡ d S |  |¡ d S )	Nr¤  r  rµ   r   z(undefined(name=z) if z is missing else r>   )r¶   rŒ   rŽ   r   rÊ   rª   rN   rˆ   r&  Ú	find_loadr   rL  rB   )r%   r'   r(   r&  rµ   r2   r2   r3   r¸   e  s*   
ÿÿÿ
ÿÿzCodeGenerator.visit_Namec                 C   s*   |j  |j¡}|  |› d|j›d¡ d S )Nrÿ   r   )rˆ   r&  rN   rÓ   Úattr)r%   r'   r(   r&  r2   r2   r3   Úvisit_NSRef~  s   zCodeGenerator.visit_NSRefc                 C   s:   |  |j¡}t|tƒr|  t|ƒ¡ d S |  t|ƒ¡ d S r+   )rÙ  r-   rS   rg   rB   rj   r5  )r%   r'   r(   rã  r2   r2   r3   Úvisit_Const†  s   
zCodeGenerator.visit_Constc                 C   sH   z|   t| |j¡ƒ¡ W d S  tjy#   |   d|j›d¡ Y d S w ©Nz6(Markup if context.eval_ctx.autoescape else identity)(r>   )rB   r5  rÙ  r-   r
   rß  ÚdatarE   r2   r2   r3   Úvisit_TemplateData  s   
ÿÿz CodeGenerator.visit_TemplateDatac                 C   s\   |   d¡ d}t|jƒD ]\}}|r|   d¡ |  ||¡ q|   |dkr)d¡ d S d¡ d S )Nr<   r  r;   r   z,)r>   ©rB   r%  rq   r/   ©r%   r'   r(   r2  râ  r2   r2   r3   Úvisit_Tuple•  s   

 zCodeGenerator.visit_Tuplec                 C   sF   |   d¡ t|jƒD ]\}}|r|   d¡ |  ||¡ q
|   d¡ d S )Nrÿ   r;   r   rò  ró  r2   r2   r3   Ú
visit_Listž  s   

zCodeGenerator.visit_Listc                 C   s`   |   d¡ t|jƒD ]\}}|r|   d¡ |  |j|¡ |   d¡ |  |j|¡ q
|   d¡ d S )Nr=  r;   rô   rõ   )rB   r%  rq   r/   rð   rZ   ró  r2   r2   r3   Ú
visit_Dict¦  s   


zCodeGenerator.visit_Dictú+ú-Ú*ú/z//z**ú%ÚandÚorznot c                 C   s`   |j jrd}n	|j jrd}nd}|  |› d¡ |jD ]}|  ||¡ |  d¡ q|  d¡ d S )Nz8(markup_join if context.eval_ctx.volatile else str_join)Úmarkup_joinÚstr_joinz((r;   rÖ   )r-   r.   rÚ   rB   r
   r/   )r%   r'   r(   rŠ  rû   r2   r2   r3   Úvisit_Concat½  s   
zCodeGenerator.visit_Concatc                 C   s>   |   d¡ |  |j|¡ |jD ]}|  ||¡ q|   d¡ d S )Nr<   r>   )rB   r/   rÄ  Úops)r%   r'   r(   r9   r2   r2   r3   Úvisit_CompareË  s
   

zCodeGenerator.visit_Comparec                 C   s*   |   dt|j › d¡ |  |j|¡ d S )Nr=   )rB   Ú	operatorsr9   r/   rÄ  rE   r2   r2   r3   Úvisit_OperandÓ  s   zCodeGenerator.visit_Operandc                 C   sX   | j jr	|  d¡ |  d¡ |  |j|¡ |  d|j›d¡ | j jr*|  d¡ d S d S )Nú(await auto_await(zenvironment.getattr(r;   r>   rÖ   )r?   r  rB   r/   r'   rì  rE   r2   r2   r3   Úvisit_Getattr×  s   

ÿzCodeGenerator.visit_Getattrc                 C   s¨   t |jtjƒr!|  |j|¡ |  d¡ |  |j|¡ |  d¡ d S | jjr*|  d¡ |  d¡ |  |j|¡ |  d¡ |  |j|¡ |  d¡ | jjrR|  d¡ d S d S )Nrÿ   r   r  zenvironment.getitem(r;   r>   rÖ   )	rS   rû   r
   ÚSlicer/   r'   rB   r?   r  rE   r2   r2   r3   Úvisit_Getitemã  s   




ÿzCodeGenerator.visit_Getitemc                 C   sd   |j d ur|  |j |¡ |  d¡ |jd ur|  |j|¡ |jd ur0|  d¡ |  |j|¡ d S d S )Nr¢  )Ústartr/   rB   ÚstoprÝ   rE   r2   r2   r3   Úvisit_Sliceø  s   




þzCodeGenerator.visit_SliceÚ	is_filterc                 c   s   | j jr
|  d¡ |r!|  | j|j › d¡ | j j |j¡}n|  | j|j › d¡ | j j |j¡}|d u rQ|jsQ|r@dnd}|  d|› d|j›d|j	¡ t
jdt
jd	t
j d
i t
 |¡¡}|d urn|  |› d¡ d V  |  ||¡ |  d¡ | j jr‡|  d¡ d S d S )Nr  r<   r½  r   zNo r  r^  r¼   rÎ  r?   r;   r>   rÖ   )r?   r  rB   r¥   rN   rÓ  r¦   r   rÏ   rÎ   r   r¼   rÒ  rÔ  rý   )r%   r'   r(   r  r  Ú	type_namerÕ  r2   r2   r3   Ú_filter_test_common  s6   €
ýÿü
ÿz!CodeGenerator._filter_test_commonc                 C   sÖ   |   ||d¡Z |jd ur|  |j|¡ n4|jjr(|  d|j› d|j› d¡ n)|jjr7|  d|j› d¡ n"|  d|j› d¡ W d   ƒ d S W d   ƒ d S W d   ƒ d S W d   ƒ d S 1 sdw   Y  d S )NTz(Markup(concat(z.)) if context.eval_ctx.autoescape else concat(rÖ   zMarkup(concat(ré  r>   )r  r'   r/   r-   r.   rB   rŠ   rÚ   rE   r2   r2   r3   r«   ,  s&   

ÿÿóüú"õzCodeGenerator.visit_Filterc                 C   sB   |   ||d¡ |  |j|¡ W d   ƒ d S 1 sw   Y  d S ry   )r  r/   r'   rE   r2   r2   r3   r­   =  s   "ÿzCodeGenerator.visit_Testc                    sh   ˆ   ¡ ‰ d‡ ‡‡fdd„}ˆ d¡ ˆ ˆjˆ ¡ ˆ d¡ ˆ ˆjˆ ¡ ˆ d¡ |ƒ  ˆ d¡ d S )	Nr$   c                      s8   ˆj d urˆ ˆj ˆ ¡ d S ˆ dˆ ˆ¡› d¡ d S )Nz1cond_expr_undefined("the inline if-expression on z6 evaluated to false and no else section was defined."))Úexpr2r/   rB   r;  r2   ©r(   r'   r%   r2   r3   Úwrite_expr2F  s   
ÿÿz1CodeGenerator.visit_CondExpr.<locals>.write_expr2r<   z if z else r>   r±   )rœ   rB   r/   Úexpr1r   )r%   r'   r(   r  r2   r  r3   Úvisit_CondExprB  s   


zCodeGenerator.visit_CondExprr¸  c                 C   sÔ   | j jr	|  d¡ | j jr|  d¡ n|  d¡ |  |j|¡ |r%ddind }|jr.ddini }|jr7ddini }|rE|j|fi |¤Ž n|sI|rQt	|fi |¤Ž}|  
|||¡ |  d¡ | j jrh|  d¡ d S d S )	Nr  zenvironment.call(context, zcontext.call(r  Ú
_loop_varsÚ_block_varsr>   rÖ   )r?   r  rB   r@   r/   r'   rŽ   r   r–   rp   rý   )r%   r'   r(   r¸  rì   Úloop_kwargsÚblock_kwargsr2   r2   r3   r¹  Y  s$   


ÿzCodeGenerator.visit_Callc                 C   s"   |   |jd ¡ |  |j|¡ d S )Nró   )rB   rð   r/   rZ   rE   r2   r2   r3   Úvisit_Keywordp  s   zCodeGenerator.visit_Keywordc                 C   ó&   |   d¡ |  |j|¡ |   d¡ d S )NzMarkup(r>   ©rB   r/   rÄ  rE   r2   r2   r3   Úvisit_MarkSafev  s   
zCodeGenerator.visit_MarkSafec                 C   r  rï  r  rE   r2   r2   r3   Úvisit_MarkSafeIfAutoescape{  s   
z(CodeGenerator.visit_MarkSafeIfAutoescapec                 C   s   |   d|j ¡ d S )Nzenvironment.©rB   rN   rE   r2   r2   r3   Úvisit_EnvironmentAttribute‚  ó   z(CodeGenerator.visit_EnvironmentAttributec                 C   s   |   d|j›d|j› ¡ d S )Nzenvironment.extensions[z].)rB   Ú
identifierrN   rE   r2   r2   r3   Úvisit_ExtensionAttribute‡  s   z&CodeGenerator.visit_ExtensionAttributec                 C   s   |   | j|j ¡ d S r+   )rB   r¾   ri  rE   r2   r2   r3   Úvisit_ImportedNameŒ  s   z CodeGenerator.visit_ImportedNamec                 C   s   |   |j¡ d S r+   r  rE   r2   r2   r3   Úvisit_InternalName  r  z CodeGenerator.visit_InternalNamec                 C   s   |   d¡ d S )Nr¼   )rB   rE   r2   r2   r3   Úvisit_ContextReference’  s   z$CodeGenerator.visit_ContextReferencec                 C   s   |   |  |¡¡ d S r+   )rB   rK  rE   r2   r2   r3   Úvisit_DerivedContextReference—  r  z+CodeGenerator.visit_DerivedContextReferencec                 C   ó   |   d|¡ d S )NÚcontinuerA  rE   r2   r2   r3   Úvisit_Continueœ  r  zCodeGenerator.visit_Continuec                 C   r&  )NÚbreakrA  rE   r2   r2   r3   Úvisit_BreakŸ  r  zCodeGenerator.visit_Breakc                 C   s:   |  ¡ }|j |¡ |  |¡ |  |j|¡ |  |¡ d S r+   )r›   rˆ   r$  r  rå   r'  r  )r%   r'   r(   Úscope_framer2   r2   r3   Úvisit_Scope¢  s
   
zCodeGenerator.visit_Scopec                 C   s   |   ¡ }|  |› d|  |¡› ¡ |  |› d¡ |  |j|¡ |  |¡ |jdd}|j |¡ |  	|¡ |  
|j|¡ |  |¡ |  ¡  d S )Nr  z.vars = T)rš   )rÒ   rÓ   rK  r/   r¼   rF  r›   rˆ   r$  r  rå   r'  r  rG  )r%   r'   r(   r¶   r+  r2   r2   r3   Úvisit_OverlayScope©  s   


z CodeGenerator.visit_OverlayScopec              	   C   sr   |j D ]3}|  d|j› d¡ |  |j|¡ z	|j |j¡}W n tjy-   d|j_	Y qw t
|j|j|ƒ qd S )Nzcontext.eval_ctx.r  T)ÚoptionsrÓ   rð   r/   rZ   rÙ  r-   r
   rß  r.   Úsetattr)r%   r'   r(   Úkeywordrã  r2   r2   r3   Úvisit_EvalContextModifier·  s   
ÿøz'CodeGenerator.visit_EvalContextModifierc                 C   sh   |   ¡ }|j ¡ }|  |› d¡ |  ||¡ |jD ]}|  ||¡ q|j |¡ |  d|› d¡ d S )Nz = context.eval_ctx.save()zcontext.eval_ctx.revert(r>   )rÒ   r-   ÚsaverÓ   r1  r'  r/   Úrevert)r%   r'   r(   Úold_ctx_nameÚ	saved_ctxrá  r2   r2   r3   Úvisit_ScopedEvalContextModifierÄ  s   

z-CodeGenerator.visit_ScopedEvalContextModifier©NFTr   r±   )r	   r+   )Nr   )r  r  )¶r   r€   r   r6   rŸ   rj   ÚTextIOre   r~   ÚpropertyrR   rf   rÏ   rÒ   r)   rŠ   rÛ   rØ   rÙ   r
   ÚNoderà   rá   rã   r¹   rå   rB   rÓ   rê   r‚   ÚCallr²   r³   ÚMappingr7   rý   r  r  r  r  r  rƒ   r„   r‡  rx   r4  r9  r;  r@  rB  r,  r.  r-  rF  rG  rI  r  rK  rL  rM  r[  rT   ru  r´   r¯   rf  r  ÚIncluder‹  ÚImportÚ
FromImportr‘  r”  r›  ÚForr²  ÚIfrµ  r·  r¼  ÚFilterBlockr¿  ÚWithrÅ  ÚExprStmtrÆ  Ú
NamedTuplerË  ÚstaticmethodrÌ  rÍ  rÊ  rÖ  rØ  r5   rÛ  rÝ  rÞ  ÚOutputrä  ÚAssignrè  ÚAssignBlockrê  rº   r¸   rå  rí  r†  rî  rÚ  rñ  rô  rˆ  rõ  ÚDictrö  rJ   Ú	visit_AddÚ	visit_SubÚ	visit_MulÚ	visit_DivÚvisit_FloorDivÚ	visit_PowÚ	visit_ModÚ	visit_AndÚvisit_OrrM   Ú	visit_PosÚ	visit_NegÚ	visit_Notr8   ÚConcatr   ÚComparer  ÚOperandr  ÚGetattrr  ÚGetitemr  r  r  r   ÚIteratorr  r«   r­   ÚCondExprr  r¹  ÚKeywordr  ÚMarkSafer  ÚMarkSafeIfAutoescaper  ÚEnvironmentAttributer  ÚExtensionAttributer!  rh  r"  ÚInternalNamer#  ÚContextReferencer$  ÚDerivedContextReferencer%  ÚContinuer(  ÚBreakr*  ÚScoper,  ÚOverlayScoper-  ÚEvalContextModifierr1  ÚScopedEvalContextModifierr6  r2   r2   r2   r3   r&   ,  s"  
 ùþýü
ûúù
øIÿÿÿ
þ
 ÿÿÿ
ÿ
þÿÿ
ÿÿ
þ üþýü
û9.ÿÿ
þS

	

.ÿÿÿ
þz1*:ÿÿ
þ7 
0ÿÿÿ
þÿÿÿ
þÿÿÿ
þO	

ÿÿÿþ)ÿÿÿÿþÿÿ
þÿÿ
þÿÿ
þÿÿ
þÿÿ
þÿÿ
þÿÿþr7  )Frž   Útypingr6   Ú
contextlibr   Ú	functoolsr   Úior   Ú	itertoolsr   r0  r   rí   Ú
markupsafer   r   r  r
   Ú
exceptionsr   Ú
idtrackingr   r   r   r   r   r   r,   r   Úutilsr   r   rG   r   ÚTYPE_CHECKINGÚtyping_extensionsÚter?   r   ÚTypeVarrÉ  r7   r   r  r8   rj   rH   rJ   rL   rM   rT   rŸ   r8  re   rY   r\   r¹   r:  ÚSetrw   rx   r)   ÚRuntimeErrorru   r¤   rt   rà  r»   r&   r2   r2   r2   r3   Ú<module>   s˜    ø$ÿ
þùÿþýü
ûúù
ø
ÿÿ
þS