o
    à›hë"  ã                   @   s¼   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZmZ d dlmZ ejdkr?d dlmZ da	 da	 g Z	 dd„ Zd	d
„ Zdd„ Zdd„ Zdd„ ZdS )é    N)Úlauncher)ÚlogÚ	messaging)ÚoutputÚwin32)Úwinapic                   C   s   dt j› d�S )NzDebuggee[PID=ú])ÚprocessÚpid© r   r   úOc:\Users\shubh\Videos\agent\nova\Lib\site-packages\debugpy/launcher/debuggee.pyÚdescribe$   s   r   c                 C   sº  t  d||¡ tƒ }�z2|r)t ¡ \}}t ¡ \}}|||||hO }t||d�}	ni }	tjdkr@tjj	dkr@dd„ }
|	j
|
d� ztj|f|dd	œ|	¤ŽaW n tyc } z	t d
 ||¡¡‚d }~ww t  dtƒ ¡ tjdkrÔzStj d d ¡at ¡ }t t |¡¡}tj ttjt |¡|t |¡¡ |j jtj tj!B O  _tj "ttjt |¡|¡ tj #tj$tj%B dtj&¡}tj 't|¡ W n tyÓ   t j(ddd� Y nw t) *t+¡ t,j- .dddtj&| t/ 0d¡d dœ¡ |�rd|tj1fd|tj2ffD ]\}}}t3 4tƒ |||¡ | 5|¡ qût6j7t8dd�}d|_9| :¡  W |D ]}zt ;|¡ W �q  t�y;   t j(dd� Y �q w d S |D ]}zt ;|¡ W �q@ t�y[   t j(dd� Y �q@w w )NzOSpawning debuggee process:

Command line: {0!r}

Environment variables: {1!r}

)ÚstdoutÚstderrr   Zgraalpyc               
   S   sž   z=t  ¡  t tjtj¡} z(t  dt j¡}zt  |t  ¡ ¡ W t  	|¡ nt  	|¡ w W t tj| ¡ W d S t tj| ¡ w  t
yN   tjddd� Y d S w )Nz/dev/ttyzFailed to set up process groupÚinfo©Úlevel)ÚosZsetpgrpÚsignalZSIGTTOUÚSIG_IGNÚopenÚO_RDWRZ	tcsetpgrpZgetpgrpÚcloseÚ	Exceptionr   Úswallow_exception)Zold_handlerÚttyr   r   r   Ú
preexec_fn@   s   $ÿþzspawn.<locals>.preexec_fn)r   r   )ÚenvÚbufsizez0Couldn't spawn debuggee: {0}

Command line:{1!r}zSpawned {0}.FzFailed to set up job objectÚwarningr   r	   ZlaunchTÚPé   )ZstartMethodZisLocalProcessZsystemProcessIdÚnameZpointerSizer   r   zwait_for_exit())Útargetr"   )<r   r   Úsetr   ÚpipeÚdictÚsysÚplatformÚimplementationr"   ÚupdateÚ
subprocessÚPopenr	   r   r   ZMessageHandlingErrorÚformatr   r   Úkernel32ZCreateJobObjectAÚ
job_handleZ$JOBOBJECT_EXTENDED_LIMIT_INFORMATIONÚDWORDÚctypesÚsizeofZQueryInformationJobObjectZ!JobObjectExtendedLimitInformationÚpointerZBasicLimitInformationZ
LimitFlagsZ"JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSEZJOB_OBJECT_LIMIT_BREAKAWAY_OKZSetInformationJobObjectÚOpenProcessZPROCESS_TERMINATEZPROCESS_SET_QUOTAr
   ZAssignProcessToJobObjectr   ÚatexitÚregisterÚkillr   ÚchannelÚ
send_eventÚstructÚcalcsizer   r   r   ZCaptureOutputÚremoveÚ	threadingÚThreadÚwait_for_exitÚdaemonÚstartr   )Zprocess_nameZcmdliner   Zredirect_outputÚ	close_fdsZstdout_rZstdout_wZstderr_rZstderr_wÚkwargsr   ÚexcZjob_infoZjob_info_sizeZprocess_handleÚcategoryÚfdÚteeZwait_threadr   r   r   Úspawn(   s¶   ûÿÿ€ÿ
ûýýü
ýÿ
ûþ

þ
ÿýÿýrH   c                   C   s„   t d u rd S z*t  ¡ d u r.t dtƒ ¡ tjdkr#tj 	t
d¡ W d S t t jtj¡ W d S W d S  tyA   t dtƒ ¡ Y d S w )NzKilling {0}r   r   zFailed to kill {0})r	   Úpollr   r   r   r'   r(   r   r.   ZTerminateJobObjectr/   r   Zkillpgr
   r   ZSIGKILLr   r   r   r   r   r   r7   ²   s   
ø	ÿr7   c                     sÒ   zt  ¡ ‰ tjdkrˆ dk rˆ dM ‰ W n ty#   t d¡ d‰ Y nw t dtƒ ˆ ¡ t	 
¡  t‡ fdd„tD ƒƒ} ztj d	d
ˆ i¡ W n	 tyO   Y nw | rUtƒ  z	tj d¡ W d S  tyh   Y d S w )Nr   r   éÿ   z$Couldn't determine process exit codeéÿÿÿÿz{0} exited with code {1}c                 3   s   � | ]}|ˆ ƒV  qd S )Nr   )Ú.0Úpred©Úcoder   r   Ú	<genexpr>Ö   s   € z wait_for_exit.<locals>.<genexpr>ZexitedZexitCodeZ
terminated)r	   Úwaitr'   r(   r   r   r   r   r   r   Zwait_for_remaining_outputÚanyÚwait_on_exit_predicatesr   r8   r9   Ú_wait_for_user_input)Zshould_waitr   rN   r   r?   Ä   s0   €
þÿÿr?   c                  C   s¶   t jrUt jrWt j ¡ rYddlm}  zdd l}W n ty"   d}Y nw d}|r=|  d¡ t j 	d¡ t j 
¡  | ¡  d S |  d¡ t j 	d¡ t j 
¡  t j d	¡ d S d S d S d S )
Nr   )r   FTz5msvcrt available - waiting for user input via getch()z Press any key to continue . . . z8msvcrt not available - waiting for user input via read()zPress Enter to continue . . . é   )r'   r   ÚstdinÚisattyÚdebugpy.commonr   ÚmsvcrtÚImportErrorÚdebugÚwriteÚflushÚgetchÚread)r   rY   Z	can_getchr   r   r   rT   æ   s$   ÿ



írT   )r5   r1   r   r   r:   r+   r'   r=   Zdebugpyr   rX   r   r   Zdebugpy.launcherr   r(   r   r	   r/   rS   r   rH   r7   r?   rT   r   r   r   r   Ú<module>   s2   
 "