
    Mh                    v   d Z ddlm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 ddlmZ ddlmZmZ ddlmZ dd	lmZ dd
lmZmZmZmZmZmZmZmZm Z  	 ddl!m"Z" n# e#$ r	 ddl!m$Z" Y nw xY w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.m/Z/m0Z0m1Z1m2Z2 d Z3 G d de.          Z4 e,j5        e4           dS )z)An implementation of a kernel connection.    )annotationsNFuture)dedent)protocol_version)genweb)IOLoop)WebSocketClosedError)	AnyBoolDictFloatInstanceIntListUnicodedefault)json_default)date_default)ensure_async)_i18n   )KernelWebsocketHandler   )KernelWebsocketConnectionABC)BaseKernelWebsocketConnectiondeserialize_binary_messagedeserialize_msg_from_ws_v1serialize_binary_messageserialize_msg_to_ws_v1c                v    	 t          j                     t          j        |           S # t          $ r | cY S w xY w)zIWrap a concurrent future as an asyncio future if there is a running loop.)asyncioget_running_loopwrap_futureRuntimeError)fs    s/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/jupyter_server/services/kernels/connection/channels.py_ensure_futurer)   '   sK     """"1%%%   s   &) 88c                  *   e Zd ZU dZ edd ed                    Z edd ed                    Z edd ed                    Z	 ed	d ed
                    Z
 ee          Zed             Zi Zded<    ej                    Zded<   ded<   ded<    ei           Z ed          Z ee          Z ed          d             Z ee          Z ed          d             Z ed          Z  e!            Z" e!            Z# ed          Z$ ed          Z% e&g           Z'ded<   e(d             Z)ed             Z*d Z+d Z,d Z-d  Z.d! Z/d" Z0d# Z1d:d(Z2d;d,Z3d- Z4d<d/Z5d0 Z6d1 Z7d2 Z8d3 Z9d4 Z:d5 Z;d6 Z<d7 Z=d8 Z>d9 Z?d.S )=ZMQChannelsWebsocketConnectionz%A Jupyter Server Websocket ConnectionTzWhether to limit the rate of IOPub messages (default: True). If True, use iopub_msg_rate_limit, iopub_data_rate_limit and/or rate_limit_window to tune the rate.)confighelpi  zg(msgs/sec)
        Maximum rate at which messages can be sent on iopub before they are
        limited.i@B zm(bytes/sec)
        Maximum rate at which stream output can be sent on iopub before they are
        limited.   zI(sec) Time window used to
        check the message and data rate limits.c                    | j         j        S )z6Alias to the websocket handler's write_message method.)websocket_handlerwrite_messageselfs    r(   r1   z,ZMQChannelsWebsocketConnection.write_message\   s     %33    z!dict[str, KernelWebsocketHandler]_open_sessionsz,t.MutableSet[ZMQChannelsWebsocketConnection]_open_socketszFuture[t.Any]_kernel_info_future_close_future)
allow_none)klassc                    t                      S )zThe default kernel info future.r   r2   s    r(   _default_kernel_info_futurez:ZMQChannelsWebsocketConnection._default_kernel_info_futureo        xxr4   c                    t                      S )zThe default close future.r   r2   s    r(   _default_close_futurez4ZMQChannelsWebsocketConnection._default_close_futurev   r=   r4    FzList[t.Any]_iopub_window_byte_queuec                   K   t          | j                  D ]0}|                                 t          |j                   d{V  1dS )zATornado does not provide a way to close open sockets, so add one.N)listr6   
disconnectr)   r8   )cls
connections     r(   	close_allz(ZMQChannelsWebsocketConnection.close_all   sd       s011 	; 	;J!!### !9::::::::::	; 	;r4   c                F    	 | j         j        }n# t          $ r d}Y nw xY w|S )zThe sub protocol.N)r0   selected_subprotocol	Exception)r3   protocols     r(   subprotocolz*ZMQChannelsWebsocketConnection.subprotocol   s=    	-BHH 	 	 	HHH	s    c                    | j         j        }dD ]7}t          | j        d|z             } ||          x| j        |<   }||_        8dS )zCreate a stream.)iopubshellcontrolstdinconnect_)identityN)sessionbsessiongetattrkernel_managerchannelschannel)r3   rS   rY   methstreams        r(   create_streamz,ZMQChannelsWebsocketConnection.create_stream   sc    <(= 	% 	%G4.
W0DEED.2dH.E.E.EEDM'"V$FNN	% 	%r4   c                   	
 t           j        dd          dk    rR j                            d j                   t                      }|                    d           t          |          S  j                                         j        	                                 j
        d         t                      
t                      t          j        
g          d
fd		dfd	}                    |           
 fd}
 fd	} fd
}                    |                               |                               |           t          j                    	 fd                    dd          t          j                                         j        z             }|                    	           t          |          S )a  Nudge the zmq connections with kernel_info_requests
        Returns a Future that will resolve when we have received
        a shell or control reply and at least one iopub message,
        ensuring that zmq subscriptions are established,
        sockets are fully connected, and kernel is responsive.
        Keeps retrying kernel_info_request until these are both received.
        execution_stateNbusyz!Nudge: not nudging busy kernel %srN   c                h    fD ]+}|                                 s|                    d           ,dS )zWEnsure all futures are resolved
            which in turn triggers cleanup
            N)done
