a
    VŸ$cm- ã                   @   sÖ  d dl mZmZmZmZmZ d dlmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZ d dlmZmZ d dlZd dlZd dlZd dlZdd„ Zdd„ ZG d	d
„ d
eƒZdtdd„ZG dd„ dejjƒZ eg g ddddƒZ!e g ddƒZ"dd„ Z#G dd„ deƒZ$dd„ Z%G dd„ deƒZ&dd„ Z'G dd„ deƒZ(G dd„ deƒZ)dd„ Z*dud d!„Z+G d"d#„ d#e)ƒZ,e-e,d$e,j.ƒ G d%d&„ d&e)ƒZ/G d'd(„ d(e)ƒZ0G d)d*„ d*e)ƒZ1G d+d,„ d,e)ƒZ2G d-d.„ d.e)ƒZ3G d/d0„ d0e)ƒZ4dvd1d2„Z5dwd3d4„Z6G d5d6„ d6e)ƒZ7G d7d8„ d8e)ƒZ8G d9d:„ d:e)ƒZ9G d;d<„ d<e)ƒZ:G d=d>„ d>e)ƒZ;G d?d@„ d@e)ƒZ<G dAdB„ dBe)ƒZ=G dCdD„ dDe)ƒZ>G dEdF„ dFe)ƒZ?e-e?d$e?j.ƒ G dGdH„ dHe)ƒZ@G dIdJ„ dJe)ƒZAG dKdL„ dLe)ƒZBG dMdN„ dNe)ƒZCG dOdP„ dPe)ƒZDG dQdR„ dRe)ƒZEdSdT„ ZFG dUdV„ dVeƒZGdWdX„ ZHh dY£ZIg ZJG dZd[„ d[e)ƒZKd\d]„ ZLg ZMG d^d_„ d_e)ƒZNG d`da„ dae)ƒZOG dbdc„ dce)ƒZPG ddde„ dee)ƒZQG dfdg„ dge)ƒZRG dhdi„ die)ƒZSG djdk„ dke)ƒZTG dldm„ dmeTƒZUG dndo„ doe)ƒZVG dpdq„ dqe)ƒZWG drds„ dse)ƒZXdS )xé    )ÚdivisionÚabsolute_importÚwith_statementÚprint_functionÚunicode_literals)ÚPY2Ú
basestringÚbchrÚbordÚchrÚopenÚpystrÚrangeÚroundÚstrÚtobytesÚunicode)ÚOptionalÚAnyNc                 C   s   t jjD ]}|| ƒ qdS )zI
    Reports the name of this statement to systems like window auto.
    N)ÚrenpyÚconfigÚstatement_callbacks)ÚnameÚi© r   úrenpy/ast.pyÚstatement_name)   s    r   c                 C   s   | t j ¡ _dS )zª
    Indicates the next node that should be executed. When a statement
    can crash, this should be set as early as possible, so that ignore
    can bring us there.
    N)r   ÚgameÚcontextÚ	next_node)Únr   r   r   r   2   s    r   c                   @   s,   e Zd ZdZg Zg Zddd„Zd	dd„ZdS )
ÚParameterInfozR
    This class is used to store information about parameters to a
    label.
    Nc           	      C   s¤   || _ || _|| _|| _|d u r(g | _n.g }|D ]}| |¡ |d |kr0 qPq0|| _|d u rfg | _n:g }t|ƒD ]}| |¡ |d |krr q’qr| ¡  || _d S ©Nr   )	Ú
parametersÚ
positionalÚextraposÚextrakwÚpositional_onlyÚappendÚkeyword_onlyÚreversedÚreverse)	Úselfr#   r$   r%   r&   Úlast_posonlyÚfirst_kwonlyÚrvÚparamr   r   r   Ú__init__E   s*    

zParameterInfo.__init__Fc              	   C   sN  i }|du rg }|du r$t j ¡ }n| ¡ }| j}|sª| jrH||| j< n0|rx|sx| dd¡sxtdd dd„ |D ƒ¡ ƒ‚| j	rŽt
|ƒ|| j	< n|r¦|s¦tdt|ƒ ƒ‚|S t| jƒ}t|ƒ}g }g }	|D ]`}
zt|ƒ\}}W n. ty
   t|
gt|ƒ ƒ}Y  q|Y n0 ||v r |	 |¡ |
||< qÈ|D ]D\}}||v rJ|	 |¡ |durft j |¡||< n
| |¡ q.tg ƒ}|	rÈ| jdu rÈ|s²td	d d
d„ |	D ƒ¡ ƒ‚n|	D ]}| |¡ q¶|t| jƒt| jƒ pâd… }t|ƒ}g }g }|D ]h}
zt|ƒ\}}W n* ty:   |
gt|ƒ }Y  q¶Y n0 |
||< ||v rü| |¡ | |¡ qü|D ]J\}}||v rŒ| |¡||< n&|dur¨t j |¡||< n
| |¡ qj|rÞ|sÞtdd dd„ |D ƒ¡ ƒ‚| j	röt
|ƒ|| j	< nd|rZ|sZ| j| }tdd„ |D ƒƒ}t|ƒ}||kr:t|ƒ}nd||f }td|t|ƒf ƒ‚|r‚|s‚tdd dd„ |D ƒ¡ ƒ‚g }| jD ]J\}}||v r®| |¡||< n&|durÊt j |¡||< n
| |¡ qŒ|r |s tdd dd„ |D ƒ¡ ƒ‚| jr||| j< n6|rJ|sJ| dd¡sJtdd dd„ |D ƒ¡ ƒ‚|S )a  
        Applies `args` and `kwargs` to these parameters. Returns
        a dictionary that can be used to update an enclosing
        scope.

        `ignore_errors`
            If true, errors will be ignored, and this function will do the
            best job it can.
        NÚ_ignore_extra_kwargsFz Unexpected keyword arguments: %sú, c                 s   s   | ]}d | V  qdS ©z'%s'Nr   ©Ú.0r   r   r   r   Ú	<genexpr>–   ó    z&ParameterInfo.apply.<locals>.<genexpr>z0Too many arguments in call (expected 0, got %d).z>Some positional-only arguments passed as keyword arguments: %sc                 s   s   | ]}d | V  qdS r4   r   r5   r   r   r   r7   Ã   r8   z)Missing required positional arguments: %sc                 s   s   | ]}d | V  qdS r4   r   r5   r   r   r   r7   è   r8   c                 S   s   g | ]}|d  du r|‘qS )é   Nr   r5   r   r   r   Ú
<listcomp>ð   r8   z'ParameterInfo.apply.<locals>.<listcomp>zfrom %d to %dz1Too many arguments in call (expected %s, got %d).z%Got multiple values for arguments: %sc                 s   s   | ]}d | V  qdS r4   r   r5   r   r   r   r7      r8   z+Missing required keyword-only arguments: %sc                 s   s   | ]}d | V  qdS r4   r   r5   r   r   r   r7     r8   c                 s   s   | ]}d | V  qdS r4   r   r5   r   r   r   r7     r8   )r   ÚpythonÚRevertableDictÚcopyr#   r&   ÚpopÚ	TypeErrorÚjoinr%   ÚtupleÚlenÚiterr'   ÚnextÚStopIterationÚlistr(   Úpy_evalr)   r   )r,   ÚargsÚkwargsÚignore_errorsr/   r#   ÚslotsÚargsiÚ
missed_posÚposonly_keywordÚvaluer   Ú_ÚdefaultÚposkw_slotsÚ	extraargsÚduplicated_namesr$   ÚrequiredÚtotalÚexpectedÚ	missed_kwr   r   r   Úapplyu   sð    ÿÿ






ÿÿ 



ÿÿ



ÿÿÿÿ

ÿÿÿÿzParameterInfo.apply)NN)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r'   r)   r1   rY   r   r   r   r   r!   <   s
   
0r!   Fc                 C   s0   | d u r"|s|r|st dƒ‚ni S |  |||¡S )Nz2Arguments supplied, but parameter list not present)Ú	ExceptionrY   )r#   rH   rI   rJ   r   r   r   Úapply_arguments  s
    
r_   c                   @   s@   e Zd ZdZeƒ Zeƒ Zdd„ Zddd„Zddd„Z	d	d
„ Z
dS )ÚArgumentInfor9   c                 C   s†   |dk r‚| j }| j}| j}t|ƒt|ƒ t|ƒ }|rP|d h| _| d |f¡ |rn|d h| _| d |f¡ |r‚|r‚|d h| _d S )Nr9   é   )Ú	argumentsr%   r&   rB   ÚboolÚstarred_indexesr(   Údoublestarred_indexes)r,   Úversionrb   r%   r&   Úlengthr   r   r   Úafter_upgrade/  s    zArgumentInfo.after_upgradeNc                 C   s"   || _ |ptƒ | _|ptƒ | _d S ©N)rb   Úsetrd   re   )r,   rb   rd   re   r   r   r   r1   @  s    zArgumentInfo.__init__c                 C   sŠ   g }t j ¡ }t| jƒD ]d\}\}}t jj||d}|| jv rJ| |¡ q|| j	v r`| 
|¡ q|durr|||< q| |¡ qt|ƒ|fS )zx
        Evaluates the arguments, returning a tuple of arguments and a
        dictionary of keyword arguments.
        )ÚlocalsN)r   Ú
revertabler<   Ú	enumeraterb   r;   rG   rd   Úextendre   Úupdater(   rA   )r,   ÚscoperH   rI   r   ÚkÚvrO   r   r   r   ÚevaluateL  s    



zArgumentInfo.evaluatec                 C   sˆ   g }t | jƒD ]f\}\}}|| jv r4| d| ¡ q|| jv rN| d| ¡ q|d urj| d ||¡¡ q| |¡ qdd |¡ d S )NÚ*z**z{}={}ú(r3   ú))rm   rb   rd   r(   re   Úformatr@   )r,   Úlr   ÚkeywordÚ
expressionr   r   r   Úget_codee  s    

zArgumentInfo.get_code)NN)N)rZ   r[   r\   Ú__version__rj   rd   re   rh   r1   rs   r{   r   r   r   r   r`   )  s   

r`   c                 G   s   | j | g|¢R Ž S ri   )Ú__new__)ÚclsrH   r   r   r   Ú
__newobj__}  s    r   c                   @   sB   e Zd ZdZg d¢Zddd„Zdd„ Zedd	„ ƒZed
d„ ƒZ	dS )ÚPyExprz5
    Represents a string containing python code.
    )ÚfilenameÚ
