o
    ,&]i1                     @  s$  U d dl mZ d dlZd dlZd dlZd dlZd dlmZmZ d dl	m
Z
mZmZmZmZmZ d dlmZ d dlmZmZ d dlmZmZmZ eeZded	< d
Zd4ddZd5ddZd6ddZd7ddZ d8ddZ!d4dd Z"d7d!d"Z#d5d#d$Z$d9d&d'Z%d:d*d+Z&d:d,d-Z'd.d/d;d2d3Z(dS )<    )annotationsN)AnyFinal)cli_utilconfigenv_util	file_utilnet_utilsecrets)
get_logger)report_watchdog_availability
watch_file)Serverserver_address_is_unix_socketserver_utilr   _LOGGERi   @serverr   returnNonec                   sb   t d d fdd	}ttj| ttj| tjd
kr(ttj| d S ttj| d S )NzSetting up signal handlersignal_numberintstack_framer   r   r   c                   s       d S N)stop)r   r   r    U/var/www/html/IGF-ODF-V3/venv/lib/python3.10/site-packages/streamlit/web/bootstrap.pysignal_handler(   s   z._set_up_signal_handler.<locals>.signal_handlerwin32)r   r   r   r   r   r   )	r   debugsignalSIGTERMSIGINTsysplatformSIGBREAKSIGQUIT)r   r   r   r   r   _set_up_signal_handler%   s   

r'   main_script_pathstrc                 C  s   t jdtj|  dS )zAdd the script's folder to the sys path.

    Python normally does this automatically, but since we exec the script
    ourselves we need to do it instead.
    r   N)r#   pathinsertosdirname)r(   r   r   r   _fix_sys_path4   s   r.   running_in_event_loopboolc                 C  sp   | rdS t jr	dS zddl}W n
 ty   Y dS w z|  td W dS  ty7   tjddd Y dS w )z=Install uvloop as the default event loop policy if available.Nr   z.uvloop installed as default event loop policy.z7Failed to install uvloop. Falling back to default loop.T)exc_info)	r   
IS_WINDOWSuvloopModuleNotFoundErrorinstallr   r   	Exceptionwarning)r/   r3   r   r   r   _maybe_install_uvloop=   s"   r8   c                  C  sX   t jr(z
ddlm} m} W n
 ty   Y dS w tt | u r*t|  dS dS dS )a/  Set default asyncio policy to be compatible with Tornado 6.

    Tornado 6 (at least) is not compatible with the default
    asyncio implementation on Windows. So here we
    pick the older SelectorEventLoopPolicy when the OS is Windows
    if the known-incompatible default policy is in use.

    This has to happen as early as possible to make it a low priority and
    overridable

    See: https://github.com/tornadoweb/tornado/issues/2608

    FIXME: if/when tornado supports the defaults in asyncio,
    remove and bump tornado requirement for py38
    r   WindowsProactorEventLoopPolicyWindowsSelectorEventLoopPolicyN)	r   r2   asyncior:   r;   ImportErrortypeget_event_loop_policyset_event_loop_policyr9   r   r   r   _fix_tornado_crashT   s   
rA   args	list[str]c                 C  s   ddl }| gt||_dS )ztsys.argv needs to exclude streamlit arguments and parameters
    and be set to what a user's script may expect.
    r   N)r#   listargv)r(   rB   r#   r   r   r   _fix_sys_argvt   s   rF   c                 C  s`   t | j t| j t  zt  W n ty!   t	d Y nw ddd}t
 | d S )Nz Failed to load secrets.toml filer   r   c                  S  s\   t drd S t drt d} nt dr"t rd S t d} nd} tt|  d S )Nserver.headlessbrowser.serverAddressserver.address	localhost)r   
get_optionis_manually_setr   r   open_browserr   get_url)addrr   r   r   maybe_open_browser   s   


z,_on_server_start.<locals>.maybe_open_browserr   r   )"_maybe_print_static_folder_warningr(   
_print_urlis_running_hellor   r
   load_if_toml_existsr6   r   	exceptionr<   get_running_loop	call_soon)r   rP   r   r   r   _on_server_start}   s   


rY   c                   C  s"   dt jvrtdt jd< dS dS )ziSets MAPBOX_API_KEY environment variable needed for PyDeck otherwise it
    will throw an exception.
    MAPBOX_API_KEYzmapbox.tokenN)r,   environr   rK   r   r   r   r   _fix_pydeck_mapbox_api_warning   s   