set_result)_r'   info_futureiopub_futures     r(   finishz4ZMQChannelsWebsocketConnection.nudge.<locals>.finish   sF     "<0 ' 'vvxx 'LL&&&' 'r4   c                                                                                                                     s                                                                 s                                 dS dS )zCommon cleanupN)remove_timeoutstop_on_recvclosedclose)rc   control_channeliopub_channelloopnudge_handleshell_channels    r(   cleanupz5ZMQChannelsWebsocketConnection.nudge.<locals>.cleanup   s    ---&&((( '')) &##%%%"))++ (%%'''''( (r4   c                    j                             dj                                                   s7j                             dj                                       d           dS dS )zHandle nudge shell replies.z$Nudge: shell info reply received: %sz!Nudge: resolving shell future: %sNlogdebug	kernel_idra   rb   msgrd   r3   s    r(   on_shell_replyz<ZMQChannelsWebsocketConnection.nudge.<locals>.on_shell_reply   sm    HNNA4>RRR##%% -BDNSSS&&t,,,,,- -r4   c                    j                             dj                                                   s7j                             dj                                       d           dS dS )zHandle nudge control replies.z&Nudge: control info reply received: %sz#Nudge: resolving control future: %sNrs   rw   s    r(   on_control_replyz>ZMQChannelsWebsocketConnection.nudge.<locals>.on_control_reply   sm    HNNCT^TTT##%% -DdnUUU&&t,,,,,- -r4   c                   j                             dj                                                   sK                                 j                             dj                                       d           dS dS )zHandle nudge iopub replies.zNudge: IOPub received: %sz!Nudge: resolving iopub future: %sN)rt   ru   rv   ra   ri   rb   )rx   rm   re   r3   s    r(   on_iopubz6ZMQChannelsWebsocketConnection.nudge.<locals>.on_iopub   s    HNN6GGG$$&& .**,,,BDNSSS''-----. .r4   c                   | dz  } j         j        vr,j                            dj                                  dS 	                                r,j                            dj                                  dS                                 r,j                            dj                                  dS                                 s| dz  dk    rj        j        nj        j        } |d|  dj                     j                            	d	           j                            d	           	                    d
|           dS dS )zNudge the kernel.r   z'Nudge: cancelling on stopped kernel: %sNz*Nudge: cancelling on closed zmq socket: %s
   r   zNudge: attempt z on kernel kernel_info_requestg      ?)