linenumberÚpyé   c                 C   sD   t  | |¡}||_||_||_|r@tjjjd ur@tjjj 	|¡ |S ri   )
r   r}   r   r‚   rƒ   r   r   ÚscriptÚ
all_pyexprr(   )r~   Úsr   r‚   rƒ   r,   r   r   r   r}     s    zPyExpr.__new__c                 C   s   t | ƒ| j| j| jfS ri   )r   r   r‚   rƒ   ©r,   r   r   r   Ú__getnewargs__™  s    zPyExpr.__getnewargs__c                   C   s    t jjjdu rdS tt jjjƒS )zt
        Checkpoints the pyexpr list. Returns an opaque object that can be used
        to revert the list.
        N)r   r   r…   r†   rB   r   r   r   r   Ú
checkpointœ  s    zPyExpr.checkpointc                 C   s4   t jjjd u rd S | d u rd S g t jjj| d …< d S ri   )r   r   r…   r†   )Úopaquer   r   r   Úrevert¨  s
    zPyExpr.revertN)r„   )
rZ   r[   r\   r]   Ú	__slots__r}   r‰   ÚstaticmethodrŠ   rŒ   r   r   r   r   r€   ‚  s   

r€   c                 C   s   d| vS )zÃ
    Returns true if an expr probably does not have side effects, and should
    be predicted. Basically, this just whitelists a set of characters that
    doesn't allow for a function call.
    ru   r   )Úexprr   r   r   Úprobably_side_effect_free´  s    r   c                   @   s6   e Zd Zg d¢Zdd„ Zdd„ Zddd	„Zd
d„ ZdS )ÚPyCode)ÚsourceÚlocationÚmodeÚbytecodeÚhashrƒ   c                 C   s   d| j | j| j| jfS )Nr9   )r’   r“   r”   rƒ   rˆ   r   r   r   Ú__getstate__É  s    zPyCode.__getstate__c                 C   s`   t |ƒdkr&|\}| _| _| _d| _n|\}| _| _| _| _d | _tjjj	r\tjjj
 | ¡ d S )Né   ra   )rB   r’   r“   r”   rƒ   r•   r   r   r…   Úrecord_pycodeÚ
all_pycoder(   )r,   ÚstaterP   r   r   r   Ú__setstate__Ì  s    
zPyCode.__setstate__©z<none>r9   Úexecc                 C   sx   t |tƒr|j|j|f}tr$d| _nd| _|| _|tt ¡ ƒf | _	|| _
d | _tjjjrjtjjj | ¡ |  ¡ | _d S )Nra   r„   )Ú
isinstancer€   r   r‚   r   rƒ   r’   ÚintÚtimer“   r”   r•   r   r   r…   r™   rš   r(   Úget_hashr–   )r,   r’   Úlocr”   r   r   r   r1   Ø  s    

zPyCode.__init__c                 C   s~   z| j d ur| j W S W n ty(   Y n0 | j}t|tjjjƒrNtjj |¡}t	tj
ƒt t| jƒ|  d¡¡ ¡  | _ | j S )Núutf-8)r–   r^   r’   rŸ   r   r;   ÚastÚASTÚdumpr	   Úbytecode_versionÚhashlibÚmd5Úreprr“   ÚencodeÚdigest)r,   Úcoder   r   r   r¢   ò  s    
*zPyCode.get_hashN)r   rž   )rZ   r[   r\   r   r—   rœ   r1   r¢   r   r   r   r   r‘   ¾  s
   	
r‘   c                 C   s@   | sdS t | | dd… ƒD ]\}}| |¡ q| d  |¡ dS )zš
    This is called to chain together all of the nodes in a block. Node
    n is chained with node n+1, while the last node is chained with
    next.
    Nr9   éÿÿÿÿ)ÚzipÚchain)ÚblockrD   ÚaÚbr   r   r   Úchain_block  s
    rµ   c                   @   s4   e Zd ZdZdZdZdZdZdZdd„ Z	dd„ Z
dS )ÚScryz•
    This is used to store information about the future, if we know it. Unlike
    predict, this tries to only get things we _know_ will happen.
    NFc                 C   s   d S ri   r   ©r,   r   r   r   r   Ú__getattr__  s    zScry.__getattr__c                 C   s4   | j d u rd S z| j  ¡ W S  ty.   Y d S 0 d S ri   )Ú_nextÚscryr^   rˆ   r   r   r   rD   "  s    
z	Scry.next)rZ   r[   r\   r]   r¹   Ú	interactsÚsayÚmenu_with_captionÚwhor¸   rD   r   r   r   r   r¶     s   r¶   c                   @   s’   e Zd ZdZg d¢ZdZdZdZdd„ Zdd„ Z	d	d
„ Z
dZdd„ Zdd„ Zdd„ ZdZdd„ Zdd„ Zdd„ Zddd„Zdd„ ZdZdd„ ZdS )ÚNodea  
    A node in the abstract syntax tree of the program.

    @ivar name: The name of this node.
    @ivar filename: The filename where this node comes from.
    @ivar linenumber: The line number of the line on which this node is defined.
    @ivar next: The statement that will execute after this one.
    @ivar statement_start: If present, the first node that makes up the statement that includes this node.
    )r   r   r‚   rD   Ústatement_startFÚnormalc                 C   s   |\| _ | _d| _d| _dS )z­
        Initializes this Node object.

        @param loc: A (filename, physical line number) tuple giving the
        logical line on which this Node node starts.
        N)r   r‚   r   rD   )r,   r£   r   r   r   r1   N  s    zNode.__init__c                 C   s
   t | ƒfS )zÃ
        Returns a tuple of diff info about ourself. This is used to
        compare Nodes to see if they should be considered the same node. The
        tuple returned must be hashable.
        )Úidrˆ   r   r   r   Ú	diff_infoZ  s    zNode.diff_infoc                 C   s   || ƒ dS )z<
        Calls `f` with this node and its children.
        Nr   )r,   Úfr   r   r   Úget_childrenc  s    zNode.get_childrenNc                 C   s
   || _ dS )a&  
        This is called with the Node node that should be followed after
        executing this node, and all nodes that this node
        executes. (For example, if this node is a block label, the
        next is the node that should be executed after all nodes in
        the block.)
        N©rD   ©r,   rD   r   r   r   r±   x  s    	z
Node.chainc                 C   s   | j |u r|| _ dS )zc
        Replaces instances of the `old` node with `new` when it is the next
        node.
        NrÆ   ©r,   ÚoldÚnewr   r   r   Úreplace_nextƒ  s    
zNode.replace_nextc                 C   s   t dƒ‚dS )zµ
        Causes this node to execute, and any action it entails to be
        performed. The node should call next_node with the node to
        be executed after this one.
        z'Node subclass forgot to define execute.N©r^   rˆ   r   r   r   ÚexecuteŒ  s    zNode.executec                 C   s   | j r| j gS g S dS )zÊ
        This is called to predictively load images from this node. It
        should cause renpy.display.predict.displayable and
        renpy.display.predict.screen to be called as necessary.
        NrÆ   rˆ   r   r   r   Úpredict  s    zNode.predictc                 C   s   t ƒ }| j|_|S )zt
        Called to return an object with some general, user-definable information
        about the future.
        )r¶   rD   r¹   ©r,   r/   r   r   r   rº   ©  s    z	Node.scryc                 C   s   dS )zõ
        Called to restructure the AST.

        When this method is called, callback is called once for each child
        block of the node. The block, a list, can be updated by the callback
        using slice assignment to the list.
        Nr   ©r,   Úcallbackr   r   r   Úrestructure³  s    
zNode.restructurec                 C   s   t dƒ‚dS )a   
        Returns the canonical form of the code corresponding to this statement.
        This only needs to be defined if the statement is translatable.

        `filter`
            If present, a filter that should be applied to human-readable
            text in the statement.
        zNot ImplementedNrÌ   ©r,   Údialogue_filterr   r   r   r{   ¿  s    
zNode.get_codec                 C   s   dS )zI
        Called on all code after the init phase, to analyze it.
        Nr   rˆ   r   r   r   ÚanalyzeË  s    zNode.analyzec                 C   s   | j S )zT
        Returns true if this should be run while warping, False otherwise.
        )Úwarprˆ   r   r   r   Úcan_warpÕ  s    zNode.can_warp)N)rZ   r[   r\   r]   r   ÚtranslatableÚtranslation_relevantÚrollbackr1   rÃ   rÅ   Úget_initr±   rË   rÍ   Úearly_executerÎ   rº   rÒ   r{   rÕ   rÖ   r×   r   r   r   r   r¿   ,  s(   

		

r¿   c                 C   sX   | durt j | ¡}n$t jjr6t jjjdkr6t jj}ndS |sBdS t jjjrT||ƒ dS )zB
    This handles the with clause of a say or menu statement.
    Nra   )r   r;   rG   ÚstoreÚdefault_transitionr   ÚpreferencesÚtransitions)rz   rÑ   Úwhatr   r   r   Úsay_menu_withÝ  s    

râ   c                 C   sŒ   | du rdS dt jjv r.t jjd  | d¡}nd}|du rNt jjd  | d¡}|durZ|S zt j | ¡W S  ty†   td|  ƒ‚Y n0 dS )z;
    Evaluates the `who` parameter to a say statement.
    Nzstore.characterrÝ   zSayer '%s' is not defined.)r   r;   Ústore_dictsÚgetrG   r^   )r¾   Úfastr/   r   r   r   Úeval_whoð  s    ræ   c                       sX   e Zd Zg d¢Zdd„ Zdd„ Zd‡ fdd	„	Zdd
d„Zdd„ Zdd„ Z	dd„ Z
‡  ZS )ÚSay)
r¾   Úwho_fastrá   Úwith_ÚinteractÚ
attributesrb   Útemporary_attributesrÚ   Ú
identifierc                 C   s   t | j| jfS ri   )rç   r¾   rá   rˆ   r   r   r   rÃ     s    zSay.diff_infoc                 O   s,   t  | ¡}d |_d|_d |_d |_d|_|S )NTrÁ   )r¿   r}   rë   rê   rb   rì   rÚ   ©r~   rH   rI   r,   r   r   r   r}     s    
zSay.__new__TNc
           
         sŠ   t t| ƒ |¡ |d urH| ¡ | _t tjj	d | j¡r@d| _
qTd| _
nd | _d| _
|| _|| _|| _|| _|| _|| _|	d ur†|	| _d S )Nú$TF)Úsuperrç   r1   Ústripr¾   ÚreÚmatchr   ÚparserÚword_regexprè   rá   ré   rê   rb   rë   rì   rí   )
r,   r£   r¾   rá   ré   rê   rë   rb   rì   rí   ©Ú	__class__r   r   r1   $  s     
zSay.__init__c                 C   sä   g }| j r| | j ¡ | jd ur,| | j¡ | jrH| d¡ | | j¡ | j}|d ur^||ƒ}| tj |¡¡ | j	s€| d¡ t
| dd ƒr¨| d¡ | t
| dd ƒ¡ | jr¾| | j ¡ ¡ | jrÚ| d¡ | | j¡ d |¡S )Nú@Ú
nointeractrí   rÂ   Úwithú )r¾   r(   rë   rn   rì   rá   r   ÚtranslationÚencode_say_stringrê   Úgetattrrb   r{   ré   r@   )r,   rÔ   r/   rá   r   r   r   r{   D  s.    




zSay.get_codec              	   C   s”  t | jƒ z`| jtj ¡ _| jtj ¡ _t| j	| j
ƒ}|d urdt|ddƒ}t|ƒrZ|ƒ }t|ƒ ntdƒ |d u sšt|ƒsšt|tƒsštd| j	 d¡ ƒ‚| j}tjjr´tj |¡}|tj_| jd urÖ| j ¡ \}}nd}i }| d| j¡ t|ddƒr| j	tj_|tj_|tj_|tj_t| j tjj!j"ƒ tj#j$||g|¢R i |¤Ž W d tj ¡ _d tj ¡ _d	tj_n"d tj ¡ _d tj ¡ _d	tj_0 d S )
Nr   r¼   z%Sayer %s is not a function or string.r¤   r   rê   Ú
record_sayTÚ )%r   rD   rë   r   r   r   Úsay_attributesrì   ræ   r¾   rè   rþ   Úcallabler   rŸ   r   r^   r¬   rá   r   Úsay_menu_text_filterrÝ   Ú_last_raw_whatrb   rs   Ú
setdefaultrê   Ú_last_say_whoÚ_last_say_whatÚ_last_say_argsÚ_last_say_kwargsrâ   ré   Ú	interfaceÚset_transitionÚexportsr¼   )r,   r¾   Ú	stmt_namerá   rH   rI   r   r   r   rÍ   h  sP    