r\   c                 C  sr   t dr5t| }tj|stjd| ddd dS t	|}|t
kr7t dd tjddd dS dS dS )	z7Prints a warning if the static folder is misconfigured.zserver.enableStaticServingzGWARNING: Static file serving is enabled, but no static folder found at zJ. To disable static file serving, set server.enableStaticServing to false.yellow)fgFzVWARNING: Static folder size is larger than 1GB. Static file serving has been disabled.N)r   rK   r   get_app_static_dirr,   r*   isdirr   print_to_cliget_directory_sizeMAX_APP_STATIC_FOLDER_SIZE
set_option)r(   static_folder_pathstatic_folder_sizer   r   r   rR      s$   




rR   rT   c                 C  s  | rd}nd}g }t drdtt dfg}nMt dr.t s.dtt dfg}n9t r:dt dfg}n-dtdfg}t }|rR|d	t|f t d
rgt	 }|rg|dt|f t
d t
jd| ddd t
d |D ]\}}t
jd| dddd t
j|dd q~t
d | rt
d t
jddd t
jddd t
d t
d t
d t
d d S d S )Nz9Welcome to Streamlit. Check out our demo in your browser.z4You can now view your Streamlit app in your browser.rH   URLrI   zUnix Socketz	Local URLrJ   zNetwork URLrG   zExternal URL z  blueT)r^   boldz: F)nlr^   )rj   z5  Ready to create your own Python apps super quickly?z  Head over to )rk   zhttps://docs.streamlit.ioz  May you create awesome apps!)r   rL   r   rN   rK   r   r	   get_internal_ipappendget_external_ipr   ra   )rT   title_message
named_urlsinternal_ipexternal_ipurl_nameurlr   r   r   rS      sR   








rS   flag_optionsdict[str, Any]c                 C  s$   dd |   D }tjd|d dS )a;  Load config options from config.toml files, then overlay the ones set by
    flag_options.

    The "streamlit run" command supports passing Streamlit's config options
    as flags. This function reads through the config options set via flag,
    massages them, and passes them to get_config_options() so that they
    overwrite config option defaults and those loaded from config.toml files.

    Parameters
    ----------
    flag_options : dict[str, Any]
        A dict of config options where the keys are the CLI flag version of the
        config option names.
    c                 S  s.   i | ]\}}|d ur|dkr| dd|qS )Nr   _.)replace).0namevalr   r   r   
<dictcomp>  s
    z'load_config_options.<locals>.<dictcomp>T)force_reparseoptions_from_flagsN)itemsr   get_config_options)ru   r   r   r   r   load_config_options   s   r   c                   s8   d fdd}t dD ]}tj|rt|| qd S )	N_pathr)   r   r   c                   s   t   d S r   )r   )r   ru   r   r   on_config_changed  s   z3_install_config_watchers.<locals>.on_config_changedzconfig.toml)r   r)   r   r   )r   get_config_filesr,   r*   existsr   )ru   r   filenamer   r   r   _install_config_watchers  s   
r   F)stop_immediately_for_testingis_hellor   c                  s   t |  t  t| | t  t| t| |dfdd d fdd}d}zt  d}W n	 ty:   Y nw |rOt	
d	 tj| d
d}|_dS t| t	
d t|  dS )zuRun a script in a separate thread and start a server for the app.

    This starts a blocking asyncio eventloop.
    r   r   c                     sF      I d H  t  t  rtd     jI d H  d S )Nz'Stopping server immediately for testing)startrY   r'   r   r   r   stoppedr   )r   r   r   r   
run_server8  s   
zrun.<locals>.run_serverc                     s     I d H  d S r   r   r   )r   r   r   mainK  s   zrun.<locals>.mainFTz&Running server in existing event loop.zbootstrap.run_server)r{   z"Starting new event loop for serverNrQ   )r.   rA   rF   r\   r   r   r<   rW   RuntimeErrorr   r   create_task_bootstrap_taskr8   run)r(   r   rB   ru   r   r   r/   taskr   )r   r   r   r   r   "  s,   




r   )r   r   r   r   )r(   r)   r   r   )r/   r0   r   r   rQ   )r(   r)   rB   rC   r   r   )rT   r0   r   r   )ru   rv   r   r   )r(   r)   r   r0   rB   rC   ru   rv   r   r0   r   r   ))
__future__r   r<   r,   r    r#   typingr   r   	streamlitr   r   r   r   r	   r
   streamlit.loggerr   streamlit.watcherr   r   streamlit.web.serverr   r   r   __name__r   __annotations__rc   r'   r.   r8   rA   rF   rY   r\   rR   rS   r   r   r   r   r   r   r   <module>   s2    


	

 
	
"
	

;