rv   multi_kernel_managerrt   ru   rj   ra   warningrT   send
call_later)
countrt   	both_donerl   rf   rn   nudgero   r3   rp   s
     r(   r   z3ZMQChannelsWebsocketConnection.nudge.<locals>.nudge   so   QJE~T%>>>H$.YYY ##%% KT^\\\ %%'' KT^\\\>>## B*/"*//dh&&tx~HeHHHHIII!!-1FGGG!!/3HIII#sE5AAB Br4   r   )r   N)rV   rW   rt   ru   rv   r   rb   r)   connect_shellconnect_controlrX   r   multiadd_done_callbackon_recvr
   currentr   with_timeouttimekernel_info_timeout)r3   r'   rq   ry   r{   r}   futurer   rl   rf   rd   rm   re   rn   r   ro   rp   s   `      @@@@@@@@@@r(   r   z$ZMQChannelsWebsocketConnection.nudge   s    4&(94@@FJJHNN>OOO%xxALL!!$$$ +99;; -==??g.%+XX&,hhI{L9::		' 	' 	' 	' 	' 	' 	'	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	##G,,,	- 	- 	- 	- 	- 	-	- 	- 	- 	- 	- 	-	. 	. 	. 	. 	. 	. 	. 	h'''n--- 0111~	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B: q%q99 !$))++0H"H)TT  (((f%%%r4   c                b  K   | j          d| j        j         | _        | j                            | j                  }|r4| j                            d| j                   |                                 | j         | j        v r.t          j
        t          | j                  | j        | j        <   dS dS )a#  Ensure we aren't creating a duplicate session.

        If a previous identical session is still open, close it to avoid collisions.
        This is likely due to a client reconnecting from a lost network connection,
        where the socket on our side has not been cleaned up yet.
        :zReplacing stale connection: %sN)rv   rT   session_keyr5   getrt   r   rk   r   tcastr   r0   )r3   stale_handlers     r(   _register_sessionz0ZMQChannelsWebsocketConnection._register_session  s       #nEEt|/CEE+//0@AA 	"H=t?OPPP!!!Nd77745F&(>5 5D 0111 87r4   c                @   K                                      d{V  t           j        d          r j        j        }t	          |t
          j                  st          j        |          }	 | d{V  nZ# t          $ rM}d j        _	        t          |           j        _        t          j        dt          |                    |d}~ww xY wt          j                    }t           j                                                   d{V s{t          j        d           d{V  t          j                    |z
   j        j        k    rd}t)          |          t           j                                                   d{V { j        j        j         j        _                                          fd}t1          j                    }|                    |                                 j        z   |           t          j                   d{V  dS )zPrepare a kernel connection.Nreadydeadi  g?z&Kernel never reached an 'alive' state.c                                                       rdS j                            dj                                        i            dS )z*Don't wait forever for the kernel to replyNz-Timeout waiting for kernel_info reply from %s)ra   rt   r   rv   rb   )r   r3   s   r(   give_upz7ZMQChannelsWebsocketConnection.prepare.<locals>.give_upC  sM    {{}} HLdn]]]b!!!!!r4   )r   hasattrrW   r   
isinstancer#   r   r%   rJ   r^   strreasonr	   	HTTPErrorr   r   is_alivesleepr   r   TimeoutErrorrT   keyrequest_kernel_infor
   r   add_timeout)r3   r   et0rx   r   rn   r   s   `      @r(   preparez&ZMQChannelsWebsocketConnection.prepare&  sE      $$&&&&&&&&&
 4&00 		8'-EeW^44 3+E228 8 8 86<#3-0VV#*mCQ00a78
 Y[[$T%8%A%A%C%CDDDDDDDD 	(-$$$$$$$$$	b D$=$QQQ>"3'''	 %T%8%A%A%C%CDDDDDDDD 	(  .6:))++	" 	" 	" 	" 	" 	" ~t'??III!&)))))))))))s   /A8 8
CAC

Cc                     j                              j                    j                              j         j                  rd          j        k    r j                            d j                    j                              j                  r                                  nd          _	         
                                } fd}|                    |           n	                                    
                                }n# t          j        $ r}	  j                              j                    j                            d|           n# t           $ r Y nw xY w j	                                        D ]*}|                                s|                                 +                                  Y d}~dS d}~ww xY w j                              j         j                    j                              j         j        d            fd}|                    |           t0          j                                        |S )	zHandle a connection.r   zRestoring connection for %srX   c                    d         }|rSj                             dt          |                     |D ]*\  }}j        |         }                    ||           )d S d S )NbufferzReplaying %s buffered messages)rt   infolenrX   handle_outgoing_message)valuereplay_bufferrY   msg_listr[   buffer_infor3   s        r(   replayz6ZMQChannelsWebsocketConnection.connect.<locals>.replaya  s     +H 5  GHMM"BCDVDVWWW-: G G)!%w!744VXFFFF	G GG Gr4   zError opening stream: %sNr   c                t    j                                         D ]}|                    j                   d S r   )rX   valueson_recv_streamr   )r   r[   r3   s     r(   	subscribez9ZMQChannelsWebsocketConnection.connect.<locals>.subscribe  sH    -..00 D D%%d&BCCCCD Dr4   )r   notify_connectrv   
get_bufferr   rt   r   ports_changedr\   rX   r   r   r	   r   
get_kernelerrorKeyErrorr   rj   rk   rD   add_restart_callbackon_kernel_restartedon_restart_failedr+   r6   add)r3   	connectedr   r   r[   r   r   s   `     @r(   connectz&ZMQChannelsWebsocketConnection.connectO  s   !00@@@ /::4>4K[\\ '	;}59IIIHMM79IJJJ(66t~FF 8 ""$$$$ !,J 7

IG G G G G G ''////""$$$ JJLL		=   -88HHHHNN#=qAAAA   D #m2244 ' 'F!==?? '!!!ttttt  	!66t~tG_```!66ND2F	
 	
 	
	D 	D 	D 	D 	D 	##I...&488>>>s7   ,(D G%:E G 
E-*G,E--AGGc                *    |                                  S )zClose the connection.)rD   r2   s    r(   rk   z$ZMQChannelsWebsocketConnection.close  s       r4   c                B   | j                             d| j                   | j                            | j                  | j        u r| j                            | j                   | j        | j        v r| j        	                    | j                   | j        
                    | j        | j                   | j        
                    | j        | j        d           | j        | j        j        v r| j        j        | j                 dk    rf| j                            | j        | j        | j                   t           j                            |            | j                            d           dS | j                                        D ]A}|=|                                s)|                    d           |                                 Bi | _        	 t           j                            |            | j                            d           dS # t2          $ r Y dS w xY w)zHandle a disconnect.zWebsocket closed %sr   r   N)rt   ru   r   r5   r   r0   poprv   r   notify_disconnectremove_restart_callbackr   r   _kernel_connectionsstart_bufferingrX   r+   r6   remover8   rb   r   rj   r   rk   rJ   )r3   r[   s     r(   rD   z)ZMQChannelsWebsocketConnection.disconnect  s   ,d.>???""4#3448NNN##D$4555>T666%77GGG%==(   %==&   $";"OOO-A$.QUVVV)99ND$4dm   /<CCDIII"--d333
 m**,, 	 	F!&--//!t$$$	*8??EEE))$///// 	 	 	DD	s   9H 