ÿþý


þzSay.executec              	   C   s¾   t j ¡ j}t j ¡ j}z‚| jt j ¡ _| jt j ¡ _t| j| jƒ}dd„ }t	| j
|ƒ | j}t jjrrt j |¡}t j ||¡ W |t j ¡ _|t j ¡ _n|t j ¡ _|t j ¡ _0 | jgS )Nc                 S   s   t jj | d d d¡ d S ©N)Ú
old_widgetÚ
new_widget©r   ÚdisplayrÎ   Údisplayable©Útransr   r   r   Úpredict_with¬  s    z!Say.predict.<locals>.predict_with)r   r   r   r  rì   rë   ræ   r¾   rè   râ   ré   rá   r   r  r  Úpredict_sayrD   )r,   Úold_attributesÚold_temporary_attributesr¾   r  rá   r   r   r   rÎ      s"    ÿzSay.predictc                 C   sD   t  | ¡}t| j| jƒ}||_d|_| jr:tj 	||¡ nd|_
|S )NTF)r¿   rº   ræ   r¾   rè   r¼   rê   r   r  Úscry_sayr»   )r,   r/   r¾   r   r   r   rº   ½  s    
zSay.scry)TNNNN)N)rZ   r[   r\   r   rÃ   r}   r1   r{   rÍ   rÎ   rº   Ú__classcell__r   r   rö   r   rç   	  s   	 
$8rç   rú   c                       sL   e Zd ZddgZ‡ fdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	‡  Z
S )ÚInitr²   Úpriorityc                    s    t t| ƒ |¡ || _|| _d S ri   )rð   r  r1   r²   r  )r,   r£   r²   r  rö   r   r   r1   ×  s    zInit.__init__c                 C   s"   || ƒ | j D ]}| |¡ qd S ri   ©r²   rÅ   ©r,   rÄ   r   r   r   r   rÅ   Ý  s    
zInit.get_childrenc                 C   s   | j | jd fS r"   )r  r²   rˆ   r   r   r   rÛ   ã  s    zInit.get_initc                 C   s   || _ t| jd ƒ d S ri   ©rD   rµ   r²   rÇ   r   r   r   r±   é  s    z
Init.chainc                 C   s"   t | jƒ tj d¡ tdƒ d S )Né<   Úinit©r   rD   r   Ú	executionÚnot_infinite_loopr   rˆ   r   r   r   rÍ   î  s    
zInit.executec                 C   s   || j ƒ d S ri   ©r²   rÐ   r   r   r   rÒ   ó  s    zInit.restructure)rZ   r[   r\   r   r1   rÅ   rÛ   r±   rÍ   rÒ   r  r   r   rö   r   r  Ð  s   þr  c                       s^   e Zd ZdZdZg d¢Zdd„ Zd‡ fdd„	Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Z‡  ZS )ÚLabelÚforceT)r   r#   r²   Úhidec                 O   s   t  | ¡}d |_d|_|S )NF)r¿   r}   r#   r)  rî   r   r   r   r}     s    
zLabel.__new__Fc                    s,   t t| ƒ |¡ || _|| _|| _|| _dS )zÎ
        Constructs a new Label node.

        @param name: The name of this label.
        @param block: A (potentially empty) list of nodes making up the
        block associated with this label.
        N)rð   r'  r1   r   r²   r#   r)  )r,   r£   r   r²   r#   r)  rö   r   r   r1   	  s
    	zLabel.__init__c                 C   s
   t | jfS ri   )r'  r   rˆ   r   r   r   rÃ     s    zLabel.diff_infoc                 C   s"   || ƒ | j D ]}| |¡ qd S ri   r  r  r   r   r   rÅ     s    
