3
b`#                 @   s   d dl mZ d dlZd dlZd dlZddlmZmZ dejfdej	fdej
fdejfd	ejfd
ejfdejfdejfdejfdejfg
Zdd eD Zejddd f dZG dd deZdS )    )unicode_literalsN   )ExtractorErrorremove_quotes|^&z>>z<<-+%/*c             C   s   g | ]\}}|d  |fqS )= ).0opopfuncr   r   ?C:\Users\Broad\Desktop\All-Down\binaries\youtube_dl\jsinterp.py
<listcomp>   s    r   r   c             C   s   |S )Nr   )currightr   r   r   <lambda>   s    r   z[a-zA-Z_$][a-zA-Z_$0-9]*c               @   sH   e Zd ZdddZdddZdd Zd	d
 Zdd Zdd Zdd Z	dS )JSInterpreterNc             C   s"   |d kri }|| _ i | _|| _d S )N)code
_functions_objects)selfr   Zobjectsr   r   r   __init__   s
    zJSInterpreter.__init__d   c       	      C   s   |dk rt dd}|j }tjd|}|rD|t|jdd  }n0tjd|}|rp|t|jdd  }d}n|}| j|||}||fS )Nr   zRecursion limit reachedFzvar\szreturn(?:\s+|$)T)r   lstriprematchlengroupinterpret_expression)	r   stmt
local_varsallow_recursionZshould_abortZstmt_mexprZreturn_mvr   r   r   interpret_statement&   s    z!JSInterpreter.interpret_statementc                sH  |j  }|dkrd S |jdrd}xtjd|D ]v}|jddkrL|d7 }q0|d8 }|dkr0|d|j  }j| }||j d  j  }|s|S tj	|| }P q0W t
d| xtD ]\}	}
tjdttj|	f |}|sqj|jd d }|j jd	r\|jd
 }j|jd	 }t|ts>t|| }|
||}|||< |S j|jd
}|
||}||jd
< |S qW |j rt|S tjdt |}|r|jd S y
tj|S  tk
r   Y nX tjdt |}|r(|jd }j|jd d }|| S tjdt |}|r|jd}t|jdp^|jd}|jd}|kr| }n&|jkrj|j|< j| }|d kr|dkrt|S || S |jdst|dkrt }n t fdd|jdD }|dkr,|d(ks$tt|S |dkrVt|dksHt|d j|S |dkr~t|dksrt|j   |S |dkrt|dkst||d d  S |dkrt|tst|\}}g }x2t!|t"|| t|D ]}|j#|j$| qW |S || |S xt%D ]\}	}
tjdtj|	 |}|sBqj&|jd  d \}}|rtt
d!|	|f j&|jd" d \}}|rt
d#|	|f |
||S W tjd$t |}|r8|jd%}t|jddkrtfd&d|jdjdD nt }|j'kr*j(|j'|< j'| |S t
d'| d S ))N (r   z[()]r   zPremature end of parens in %rzo(?x)
                (?P<out>%s)(?:\[(?P<index>[^\]]+?)\])?
                \s*%s
                (?P<expr>.*)$r(   indexoutz%(?!if|return|true|false)(?P<name>%s)$namez(?P<in>%s)\[(?P<idx>.+)\]$inidxzW(?P<var>%s)(?:\.(?P<member>[^(]+)|\[(?P<member2>[^]]+)\])\s*(?:\(+(?P<args>[^()]*)\))?$varmemberZmember2argslength)c                s   g | ]}j | qS r   )r$   )r   r)   )r'   r&   r   r   r   r      s   z6JSInterpreter.interpret_expression.<locals>.<listcomp>,splitjoinreversesliceZsplicez(?P<x>.+?)%s(?P<y>.+)xz&Premature left-side return of %s in %ryz'Premature right-side return of %s in %rz+^(?P<func>%s)\((?P<args>[a-zA-Z0-9_$,]*)\)$funcc                s$   g | ]}|j  rt|n | qS r   )isdigitint)r   r)   )r&   r   r   r      s   zUnsupported JS expression %r)r+   ))strip
startswithr    finditerr#   startr$   endjsondumpsr   _ASSIGN_OPERATORSr!   _NAME_REescape	groupdictget
isinstancer@   AssertionErrorr?   loads
ValueErrorr   r   extract_objectr"   endswithtupler8   listr9   r:   rangeminappendpop
_OPERATORSr*   r   extract_function)r   r(   r&   r'   Zparens_countmZsub_exprZ
sub_resultZremaining_exprr   r   Z	right_valZlvarr1   r   valZvar_mvariabler3   Zarg_strobjZargvalsr-   ZhowManyresir<   abortr=   fnamer   )r'   r&   r   r   r$   ;   s    




















<z"JSInterpreter.interpret_expressionc       	      C   s   d}i }t jdt j||f | j}|jd}t jd| |}x<|D ]4}|jdjd}| j||jd|t|jd< qDW |S )	Nz1(?:[a-zA-Z$0-9]+|"[a-zA-Z$0-9]+"|'[a-zA-Z$0-9]+')z(?x)
                (?<!this\.)%s\s*=\s*{\s*
                    (?P<fields>(%s\s*:\s*function\s*\(.*?\)\s*{.*?}(?:,\s*)?)*)
                }\s*;
            fieldsze(?x)
                (?P<key>%s)\s*:\s*function\s*\((?P<args>[a-z,]+)\){(?P<code>[^}]+)}
            r4   r7   r   key)	r    searchrJ   r   r#   rC   r8   build_functionr   )	r   ZobjnameZ_FUNC_NAME_REr^   Zobj_mrc   Zfields_mfargnamesr   r   r   rQ      s    

$zJSInterpreter.extract_objectc             C   s`   t jdt j|t j|t j|f | j}|d kr>td| |jdjd}| j||jdS )Nz(?x)
                (?:function\s+%s|[{;,]\s*%s\s*=\s*function|var\s+%s\s*=\s*function)\s*
                \((?P<args>[^)]*)\)\s*
                \{(?P<code>[^}]+)\}zCould not find JS function %rr4   r7   r   )r    re   rJ   r   r   r#   r8   rf   )r   funcnameZfunc_mrh   r   r   r   rZ      s    zJSInterpreter.extract_functionc             G   s   | j |}||S )N)rZ   )r   ri   r4   rg   r   r   r   call_function   s    
zJSInterpreter.call_functionc                s    fdd}|S )Nc                s<   t t | }x(jdD ]}j||\}}|rP qW |S )N;)dictzipr8   r*   )r4   r&   r%   r_   ra   )rh   r   r   r   r   resf   s    z*JSInterpreter.build_function.<locals>.resfr   )r   rh   r   rn   r   )rh   r   r   r   rf      s    zJSInterpreter.build_function)N)r   )
__name__
__module____qualname__r   r*   r$   rQ   rZ   rj   rf   r   r   r   r   r      s   

 r   )
__future__r   rF   operatorr    utilsr   r   or_xorand_rshiftlshiftsubaddmodtruedivmulrY   rH   rW   rI   objectr   r   r   r   r   <module>   s$   