HHincoming_msgr   returnNonec                T   |}| j         s| j                            d|           dS | j        dk    rt	          |          \  }}ddi}nQt          |t                    rt          |          }nt          j	        |          }g }|
                    dd          }|| j                            d|           d}|| j         vr| j                            d|           dS | j        j        }d	}|re|                     d|d         |          |d<   |d         J |d         d
         |vr+| j                            d|d         d
         z             d}|sR| j         |         }| j        dk    r| j                            ||           dS | j                            ||           dS dS )z7Handle incoming messages from Websocket to ZMQ Sockets.z'Received message on closed websocket %rNv1.kernel.websocket.jupyter.orgheaderrY   z(No channel specified, assuming shell: %srO   zNo such channel: %rFmsg_typez>Received message of type "%s", which is not allowed. Ignoring.T)rX   rt   ru   rL   r   r   bytesr   jsonloadsr   r   r   allowed_message_typesget_partrT   send_rawr   )	r3   r   ws_msgrY   r   rx   am
ignore_msgr[   s	            r(   handle_incoming_messagez6ZMQChannelsWebsocketConnection.handle_incoming_message  s   } 	HNNDfMMMF@@@ :6 B BGX$CC &%(( )088j((Hggi..G?HGMMMG$-''H2G<<<F&<
 	" MM(CM8LLCMx=,,,8}Z(22  T(mJ/0   "
 	/]7+F#DDD%%fh77777!!&#.....	/ 	/r4   r[   outgoing_msglist[t.Any]c                   |}| j                             |          \  }}| j        dk    rdddd}n| j                             |          }t	          |t
                    r| j        |         }t          |dd          }|dd         }|                     |||           | 	                    |||          rdS | j        dk    r| 
                    ||           dS | 
                    ||           dS )z;Handle the outgoing messages from ZMQ sockets to Websocket.r   Nr   parent_headercontentrY   r   )rT   feed_identitiesrL   deserializer   r   rX   rV   	_on_error_limit_rate_on_zmq_reply)	r3   r[   r   r   rc   fed_msg_listrx   rY   partss	            r(   r   z6ZMQChannelsWebsocketConnection.handle_outgoing_message  s   ,66x@@<@@@!DTJJCC,**<88Cfc"" 	+]6*F&)T22QRR wU+++GS%00 	F@@@vu-----vs+++++r4   c                b    |,dddd}| j                             |||                            }|S )zGet a part of a message.Nr   r   r.   r   )rT   unpack)r3   fieldr   r   	field2idxs        r(   r   z'ZMQChannelsWebsocketConnection.get_part  sB    =!" I
 L''51A(BCCEr4   Nc                   t          |t                    r|}n7| j                            |          \  }}| j                            |          }|r||d<   |d         rt          |          }|S t          j        |t                    S )a  Reserialize a reply message using JSON.

        msg_or_list can be an already-deserialized msg dict or the zmq buffer list.
        If it is the zmq list, it will be deserialized with self.session.

        This takes the msg list from the ZMQ socket and serializes the result for the websocket.
        This method should be used by self._on_zmq_reply to build messages that can
        be sent back to the browser.

        rY   buffersr   )	r   dictrT   r   r   r    r   dumpsr   )r3   msg_or_listrY   rx   rc   r   bufs          r(   _reserialize_replyz1ZMQChannelsWebsocketConnection._reserialize_reply  s     k4(( 	5CC,66{CCKAx,**844C 	%$C	Ny> 	9*3//CJ:c<8888r4   c                |   |                                 r0| j                            d           |                                  dS t	          |dd          }| j        dk    r)t          ||          }|                     |d           dS 	 |                     ||          }	 |                     |t          |t                               dS # t          $ r2}| j                            t          |                     Y d}~dS d}~ww xY w# t          $ r# | j                            d|z  d	           Y dS w xY w)
zHandle a zmq reply.z%zmq message arrived on closed channelNrY   r   Tbinary)rY   zMalformed message: %rexc_info)rj   rt   r   rD   rV   rL   r!   r1   r   r   r   r   r   rJ   critical)r3   r[   r   rY   bin_msgrx   r   s          r(   r   z,ZMQChannelsWebsocketConnection._on_zmq_reply(  sq    ==?? 	HDEEEOOF&)T22@@@,Xw??Gwt44444---h-HH-&&s:c53I3I&JJJJJ+ - - -H$$SVV,,,,,,,,,-  U U U!!"9H"Dt!TTTTTTUs*   D #*C 
D'DD)D;:D;c                <    	  j         j        }|                                s j                            d           |                     fd           n# t          $ r  j                            d j                    j        $ j	        
                     j                   _         j        J  j                             j                    j                             j        d            j         j         _        Y nw xY wt           j                  S )zsend a request for kernel_infoz'Waiting for pending kernel_info requestc                R                         |                                           S r   )_finish_kernel_inforesult)r'   r3   s    r(   <lambda>zDZMQChannelsWebsocketConnection.request_kernel_info.<locals>.<lambda>R  s    t/G/G

/S/S r4   zRequesting kernel info from %sNr   )rW   r7   ra   rt   ru   r   AttributeErrorrv   kernel_info_channelr   r   r   _handle_kernel_info_replyrT   r   r)   )r3   r   s   ` r(   r   z2ZMQChannelsWebsocketConnection.request_kernel_info?  s+   	U(<F ;;== JHIII$$%S%S%S%STTTT  
	O 
	O 
	OHNN;T^LLL '/+/+D+R+RSWSa+b+b(+777$,,T-KLLLLd68MNNN6:6ND333
	O d6777s   A B.DDc                   | j                             |          \  }}	 | j                             |          }|d         }| j                            d|           |d         dk    sd|vr| j                            d|           i }|                     |           nG# t          $ r: | j                            dd	           | j        	                    i            Y d
S w xY w| j
        r| j
                                         d
| _
        d
S )zZprocess the kernel_info_reply

        enabling msg spec adaptation, if necessary
        r   zReceived kernel info: %sr   kernel_info_replyr   z/Kernel info request failed, assuming current %szBad kernel_info replyTr   N)rT   r   r   rt   ru   r   r  BaseExceptionr7   rb   r  rk   )r3   rx   identsr   s       r(   r	  z8ZMQChannelsWebsocketConnection._handle_kernel_info_replyU  s-   
 l22377	+,**3//C y>DHNN5t<<<:"5559KSW9W9WPRVWWW$$T****  	 	 	HNN2TNBBB$//333FF	 # 	-$**,,,#'   s   B A C#"C#c           	     |   |                     dt                    }|t          k    r`t          |                    d          d                   | j        _        | j                            d| d| j         dt           d           | j	        
                                s| j	                            |           dS dS )	zFinish handling kernel_info reply

        Set up protocol adaptation, if needed,
        and signal that connection can continue.
        r   .r   zAdapting from protocol version z	 (kernel z) to z
 (client).N)r   client_protocol_versionintsplitrT   adapt_versionrt   r   rv   r7   ra   rb   )r3   r   r   s      r(   r  z2ZMQChannelsWebsocketConnection._finish_kernel_infon  s      88$68OPP666),-=-C-CC-H-H-K)L)LDL&HMM F2B  F  FT^  F  Fby  F  F  F   ',,.. 	6$//55555	6 	6r4   c                d   | j                             |           | j                            d|dz   dd|          }| j        dk    r4t          |d| j        j                  }|                     |d	           dS d|d