zLabel.get_childrenc                 C   s*   | j r | j d | _t| j |ƒ n|| _d S r"   )r²   rD   rµ   rÇ   r   r   r   r±   "  s    zLabel.chainc                 C   s–   t | jƒ tdƒ tj ¡  ¡  t| jtj	j
tj	jƒ}| ¡ D ]"\}}tj |¡ ttj	||ƒ q>d tj	_
d tj	_tjjr’tj | jtj ¡ j¡ d S )NÚlabel)r   rD   r   r   r   r   Ú	mark_seenr_   r#   rÝ   Ú_argsÚ_kwargsÚitemsr  ÚdynamicÚsetattrr   Úlabel_callbackr   Úlast_abnormal)r,   Úvaluesrq   rr   r   r   r   rÍ   *  s    
zLabel.executec                 C   s   || j ƒ d S ri   r&  rÐ   r   r   r   rÒ   <  s    zLabel.restructure)F)rZ   r[   r\   rÚ   rÙ   r   r}   r1   rÃ   rÅ   r±   rÍ   rÒ   r  r   r   rö   r   r'  ÷  s   r'  c                       sN   e Zd Zg d¢Zdd„ Zd‡ fdd„	Zdd	„ Zd
d„ Zdd„ Zdd„ Z	‡  Z
S )ÚPython©r)  r®   rÝ   c                 O   s   t  | ¡}d|_|S ©NrÝ   ©r¿   r}   rÝ   rî   r   r   r   r}   H  s    
zPython.__new__FrÝ   c                    sF   t t| ƒ |¡ || _|r,t||dd| _nt||dd| _|| _dS ©ú
        @param code: A PyCode object.

        @param hide: If True, the code will be executed with its
        own local dictionary.
        r)  ©r£   r”   rž   N)rð   r4  r1   r)  r‘   r®   rÝ   ©r,   r£   Úpython_coder)  rÝ   rö   r   r   r1   M  s    zPython.__init__c                 C   s   t | jjfS ri   )r4  r®   r’   rˆ   r   r   r   rÃ   `  s    zPython.diff_infoc                 C   s   t j | j¡ d S ri   )r   r;   Úcreate_storerÝ   rˆ   r   r   r   rÜ   c  s    zPython.early_executec                 C   sx   t | jƒ tdƒ z>tjj| jj| j| j	d W tj
 ¡ jsttjjD ]
}|ƒ  qDn"tj
 ¡ jsrtjjD ]
}|ƒ  qf0 d S )Nr;   ©rÝ   )r   rD   r   r   r;   Úpy_exec_bytecoder®   r•   r)  rÝ   r   r   Ú
init_phaser   Úpython_callbacks)r,   r   r   r   r   rÍ   f  s    

þzPython.executec                 C   s   t  | ¡}d|_|S ©NT)r¿   rº   r»   rÏ   r   r   r   rº   r  s    
zPython.scry)FrÝ   )rZ   r[   r\   r   r}   r1   rÃ   rÜ   rÍ   rº   r  r   r   rö   r   r4  @  s   r4  c                       sF   e Zd Zg d¢Zdd„ Zd‡ fdd„	Zdd	„ Zd
d„ Zdd„ Z‡  Z	S )ÚEarlyPythonr5  c                 O   s   t  | ¡}d|_|S r6  r7  rî   r   r   r   r}   €  s    
zEarlyPython.__new__FrÝ   c                    sF   t t| ƒ |¡ || _|r,t||dd| _nt||dd| _|| _dS r8  )rð   rC  r1   r)  r‘   r®   rÝ   r;  rö   r   r   r1   …  s    zEarlyPython.__init__c                 C   s   t | jjfS ri   )rC  r®   r’   rˆ   r   r   r   rÃ   ˜  s    zEarlyPython.diff_infoc                 C   s"   t | jƒ tj d¡ tdƒ d S )Nr!  zpython earlyr#  rˆ   r   r   r   rÍ   ›  s    
zEarlyPython.executec                 C   s4   t j | j¡ | jjr0t jj| jj| j| jd d S )Nr>  )r   r;   r=  rÝ   r®   r•   r?  r)  rˆ   r   r   r   rÜ      s    zEarlyPython.early_execute)FrÝ   )
rZ   r[   r\   r   r}   r1   rÃ   rÍ   rÜ   r  r   r   rö   r   rC  x  s   rC  c                       s>   e Zd Zg d¢Zd‡ fdd„	Zdd„ Zdd„ Zd	d
„ Z‡  ZS )ÚImage)Úimgnamer®   ÚatlNc                    sB   t t| ƒ |¡ || _|r2t||dd| _d| _nd| _|| _dS )z¥
        @param name: The name of the image being defined.

        @param expr: An expression yielding a Displayable that is
        assigned to the image.
        Úevalr:  N)rð   rD  r1   rE  r‘   r®   rF  )r,   r£   r   r   rF  rö   r   r   r1   ¯  s    zImage.__init__c                 C   s   t t| jƒfS ri   )rD  rA   rE  rˆ   r   r   r   rÃ   Â  s    zImage.diff_infoc                 C   sR   t | jƒ tdƒ | jd ur.tj | jj¡}ntjj	 
| j¡}tj | j|¡ d S )NÚimage)r   rD   r   r®   r   r;   Úpy_eval_bytecoder•   r  ÚmotionÚATLTransformrF  r  rH  rE  )r,   Úimgr   r   r   rÍ   Å  s    

zImage.executec                 C   s    t | dd ƒd ur| j t¡ d S ©NrF  ©rþ   rF  rÕ   ÚEMPTY_PARAMETERSrˆ   r   r   r   rÕ   Ô  s    zImage.analyze)NN)	rZ   r[   r\   r   r1   rÃ   rÍ   rÕ   r  r   r   rö   r   rD  §  s
   rD  c                       sF   e Zd Zg d¢ZeZdef‡ fdd„	Zdd„ Zdd„ Zd	d
„ Z	‡  Z
S )Ú	Transform)ÚvarnamerF  r#   Nc                    s&   t t| ƒ |¡ || _|| _|| _d S ri   )rð   rP  r1   rQ  rF  r#   )r,   r£   r   rF  r#   rö   r   r   r1   ë  s    zTransform.__init__c                 C   s
   t | jfS ri   )rP  rQ  rˆ   r   r   r   rÃ   ó  s    zTransform.diff_infoc                 C   s|   t | jƒ tdƒ t| dd ƒ}|d u r,tj}tjjj	| j
|d}tjj | j| j| jf¡ tj | j¡ ttj| j|ƒ d S )NÚ	transformr#   )r#   )r   rD   r   rþ   rP  Údefault_parametersr   r  rJ  rK  rF  r§   Ú
transformsr(   rQ  r   r‚   r  Úpurer0  rÝ   )r,   r#   r  r   r   r   rÍ   ö  s    
zTransform.executec                 C   s*   t | dd ƒ}|d u rtj}| j |¡ d S )Nr#   )rþ   rP  rS  rF  rÕ   )r,   r#   r   r   r   rÕ     s    zTransform.analyze)rZ   r[   r\   r   rO  rS  r1   rÃ   rÍ   rÕ   r  r   r   rö   r   rP  Û  s   rP  c              	   C   sB  t | ƒdkr | \}}}}}}}	n0t | ƒdkr>| \}}}}}}n| \}}}d}d}|rˆztj |¡}
tj |
¡}
W qŒ ty„   Y dS 0 nd}
g }|D ].}z| tj |¡¡ W q” tyÀ   Y q”0 q”|durøz| tjj	 
|¡¡ W n työ   Y n0 tj ||p|t|ƒ¡}|r*tj ¡ j |¡ tjj|||
|d dS )zW
    Call this to use the given callback to predict the image named
    in imspec.
    é   é   N)rá   Útag)rB   r   r;   rG   Úeasyr  r^   r(   r  rJ  rK  r  Údefault_layerrc   r   r   ÚimagesÚpredict_sceneÚpredict_show)ÚimspecÚscenerF  r   rz   rX  Úat_expr_listÚlayerÚ_zorderÚ_behindrL  Úat_listr   r   r   r   Úpredict_imspec  s:    

re  c           	   
   C   sä   t | ƒdkr | \}}}}}}}n<t | ƒdkrB| \}}}}}}g }n| \}}}d }d }d }g }|d urrtj |¡}nd }|d ur–tj |¡}tj |¡}dd„ |D ƒ}tj ||p²|t|ƒoÀ|d u ¡}tj	j
||||||||d d S )NrV  rW  c                 S   s   g | ]}t j |¡‘qS r   ©r   r;   rG   r5   r   r   r   r:   W  r8   zshow_imspec.<locals>.<listcomp>)rd  ra  rá   ÚzorderrX  ÚbehindrF  )rB   r   r;   rG   rY  r  r  rZ  rc   r   Úshow)	r^  rF  r   rz   rX  rd  ra  rg  rh  r   r   r   Úshow_imspec>  s6    
 ùrj  c                       sJ   e Zd ZddgZdZd‡ fdd„	Zdd„ Zd	d
„ Zdd„ Zdd„ Z	‡  Z
S )ÚShowr^  rF  TNc                    s    t t| ƒ |¡ || _|| _dS )z‘
        @param imspec: A triple consisting of an image name (itself a
        tuple of strings), a list of at expressions, and a layer.
        N)rð   rk  r1   r^  rF  )r,   r£   r^  rF  rö   r   r   r1   n  s    zShow.__init__c                 C   s   t t| jd ƒfS r"   )rk  rA   r^  rˆ   r   r   r   rÃ   y  s    zShow.diff_infoc                 C   s,   t | jƒ tdƒ t| jt| dd ƒd d S )Nri  rF  ©rF  )r   rD   r   rj  r^  rþ   rˆ   r   r   r   rÍ   |  s    
zShow.executec                 C   s   t | jt| dd ƒd | jgS )NrF  rl  )re  r^  rþ   rD   rˆ   r   r   r   rÎ   ‚  s    zShow.predictc                 C   s    t | dd ƒd ur| j t¡ d S rM  rN  rˆ   r   r   r   rÕ   †  s    zShow.analyze)N©rZ   r[   r\   r   rÖ   r1   rÃ   rÍ   rÎ   rÕ   r  r   r   rö   r   rk  e  s   þrk  c                       sH   e Zd ZdZg d¢Z‡ fdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Z	‡  Z
S )Ú	ShowLayerT©ra  rd  rF  c                    s&   t t| ƒ |¡ || _|| _|| _d S ri   )rð   rn  r1   ra  rd  rF  ©r,   r£   ra  rd  rF  rö   r   r   r1   ˜  s    zShowLayer.__init__c                 C   s
   t | jfS ri   ©rn  ra  rˆ   r   r   r   rÃ   Ÿ  s    zShowLayer.diff_infoc                 C   s\   t | jƒ tdƒ dd„ | jD ƒ}| jd urFtjj | j¡}| 	|¡ tj
j|| jd d S )Nú
show layerc                 S   s   g | ]}t j |¡‘qS r   rf  r5   r   r   r   r:   ¦  r8   z%ShowLayer.execute.<locals>.<listcomp>)ra  ©r   rD   r   rd  rF  r   r  rJ  rK  r(   r  Úlayer_at_listra  ©r,   rd  rF  r   r   r   rÍ   ¢  s    


zShowLayer.executec                 C   s   | j gS ri   rÆ   rˆ   r   r   r   rÎ   ®  s    zShowLayer.predictc                 C   s   | j d ur| j  t¡ d S ri   ©rF  rÕ   rO  rˆ   r   r   r   rÕ   ±  s    
zShowLayer.analyze©rZ   r[   r\   rÖ   r   r1   rÃ   rÍ   rÎ   rÕ   r  r   r   rö   r   rn  Ž  s   rn  c                       sH   e Zd ZdZg d¢Z‡ fdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Z	‡  Z
S )ÚCameraTro  c                    s&   t t| ƒ |¡ || _|| _|| _d S ri   )rð   rx  r1   ra  rd  rF  rp  rö   r   r   r1   À  s    zCamera.__init__c                 C   s
   t | jfS ri   rq  rˆ   r   r   r   rÃ   Ç  s    zCamera.diff_infoc                 C   s^   t | jƒ tdƒ dd„ | jD ƒ}| jd urFtjj | j¡}| 	|¡ tj
j|| jdd d S )Nrr  c                 S   s   g | ]}t j |¡‘qS r   rf  r5   r   r   r   r:   Î  r8   z"Camera.execute.<locals>.<listcomp>T)ra  Úcamerars  ru  r   r   r   rÍ   Ê  s    


zCamera.executec                 C   s   | j gS ri   rÆ   rˆ   r   r   r   rÎ   Ö  s    zCamera.predictc                 C   s   | j d ur| j  t¡ d S ri   rv  rˆ   r   r   r   rÕ   Ù  s    
zCamera.analyzerw  r   r   rö   r   rx  ¶  s   rx  c                       sJ   e Zd Zg d¢ZdZd‡ fdd„	Zdd„ Zdd	„ Zd
d„ Zdd„ Z	‡  Z
S )ÚScene)r^  ra  rF  TNc                    s&   t t| ƒ |¡ || _|| _|| _dS )zÙ
        @param imspec: A triple consisting of an image name (itself a
        tuple of strings), a list of at expressions, and a layer, or
        None to not have this scene statement also display an image.
        N)rð   rz  r1   r^  ra  rF  )r,   r£   Úimgspecra  rF  rö   r   r   r1   è  s    zScene.__init__c                 C   s"   | j rt| j d ƒ}nd }t|fS r"   )r^  rA   rz  )r,   Údatar   r   r   rÃ   õ  s    zScene.diff_infoc                 C   s@   t | jƒ tdƒ tj | j¡ | jr<t| jt	| dd ƒd d S )Nr_  rF  rl  )
r   rD   r   r   r   r_  ra  r^  rj  rþ   rˆ   r   r   r   rÍ   þ  s
    
zScene.executec                 C   s&   | j rt| j t| dd ƒdd | jgS )NrF  T)rF  r_  )r^  re  rþ   rD   rˆ   r   r   r   rÎ     s    zScene.predictc                 C   s    t | dd ƒd ur| j t¡ d S rM  rN  rˆ   r   r   r   rÕ     s    zScene.analyze)Nrm  r   r   rö   r   rz  Þ  s   	
rz  c                       s>   e Zd ZdgZdZ‡ fdd„Zdd„ Zdd„ Zd	d
„ Z‡  Z	S )ÚHider^  Tc                    s   t t| ƒ |¡ || _dS )z¬
        @param imspec: A triple consisting of an image name (itself a
        tuple of strings), a list of at expressions, and a list of
        with expressions.
        N)rð   r}  r1   r^  )r,   r£   r{  rö   r   r   r1     s    zHide.__init__c                 C   s   t t| jd ƒfS r"   )r}  rA   r^  rˆ   r   r   r   rÃ   '  s    zHide.diff_infoc                 C   s¢   t | jƒdkr$| j\}}}}}}}nBt | jƒdkrJ| j\}}}}}}d }n| j\}}}d }d }d }d }|d u rv|d }tj ||¡}tj ¡ j ||f¡ | j	gS )NrV  rW  r   )
rB   r^  r   r  rZ  r   r   r[  Úpredict_hiderD   ©r,   r   Ú_expressionrX  Ú_at_listra  rb  rc  r   r   r   rÎ   *  s    zHide.predictc                 C   s˜   t | jƒ tdƒ t| jƒdkr6| j\}}}}}}}n:t| jƒdkrX| j\}}}}}}n| j\}}}d }d }d}tj ||p~|¡}tj 	|pŽ||¡ d S )Nr)  rV  rW  r   )
r   rD   r   rB   r^  r   r  rZ  r   r)  r  r   r   r   rÍ   B  s    
zHide.execute)
rZ   r[   r\   r   rÖ   r1   rÃ   rÎ   rÍ   r  r   r   rö   r   r}    s   ÿr}  c                       sF   e Zd ZddgZdd„ Zd‡ fdd„	Zdd	„ Zd
d„ Zdd„ Z‡  Z	S )ÚWithr   Úpairedc                 O   s   t  | ¡}d |_|S ri   )r¿   r}   rƒ  rî   r   r   r   r}   ]  s    
zWith.__new__Nc                    s    t t| ƒ |¡ || _|| _dS )zI
        @param expr: An expression giving a transition or None.
        N)rð   r‚  r1   r   rƒ  )r,   r£   r   rƒ  rö   r   r   r1   b  s    zWith.__init__c                 C   s
   t | jfS ri   )r‚  r   rˆ   r   r   r   rÃ   k  s    zWith.diff_infoc                 C   sR   t | jƒ tdƒ tj | j¡}| jd ur:tj | j¡}nd }tjj	||d d S )Nrú   )rƒ  )
r   rD   r   r   r;   rG   r   rƒ  r  r   )r,   r  rƒ  r   r   r   rÍ   n  s    

zWith.executec                 C   sH   z,t j | j¡}|r*t jj |d d d¡ W n ty>   Y n0 | jgS r  )	r   r;   rG   r   r  rÎ   r  r^   rD   )r,   r  r   r   r   rÎ   |  s    zWith.predict)N)
rZ   r[   r\   r   r}   r1   rÃ   rÍ   rÎ   r  r   r   rö   r   r‚  V  s   þ	r‚  c                       sL   e Zd Zg d¢Zdd„ Z‡ fdd„Zdd„ Zdd	„ Zd
d„ Zdd„ Z	‡  Z
S )ÚCall)r*  rb   rz   c                 O   s   t  | ¡}d |_|S ri   )r¿   r}   rb   rî   r   r   r   r}   ’  s    
zCall.__new__c                    s&   t t| ƒ |¡ || _|| _|| _d S ri   )rð   r„  r1   r*  rz   rb   )r,   r£   r*  rz   rb   rö   r   r   r1   —  s    zCall.__init__c                 C   s   t | j| jfS ri   )r„  r*  rz   rˆ   r   r   r   rÃ   ž  s    zCall.diff_infoc                 C   s†   t dƒ | j}| jr tj |¡}tj ¡ j|| j	j
d}t|ƒ dtj ¡ _| jrr| j ¡ \}}|tj_|tj_nd tj_d tj_d S )NÚcall)Úreturn_siteT)r   r*  rz   r   r;   rG   r   r   r…  rD   r   r   Úabnormalrb   rs   rÝ   r,  r-  )r,   r*  r/   rH   rI   r   r   r   rÍ   ¡  s    
zCall.executec                 C   sj   | j }| jrRt|ƒsg S ztj |¡}W n ty>   g  Y S 0 tjj 	|¡sRg S tj 
¡  || jj¡gS ri   )r*  rz   r   r   r;   rG   r^   r   r…   Ú	has_labelr   Úpredict_callrD   r   ©r,   r*  r   r   r   rÎ   µ  s    
zCall.predictc                 C   s   t  | ¡}d |_|S ri   ©r¿   rº   r¹   rÏ   r   r   r   rº   È  s    
z	Call.scry)rZ   r[   r\   r   r}   r1   rÃ   rÍ   rÎ   rº   r  r   r   rö   r   r„  Š  s   r„  c                       sR   e Zd ZdgZdd„ Z‡ fdd„Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
‡  ZS )ÚReturnrz   c                 O   s   t  | ¡}d |_|S ri   )r¿   r}   rz   rî   r   r   r   r}   Ò  s    
zReturn.__new__c                    s   t t| ƒ |¡ || _d S ri   )rð   rŒ  r1   rz   )r,   r£   rz   rö   r   r   r1   ×  s    zReturn.__init__c                 C   s   t fS ri   )rŒ  rˆ   r   r   r   rÃ   Û  s    zReturn.diff_infoc                 C   s
   d | _ d S ri   rÆ   rÇ   r   r   r   r±   ß  s    zReturn.chainc                 C   sŠ   t dƒ | jr"tj | j¡tj_nd tj_tj ¡ }tj ¡ j	rbt
|jƒdkrbtjjr^tdƒ‚d S ttj ¡ jddƒ tj ¡  ¡  d S )NÚreturnr   z(Unexpected return during the init phase.T)r>   )r   rz   r   r;   rG   rÝ   Ú_returnr   r   r@  rB   Úreturn_stackr   Ú	developerr^   r   Úlookup_returnÚpop_dynamic)r,   Úctxr   r   r   rÍ   ã  s    
zReturn.executec                 C   s   t j ¡  ¡ gS ri   )r   r   r   Úpredict_returnrˆ   r   r   r   rÎ   ù  s    zReturn.predictc                 C   s   t  | ¡}d |_|S ri   r‹  rÏ   r   r   r   rº   ý  s    
zReturn.scry)rZ   r[   r\   r   r}   r1   rÃ   r±   rÍ   rÎ   rº   r  r   r   rö   r   rŒ  Î  s   rŒ  c                       sp   e Zd ZdZg d¢Zdd„ Z‡ fdd„Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚMenuT)r.  rj   ré   Úhas_captionrb   Úitem_argumentsrÚ   c                 O   s&   t  | ¡}d|_d |_d |_d|_|S )NFr(  )r¿   r}   r–  rb   r—  rÚ   rî   r   r   r   r}     s    
zMenu.__new__c                    s8   t t| ƒ |¡ || _|| _|| _|| _|| _|| _d S ri   )	rð   r•  r1   r.  rj   ré   r–  rb   r—  )r,   r£   r.  rj   ré   r–  rb   r—  rö   r   r   r1     s    zMenu.__init__c                 C   s   t fS ri   )r•  rˆ   r   r   r   rÃ   #  s    zMenu.diff_infoc                 C   s6   || ƒ | j D ]"\}}}|r|D ]}| |¡ q qd S ri   )r.  rÅ   )r,   rÄ   Ú_labelÚ
_conditionr²   r   r   r   r   rÅ   &  s
    zMenu.get_childrenc                 C   s*   || _ | jD ]\}}}|rt||ƒ qd S ri   )rD   r.  rµ   )r,   rD   r˜  r™  r²   r   r   r   r±   /  s    z
Menu.chainc                 C   s@   t  | ||¡ | jD ]&\}}}|r|d |u r| d|¡ qd S r"   )r¿   rË   r.  Úinsert)r,   rÉ   rÊ   r˜  r™  r²   r   r   r   rË   7  s    zMenu.replace_nextc                 C   s–  t | jƒ | jstjjr"tdƒ ntdƒ | jd urD| j ¡ \}}nd  }}g }g }g }t	| j
ƒD ]¼\}\}}}	tjjr„tj |¡}d}
|	d u r¾tjjr¨|r¨| |¡ qÞ| ||d f¡ d}
n | |||f¡ d}
t |	d ƒ |
rb| jr| j| d ur| | j|  ¡ ¡ qb| di f¡ qb|r>tjjd d |¡dd t| jtjjjƒ tj || j|||¡}|d urˆt | j
| d	 d ƒ n
t | jƒ d S )
Nzmenu-with-captionÚmenuFTr   r   Ú
)rê   ra   )r   rD   r–  r   r   Úchoice_empty_windowr   rb   rs   rm   r.  r  Únarrator_menur(   r—  r  r¼   r@   râ   ré   r   r
  r  r›  rj   )r,   rH   rI   ÚchoicesÚ	narrationr—  r   r*  Ú	conditionr²   Úhas_itemÚchoicer   r   r   rÍ   >  sB    



zMenu.executec                 C   sJ   g }dd„ }t | j|ƒ tj ¡  | jD ]\}}}|r(| |d ¡ q(|S )Nc                 S   s   t jj | d d d¡ d S r  r  r  r   r   r   r  y  s    z"Menu.predict.<locals>.predict_withr   )râ   ré   r   rÝ   Úpredict_menur.  r(   )r,   r/   r  r˜  r™  r²   r   r   r   rÎ   v  s    
zMenu.predictc                 C   s&   t  | ¡}d |_d|_| jr"d|_|S rB  )r¿   rº   r¹   r»   r–  r½   rÏ   r   r   r   rº   †  s    
z	Menu.scryc                 C   s&   | j D ]\}}}|d ur||ƒ qd S ri   )r.  )r,   rÑ   r˜  r™  r²   r   r   r   rÒ   Ž  s    zMenu.restructure)rZ   r[   r\   rÙ   r   r}   r1   rÃ   rÅ   r±   rË   rÍ   rÎ   rº   rÒ   r  r   r   rö   r   r•    s   

	8r•  c                       sL   e Zd ZddgZ‡ fdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	‡  Z
S )ÚJumpÚtargetrz   c                    s    t t| ƒ |¡ || _|| _d S ri   )rð   r¥  r1   r¦  rz   )r,   r£   r¦  rz   rö   r   r   r1      s    zJump.__init__c                 C   s   t | j| jfS ri   )r¥  r¦  rz   rˆ   r   r   r   rÃ   ¦  s    zJump.diff_infoc                 C   s
   d | _ d S ri   rÆ   rÇ   r   r   r   r±   ª  s    z
Jump.chainc                 C   sF   t dƒ | j}| jr tj |¡}tjj |¡}dtj 	¡ _
t|ƒ d S )NÚjumpT)r   r¦  rz   r   r;   rG   r   r…   Úlookupr   r‡  r   )r,   r¦  r/   r   r   r   rÍ   ®  s    zJump.executec                 C   sb   | j }| jrRt|ƒsg S ztj |¡}W n ty>   g  Y S 0 tjj 	|¡sRg S tjj 
|¡gS ri   )r¦  rz   r   r   r;   rG   r^   r   r…   rˆ  r¨  rŠ  r   r   r   rÎ   »  s    
zJump.predictc                 C   s.   t  | ¡}| jrd |_ntjj | j¡|_|S ri   )	r¿   rº   rz   r¹   r   r   r…   r¨  r¦  rÏ   r   r   r   rº   Î  s
    
z	Jump.scry)rZ   r[   r\   r   r1   rÃ   r±   rÍ   rÎ   rº   r  r   r   rö   r   r¥  ™  s   þr¥  c                   @   s    e Zd Zg Zdd„ Zdd„ ZdS )ÚPassc                 C   s   t fS ri   )r©  rˆ   r   r   r   rÃ   Ý  s    zPass.diff_infoc                 C   s   t | jƒ tdƒ d S )NÚpass©r   rD   r   rˆ   r   r   r   rÍ   à  s    
zPass.executeN)rZ   r[   r\   r   rÃ   rÍ   r   r   r   r   r©  Ù  s   r©  c                       sd   e Zd ZddgZ‡ fdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Z‡  ZS )ÚWhiler¡  r²   c                    s    t t| ƒ |¡ || _|| _d S ri   )rð   r¬  r1   r¡  r²   )r,   r£   r¡  r²   rö   r   r   r1   ì  s    zWhile.__init__c                 C   s
   t | jfS ri   )r¬  r¡  rˆ   r   r   r   rÃ   ò  s    zWhile.diff_infoc                 C   s"   || ƒ | j D ]}| |¡ qd S ri   r  r  r   r   r   rÅ   õ  s    
zWhile.get_childrenc                 C   s   || _ t| j| ƒ d S ri   r   rÇ   r   r   r   r±   û  s    zWhile.chainc                 C   s4   t  | ||¡ | jr0| jd |u r0| j d|¡ d S r"   )r¿   rË   r²   rš  rÈ   r   r   r   rË   ÿ  s    zWhile.replace_nextc                 C   s2   t | jƒ tdƒ tj | j¡r.t | jd ƒ d S )NÚwhiler   )r   rD   r   r   r;   rG   r¡  r²   rˆ   r   r   r   rÍ     s    
zWhile.executec                 C   s   | j d | jgS r"   )r²   rD   rˆ   r   r   r   rÎ     s    zWhile.predictc                 C   s   t  | ¡}d |_|S ri   r‹  rÏ   r   r   r   rº     s    
z
While.scryc                 C   s   || j ƒ d S ri   r&  rÐ   r   r   r   rÒ     s    zWhile.restructure©rZ   r[   r\   r   r1   rÃ   rÅ   r±   rË   rÍ   rÎ   rº   rÒ   r  r   r   rö   r   r¬  å  s   þr¬  c                       sb   e Zd ZdgZ‡ fdd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Z‡  ZS )ÚIfÚentriesc                    s   t t| ƒ |¡ || _dS )zF
        @param entries: A list of (condition, block) tuples.
        N)rð   r¯  r1   r°  )r,   r£   r°  rö   r   r   r1     s    zIf.__init__c                 C   s   t fS ri   )r¯  rˆ   r   r   r   rÃ   &  s    zIf.diff_infoc                 C   s0   || ƒ | j D ]\}}|D ]}| |¡ qqd S ri   )r°  rÅ   )r,   rÄ   r™  r²   r   r   r   r   rÅ   )  s    zIf.get_childrenc                 C   s$   || _ | jD ]\}}t||ƒ qd S ri   )rD   r°  rµ   )r,   rD   r™  r²   r   r   r   r±   0  s    zIf.chainc                 C   s>   t  | ||¡ | jD ]$\}}|r|d |u r| d|¡ qd S r"   )r¿   rË   r°  rš  )r,   rÉ   rÊ   r™  r²   r   r   r   rË   6  s    zIf.replace_nextc                 C   sD   t | jƒ tdƒ | jD ]&\}}tj |¡rt |d ƒ  d S qd S )NÚifr   )r   rD   r   r°  r   r;   rG   )r,   r¡  r²   r   r   r   rÍ   =  s    
z
If.executec                 C   s   dd„ | j D ƒ| jg S )Nc                 S   s   g | ]\}}|d  ‘qS ©r   r   )r6   r™  r²   r   r   r   r:   I  r8   zIf.predict.<locals>.<listcomp>)r°  rD   rˆ   r   r   r   rÎ   G  s    ÿz
If.predictc                 C   s   t  | ¡}d |_|S ri   r‹  rÏ   r   r   r   rº   L  s    
zIf.scryc                 C   s   | j D ]\}}||ƒ qd S ri   )r°  )r,   rÑ   r™  r²   r   r   r   rÒ   Q  s    zIf.restructurer®  r   r   rö   r   r¯    s   	
r¯  c                       s®   e Zd Zg d¢Zdd„ Z‡ fdd„Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd'd#d$„Zd%d&„ Z‡  ZS )(ÚUserStatement)ÚlineÚparsedr²   rØ   Ú
code_blockrÙ   rÚ   Ú	subparsesc                 O   s2   t  | ¡}g |_d |_d|_d|_d|_g |_|S )NFrÁ   )r¿   r}   r²   r¶  rØ   rÙ   rÚ   r·  rî   r   r   r   r}   c  s    
zUserStatement.__new__c                    sT   t t| ƒ |¡ d | _|| _|| _|| _g | _|  d¡| _	t
j d| j¡pLd| _d S )Nr*  rÚ   rÁ   )rð   r³  r1   r¶  rµ  r´  r²   r·  r…  r   r   Ú
statementsrä   rÚ   )r,   r£   r´  r²   rµ  rö   r   r   r1   m  s    zUserStatement.__init__c                 C   s   d  | j¡S )Nz<UserStatement {!r}>)rw   r´  rˆ   r   r   r   Ú__repr__y  s    zUserStatement.__repr__c                 C   sN   || ƒ | j d ur(| j D ]}| |¡ q| jD ]}|jD ]}| |¡ q8q.d S ri   )r¶  rÅ   r·  r²   )r,   rÄ   r   Újr   r   r   rÅ   |  s    



zUserStatement.get_childrenc                 C   s8   || _ | jd urt| j|ƒ | jD ]}t|j|ƒ q"d S ri   )rD   r¶  rµ   r·  r²   )r,   rD   r   r   r   r   r±   ‡  s
    

zUserStatement.chainc                 C   s\   t  | ||¡ | jr0| jd |u r0| j d|¡ | jD ] }|jd |u r6| j d|¡ q6d S r"   )r¿   rË   r¶  rš  r·  r²   )r,   rÉ   rÊ   r   r   r   r   rË     s    
zUserStatement.replace_nextc                 C   s*   | j r|| j ƒ | jD ]}||jƒ qd S ri   )r¶  r·  r²   )r,   rÑ   r   r   r   r   rÒ   š  s    

zUserStatement.restructurec                 C   s
   t | jfS ri   )r³  r´  rˆ   r   r   r   rÃ   ¡  s    zUserStatement.diff_infoc                 O   sD   | j }|d u r(tj | | j| j¡}|| _ tjj||g|¢R i |¤ŽS ri   )rµ  r   r¸  Úparser´  r²   r…  )r,   ÚmethodrH   rI   rµ  r   r   r   r…  ¤  s
    zUserStatement.callc                 C   s   |   d¡ d S )NÚexecute_init©r…  rˆ   r   r   r   r½  ®  s    zUserStatement.execute_initc                 C   s
   d| j fS r"   )r½  rˆ   r   r   r   rÛ   ±  s    zUserStatement.get_initc                 C   s&   t |  ¡ ƒ t|  ¡ ƒ |  d¡ d S )NrÍ   )r   Úget_nextr   Úget_namer…  rˆ   r   r   r   rÍ   ´  s    zUserStatement.executec                 C   s¢   |   d¡}|d ur(|D ]}tj |¡ q| jrVtj d| j¡rVdd„ | jD ƒ| jg S | jrf| jj	}nd }|   d|¡}|d uršdd„ |D ƒ}dd„ |D ƒS | jgS )NrÎ   Úpredict_allc                 S   s   g | ]}|j d  ‘qS r²  r&  r5   r   r   r   r:   Â  r8   z)UserStatement.predict.<locals>.<listcomp>Úpredict_nextc                 S   s"   g | ]}|d urt jj |¡‘qS ri   )r   r   r…   Úlookup_or_noner5   r   r   r   r:   Ì  r8   c                 S   s   g | ]}|d ur|‘qS ri   r   r5   r   r   r   r:   Í  r8   )
r…  r   rY  rÎ   rµ  r¸  rä   r·  rD   r   )r,   Úpredictionsr   Ú
next_labelÚ	next_listÚnextsr   r   r   rÎ   º  s    

zUserStatement.predictc                 C   s4   | j }|d u r(tj | | j| j¡}|| _ tj |¡S ri   )rµ  r   r¸  r»  r´  r²   rÀ  )r,   rµ  r   r   r   rÀ  Ñ  s
    zUserStatement.get_namec                 C   sP   | j r&t| j ƒr&|  d| j d j¡}n
|  d¡}|d urFtjj |¡S | jS d S )NrD   r   )	r¶  rB   r…  r   r   r   r…   r¨  rD   rÏ   r   r   r   r¿  Ú  s    
zUserStatement.get_nextc                 C   s$   t  | ¡}|  ¡ |_|  d|¡ |S )Nrº   )r¿   rº   r¿  r¹   r…  rÏ   r   r   r   rº   æ  s    

zUserStatement.scryNc                 C   s   | j S ri   )r´  rÓ   r   r   r   r{   ì  s    zUserStatement.get_codec                 C   s   |   d¡rdS dS )NrÖ   TFr¾  rˆ   r   r   r   r×   ï  s    
zUserStatement.can_warp)N)rZ   r[   r\   r   r}   r1   r¹  rÅ   r±   rË   rÒ   rÃ   r…  r½  rÛ   rÍ   rÎ   rÀ  r¿  rº   r{   r×   r  r   r   rö   r   r³  V  s&   
	

	
r³  c                       s:   e Zd ZdgZ‡ fdd„Zdd„ Zdd„ Zdd	„ Z‡  ZS )
ÚPostUserStatementÚparentc                    s(   t t| ƒ |¡ || _| j d¡| _d S )NÚ
post_label)rð   rÈ  r1   rÉ  r…  r   )r,   r£   rÉ  rö   r   r   r1   ý  s    zPostUserStatement.__init__c                 C   s   d  | jj¡S )Nz<PostUserStatement {!r}>)rw   rÉ  r´  rˆ   r   r   r   r¹  	  s    zPostUserStatement.__repr__c                 C   s   t | jjfS ri   )rÈ  rÉ  r´  rˆ   r   r   r   rÃ   	  s    zPostUserStatement.diff_infoc                 C   s,   t | jƒ td| j ¡  ƒ | j d¡ d S )Nzpost Úpost_execute)r   rD   r   rÉ  rÀ  r…  rˆ   r   r   r   rÍ   
	  s    
zPostUserStatement.execute)	rZ   r[   r\   r   r1   r¹  rÃ   rÍ   r  r   r   rö   r   rÈ  ÷  s   ÿrÈ  c                 C   sh   | t jjv rd S d |  d¡d d… ¡}|t jjv rXt jj| jsXtd |dd … ¡ƒ‚t j 	| ¡ d S )NÚ.ra   z9Creating stores within the {} namespace is not supported.rW  )
r   r   Úspecial_namespacesr@   ÚsplitÚallow_child_namespacesr^   rw   r;   r=  )r   Úmaybe_specialr   r   r   r=  	  s    r=  c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚStoreNamespaceTc                 C   s
   || _ d S ri   r>  )r,   rÝ   r   r   r   r1   !	  s    zStoreNamespace.__init__c                 C   s   |t jj| j |< d S ri   ©r   r;   rã   rÝ   ©r,   r   rO   r   r   r   rj   $	  s    zStoreNamespace.setc                 C   s   |t jj| j |< d S ri   rÒ  rÓ  r   r   r   Úset_default'	  s    zStoreNamespace.set_defaultc                 C   s   t jj| j | S ri   rÒ  r·   r   r   r   rä   *	  s    zStoreNamespace.getN)rZ   r[   r\   rU  r1   rj   rÔ  rä   r   r   r   r   rÑ  	  s
   rÑ  c                 C   s(   | t jjv rt jj|  dfS t| ƒdfS )z
    Returns the namespace object for `store`, and a flag that is true if the
    namespace is special, and false if it is a normal store.
    TF)r   r   rÍ  rÑ  r>  r   r   r   Úget_namespace.	  s    rÕ  >   r   Ústeam_appidÚkeyword_after_pythonrf   Úsave_directoryÚallow_duplicate_labelsc                       sT   e Zd Zg d¢Zdd„ Z‡ fdd„Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
‡  ZS )ÚDefine)rQ  r®   rÝ   ÚoperatorÚindexc                 O   s    t  | ¡}d|_d|_d |_|S )NrÝ   ú=)r¿   r}   rÝ   rÛ  rÜ  rî   r   r   r   r}   R	  s
    
zDefine.__new__c                    sV   t t| ƒ |¡ || _|| _|d ur6t||dd| _nd | _|| _t||dd| _d S ©NrG  r:  )	rð   rÚ  r1   rÝ   rQ  r‘   rÜ  rÛ  r®   )r,   r£   rÝ   r   rÜ  rÛ  r   rö   r   r   r1   Y	  s    zDefine.__init__c                 C   s   t | j| jfS ri   )rÚ  rÝ   rQ  rˆ   r   r   r   rÃ   g	  s    zDefine.diff_infoc                 C   s^   t | jƒ | jdkrd S | jd ur&d S | jdkrZ| jtv rZtj | j	j
¡}ttj| j|ƒ d S )NrÝ  zstore.config)r=  rÝ   rÛ  rÜ  rQ  ÚEARLY_CONFIGr   r;   rI  r®   r•   r0  r   )r,   rO   r   r   r   rÜ   j	  s    


zDefine.early_executec                 C   sÀ   t | jƒ tdƒ t | ¡ | jdkrBtjj | j	| j
| jf¡ n,tjj | jdd … d | j	 | j
| jf¡ | jdkr´| jd u r´t| jƒ\}}t|ddƒr´tj | jd | j	 ¡ |  ¡  d S )NÚdefinerÝ   rW  rÌ  rÝ  rU  T)r   rD   r   Údefine_statementsr(   rÝ   r   r§   ÚdefinitionsrQ  r   r‚   rÛ  rÜ  rÕ  rþ   r  rU  rj   )r,   ÚnsÚ_specialr   r   r   rÍ   x	  s    


,zDefine.executec                 C   s   | j |vrd S |  ¡  d S ri   )rÝ   rj   )r,   Ústoresr   r   r   Úredefine‹	  s    
zDefine.redefinec                 C   sÜ   d }d }t j | jj¡}t| jƒ\}}| jd u rL| jdkrL| 	| j
|¡ d S | | j
¡}|}| jr„t j | jj¡}| jdkr„|| }| jdkr”|}n&| jdkr¨|| }n| jdkrº||B }| jrÊ|||< n| 	| j
|¡ d S )NrÝ  z+=z|=)r   r;   rI  r®   r•   rÕ  rÝ   rÜ  rÛ  rj   rQ  rä   )r,   ÚkeyrÊ   rO   rã  rä  ÚbaserÉ   r   r   r   rj   ’	  s,    





z
Define.set)rZ   r[   r\   r   r}   r1   rÃ   rÜ   rÍ   ræ  rj   r  r   r   rö   r   rÚ  H	  s   rÚ  c                 C   s   t D ]}| | ¡ qdS )z.
    Re-runs the given define statements.
    N)rá  ræ  )rå  r   r   r   r   ræ  ´	  s    ræ  c                       sT   e Zd Zg d¢Zdd„ Z‡ fdd„Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
‡  ZS )ÚDefault)rQ  r®   rÝ   c                 O   s   t  | ¡}d|_|S r6  r7  rî   r   r   r   r}   É	  s    
zDefault.__new__c                    s0   t t| ƒ |¡ || _|| _t||dd| _d S rÞ  )rð   ré  r1   rÝ   rQ  r‘   r®   )r,   r£   rÝ   r   r   rö   r   r   r1   Î	  s    zDefault.__init__c                 C   s   t | j| jfS ri   )ré  rÝ   rQ  rˆ   r   r   r   rÃ   Ö	  s    zDefault.diff_infoc                 C   s   t | jƒ d S ri   )r=  rÝ   rˆ   r   r   r   rÜ   Ù	  s    zDefault.early_executec                 C   s¦   t | jƒ tdƒ t| jƒ\}}|rFtj | jj	¡}| 
| j|¡ d S t | ¡ | jdkrvtjj | j| j| jf¡ n,tjj | jdd … d | j | j| jf¡ d S )NrQ   rÝ   rW  rÌ  )r   rD   r   rÕ  rÝ   r   r;   rI  r®   r•   rÔ  rQ  Údefault_statementsr(   r§   râ  r   r‚   )r,   rã  ÚspecialrO   r   r   r   rÍ   Ü	  s    


zDefault.executec                 C   sî   t jj| j }| dd ¡}|d u r@t j ¡  |d< }|j d¡ | j	|v rn|rjt j
jrjtd | j| j	¡ƒ‚d S |rªt j
jdu rªd | j| j	f¡}|t jjv rªtd |¡ƒ‚|sº| j	|jvrÐt j | jj¡|| j	< |j | j	¡ | | j	¡ d S )NÚ_defaults_setz-{}.{} is being given a default a second time.TrÌ  zG{} is being given a default, but a store with that name already exists.)r   r;   rã   rÝ   rä   rl   ÚRevertableSetÚever_been_changedÚaddrQ  r   r  r^   rw   r@   rI  r®   r•   )r,   ÚstartÚdÚdefaults_setÚfullnamer   r   r   rÔ  ð	  s"    
zDefault.set_defaultc                 C   s   | j | j|d fgS ri   )r   r‚   )r,   r   Úlastr   r   r   Úreport_traceback
  s    zDefault.report_traceback)rZ   r[   r\   r   r}   r1   rÃ   rÜ   rÍ   rÔ  rõ  r  r   r   rö   r   ré  Á	  s   ré  c                       s2   e Zd ZdgZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚScreenÚscreenc                    s   t t| ƒ |¡ || _dS )z°
        @param screen: The screen object being defined.
        In SL1, an instance of screenlang.ScreenLangScreen.
        In SL2, an instance of sl2.slast.SLScreen.
        N)rð   rö  r1   r÷  )r,   r£   r÷  rö   r   r   r1   
  s    zScreen.__init__c                 C   s   t | jjfS ri   )rö  r÷  r   rˆ   r   r   r   rÃ    
  s    zScreen.diff_infoc                 C   sF   t | jƒ tdƒ | j | j| jf¡ tjj	 
| jj| j| jf¡ d S )Nr÷  )r   rD   r   r÷  rà  r   r‚   r   r§   Úscreensr(   r   rˆ   r   r   r   rÍ   #
  s    
zScreen.execute©rZ   r[   r\   r   r1   rÃ   rÍ   r  r   r   rö   r   rö  
  s
   ÿrö  c                       sz   e Zd ZdZdZdZg d¢Zd‡ fdd„	Zdd	„ Zd
d„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z‡  ZS )Ú	Translatea  
    A translation block, produced either by explicit translation statements
    or implicit translation blocks.

    If language is None, when executed this transfers control to the translate
    statement in the current language, if any, and otherwise runs the block.
    If language is not None, causes an error to occur if control reaches this
    statement.

    When control normally leaves a translate statement, in any language, it
    goes to the end of the translate statement in the None language.
    ÚneverT)rí   Ú	alternateÚlanguager²   ÚafterNc                    s,   t t| ƒ |¡ || _|| _|| _|| _d S ri   )rð   rú  r1   rí   rü  rý  r²   )r,   r£   rí   rý  r²   rü  rö   r   r   r1   I
  s
    zTranslate.__init__c                 C   s   t | j| jfS ri   )rú  rí   rý  rˆ   r   r   r   rÃ   Q
  s    zTranslate.diff_infoc                 C   s0   | j r | j d | _t| j |ƒ n|| _|| _d S r"   )r²   rD   rµ   rþ  rÇ   r   r   r   r±   T
  s
    zTranslate.chainc                 C   sD   t  | ||¡ | jr0| jd |u r0| j d|¡ | j|u r@|| _d S r"   )r¿   rË   r²   rš  rþ  rÈ   r   r   r   rË   ]
  s
    
zTranslate.replace_nextc                 C   s   t jjj | jt| dd ƒ¡S )Nrü  )r   r   r…   Ú
translatorÚlookup_translaterí   rþ   rˆ   r   r   r   r¨  f
  s    zTranslate.lookupc                 C   s˜   t dƒ | jd ur$t| jƒ tdƒ‚| jtjjj	vrftjjj	 
| j¡ tj jd7  _tj jd7  _t|  ¡ ƒ | jtj ¡ _t| dd ƒtj ¡ _d S )NÚ	translatez)Translation nodes cannot be run directly.r9   rü  )r   rý  r   rD   r^   rí   r   r   Ú
persistentÚ_seen_translatesrï  Úseen_translates_countÚnew_translates_countr¨  r   Útranslate_identifierrþ   Úalternate_translate_identifierrˆ   r   r   r   rÍ   i
  s    

zTranslate.executec                 C   s   |   ¡ }|gS ri   )r¨  )r,   Únoder   r   r   rÎ   {
  s    zTranslate.predictc                 C   s   t ƒ }|  ¡ |_|S ri   )r¶   r¨  r¹   rÏ   r   r   r   rº   
  s    
zTranslate.scryc                 C   s"   || ƒ | j D ]}| |¡ qd S ri   r  r  r   r   r   rÅ   „
  s    
zTranslate.get_childrenc                 C   s
   || j ƒS ri   r&  rÐ   r   r   r   rÒ   Š
  s    zTranslate.restructure)N)rZ   r[   r\   r]   rÚ   rÙ   r   r1   rÃ   r±   rË   r¨  rÍ   rÎ   rº   rÅ   rÒ   r  r   r   rö   r   rú  /
  s   		rú  c                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )ÚEndTranslatez|
    A node added implicitly after each translate block. It's responsible for
    resetting the translation identifier.
    rû  c                 C   s   t fS ri   )r	  rˆ   r   r   r   rÃ   –
  s    zEndTranslate.diff_infoc                 C   s.   t | jƒ tdƒ d tj ¡ _d tj ¡ _d S )Nzend translate)r   rD   r   r   r   r   r  r  rˆ   r   r   r   rÍ   ™
  s    
zEndTranslate.executeN)rZ   r[   r\   r]   rÚ   rÃ   rÍ   r   r   r   r   r	  Ž
  s   r	  c                       s<   e Zd ZdZdZg d¢Z‡ fdd„Zdd„ Zdd	„ Z‡  Z	S )
ÚTranslateStringz-
    A node used for translated strings.
    T)rý  rÉ   rÊ   Únewlocc                    s,   t t| ƒ |¡ || _|| _|| _|| _d S ri   )rð   r
  r1   rý  rÉ   rÊ   r  )r,   r£   rý  rÉ   rÊ   r  rö   r   r   r1   ¯
  s
    zTranslateString.__init__c                 C   s   t fS ri   )r
  rˆ   r   r   r   rÃ   ·
  s    zTranslateString.diff_infoc                 C   sF   t | jƒ tdƒ t| d| j| jd fƒ}tj | j	| j
| j|¡ d S )Nztranslate stringr  r9   )r   rD   r   rþ   r   r‚   r   rü   Úadd_string_translationrý  rÉ   rÊ   )r,   r  r   r   r   rÍ   º
  s    
zTranslateString.execute©
rZ   r[   r\   r]   rÙ   r   r1   rÃ   rÍ   r  r   r   rö   r   r
  ¡
  s   r
  c                       s<   e Zd ZdZdZddgZ‡ fdd„Zdd„ Zd	d
„ Z‡  Z	S )ÚTranslatePythonz{
    Runs python code when changing the language.

    This is no longer generated, but is still run when encountered.
    Trý  r®   c                    s*   t t| ƒ |¡ || _t||dd| _dS )r9  rž   r:  N)rð   r  r1   rý  r‘   r®   )r,   r£   rý  r<  rö   r   r   r1   Ð
  s    zTranslatePython.__init__c                 C   s   t | jjfS ri   )r  r®   r’   rˆ   r   r   r   rÃ   Ý
  s    zTranslatePython.diff_infoc                 C   s   t | jƒ tdƒ d S )NÚtranslate_pythonr«  rˆ   r   r   r   rÍ   à
  s    
zTranslatePython.executer  r   r   rö   r   r  Â
  s   þr  c                       sL   e Zd ZdZdZddgZ‡ fdd„Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
‡  ZS )ÚTranslateBlockz:
    Runs a block of code when changing the language.
    Tr²   rý  c                    s    t t| ƒ |¡ || _|| _d S ri   )rð   r  r1   rý  r²   )r,   r£   rý  r²   rö   r   r   r1   õ
  s    zTranslateBlock.__init__c                 C   s"   || ƒ | j D ]}| |¡ qd S ri   r  r  r   r   r   rÅ   û
  s    
zTranslateBlock.get_childrenc                 C   s   || _ t| jd ƒ d S ri   r   rÇ   r   r   r   r±     s    zTranslateBlock.chainc                 C   s   t | jƒ tdƒ d S )NÚtranslate_blockr«  rˆ   r   r   r   rÍ     s    
zTranslateBlock.executec                 C   s   || j ƒ d S ri   r&  rÐ   r   r   r   rÒ     s    zTranslateBlock.restructure)rZ   r[   r\   r]   rÙ   r   r1   rÅ   r±   rÍ   rÒ   r  r   r   rö   r   r  é
  s   þ	r  c                   @   s   e Zd ZdZdS )ÚTranslateEarlyBlockz^
    This is similar to the TranslateBlock, except it runs before deferred
    styles do.
    N)rZ   r[   r\   r]   r   r   r   r   r    s   r  c                       s<   e Zd Zg d¢Z‡ fdd„Zdd„ Zdd„ Zdd	„ Z‡  ZS )
ÚStyle)Ú
style_namerÉ  Ú
propertiesÚclearÚtakeÚdelattrÚvariantc                    s>   t t| ƒ |¡ || _d| _i | _d| _d| _g | _d| _	dS )zE
        `name`
            The name of the style to define.
        NF)
rð   r  r1   r  rÉ  r  r  r  r  r  )r,   r£   r   rö   r   r   r1   #  s    zStyle.__init__c                 C   s
   t | jfS ri   )r  r  rˆ   r   r   r   rÃ   ?  s    zStyle.diff_infoc                 C   sÚ   | j d ur(tj | j ¡}tj  |¡s(d S tj | j¡}| jrD| ¡  | j	d urZ| 
| j	¡ | jd urp| | j¡ | jD ]}| |¡ qv| jrÖi }| j ¡ D ]0\}}tj |¡}|dkrÂ| |¡ qš|||< qš| |¡ d S )Nr  )r  r   r;   rG   r  ÚstyleÚget_or_create_styler  r  rÉ  Ú
set_parentr  r  r  r.  ro   Úadd_properties)r,   r  r‡   r   r  r   r   rO   r   r   r   rY   B  s*    




zStyle.applyc                 C   sD   t | jƒ tdƒ tjjr8tj ¡ jr8tj	j
 | ¡ d S |  ¡  d S )Nr  )r   rD   r   r   r   Údefer_stylesr   r   r@  rü   Údeferred_stylesr(   rY   rˆ   r   r   r   rÍ   d  s    
zStyle.execute)	rZ   r[   r\   r   r1   rÃ   rY   rÍ   r  r   r   rö   r   r    s
   
"r  c                       s4   e Zd ZddgZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )	ÚTestcaser*  Útestc                    s    t t| ƒ |¡ || _|| _d S ri   )rð   r   r1   r*  r!  )r,   r£   r*  r!  rö   r   r   r1   v  s    zTestcase.__init__c                 C   s
   t | jfS ri   )r   r*  rˆ   r   r   r   rÃ   |  s    zTestcase.diff_infoc                 C   s(   t | jƒ tdƒ | jtjjj| j< d S )NÚtestcase)r   rD   r   r!  r   ÚtestexecutionÚ	testcasesr*  rˆ   r   r   r   rÍ     s    
zTestcase.executerù  r   r   rö   r   r   o  s   þr   c                       s:   e Zd ZdgZ‡ fdd„Zdd„ Zdd„ Zdd	„ Z‡  ZS )
ÚRPYÚrestc                    s   t t| ƒ |¡ || _d S ri   )rð   r%  r1   r&  )r,   r£   r&  rö   r   r   r1   ‹  s    zRPY.__init__c                 C   s
   t | jfS ri   )r%  r&  rˆ   r   r   r   rÃ     s    zRPY.diff_infoc                 C   s   t | jƒ tdƒ d S )NÚrpyr«  rˆ   r   r   r   rÍ   “  s    
zRPY.executec                 C   s   dd  | j¡ S )Nzrpy rû   )r@   r&  rˆ   r   r   r   r{   ™  s    zRPY.get_code)	rZ   r[   r\   r   r1   rÃ   rÍ   r{   r  r   r   rö   r   r%  †  s   ÿr%  )F)N)FN)N)YÚ
__future__r   r   r   r   r   Úrenpy.compatr   r   r	   r
   r   r   r   r   r   r   r   r   Útypingr   r   r   r©   rò   r¡   r   r   Úobjectr!   r_   ÚObjectr`   rO  ÚEMPTY_ARGUMENTSr   r€   r   r‘   rµ   r¶   r¿   râ   ræ   rç   r0  ré   r  r'  r4  rC  rD  rP  re  rj  rk  rn  rx  rz  r}  r‚  r„  rŒ  r•  r¥  r©  r¬  r¯  r³  rÈ  r=  rÑ  rÕ  rß  rá  rÚ  ræ  rê  ré  rö  rú  r	  r
  r  r  r  r  r   r%  r   r   r   r   Ú<module>   s   8	
 c
P2
C 2
 E'I8/44
/
')((6B4D5 @4= "	l
N _!''X