
    (?e+                     :   d Z ddlmZ ddlZddlmZ ddlZddl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n# e$ rZ ed          edZ[ww xY w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 ej         !                    d           G d dej"                              Z# ej"        d           Z$ G d dej%                  Z% G d dej&                  Z' G d dej(        j)                  Z*d Z+ej,         G d de                      Z-dS )z7Displays Agg images in the browser, with interactivity.    )contextmanagerN)BytesIO)Pathz$The WebAgg backend requires Tornado.)_Backend)Gcf   )backend_webagg_core)TimerAsyncioTimerTornadoz3.7c                       e Zd Zd ZdS )ServerThreadc                 p    t           j        j                                                                         d S NtornadoioloopIOLoopinstancestartselfs    Blib/python3.11/site-packages/matplotlib/backends/backend_webagg.pyrunzServerThread.run*   s+    &&((..00000    N)__name__
__module____qualname__r    r   r   r   r   (   s#        1 1 1 1 1r   r   c                  l    t           j        j                                                                        S r   r   r   r   r   <lambda>r    /   s#    7>(113399;; r   )targetc                   8    e Zd Zej        Zeddd            ZdS )FigureManagerWebAggN)blockc                v   t                                            d                    t           j        t           j        t           j                  }t          j        d         r,dd l}|	                    |          st          d|            nt          d|            t                                            d S )Nzhttp://{address}:{port}{prefix})addressportprefixzwebagg.open_in_browserr   zTo view figure, visit )WebAggApplication
initializeformatr&   r'   
url_prefixmplrcParams
webbrowseropenprintr   )clsr$   urlr/   s       r   pyplot_showzFigureManagerWebAgg.pyplot_show5   s    $$&&&/66%-"'$/ 7 1 1
 <01 	2??3'' 64s445550300111!!!!!r   )r   r   r   coreNavigationToolbar2WebAgg_toolbar2_classclassmethodr4   r   r   r   r#   r#   2   sB        3O"& " " " " [" " "r   r#   c                       e Zd ZeZdS )FigureCanvasWebAggN)r   r   r   r#   manager_classr   r   r   r:   r:   H   s        'MMMr   r:   c                   v    e Zd ZdZdZ G d dej        j                  Z G d dej        j                  Z	 G d dej        j                  Z
 G d d	ej        j                  Z G d
 dej        j                  Z G d dej        j                  Zd fd	Zedd            Zed             Z xZS )r)   Fc                       e Zd Zd ZdS )WebAggApplication.FavIconc                     |                      dd           |                     t          t          j                    d                                                     d S )NContent-Typez	image/pngzimages/matplotlib.png)
set_headerwriter   r-   get_data_path
read_bytesr   s    r   getzWebAggApplication.FavIcon.getQ   s^    OONK888JJtC-//35 55?Z\\C C C C Cr   Nr   r   r   rE   r   r   r   FavIconr>   P   s(        	C 	C 	C 	C 	Cr   rG   c                   *     e Zd Zdd fd
Zd Z xZS )"WebAggApplication.SingleFigurePage r,   c                L    || _          t                      j        ||fi | d S r   r,   super__init__r   applicationrequestr,   kwargs	__class__s        r   rO   z+WebAggApplication.SingleFigurePage.__init__W   1    (DOEGG['<<V<<<<<r   c                     t          |          }t          j        |          }d| j        j         | j         d}|                     d| j        ||t          j        j	        |j
                   d S )Nws:///zsingle_figure.html)r(   ws_urifig_id	toolitemscanvas)intr   get_fig_managerrR   hostr,   renderr5   r6   r[   r\   )r   fignummanagerrY   s       r   rE   z&WebAggApplication.SingleFigurePage.get[   sz    [[F)&11GBT\.BBBBFKK$7A~  ' ' ' ' 'r   r   r   r   rO   rE   __classcell__rT   s   @r   SingleFigurePagerI   V   sT        ?A 	= 	= 	= 	= 	= 	= 	=	' 	' 	' 	' 	' 	' 	'r   rf   c                   *     e Zd Zdd fd