<   |                     t          j	        |t                               dS )zWrite a message to stderr.r[   
stderr)textname)r   parentr   rN   Tr   rY   r   N)rt   r   rT   rx   rL   r!   packr1   r   r   r   )r3   error_messager   err_msgr  s        r(   write_stderrz+ZMQChannelsWebsocketConnection.write_stderr}  s    ''',""*T18DD  # 
 

 @@@,Wgt|?PQQGwt44444!(GItz'<HHHIIIIIr4   c           	     X   | j         r|dk    sdS |                     d|d         |          |d<   |d         d         }|dk    rb|                     d|d         |          |d<   |d                             d          dk    r#g | _        d	| _        d	| _        d| _        d| _        |d
vrt          j	                    
                                }t          | j                  d	k    ra| j        d	         }||d	         k    r/| xj        |d         z  c_        | xj        dz  c_        | j        d	= nnt          | j                  d	k    a| xj        dz  c_        |dk    rt          d |D                       nd	}| xj        |z  c_        | j                            || j        z   |f           t          | j                  | j        z  }t          | j                  | j        z  }	| j        d	k    rt|| j        k    ri| j        sad| _        |                     d|d         |          |d<   |                     t%          d| j         d| j         d          |d                    n=| j        r6|d| j        z  k     r(d| _        | j        s| j                            d           | j        d	k    rt|	| j        k    ri| j        sad| _        |                     d|d         |          |d<   |                     t%          d| j         d| j         d          |d                    n=| j        r6|	d| j        z  k     r(d| _        | j        s| j                            d           | j        s| j        r<| xj        dz  c_        | xj        |z  c_        | j                            d           dS dS dS )z$Limit the message rate on a channel.rN   Fr   r   statusr   r^   idler   >   r  	comm_openexecute_inputr   r[   c              3  4   K   | ]}t          |          V  d S r   )r   ).0xs     r(   	<genexpr>z=ZMQChannelsWebsocketConnection._limit_rate.<locals>.<genexpr>  s(      66SVV666666r4   Tr   a                      IOPub message rate exceeded.
                    The Jupyter server will temporarily stop sending output
                    to the client in order to avoid crashing it.
                    To change this limit, set the config variable
                    `--ServerApp.iopub_msg_rate_limit`.

                    Current values:
                    ServerApp.iopub_msg_rate_limit=z< (msgs/sec)
                    ServerApp.rate_limit_window=z (secs)
                    g?ziopub messages resumeda                      IOPub data rate exceeded.
                    The Jupyter server will temporarily stop sending output
                    to the client in order to avoid crashing it.
                    To change this limit, set the config variable
                    `--ServerApp.iopub_data_rate_limit`.

                    Current values:
                    ServerApp.iopub_data_rate_limit=z= (bytes/sec)
                    ServerApp.rate_limit_window=N)
limit_rater   r   rA   _iopub_window_msg_count_iopub_window_byte_count_iopub_msgs_exceeded_iopub_data_exceededr
   r   r   r   sumappendrate_limit_windowfloatiopub_msg_rate_limitr  r   rt   r   iopub_data_rate_limitr   )
r3   rY   rx   r   r   nowqueued
byte_countmsg_rate	data_rates
             r(   r   z*ZMQChannelsWebsocketConnection._limit_rate  sw    	Gw$6$65hHxHHHx=,x!]]9c)nhOOC	N9~!!"344>> 13-/0,01-,1),1)CCC.""''))Cd344q886q9&)##11VAY>1100A5005a88  d344q88 ((A-((:Bh:N:N66X666666TUJ))Z7)) )00#8N2NPZ1[\\\ T9::T=SSHd;<<t?UUI (1,,D<U1U1U0 04D-+/=='_)=x, ,C( %%
 594M
 
 261G
 
 
  O,  " * ?x3AZ;Z/[/[,1)0 ?H$$%=>>> )A--)d>X2X2X0 04D-+/=='_)=x, ,C( %%
 6:5O
 
 261G
 
 
  O,  " * ?yC$B\<\/]/],1)0 ?H$$%=>>> ( D,E ,,1,,--;---11"555t5} DCr4   c                   | j                             dd          }|r(|                                s|                                 | j                            dd|i          }| j        dk    r4t          |d| j        j                  }| 	                    |d           dS d|d<   | 	                    t          j        |t          	                     dS )
zSend a status message.rN   Nr  r^   r   Tr   rY   r   )rX   r   rj   flushrT   rx   rL   r!   r  r1   r   r   r   )r3   r  rN   rx   r  s        r(   _send_status_messagez3ZMQChannelsWebsocketConnection._send_status_message  s    !!'400 	 	 KKMMMlx*;V)DEE@@@,S'4<;LMMGwt44444$C	Ntz#|DDDEEEEEr4   c                p    | j                             d| j                   |                     d           dS )zHandle a kernel restart.zkernel %s restarted
restartingN)rt   r   rv   r:  r2   s    r(   r   z2ZMQChannelsWebsocketConnection.on_kernel_restarted  s7    .???!!,/////r4   c                p    | j                             d| j                   |                     d           dS )z Handle a kernel restart failure.zkernel %s restarted failed!r   N)rt   r   rv   r:  r2   s    r(   r   z0ZMQChannelsWebsocketConnection.on_restart_failed  s5    4dnEEE!!&)))))r4   c                   | j         j        rdS |dk    r|                     d|d         |          |d<   |d         d         dk    r~|                     d|d         |          |d<   d|d         d<   d	|d         d
<   | j        j        g|d         d<   | j        dk    r)| j                            |d                   |d<   dS dS dS dS )zHandle an error message.NrN   r   r   r   r   ExecutionErrorenamezExecution errorevalue	tracebackr   r.   )r   allow_tracebacksr   rW   traceback_replacement_messagerL   rT   r  )r3   rY   rx   r   s       r(   r   z(ZMQChannelsWebsocketConnection._on_error  s    $5 	Fg MM(CM8LLCM8}Z(G33!%y#i.(!S!SI*:Iw'+<Ix(/3/B/`.aI{+#'HHH"&,"3"3C	N"C"CHQKKK 33
 IHr4   )r   r   r   r   )r[   r   r   r   r   r   r   )@__name__
__module____qualname____doc__r   r   r(  r   r1  r2  r/  r   r   r0   propertyr1   r5   __annotations__weakrefWeakSetr6   r   rX   r   r  r   r7   r   r<   r8   r?   r   r   r   r)  r*  r+  r,  r   rA   classmethodrG   rL   r\   r   r   r   r   rk   rD   r   r   r   r   r   r   r	  r  r  r   r:  r   r   r    r4   r(   r+   r+   0   s        //U 
 
  J !5U
 
   "EU
 
   	U3
 
   !!7884 4 X4 9;N::::BQ'/BSBSMSSSS&&&&    tBxxH#..."(000W"##  $# H6***MW_   '"++K!cee"suu4;;4;; -1DHH4444; ; [;   X% % %s& s& s&j  &'* '* '*R: : :x! ! !, , ,\+/ +/ +/ +/Z, , , ,4	 	 	9 9 9 92- - -.8 8 8,( ( (26 6 6J J Jq q qfF F F 0 0 0
* * *
D D D D Dr4   r+   )6rH  
__future__r   r#   r   r   typingr   rK  concurrent.futuresr   textwrapr   jupyter_clientr   r  tornador   r	   tornado.ioloopr
   tornado.websocketr   	traitletsr   r   r   r   r   r   r   r   r   jupyter_client.jsonutilr   ImportErrorr   jupyter_core.utilsr   jupyter_server.transutilsr   	websocketr   abcr   baser   r   r   r    r!   r)   r+   registerrN  r4   r(   <module>r`     sK   / / " " " " " "         % % % % % %       F F F F F F         ! ! ! ! ! ! 2 2 2 2 2 2 S S S S S S S S S S S S S S S S S S S S S SE4444444 E E EDDDDDDDDE , + + + + + + + + + + + . . . . . . - - - - - -               vD vD vD vD vD%B vD vD vDr &  %&D E E E E Es   A! !A/.A/