ó
    ÏÐbgø2  ã                   óî  • S r SSKrSSKrSSKrSSKrSSKrSSKrSSKJrJ	r	  SSK
Jr  SSKJr  SSKJr  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJrJr  SSKJrJr  SSKJr  SSKrSSKr\R>                  S:¼  a5  \R@                  S:X  a%  SSK!r!\!RD                  " \!RF                  " 5       5        \RH                  " S5      r%Sr&S r'SS jr( " S S\RR                  5      r* " S S\5      r+ " S S5      r,g)z¢
livereload.server
~~~~~~~~~~~~~~~~~

WSGI app server for livereload.

:copyright: (c) 2013 - 2015 by Hsiaoming Yang
:license: BSD, see LICENSE for more details.
é    N)ÚPopenÚPIPE)ÚWSGIContainer)ÚIOLoop)Úadd_reload_hook)Úweb)Úescape)Úhttputil)ÚLogFormatteré   )ÚLiveReloadHandlerÚLiveReloadJSHandler)ÚForceReloadHandlerÚStaticFileHandler)Úget_watcher_class)é   é   Úwin32Ú
livereloads   </head>c                 ó   ^ ^^• U UU4S jnU$ )z1Helper Function to Add HTTP headers to the serverc                 óB   >• T" U /UQ70 UD6  U R                  TT5        g ©N)Ú
set_header)ÚselfÚargsÚkwargsÚfnÚnameÚvalues      €€€Ú3/usr/lib/python3/dist-packages/livereload/server.pyÚset_default_headersÚ'set_header.<locals>.set_default_headers-   s#   ø€ Ù
ˆ4Ð!�$Ò!˜&Ò!Ø�‰˜˜eÕ$ó    © )r   r   r   r!   s   ``` r    r   r   +   s   ú€ ÷%ð Ðr#   c                 ó„  ^ ^^^^• T(       d  [         R                  mO`[         R                  R                  T5      nU(       a:  [         R                  R	                  U5      (       d  [         R
                  " U5        [        T [        [        45      (       d  T(       d  [        R                  " T 5      m U UUUU4S jnU$ )a  Execute a shell command.

You can add a shell command::

    server.watch(
        'style.less', shell('lessc style.less', output='style.css')
    )

:param cmd: a shell command, string or list
:param output: output stdout to the given file
:param mode: only works with output, mode ``w`` means write,
             mode ``a`` means append
:param cwd: set working directory before command is executed.
:param shell: if true, on Unix the executable argument specifies a
              replacement shell for the default ``/bin/sh``.
c            	      ó  >•  [        T[        [        [        TT	S9n U R                  5       u  p#UR                  5       nUR                  5       nU(       a  [        R	                  U5        U$ [        TT5       nUR                  U5        S S S 5        g ! [         aX  n[        R	                  U5        UR
                  [
        R                  :X  a  [        R	                  STS   5        Us S nA$ S nAff = f! , (       d  f       g = f)N)ÚstdinÚstdoutÚstderrÚcwdÚshellzmaybe you haven't installed %sr   )r   r   ÚOSErrorÚloggerÚerrorÚerrnoÚENOENTÚcommunicateÚdecodeÚopenÚwrite)
ÚpÚer(   r)   ÚfÚcmdr*   ÚmodeÚoutputr+   s
        €€€€€r    Ú	run_shellÚshell.<locals>.run_shellN   sÅ   ø€ ð	Ü�c¤¬d¼4ÀSØ!ñ#ˆAð Ÿ™›‰ˆà—‘“ˆØ—‘“ˆÞÜ�L‰L˜Ô ØˆMÜ�&˜$Ô 1Ø�G‰G�FŒO÷  Ðøô ó 	Ü�L‰L˜ŒOØ�w‰wœ%Ÿ,™,Ó&Ü—‘Ð=¸sÀ1¹vÔFØ�Hûð		ú÷  Õús*   ƒB Á9C9Â
C6ÂAC1Ã+C6Ã1C6Ã9
D)ÚosÚdevnullÚpathÚdirnameÚisdirÚmakedirsÚ
isinstanceÚlistÚtupleÚshlexÚsplit)r8   r:   r9   r*   r+   Úfolderr;   s   `````  r    r+   r+   3   sw   ü€ ö" Ü—‘‰ä—‘—‘ Ó(ˆÞœ"Ÿ'™'Ÿ-™-¨×/Ñ/Ü�KŠK˜Ôä�cœD¤%˜=×)Ñ)¶%Ü�kŠk˜#Óˆ÷ñ ð& Ðr#   c                   ó.   ^ • \ rS rSrU 4S jrS rSrU =r$ )ÚLiveScriptInjectoréd   c                 ó$   >• [         TU ]  U5        g r   )ÚsuperÚ__init__)r   ÚrequestÚ	__class__s     €r    rN   ÚLiveScriptInjector.__init__e   s   ø€ Ü‰Ñ˜Õ!r#   c                 ó  • SUR                  SS5      ;   nU(       aj  [        U;   a`  UR                  [        U R                  [        -   S5      nSU;   a2  [	        US   5      [        U R                  5      -   n[        U5      US'   XU4$ )NÚhtmlúContent-TypeÚ r   úContent-Length)ÚgetÚHEAD_ENDÚreplaceÚscriptÚintÚlenÚstr)r   Ústatus_codeÚheadersÚchunkÚ	finishingÚis_htmlÚlengths          r    Útransform_first_chunkÚ(LiveScriptInjector.transform_first_chunkh   s|   € Ø˜GŸK™K¨¸Ó;Ñ;ˆÞ”x 5Ó(Ø—M‘M¤(¨D¯K©K¼(Ñ,BÀAÓFˆEØ 7Ó*Ü˜WÐ%5Ñ6Ó7¼#¸d¿k¹kÓ:JÑJ�Ü,/°«K�Ð(Ñ)Ø UÐ*Ð*r#   r$   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__rN   rd   Ú__static_attributes__Ú__classcell__)rP   s   @r    rJ   rJ   d   s   ø† õ"÷+ð +r#   rJ   c                   ó$   • \ rS rSrSS jrS rSrg)ÚLiveScriptContainerér   c                 ó   • Xl         X l        g r   )Úwsgi_apprZ   )r   rp   rZ   s      r    rN   ÚLiveScriptContainer.__init__s   s   € Ø ŒØ�r#   c                 óÜ  ^^• 0 m/ mSUU4S jjnU R                  [        U R                   5      R                  U5      U5      n TR                  U5        SR	                  T5      n[        US5      (       a  UR                  5         T(       d  [        S5      eTS   R                  SS5      u  pV[        U5      nTS   nU VV	s1 s H  u  p‰UR                  5       iM     n
nn	[        R                  " U5      n[        U;   a'  UR                  [        U R                  [        -   5      nUS	:w  aB  S
U
;  a  UR!                  S5        SU
;  a%  UR!                  S[#        [%        U5      5      45        SU
;  a  UR!                  S5        [&        R(                  " SXV5      n[&        R*                  " 5       nU H>  u  pÞUR                  5       S:X  a  [#        [%        U5      5      nUR-                  XÞ5        M@     UR.                  R1                  X¼US9  UR.                  R3                  5         U R5                  XQ5        g ! [        US5      (       a  UR                  5         f f = fs  sn	nf )Nc                 ó0   >• U TS'   UTS'   TR                   $ )NÚstatusr_   )Úappend)rt   Úresponse_headersÚexc_infoÚdataÚresponses      €€r    Ústart_responseÚ4LiveScriptContainer.__call__.<locals>.start_response{   s   ø€ Ø#ˆD�‰NØ.ˆD�‰OØ—?‘?Ð"r#   r#   Úclosez$WSGI app did not call start_responsert   Ú r   r_   i0  zcontent-type)rT   z'application/octet-stream; charset=UTF-8zcontent-lengthrV   Úserver)ÚServerÚ
LiveServerzHTTP/1.1)r`   r   )rp   r   ÚenvironÚextendÚjoinÚhasattrr|   Ú	ExceptionrG   r[   Úlowerr	   Úutf8rX   rY   rZ   ru   r]   r\   r
   ÚResponseStartLineÚHTTPHeadersÚaddÚ
connectionÚwrite_headersÚfinishÚ_log)r   rO   rz   Úapp_responseÚbodyr^   Úreasonr_   ÚkÚvÚ
header_setÚ
start_lineÚ
header_objÚkeyr   rx   ry   s                  @@r    Ú__call__ÚLiveScriptContainer.__call__w   s  ù€ ØˆØˆ÷	#ð 	#ð
 —}‘}Ü˜$Ÿ-™-Ó(×0Ñ0°Ó9¸>óKˆð	%Ø�O‰O˜LÔ)Ø—8‘8˜HÓ%ˆDä�| W×-Ñ-Ø×"Ñ"Ô$ÞÜÐBÓCÐCà" 8™n×2Ñ2°3¸Ó:ÑˆÜ˜+Ó&ˆØ�y‘/ˆÙ.5Ô6ªg¡F Q�a—g‘g–i©gˆ
Ñ6Ü�{Š{˜4Ó ˆä�tÓØ—<‘<¤¨$¯+©+¼Ñ*@ÓAˆDà˜#ÓØ ZÓ/Ø—‘ð  ô ð   zÓ1Ø—‘Ð 0´#´c¸$³i³.ÐAÔBà˜:Ó%Ø�N‰NÐ3Ô4ä×/Ò/Ø˜ó
ˆ
ô ×)Ò)Ó+ˆ
Û!‰JˆCØ�y‰y‹{Ð.Ó.ÜœC ›I›�Ø�N‰N˜3Ö&ñ "ð 	×Ñ×(Ñ(¨ÀtÐ(ÑLØ×Ñ×!Ñ!Ô#Ø�	‰	�+Õ'øôI �| W×-Ñ-Ø×"Ñ"Õ$ð .üó 7s   Á"I ÃI(É$I%)rZ   rp   N)rU   )rf   rg   rh   ri   rN   r˜   rj   r$   r#   r    rm   rm   r   s   † ôõ3(r#   rm   c                   ó\   • \ rS rSrSrSS jrS rSS jr  SS jrS r	   SS	 jr
S
 rSrg)r   é­   a‹  Livereload server interface.

Initialize a server and watch file changes::

    server = Server(wsgi_app)
    server.serve()

:param app: a WSGI application instance
:param watcher: A Watcher instance, you don't have to initialize
                it by yourself. Under Linux, you will want to install
                pyinotify and use INotifyWatcher() to avoid wasted
                CPU usage.
Nc                 óp   • S U l         Xl        U(       d  [        5       nU" 5       nX l        [        U l        g r   )ÚrootÚappr   Úwatcherr   ÚSFH)r   rž   rŸ   Úwatcher_clss       r    rN   ÚServer.__init__»   s,   € ØˆŒ	àŒÞÜ+Ó-ˆKÙ!“mˆGØŒÜ$ˆ�r#   c                 ó`   • [        [        R                  X5      [        l        [        U l        g)a¨  Add or override HTTP headers at the at the beginning of the 
   request.

Once you have initialized a server, you can add one or more 
headers before starting the server::

    server.setHeader('Access-Control-Allow-Origin', '*')
    server.setHeader('Access-Control-Allow-Methods', '*')
    server.serve()

:param name: The name of the header field to be defined.
:param value: The value of the header field to be defined.
N)r   r   r!   r    )r   r   r   s      r    Ú	setHeaderÚServer.setHeaderÅ   s%   € ô 1;Ü!×5Ñ5°tó1DÔÔ-ä$ˆ�r#   c                 ó�   • [        U[        5      (       a  Un[        U5      nSU 3Ul        U R                  R                  XX4S9  g)a)  Add the given filepath for watcher list.

Once you have initialized a server, watch file changes before
serve the server::

    server.watch('static/*.stylus', 'make static')
    def alert():
        print('foo')
    server.watch('foo.txt', alert)
    server.serve()

:param filepath: files to be watched, it can be a filepath,
                 a directory, or a glob pattern
:param func: the function to be called, it can be a string of
             shell command, or any callable object without
             parameters
:param delay: Delay sending the reload message. Use 'forever' to
              not send it. This is useful to compile sass files to
              css, but reload on changed css files then only.
:param ignore: A function return True to ignore a certain pattern of
               filepath.
zshell: )ÚignoreN)rC   r]   r+   r   rŸ   Úwatch)r   ÚfilepathÚfuncÚdelayr§   r8   s         r    r¨   ÚServer.watch×   sC   € ô. �dœC× Ñ ØˆCÜ˜“;ˆDØ! # ˜ˆDŒIà�‰×Ñ˜8¨5ÐÒ@r#   c                 óV  ^• U R                   [        l         U[        l        Uc  U R                  (       a  SnS[        4S[        4S[
        4/nSmU(       a  [        R                  " TU-  5      mO[        R                  " TS-  5      mU R                  T5      n " U4S jS[        5      nU(       d+  Xg-   n	[        R                  " U	UU/S	9n
U
R                  XS
9  g [        R                  " UUU/S	9n
U
R                  XS
9  [        R                  " USS9nUR                  X2S
9  g )NTz/livereloadz/forcereloadz/livereload.jszÕ<script type="text/javascript">(function(){var s=document.createElement("script");var port=%s;s.src="//"+window.location.hostname+":"+port+ "/livereload.js?port=" + port;document.head.appendChild(s);})();</script>zJ(window.location.port || (window.location.protocol == 'https:' ? 443: 80))c                   ó   >• \ rS rSr Y rSrg)Ú/Server.application.<locals>.ConfiguredTransformi  r$   N)rf   rg   rh   ri   rZ   rj   )Úlive_scripts   €r    ÚConfiguredTransformr¯     s   ø† Ù ‹Fr#   r±   )ÚhandlersÚdebugÚ
transforms)ÚaddressF)r²   r³   )rŸ   r   Úlive_cssrž   r   r   r	   r‡   Úget_web_handlersrJ   r   ÚApplicationÚlisten)r   ÚportÚhostÚliveportr³   r¶   Úlive_handlersÚweb_handlersr±   r²   rž   Úliver°   s               @r    ÚapplicationÚServer.applicationõ   s(  ø€ à$(§L¡LÔÔ!Ø%-ÔÔ"Ø‰=˜TŸXŸXØˆEð Ô.Ð/ØÔ0Ð1ØÔ 3Ð4ð
ˆðð 	ö Ü Ÿ+š+ k°HÑ&<Ó=‰Kä Ÿ+š+ kð  5Añ  'Aó  BˆKà×,Ñ,¨[Ó9ˆ÷	!Ô"4ô 	!ö Ø$Ñ3ˆHÜ—/’/Ø!ØØ/Ð0ñˆCð
 �J‰J�tˆJÒ*ä—/’/Ø%ØØ/Ð0ñˆCð
 �J‰J�tˆJÑ*Ü—?’?¨MÀÑGˆDØ�K‰K˜ˆKÒ/r#   c                 óÜ   • U R                   (       a,  [        U R                   U5      nS[        R                  SU04/$ SU R                  U R
                  =(       d    SU R                  S.4/$ )Nz.*Úfallbackz/(.*)Ú.)r?   Údefault_filename)rž   rm   r   ÚFallbackHandlerr    r�   rÅ   )r   rZ   rÃ   s      r    r·   ÚServer.get_web_handlers*  sf   € Ø�8�8Ü*¨4¯8©8°VÓ<ˆHØœC×/Ñ/°*¸hÐ1GÐHÐIÐIà�t—x‘xØŸ	™	×( SØ$(×$9Ñ$9ñ"ð ð
ð 	
r#   c                 ó°  ^^^• T=(       d    SmUb  X@l         U R                  5         [        R                  ST ST 35        X l        U R                  TTX%U	S9  U(       a  [        R                  S5        Tb*  UUU4S jn[        R                  " US9R                  5          U R                  R                  R                  S	U45        [        R                  " 5         [        S
 5        [         R"                  " 5       R                  5         [         R$                  " 5       R'                  SS9  g! [(         a    [        R                  S5         gf = f)a£  Start serve the server with the given port.

:param port: serve on this port, default is 5500
:param liveport: live reload on this port
:param host: serve on this hostname, default is 127.0.0.1
:param root: serve static on this root directory
:param debug: set debug mode, which autoreloads the app on code changes
              via Tornado (and causes polling). Defaults to True when
              ``self.app`` is set, otherwise False.
:param open_url_delay: open webbrowser after the delay seconds
:param live_css: whether to use live css or force reload on css.
                 Defaults to True
:param default_filename: launch this file from the selected root on startup
z	127.0.0.1NzServing on http://Ú:)r¼   r³   r¶   z*Use `open_url_delay` instead of `open_url`c                  ój   >• [         R                  " T5        [        R                  " ST  ST 35        g )Nzhttp://rÉ   )ÚtimeÚsleepÚ
webbrowserr3   )r»   Úopen_url_delayrº   s   €€€r    ÚopenerÚServer.serve.<locals>.openerW  s(   ø€ Ü—
’
˜>Ô*Ü—’ '¨$¨¨q°°Ð 7Õ8r#   )ÚtargetÚ__livereload__c                  óH   • [         R                  " 5       R                  5       $ r   )r   ÚinstanceÚstopr$   r#   r    Ú<lambda>ÚServer.serve.<locals>.<lambda>`  s   € ¤F§O¢OÓ$5×$:Ñ$:Ô$<r#   T)Úall_fdszShutting down...)r�   Ú_setup_loggingr-   ÚinforÅ   rÀ   r.   Ú	threadingÚThreadÚstartrŸ   Ú_changesru   r   Ústart_tasksr   r   rÔ   Úcurrentr|   ÚKeyboardInterrupt)r   rº   r¼   r»   r�   r³   Úopen_urlÚrestart_delayrÎ   r¶   rÅ   rÏ   s    ` `    `   r    ÚserveÚServer.serve5  s  ú€ ð" ×"�{ˆØÑØŒIà×ÑÔÜ�‰Ð(¨¨¨a°¨vÐ6Ô7à 0Ôà×ÑØ�$ Àð 	ñ 	Kö Ü�L‰LÐEÔFØÑ%÷9ô ×Ò FÑ+×1Ñ1Ô3ð
	,Ø�L‰L×!Ñ!×(Ñ(Ð*:¸MÐ)JÔKÜ×)Ò)Ô+äÑ<Ô=ä�OŠOÓ×#Ñ#Ô%ä�NŠNÓ×"Ñ"¨4Ð"Ò0øÜ ó 	,Ü�K‰KÐ*Ö+ð	,ús   Â%BD3 Ä3EÅEc                 ó  • [         R                  [        R                  5        [        R                  " 5       nUR                  [        5       5        [         R                  U5        [        R                  " S5      R                  U5        g )NÚtornado)	r-   ÚsetLevelÚloggingÚINFOÚStreamHandlerÚsetFormatterr   Ú
addHandlerÚ	getLogger)r   Úchannels     r    rÙ   ÚServer._setup_loggingh  sY   € Ü�‰œŸ™Ô%ä×'Ò'Ó)ˆØ×Ñœ\›^Ô,Ü×Ñ˜'Ô"ô 	×Ò˜)Ó$×/Ñ/°Õ8r#   )r    rž   rÅ   r�   rŸ   )NN)NNN)NNT)
i|  NNNNFé   NTz
index.html)rf   rg   rh   ri   Ú__doc__rN   r¤   r¨   rÀ   r·   rä   rÙ   rj   r$   r#   r    r   r   ­   sC   † ñô%ò%ô$Að< <@Ø!ô30òj	
ð KOØ>BØ.:ô1,õf9r#   r   )NÚwNF)-rò   r=   rË   rF   ré   rÛ   rÍ   Ú
subprocessr   r   Útornado.wsgir   Útornado.ioloopr   Útornado.autoreloadr   rç   r   r	   r
   Útornado.logr   r²   r   r   r   r   rŸ   r   Úsysr/   Úversion_infoÚplatformÚasyncioÚset_event_loop_policyÚWindowsSelectorEventLoopPolicyrî   r-   rX   r   r+   ÚOutputTransformrJ   rm   r   r$   r#   r    Ú<module>r      sÃ   ðñó 
Û Û Û Û Û ß "å &Ý !Ý .Ý Ý Ý Ý $ß <ß ;Ý &ã 
ã à×Ñ�vÓ #§,¡,°'Ó"9ÛØ×!Ò! '×"HÒ"HÓ"JÔKà	×	Ò	˜<Ó	(€à€òô.ôb+˜×,Ñ,ô +ô8(˜-ô 8(÷vC9ò C9r#   