Zd Z xZS ) WebAggApplication.AllFiguresPagerJ   rK   c                L    || _          t                      j        ||fi | d S r   rM   rP   s        r   rO   z)WebAggApplication.AllFiguresPage.__init__i   rU   r   c           	          d| j         j         | j         d}|                     d| j        |t	          t
          j                                                  t          j	        j
                   d S )NrW   rX   zall_figures.html)r(   rY   figuresr[   )rR   r_   r,   r`   sortedr   figsitemsr5   r6   r[   )r   rY   s     r   rE   z$WebAggApplication.AllFiguresPage.getm   ss    BT\.BBBBFKK"sx~~//007A  C C C C Cr   rc   re   s   @r   AllFiguresPagerh   h   s[        ?A 	= 	= 	= 	= 	= 	= 	=	C 	C 	C 	C 	C 	C 	Cr   ro   c                       e Zd Zd ZdS )WebAggApplication.MplJsc                     |                      dd           t          j                                        }|                     |           d S )Nr@   zapplication/javascript)rA   r5   r#   get_javascriptrB   )r   
js_contents     r   rE   zWebAggApplication.MplJs.getw   sC    OON,DEEE1@@BBJJJz"""""r   NrF   r   r   r   MplJsrq   v   s#        	# 	# 	# 	# 	#r   ru   c                       e Zd Zd ZdS )WebAggApplication.Downloadc                 `   t          |          }t          j        |          }|                     dt          j                            |d                     t                      }|j        j	        
                    ||           |                     |                                           d S )Nr@   binary)r+   )r]   r   r^   rA   	mimetypes	types_maprE   r   r\   figuresavefigrB   getvalue)r   ra   fmtrb   buffs        r   rE   zWebAggApplication.Download.get   s    [[F)&11GOO	 3 7 7X F FH H H99DN!))$s);;;JJt}}'''''r   NrF   r   r   r   Downloadrw   ~   s#        	( 	( 	( 	( 	(r   r   c                   0    e Zd ZdZd Zd Zd Zd Zd ZdS )WebAggApplication.WebSocketTc                     t          |          | _        t          j        | j                  | _        | j                            |            t          | d          r|                     d           d S d S )Nset_nodelayT)r]   ra   r   r^   rb   add_web_sockethasattrr   )r   ra   s     r   r0   z WebAggApplication.WebSocket.open   so    f++DK.t{;;DLL''---t]++ '  &&&&&' 'r   c                 :    | j                             |            d S r   )rb   remove_web_socketr   s    r   on_closez$WebAggApplication.WebSocket.on_close   s    L**400000r   c                     t          j        |          }|d         dk    r|d         | _        d S t          j        | j                  }||                    |           d S d S )Ntypesupports_binaryvalue)jsonloadsr   r   r^   ra   handle_json)r   messagerb   s      r   
on_messagez&WebAggApplication.WebSocket.on_message   sr    j))G v"333'.w'7$$$-dk:: &''00000 '&r   c                 T    |                      t          j        |                     d S r   )write_messager   dumps)r   contents     r   	send_jsonz%WebAggApplication.WebSocket.send_json   s&    tz'2233333r   c                     | j         r|                     |d           d S d                    |                    d                              dd                    }|                     |           d S )NT)ry   zdata:image/png;base64,{}base64
rJ   )r   r   r+   encodereplace)r   blobdata_uris      r   send_binaryz'WebAggApplication.WebSocket.send_binary   sz    # -""4"555555<<KK))11$;;= =""8,,,,,r   N)	r   r   r   r   r0   r   r   r   r   r   r   r   	WebSocketr      sd        	' 	' 	'	1 	1 	1	1 	1 	1	4 	4 	4	- 	- 	- 	- 	-r   r   rJ   c                 4   |r"|d         dk    r|d         dk    s
J d            t                                          |dz   t          j        j        dt
          j                                        if|dz   t          j        j        dt          t          j
                    d          if|d	z   | j        f|d
z   | j        d|if|dz   | j        d|if|dz   | j        f|dz   | j        f|dz   | j        fgt
          j                                                   d S )Nr   rX   z6url_prefix must start with a "/" and not end with one.z/_static/(.*)pathz/_images/(.*)imagesz/favicon.icoz	/([0-9]+)r,   z/?z
/js/mpl.jsz/([0-9]+)/wsz/([0-9]+)/download.([a-z0-9.]+))template_path)rN   rO   r   webStaticFileHandlerr5   r#   get_static_file_pathr   r-   rC   rG   rf   ro   ru   r   r   )r   r,   rT   s     r   rO   zWebAggApplication.__init__   sl    	Ia=C''JrNc,A,A,AH -B,A,A 	 ...$2GGIIJL
 ...$s022H==>@
 o-t|< l*D,A
+- e#T%8
+- m+TZ8 o-t~> @@ ;@ 2GGIIC 	 !	K !	K !	K !	K !	Kr   Nc                    | j         rd S  | |          }|| _        d }|t          j        d         | _        n|| _        t          j        d         | _         || j        t          j        d                   D ]S}	 |                    || j                   || _         n<# t          $ r }|j        t          j	        k    r Y d }~Ld }~ww xY wt          d          d| _         d S )NrK   c              3      K   t          t          d|                    D ]	}| |z   V  
t          |dz
            D ]"}| t          j        d|z  d|z            z   V  #dS )z
            Generate a list of n random ports near the given port.

            The first 5 ports will be sequential, and the remaining n-5 will be
            randomly selected in the range [port-2*n, port+2*n].
                  N)rangeminrandomrandint)r'   nis      r   random_portsz2WebAggApplication.initialize.<locals>.random_ports   s       3q!99%%  Qh1q5\\ ; ;V^BFAE:::::::; ;r   zwebagg.addresszwebagg.portzwebagg.port_retrieszSThe webagg server could not be started because an available port could not be foundT)initializedr,   r-   r.   r&   r'   listenOSErrorerrno
EADDRINUSE
SystemExit)r2   r,   r'   r&   appr   es          r   r*   zWebAggApplication.initialize   s(   ? 	F cZ(((#
	; 
	; 
	; ?,'78CKK!CK<. L!$.C!DF F 	+ 	+D

4---
      7e... /.... *+ + + s   <B  
C
*CC
c                     dd l }	 |                                 d _        n# t          $ r Y nw xY w j        rd S 	 t          j        j                                         fdt          fd            }d _        t          d           t          j                                          |            5                                   d d d            d S # 1 swxY w Y   d S )Nr   Tc                                                        t          d           t          j                                         d _        d S )NzServer is stoppedF)stopr1   sysstdoutflushstarted)r2   r   s   r   shutdownz)WebAggApplication.start.<locals>.shutdown  s>    KKMMM%&&&JCKKKr   c               3      K   t          j         t           j        fd          } 	 d V  t          j         t           j        |            d S # t          j         t           j        |            w xY w)Nc                 .                                   S r   )add_callback_from_signal)sigframer   r   s     r   r    z?WebAggApplication.start.<locals>.catch_sigint.<locals>.<lambda>%  s    6#B#B8#L#L r   )signalSIGINT)old_handlerr   r   s    r   catch_sigintz-WebAggApplication.start.<locals>.catch_sigint!  sp       -LLLLLN NK:fm[99999fm[9999s   A !A.z"Press Ctrl+C to stop WebAgg server)asyncioget_running_loopr   RuntimeErrorr   r   r   r   r   r1   r   r   r   r   )r2   r   r   r   r   s   `  @@r   r   zWebAggApplication.start  sq   	$$&&& CKK  	 	 	D	
 ; 	F	 &//11	  	  	  	  	  	  
	: 	: 	: 	: 	: 
	: 2333
\^^ 	 	LLNNN	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   % 
229CC"C)rJ   )rJ   NN)r   r   r   r   r   r   r   RequestHandlerrG   rf   ro   ru   r   	websocketWebSocketHandlerr   rO   r8   r*   r   rd   re   s   @r   r)   r)   L   s       KGC C C C C'+, C C C' ' ' ' '7;5 ' ' '$C C C C C3 C C C# # # # #* # # #( ( ( ( (7;- ( ( (%- %- %- %- %-G%6 %- %- %-N&K &K &K &K &K &KP + + + [+Z + + [+ + + + +r   r)   c                 \   dd l }t                                           dd l}	 |                                 nB# t
          $ r5 t                                          st                                           Y nw xY w| j	        }t          t          j                                        d                                          }|j                            |          }|                    t          j        |t          j        j        | j        t          j                                      d          S )Nr   zipython_inline_figure.html)r(   rZ   r[   r\   r'   zutf-8)tornado.templater)   r*   r   r   r   webagg_server_threadis_aliver   numberr   r5   r#   r   	read_texttemplateTemplategenerater,   r6   r[   r\   r'   decode)r|   r   r   ra   tplts         r   ipython_inline_displayr   4  s     """NNN)  """" ) ) )#,,.. 	) &&((() ]F
t'<<>>+- --6Y[[ !!#&&A:: +/9}#  % %
 &,VG__5s   8 <A76A7c                       e Zd ZeZeZdS )_BackendWebAggN)r   r   r   r:   FigureCanvasr#   FigureManagerr   r   r   r   r   K  s        %L'MMMr   r   ).__doc__
contextlibr   r   ior   r   rz   pathlibr   r   r   r   	threadingr   ImportErrorerrr   tornado.webtornado.iolooptornado.websocket
matplotlibr-   matplotlib.backend_basesr   matplotlib._pylab_helpersr   rJ   r	   r5   r
   r   _api
deprecatedThreadr   r   r#   FigureCanvasWebAggCorer:   r   Applicationr)   r   exportr   r   r   r   <module>r      s   = = & % % % % %                    



     HNNNN H H H
,=
>
>CGH                 - - - - - - ) ) ) ) ) ) ) ) ) ) ) )                U1 1 1 1 19# 1 1 1
 (y';;= = = " " " " "$2 " " ",( ( ( ( (4 ( ( (e e e e e/ e e eP5 5 5. 
( ( ( ( (X ( ( ( ( (s   7 AAA