§
    Ö)ög;˜  ã            	       ód  — d 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mZm	Z	 dZ
	 dZ	 dZ	 dZ	 dZ	 dZ	 d	Z	 d
Z	 dZ	 dZ	 dZ	 dZdZdZi Z	  G d„ de¦  «        Z edefi ¦  «        Z	  G d„ de¦  «        Zej        dk    rd„ Zej        j         e_         ee_        d„ Z d„ Z! G d„ de¦  «        Z"d„ Z#d„ Z$ ej%        d¦  «        Z& ej%        d¦  «        Z' ej%        d ej(        ¦  «        Z)d!„ Z* ej%        d"ej(        ¦  «        Z+d#„ Z,d,d%„Z-d&„ Z.ddd'g g g g d$df	d(„Z/d)„ Z0eZ1	  G d*„ d+e¦  «        Z2dS )-z6
Tasks represent atomic operations such as processes.
é    N)ÚUtilsÚLogsÚErrorsé   é   é   é   é   é	   éÿÿÿÿéþÿÿÿéýÿÿÿéüÿÿÿzÊ
def f(tsk):
	env = tsk.env
	gen = tsk.generator
	bld = gen.bld
	cwdx = tsk.get_cwd()
	p = env.get_flat
	tsk.last_cmd = cmd = ''' %s ''' % s
	return tsk.exec_command(cmd, cwd=cwdx, env=env.env or None)
a�  
def f(tsk):
	env = tsk.env
	gen = tsk.generator
	bld = gen.bld
	cwdx = tsk.get_cwd()
	def to_list(xx):
		if isinstance(xx, str): return [xx]
		return xx
	def merge(lst1, lst2):
		if lst1 and lst2:
			return lst1[:-1] + [lst1[-1] + lst2[0]] + lst2[1:]
		return lst1 + lst2
	lst = []
	%s
	if '' in lst:
		lst = [x for x in lst if x]
	tsk.last_cmd = lst
	return tsk.exec_command(lst, cwd=cwdx, env=env.env or None)
z¾
def f(tsk):
	super(tsk.__class__, tsk).sig_vars()
	env = tsk.env
	gen = tsk.generator
	bld = gen.bld
	cwdx = tsk.get_cwd()
	p = env.get_flat
	buf = []
	%s
	tsk.m.update(repr(buf).encode())
c                   ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )Ústore_task_typezä
	Metaclass: store the task classes into the dict pointed by the
	class attribute 'register' which defaults to :py:const:`waflib.Task.classes`,

	The attribute 'run_str' is compiled into a method 'run' bound to the task class.
	c                 óÊ  •— t          t          | ¦  «                             |||¦  «         | j        }|dk    �r'|dk    �r"t	          | dd ¦  «        r¼t          | j        | j        ¦  «        \  }}t          j	        | j        ¦  «        | _
        | j        | _        d | _        || _        t          t          | j        |z   ¦  «        ¦  «        | _        | j                             ¦   «          | j        rt#          | j        ¦  «        }|r|| _        n8t	          | dd ¦  «        r'd| j        vrt          j	        | j        ¦  «        | _
        | t	          | dt(          ¦  «        |<   d S d S d S )NÚevilÚTaskÚrun_strÚrunÚhcodeÚregister)Úsuperr   Ú__init__Ú__name__ÚgetattrÚcompile_funr   Úshellr   Úh_cmdr   Úorig_run_strr   ÚlistÚsetÚvarsÚsortÚcompile_sig_varsÚsig_varsÚ__dict__Úclasses)ÚclsÚnameÚbasesÚdictÚfÚdvarsÚfunÚ	__class__s          €ú%/git_repos/midimsg-lv2/waflib/Task.pyr   zstore_task_type.__init__h   sE  ø€ Ý�˜ÑÔ×&Ò& t¨U°DÑ9Ô9Ð9Ø	Œ€$à	ˆV‚^�^˜ š™Ýˆc�9˜dÑ#Ô#ð %å˜Sœ[¨#¬)Ñ4Ô4�J€QˆÝ”˜CœKÑ(Ô(€C„IØ”{€CÔà€C„KØ€C„Gå•C˜œ 5Ñ(Ñ)Ô)Ñ*Ô*€C„HØ„H‡M‚M�O„O€OØ
„xð Ý˜CœHÑ%Ô%€SØð Ø€c„løÝ��U˜DÑ!Ô!ð %¨'°S´\Ð*AÐ*Aå”˜CœGÑ$Ô$€C„Ið .1…7ˆ3�
�GÑ$Ô$ TÑ*Ð*Ð*ð+ €^˜˜ó    )r   Ú
__module__Ú__qualname__Ú__doc__r   Ú__classcell__)r0   s   @r1   r   r   a   sB   ø€ € € € € ðð ð1ð 1ð 1ð 1ð 1ð 1ð 1ð 1ð 1r2   r   r   c                   ó4  — e Zd ZdZg Z	 dZ	 dZ	 dZ	 g Z	 g Z		 g Z
	 g Z	 ej        Z	 dZ	 dZ	 dZ	 dZ	 dZd„ Zd„ Zd„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!d„ Z"d„ Z#d„ Z$d„ Z%d„ Z&d„ Z'd„ Z(d„ Z)d„ Z*d„ Z+d„ Z,d„ Z-d „ Z.d!„ Z/d"„ Z0d#Z1	 d$„ Z2d%„ Z3d&„ Z4d#S )'r   a{  
	Task objects represents actions to perform such as commands to execute by calling the `run` method.

	Detecting when to execute a task occurs in the method :py:meth:`waflib.Task.Task.runnable_status`.

	Detecting which tasks to execute is performed through a hash value returned by
	:py:meth:`waflib.Task.Task.signature`. The task signature is persistent from build to build.
	FÚGREENr   )ÚhasrunÚ	generatorÚenvÚinputsÚoutputsÚ	dep_nodesÚ	run_afterc                 óÜ   — t           | _        	 |d         | _        n# t          $ r
 | | _        Y nw xY w|d         | _        	 g | _        	 g | _        	 g | _        	 t          ¦   «         | _	        d S )Nr:   r;   )
ÚNOT_RUNr9   r:   ÚKeyErrorr;   r<   r=   r>   r"   r?   )ÚselfÚkÚkws      r1   r   zTask.__init__¾   s€   € Ý€$„+ðØ�{”O€4„>€>øÝ	ð ð ð Ø€4„>€>€>ðøøøð �ŒY€$„(ØPà€$„+ØPà€$„,ØTà€$„.Ø-å‘5”5€$„.Ø:Ð:s   Ž œ0¯0c                 óV   — |                       ¦   «         |                      ¦   «         k    S ©N©Úpriority©rC   Úothers     r1   Ú__lt__zTask.__lt__Ô   ó   € Ø	�Š‰Œ˜5Ÿ>š>Ñ+Ô+Ò	+Ð+r2   c                 óV   — |                       ¦   «         |                      ¦   «         k    S rG   rH   rJ   s     r1   Ú__le__zTask.__le__Ö   ó   € Ø	�Š‰Œ˜EŸNšNÑ,Ô,Ò	,Ð,r2   c                 óV   — |                       ¦   «         |                      ¦   «         k     S rG   rH   rJ   s     r1   Ú__gt__zTask.__gt__Ø   rM   r2   c                 óV   — |                       ¦   «         |                      ¦   «         k    S rG   rH   rJ   s     r1   Ú__ge__zTask.__ge__Ú   rP   r2   c                 óH  — | j         j        }t          | dd¦  «        pt          |d|j        ¦  «        }t	          |t
          ¦  «        rYt          j                             |¦  «        r|j	         
                    |¦  «        }n| j         j         
                    |¦  «        }|S )zO
		:return: current working directory
		:rtype: :py:class:`waflib.Node.Node`
		ÚcwdN)r:   Úbldr   ÚbldnodeÚ
isinstanceÚstrÚosÚpathÚisabsÚrootÚ	make_node)rC   rW   Úrets      r1   Úget_cwdzTask.get_cwdÝ   sŽ   € ð
 	ŒÔ€#Ý��e˜TÑ"Ô"ÐF¥g¨c°5¸#¼+Ñ&FÔ&F€#Ý�•SÑÔð -Ý„g‡m‚m�CÑÔð -Ø
Œ(×
Ò
˜SÑ
!Ô
!€C€Cà
Œ.Ô
×
'Ò
'¨Ñ
,Ô
,€CØ	€*r2   c                 ó    — |}d|v r|                      dd¦  «        }d|v r|                      dd¦  «        }||k    sd|v sd|v sd|v rd|z  }|S )	z¬
		Surround a process argument by quotes so that a list of arguments can be written to a file

		:param x: flag
		:type x: string
		:return: quoted flag
		:rtype: string
		ú\ú\\ú"z\"ú ú	ú'z"%s")Úreplace)rC   ÚxÚolds      r1   Ú
quote_flagzTask.quote_flagë   sp   € ð 	
€#Ø	ˆQ€Y€YØ‡y‚y��vÑÔ€1ØˆA€X€XØ‡y‚y��eÑÔ€1ØˆA‚X€X�˜��˜T Q˜Y˜Y¨#°¨(¨(Ø��z€1Ø	
€(r2   c                 óN   — | j         | j        z   t          | j        dd¦  «         fS )zw
		Priority of execution; the higher, the earlier

		:return: the priority value
		:rtype: a tuple of numeric values
		Útg_idx_countr   )ÚweightÚ
prio_orderr   r:   ©rC   s    r1   rI   zTask.priorityý   s*   € ð Œ+˜œÑ
'­7°4´>À>ÐSTÑ+UÔ+UÐ)UÐ	VÐVr2   c                 óB   ‡ — |d         gˆ fd„|dd…         D ¦   «         fS )z½
		Splits a list of process commands into the executable part and its list of arguments

		:return: a tuple containing the executable first and then the rest of arguments
		:rtype: tuple
		r   c                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS © )rl   )Ú.0rj   rC   s     €r1   ú
<listcomp>z&Task.split_argfile.<locals>.<listcomp>  s%   ø€ Ð9Ð9Ð9¨A�T—_’_ QÑ'Ô'Ð9Ð9Ð9r2   r   Nrt   )rC   Úcmds   ` r1   Úsplit_argfilezTask.split_argfile  s3   ø€ ð ˆqŒ6ˆ(Ð9Ð9Ð9Ð9°°Q°R°R´Ð9Ñ9Ô9Ð	:Ð:r2   c                 ó  — d|vr|                       ¦   «         |d<   t          | d¦  «        r
| j        |d<   | j        j        r–t          |                     d¦  «        p| j        j        pt          j        ¦  «        x}|d<   t          | j        j        t          ¦  «        r| j        j        n(t          j                             | j        j        ¦  «        |d<   t          | d¦  «        r
| j        |d<   t          | d¦  «        r
| j        |d<   t          |t          ¦  «        �sOt          j        r"t#          t%          |¦  «        ¦  «        dk    �r"nt#          |¦  «        dk    �r|                      |¦  «        \  }}	 t)          j        ¦   «         \  }}t          j        |d	                     |¦  «                             ¦   «         ¦  «         t          j        |¦  «         t2          j        rt3          j        d
||¦  «          | j        j        j        |d|z   gz   fi |¤Ž	 t          j        |¦  «         S # t@          $ r Y S w xY w# 	 t          j        |¦  «         w # t@          $ r Y w w xY wxY w | j        j        j        |fi |¤ŽS )a¶  
		Wrapper for :py:meth:`waflib.Context.Context.exec_command`.
		This version set the current working directory (``build.variant_dir``),
		applies PATH settings (if self.env.PATH is provided), and can run long
		commands through a temporary ``@argfile``.

		:param cmd: process command to execute
		:type cmd: list of string (best) or string (process will use a shell)
		:return: the return code
		:rtype: int

		Optional parameters:

		#. cwd: current working directory (Node or string)
		#. stdout: set to None to prevent waf from capturing the process standard output
		#. stderr: set to None to prevent waf from capturing the process standard error
		#. timeout: timeout value (Python 3)
		rV   Útimeoutr;   ÚPATHÚstdoutÚstderri    i@ z
zargfile: @%r -> %rú@)!ra   Úhasattrrz   r;   r{   r,   Úgetr[   ÚenvironrY   rZ   ÚpathsepÚjoinr|   r}   r   Úis_win32ÚlenÚreprrx   ÚtempfileÚmkstempÚwriteÚencodeÚcloser   ÚverboseÚdebugr:   rW   Úexec_commandÚremoveÚOSError)rC   rw   rE   r;   ÚargsÚfdÚtmps          r1   rŽ   zTask.exec_command  sp  € ð& 
�"ˆˆØ�|Š|‰~Œ~€2€e�9åˆT�9ÑÔð  Ø”<€2€i�=à	„X„]ð eÝ˜"Ÿ&š& ™-œ-ÐE¨4¬8¬<ÐE½2¼:ÑFÔFÐF€3ˆˆE‰Ý",¨T¬X¬]½CÑ"@Ô"@Ðd�””�ÅbÄjÇoÂoÐVZÔV^ÔVcÑFdÔFd€3€v�;åˆT�8ÑÔð Ø”+€2€h�<ÝˆT�8ÑÔð Ø”+€2€h�<õ 
�C�Ñ	Ô	ñ 5½U¼^ð 5¥3¥t¨C¡y¤y¡>¤>°TÒ#9Ñ#9Ð#9ÕQTÐUXÑQYÔQYÐ\bÒQbÑQbØ×!Ò! #Ñ&Ô&�9€3ˆð
ÝÔ Ñ"Ô"�I€RˆÝ„HˆR�—’˜TÑ"Ô"×)Ò)Ñ+Ô+Ñ,Ô,Ð,Ý„HˆR�L„L€LÝ„|ð 1Ý	„ZÐ$ c¨4Ñ0Ô0Ð0Ø*ˆ4Œ>ÔÔ*¨3°#¸±)°Ñ+<ÐCÐCÀÐCÐCð
Ý„Yˆs�^„^€^€^øÝð 
ð 
ð 
à	€Tð
øøøøð
Ý„Yˆs�^„^€^€^øÝð 
ð 
ð 
à	€Tð
øøøøøøð *ˆ$Œ.Ô
Ô
)¨#Ð
4Ð
4°Ð
4Ð
4Ð4sC   Å=B$I È"H7È7
IÉIÉI.É	IÉI.É
I+É(I.É*I+É+I.c                 óž  — 	 | j         j        j        |                      ¦   «         = n# t          $ r Y nw xY w	 |                      ¦   «         }|r|| _        t          | _        nš	 |  	                    ¦   «          t          | _        nx# t          j        $ r Y ngt          $ r' t          j        ¦   «         | _        t"          | _        Y n8w xY w# t          $ r' t          j        ¦   «         | _        t"          | _        Y nw xY w| j        t          k    r?| j        r:	 | j         j        j        |                      ¦   «         = dS # t          $ r Y dS w xY wdS dS )zd
		Runs the task and handles errors

		:return: 0 or None if everything is fine
		:rtype: integer
		N)r:   rW   Ú	task_sigsÚuidrB   r   Úerr_codeÚCRASHEDr9   Úpost_runÚSUCCESSr   ÚWafErrorÚ	ExceptionÚ	tracebackÚ
format_excÚerr_msgÚ	EXCEPTIONÚscanÚimp_sigs©rC   r`   s     r1   ÚprocesszTask.processE  s}  € ðØ„~ÔÔ# D§H¢H¡J¤JÐ/Ð/øÝ	ð ð ð Ø€4ðøøøðØ	�Š‰Œ€3ð
 
ð Ø€D„MÝ€D„K€KðØ	‡]‚]�_„_€_õ €T„[€[øõ Œ?ð 
ð 
ð 
Ø	€TÝð ð ð ÝÔ(Ñ*Ô*€T„\Ý€T„[€[€[ðøøøøõ 
ð ð ð ÝÔ&Ñ(Ô(€4„<Ý€4„;€;€;ðøøøð$ 
„[•GÒÐ ¤	Ðð	ØŒÔÔ# D§H¢H¡J¤JÐ/Ð/Ð/øÝ
ð 	ð 	ð 	Ø€D€Dð	øøøð	 ÐÐÐsG   ‚$' §
4³4¸C Á#B ÂCÂ-CÃCÃ.C9Ã8C9Ä$D: Ä:
EÅEc                 ó„  — | j         j        j        dk    rdS |                      ¦   «         }|r’|j        r|j        }nt
          }| j         j        j        dk    rJt
          j        j        }t
          j        j        }| 	                    |t          j        d||dœ¬¦  «         dS | 	                    |ddddœ¬¦  «         dS dS )z1Writes the execution status on the context loggerr   Nr   Ú )ÚstreamÚ
terminatorÚc1Úc2)Úextra)r¨   r©   rª   )r:   rW   Úprogress_barÚdisplayÚloggerr   ÚcolorsÚ
cursor_offÚ	cursor_onÚinfoÚsysr}   )rC   rW   Úsr®   r©   rª   s         r1   Úlog_displayzTask.log_displayn  sÌ   € à	„^ÔÔ$¨Ò)Ð)Ø	€6à
‡l‚l�n„n€!Øð AØ	„jð ØŒZ€F€Få€Fà
„nÔÔ%¨Ò*Ð*Ý	ŒÔ	€BÝ	ŒÔ	€BØ
‡K‚K�¥C¤J¸RÀrÐRTÐUÐU€KÑVÔVÐVÐVÐVà
‡K‚K� r°¸BÐ?Ð?€KÑ@Ô@Ð@Ð@Ð@ðAð Ar2   c                 óf  ‡— t          j        | j        ¦  «        }t           j        j        }| j        j        j        Šˆfd„}| j        j        j        dk    r/| j        j                              |¦   «         ‰j	        ||¦  «        S | j        j        j        dk    r­t          | j        j        j        ¦  «        }	 d                     d„ | j        D ¦   «         ¦  «        }n# t          $ r d}Y nw xY w	 d                     d„ | j        D ¦   «         ¦  «        }n# t          $ r d}Y nw xY wd‰j	        ›d	 |¦   «         ›d
|›d|›d|›d�S t          | ¦  «        }|sdS ‰j	        }t!          t          |¦  «        ¦  «        }	d|	|	fz  }
|                      ¦   «         }|r|dz  }|
 |¦   «         |||||fz  S )zi
		Returns an execution status for the console, the progress bar, or the IDE output.

		:rtype: string
		c                  óF   •— ‰ j         ‰ j                             ¦   «         z
  S rG   )Ú	processedÚreadyÚqsize)Úmasters   €r1   ÚcurzTask.display.<locals>.cur‹  s   ø€ à
Ô
˜Vœ\×/Ò/Ñ1Ô1Ñ
1Ð1r2   r   r   ú,c                 ó   — g | ]	}|j         ‘Œ
S rt   ©r*   ©ru   Úns     r1   rv   z Task.display.<locals>.<listcomp>•  s   € Ð1Ð1Ð1 �Q”VÐ1Ð1Ð1r2   r¦   c                 ó   — g | ]	}|j         ‘Œ
S rt   r¿   rÀ   s     r1   rv   z Task.display.<locals>.<listcomp>™  s   € Ð2Ð2Ð2 �Q”VÐ2Ð2Ð2r2   z|Total z	|Current z|Inputs z	|Outputs z|Time z|
Nz[%%%dd/%%%dd] %%s%%s%%s%%s
rf   )r   r¯   ÚcolorÚNORMALr:   rW   Úproducerr¬   Úprogress_lineÚtotalrZ   Útimerrƒ   r<   ÚAttributeErrorr=   r…   Úkeyword)rC   Úcol1Úcol2r¼   ÚelaÚinsÚoutsr´   rÇ   rÁ   ÚfsrE   r»   s               @r1   r­   zTask.display�  sû  ø€ õ 
Œ�T”ZÑ	 Ô	 €$Ý	ŒÔ	€$ØŒ>ÔÔ&€&ð2ð 2ð 2ð 2ð 2ð 
„^ÔÔ$¨Ò)Ð)Ø
Œ.Ô
×
*Ò
*¨3¨3©5¬5°&´,ÀÀdÑ
KÔ
KÐKà	„^ÔÔ$¨Ò)Ð)Ý	ˆTŒ^ÔÔ%Ñ	&Ô	&€3ðØ�8Š8Ð1Ð1 T¤[Ð1Ñ1Ô1Ñ2Ô2€C€CøÝ
ð ð ð Ø
€C€C€CðøøøðØ�8Š8Ð2Ð2 T¤\Ð2Ñ2Ô2Ñ3Ô3€D€DøÝ
ð ð ð Ø€D€D€DðøøøøàDJÄLÀLÀLÐRUÐRUÑRWÔRWÐRWÐRWÐY\ÐY\ÐY\Ð^bÐ^bÐ^bÐdgÐdgÐdgÐ
hÐhå	ˆ$�i„i€!Ø	
ð Ø
ˆ$à
Œ,€%Ý	�#ˆe‰*Œ*�o„o€!Ø%¨¨A¨Ñ.€"Ø‡|‚|�~„~€"Øð Øˆ�9€2Ø	ˆsˆs‰uŒu�e˜R  q¨$Ð/Ñ	/Ð/s$   Â:$C ÃC.Ã-C.Ã2$D ÄD&Ä%D&c                 óÀ   — t          | j        ¦  «        t          | j        ¦  «        t          | j        ¦  «        t          | j        ¦  «        | j        j        | j        fS )z–
		Identifies a task type for all the constraints relevant for the scheduler: precedence, file production

		:return: a hash value
		:rtype: string
		)ÚtupleÚbeforeÚafterÚext_inÚext_outr0   r   r   rq   s    r1   Úhash_constraintszTask.hash_constraintsª  sJ   € õ �”Ñ
Ô
�e D¤JÑ/Ô/µ°t´{Ñ1CÔ1CÅUÈ4Ì<ÑEXÔEXÐZ^ÔZhÔZqÐswÔs}Ð	~Ð~r2   c                 ó¨  — t           j        rd| ›dt          | dd¦  «        ›�}nd}t          | j        dd¦  «        }t          | dd¦  «        r| j        S | j        sd	|›d
| ›�S | j        t          k    r'd|›d| j        ›|›�S # t          $ r d|›d|›�cY S w xY w| j        t          k    rd|›|›�S | j        t          k    rd|z  S d|›d| j        ›�S )zU
		Returns an error message to display the build failure reasons

		:rtype: string
		ú: ú
Úlast_cmdr¦   z* (run with -v to display more information)r*   rŸ   Nztask in z# was not executed for some reason: z -> task in z failed with exit status z failedz -> missing files in z/ -> %r canceled because of missing dependencieszinvalid status for task in )r   rŒ   r   r:   rŸ   r9   r˜   r—   rÉ   ÚMISSINGÚCANCELED)rC   Úmsgr*   s      r1   Úformat_errorzTask.format_error³  s<  € õ 
„\ð 6ð 6Ø�t�t�W T¨:°rÑ:Ô:Ð:Ð	;€3€3à	5€3Ý	�” ¨Ñ	,Ô	,€$ÝˆT�9˜dÑ#Ô#ð DØ
Œ,ÐØŒ;ð Dð DØ?C¸t¸tÀTÀTÐ
JÐJØ„{•gÒÐð3Ø<@¸D¸DÀ$Ä-À-ÐQTÐQTÐUÐUøÝ
ð 3ð 3ð 3ð 3Ø(,¨¨¨c¨cÐ2Ð2Ð2Ð2ð3øøøà„{•gÒÐÐØ)-¨¨s¨sÐ
3Ð3Ø„{•hÒÐØ
;¸dÑ
BÐBð ð 26°°°t´{°{Ð
CÐCs   Á4B ÂBÂBc                 ó  ‡— | j         |         Š‰sg S t          |t          ¦  «        r| j         |         }n|}t          ‰t          ¦  «        rˆfd„|D ¦   «         S g }|D ],}|                     ‰¦  «         |                     |¦  «         Œ-|S )a˜  
		Enable scriptlet expressions of the form ${FOO_ST:FOO}
		If the first variable (FOO_ST) is empty, then an empty list is returned

		The results will be slightly different if FOO_ST is a list, for example::

			env.FOO    = ['p1', 'p2']
			env.FOO_ST = '-I%s'
			# ${FOO_ST:FOO} returns
			['-Ip1', '-Ip2']

			env.FOO_ST = ['-a', '-b']
			# ${FOO_ST:FOO} returns
			['-a', '-b', 'p1', '-a', '-b', 'p2']
		c                 ó   •— g | ]}‰|z  ‘ŒS rt   rt   )ru   rj   r“   s     €r1   rv   zTask.colon.<locals>.<listcomp>ç  s   ø€ Ð
Ð
Ð
�qˆ3�‰7Ð
Ð
Ð
r2   )r;   rY   rZ   ÚextendÚappend)rC   Úvar1Úvar2ÚitÚlstÚyr“   s         @r1   Úcolonz
Task.colonÎ  s¦   ø€ ð  	Œ�Œ€#Ø	ð Ø
€9å�•cÑÔð ØŒ�Œ€2€2à€2Ý�•SÑÔð Ø
Ð
Ð
Ð
˜BÐ
Ñ
Ô
Ðà	€3Øð ð €qØ‡J‚Jˆs�O„O€OØ‡J‚Jˆq�M„M€M€MØ
€:r2   c                 óz  — | j         j        }| j        rU|                     d¦  «        s| j        s9| j        d         }|                     |j                             ¦   «         ¦  «        S | j        s| j        s| j         j        S t          | j        ¦  «        dk    r9| j        d         }|                     |j                             ¦   «         ¦  «        S d 	                    d„ | j        D ¦   «         ¦  «        }d 	                    d„ | j        D ¦   «         ¦  «        }| j        rd}nd}| j         j        ›d	|›|›|›�S )
zstring to display to the user©ÚlibÚprogramr   r   rf   c                 óf   — g | ].}|                      |j                             ¦   «         ¦  «        ‘Œ/S rt   ©Ú	path_fromÚctxÚlaunch_node©ru   Úas     r1   rv   z Task.__str__.<locals>.<listcomp>ü  s2   € ÐLÐLÐL¸1�a—k’k !¤%×"3Ò"3Ñ"5Ô"5Ñ6Ô6ÐLÐLÐLr2   c                 óf   — g | ].}|                      |j                             ¦   «         ¦  «        ‘Œ/S rt   rï   ró   s     r1   rv   z Task.__str__.<locals>.<listcomp>ý  s2   € ÐMÐMÐM¸1�a—k’k !¤%×"3Ò"3Ñ"5Ô"5Ñ6Ô6ÐMÐMÐMr2   ú -> r¦   rÙ   )
r0   r   r=   Úendswithr<   rð   rñ   rò   r…   rƒ   )rC   r*   ÚnodeÚsrc_strÚtgt_strÚseps         r1   Ú__str__zTask.__str__ï  s7  € à	ŒÔ	 €$Ø	„\ð 2Ø
‡m‚mÐ&Ñ'Ô'ð 2¨t¬{ð 2ØŒ<˜Œ?€DØ�>Š>˜$œ(×.Ò.Ñ0Ô0Ñ1Ô1Ð1Ø
Œ+ð "˜œð "Ø
Œ.Ô
!Ð!ÝˆŒÑÔ˜ÒÐØ
Œ+�aŒ.€4Ø
�.Š.˜œ×-Ò-Ñ/Ô/Ñ
0Ô
0Ð0à�HŠHÐLÐLÀÄÐLÑLÔLÑMÔM€'Ø�HŠHÐMÐMÀÄÐMÑMÔMÑNÔN€'Ø	„\ð Ø	€3€3à	€3ØœÔ0Ð0Ð0°'°'¸3¸3ÀÀÐ	HÐHr2   c                 óÔ   — | j         j        }|                     d¦  «        rdS t          | j        ¦  «        dk    rt          | j        ¦  «        dk    rdS | j        s| j        rdS dS dS )z4Display keyword used to prettify the console outputsrë   ÚLinkingr   Ú	CompilingÚCreatingÚRunningÚ
Processing)r0   r   r÷   r…   r<   r=   )rC   r*   s     r1   rÊ   zTask.keyword  sw   € à	ŒÔ	 €$Ø	‡]‚]Ð%Ñ&Ô&ð Ø
ˆ)ÝˆŒÑÔ˜ÒÐ�s 4¤<Ñ0Ô0°AÒ5Ð5Ø
ˆ+Ø	Œð Ø
„lð Øˆ:àˆ9Ø	ˆr2   c           	      ó²  — 	 d                      d„ | j        D ¦   «         ¦  «        }d                      d„ | j        D ¦   «         ¦  «        }nX# t          $ rK d                      d„ | j        D ¦   «         ¦  «        }d                      d„ | j        D ¦   «         ¦  «        }Y nw xY wd                      dt	          | ¦  «        z  | j        j        d|d	|d
g¦  «        S )zfor debugging purposesr½   c                 ó   — g | ]	}|j         ‘Œ
S rt   r¿   ©ru   rj   s     r1   rv   z!Task.__repr__.<locals>.<listcomp>  s   € Ð/Ð/Ð/˜a�1”6Ð/Ð/Ð/r2   c                 ó   — g | ]	}|j         ‘Œ
S rt   r¿   r  s     r1   rv   z!Task.__repr__.<locals>.<listcomp>  s   € Ð1Ð1Ð1˜q�A”FÐ1Ð1Ð1r2   c                 ó,   — g | ]}t          |¦  «        ‘ŒS rt   ©rZ   r  s     r1   rv   z!Task.__repr__.<locals>.<listcomp>  s   € Ð/Ð/Ð/˜a•3�q‘6”6Ð/Ð/Ð/r2   c                 ó,   — g | ]}t          |¦  «        ‘ŒS rt   r  r  s     r1   rv   z!Task.__repr__.<locals>.<listcomp>  s   € Ð1Ð1Ð1˜q•C˜‘F”FÐ1Ð1Ð1r2   r¦   z
	{task %r: rf   rö   ú})rƒ   r<   r=   rÉ   Úidr0   r   )rC   rÎ   rÏ   s      r1   Ú__repr__zTask.__repr__  sç   € ð3Ø	�ŠÐ/Ð/ 4¤;Ð/Ñ/Ô/Ñ	0Ô	0€3Ø
�(Š(Ð1Ð1 D¤LÐ1Ñ1Ô1Ñ
2Ô
2€4€4øÝ	ð 3ð 3ð 3Ø	�ŠÐ/Ð/ 4¤;Ð/Ñ/Ô/Ñ	0Ô	0€3Ø
�(Š(Ð1Ð1 D¤LÐ1Ñ1Ô1Ñ
2Ô
2€4€4€4ð3øøøð 
�ŠÐ"¥R¨¡X¤XÑ-¨t¬~Ô/FÈÈSÐRXÐZ^Ð`cÐdÑ	eÔ	eÐes   ‚AA ÁAB ÂB c                 ó  — 	 | j         S # t          $ rw t          j        | j        j        ¦  «        }|j        }| j        | j        z   D ]} || 	                    ¦   «         ¦  «         Œ | 
                    ¦   «         | _         | j         cY S w xY w)a  
		Returns an identifier used to determine if tasks are up-to-date. Since the
		identifier will be stored between executions, it must be:

			- unique for a task: no two tasks return the same value (for a given build context)
			- the same for a given task instance

		By default, the node paths, the class name, and the function are used
		as inputs to compute a hash.

		The pointer to the object (python built-in 'id') will change between build executions,
		and must be avoided in such hashes.

		:return: hash value
		:rtype: string
		)Úuid_rÉ   r   Úmd5r0   r   Úupdater<   r=   ÚabspathÚdigest©rC   ÚmÚuprj   s       r1   r–   zTask.uid  s‘   € ð"Ø
Œ)ÐøÝ	ð ð ð Ý„y�”Ô(Ñ)Ô)€1Ø	Œ€2ØŒK˜$œ,Ñ&ð ð €qØ€B€q‡y‚y�{„{�O„O€O€OØ�xŠx‰zŒz€4„9Ø
Œ)ÐÐÐðøøøs   ‚	 ‰A>B
Â	B
c                 óˆ   — t          |t          ¦  «        r| xj        |z  c_        dS | j                             |¦  «         dS )zj
		Appends the nodes to the *inputs* list

		:param inp: input nodes
		:type inp: node or list of nodes
		N)rY   r!   r<   rã   )rC   Úinps     r1   Ú
set_inputszTask.set_inputs7  sF   € õ �•TÑÔð Ø€;„;�#Ñ€;„;€;€;à„;×Ò�cÑÔÐÐÐr2   c                 óˆ   — t          |t          ¦  «        r| xj        |z  c_        dS | j                             |¦  «         dS )zl
		Appends the nodes to the *outputs* list

		:param out: output nodes
		:type out: node or list of nodes
		N)rY   r!   r=   rã   )rC   Úouts     r1   Úset_outputszTask.set_outputsC  sF   € õ �•TÑÔð Ø€<„<�3Ñ€<„<€<€<à„<×Ò�sÑÔÐÐÐr2   c                 óh   — t          |t          ¦  «        sJ ‚| j                             |¦  «         dS )a  
		Run this task only after the given *task*.

		Calling this method from :py:meth:`waflib.Task.Task.runnable_status` may cause
		build deadlocks; see :py:meth:`waflib.Tools.fc.fc.runnable_status` for details.

		:param task: task
		:type task: :py:class:`waflib.Task.Task`
		N)rY   r   r?   Úadd)rC   Útasks     r1   Úset_run_afterzTask.set_run_afterO  s6   € õ 
�D�$Ñ	Ô	ÐÐÐØ„.×Ò�TÑÔÐÐÐr2   c                 óŽ  — 	 | j         S # t          $ r Y nw xY wt          j        | j        ¦  «        | _        |                      ¦   «          |                      ¦   «          | j        r?	 |  	                    ¦   «          n)# t          j        $ r |                      ¦   «         cY S w xY w| j                             ¦   «         x}| _         |S )a�  
		Task signatures are stored between build executions, they are use to track the changes
		made to the input nodes (not to the outputs!). The signature hashes data from various sources:

		* explicit dependencies: files listed in the inputs (list of node objects) :py:meth:`waflib.Task.Task.sig_explicit_deps`
		* implicit dependencies: list of nodes returned by scanner methods (when present) :py:meth:`waflib.Task.Task.sig_implicit_deps`
		* hashed data: variables/values read from task.vars/task.env :py:meth:`waflib.Task.Task.sig_vars`

		If the signature is expected to give a different result, clear the cache kept in ``self.cache_sig``::

			from waflib import Task
			class cls(Task.Task):
				def signature(self):
					sig = super(Task.Task, self).signature()
					delattr(self, 'cache_sig')
					return super(Task.Task, self).signature()

		:return: the signature value
		:rtype: string or bytes
		)Ú	cache_sigrÉ   r   r  r   r  Úsig_explicit_depsr&   r¡   Úsig_implicit_depsr   Ú
TaskRescanÚ	signaturer  r£   s     r1   r%  zTask.signature\  sÞ   € ð*Ø
Œ.ÐøÝ	ð ð ð Ø€4ðøøøõ Œ9�T”ZÑ Ô €$„&ð ×ÒÑÔÐð ‡-‚-�/„/€/ð 
„Yð ðØ×ÒÑÔÐÐøÝ
Ô
ð ð ð Ø�>Š>ÑÔÐÐÐðøøøð œŸš™œÐ(€#ˆŒØ	€*s   ‚	 ‰
•Á'A< Á<#B"Â!B"c                 óH  — | j         j        }|j        dk     rt          S | j        D ]+}|j        s	t          c S |j        t          k     r	t          c S Œ,	 |  	                    ¦   «         }n# t          j        $ r
 t          cY S w xY w|                      ¦   «         }	 |j        |         }n,# t          $ r t          j        d| ¦  «         t"          cY S w xY w||k    rt          j        d| ¦  «         t"          S | j        D ]’}|j                             |¦  «        }|st          j        d| ¦  «         t"          c S ||k    rt          j        d| ¦  «         t"          c S |                     ¦   «         st          j        d| ¦  «         t"          c S Œ“| j        rt"          pt          S )zÓ
		Returns the Task status

		:return: a task state in :py:const:`waflib.Task.RUN_ME`,
			:py:const:`waflib.Task.SKIP_ME`, :py:const:`waflib.Task.CANCEL_ME` or :py:const:`waflib.Task.ASK_LATER`.
		:rtype: int
		r   zHtask: task %r must run: it was never run before or the task code changedz2task: task %r must run: the task signature changedz7task: task %r must run: an output node has no signaturezCtask: task %r must run: an output node was produced by another taskz5task: task %r must run: an output node does not exist)r:   rW   Ú
is_installÚSKIP_MEr?   r9   Ú	ASK_LATERÚSKIPPEDÚ	CANCEL_MEr%  r   ÚTaskNotReadyr–   r•   rB   r   r�   ÚRUN_MEr=   Ú	node_sigsr€   ÚexistsÚ
always_run)rC   rW   ÚtÚnew_sigÚkeyÚprev_sigrø   Úsigs           r1   Úrunnable_statuszTask.runnable_statusˆ  sÛ  € ð 	ŒÔ€#Ø„^�aÒÐÝ
€>àŒ>ð ð €aØ
Œ(ð ÝÐÐÐØ	Œ•7ÒÐåÐÐÐð 	ð
Ø�^Š^ÑÔ€7€7øÝ	Ô	ð ð ð Ý
ÐÐÐðøøøð 	�Š‰
Œ
€#ðØŒm˜CÔ €8€8øÝ	ð ð ð Ý„:ÐXÐZ^Ñ_Ô_Ð_Ý
€=€=€=ðøøøð �ÒÐÝ„:ÐBÀDÑIÔIÐIÝ
€=ð Œlð 
ð 
€dØ	Œ×	Ò	˜4Ñ	 Ô	 €3Ø
ð Ý„JÐHÈ$ÑOÔOÐOÝ€M€M€MØ	ˆS‚j€jÝ„JÐTÐVZÑ[Ô[Ð[Ý€M€M€MØ
�+Š+‰-Œ-ð Ý„JÐFÈÑMÔMÐMÝ€M€M€Mðð Œ/Ð
$�fÐ	0­Ð0s$   ÁA( Á(BÂ BÂB' Â'&CÃCc                 óª  — | j         j        }| j        D ]s}|                     ¦   «         sAt          | _        d|                     ¦   «         z  | _        t          j	        | j        ¦  «        ‚|  
                    ¦   «         |j        |<   Œt|                      ¦   «         |j        |  
                    ¦   «         <   | j        s	 | `dS # t           $ r Y dS w xY wdS )z’
		Called after successful execution to record that the task has run by
		updating the entry in :py:attr:`waflib.Build.BuildContext.task_sigs`.
		z-> missing file: %rN)r:   rW   r=   r/  rÜ   r9   r  rŸ   r   r›   r–   r.  r%  r•   Úkeep_last_cmdrÛ   rÉ   )rC   rW   rø   s      r1   r™   zTask.post_run¼  sÖ   € ð
 	ŒÔ€#ØŒlð $ð $€dØ
�+Š+‰-Œ-ð (Ý€D„KØ(¨4¯<ª<©>¬>Ñ9€D„LÝ
Œ/˜$œ,Ñ
'Ô
'Ð'ØŸš™œ€3„=�ÑÐØ"ŸnšnÑ.Ô.€#„-�—’‘
”
ÑØ	Ô	ð 	ð	ØˆˆˆøÝ
ð 	ð 	ð 	Ø€D€Dð	øøøð	ð 	s   Â>C Ã
CÃCc                 ó¬  — | j         j        }| j        j        }| j        | j        z   D ]} ||                     ¦   «         ¦  «         Œ |j        rƒ|j        }| j        | j        z   D ]n}	 ||         }n# t          $ r Y Œw xY w|D ]M}	 |                     ¦   «         }n*# t          $ r t          |d¦  «        r
 |¦   «         }Y nw xY w ||¦  «         ŒNŒmdS dS )z™
		Used by :py:meth:`waflib.Task.Task.signature`; it hashes :py:attr:`waflib.Task.Task.inputs`
		and :py:attr:`waflib.Task.Task.dep_nodes` signatures.
		Ú__call__N)r:   rW   r  r  r<   r>   Úget_bld_sigÚdeps_manr=   rB   rÉ   r   )rC   rW   Úupdrj   Úadditional_depsÚdÚvs          r1   r"  zTask.sig_explicit_depsÏ  s1  € ð
 	ŒÔ€#ØŒŒ€#ð Œ;˜œÑ'ð ð €aØ€3€q‡}‚}�„ÑÔÐÐð 	„\ð Ø”\€?ØŒK˜$œ,Ñ&ð ð €qðØ	˜Ô	€Q€QøÝð ð ð Ø€Xðøøøð ð ð ˆðØ
�-Š-‰/Œ/€a€aøÝð ð ð Ý	��JÑ	Ô	ð Øˆ1‰3Œ3€qøøðøøøð 	€Sˆ�V„V€V€Vððð ðð s$   Á(A1Á1
A>Á=A>ÂBÂ$CÃCc                 ó®   ‡— | j         j        Šˆfd„| j        | j        z   D ¦   «         }| j                             t          j        |¦  «        ¦  «         dS )a  
		Enable rebuilds on input files task signatures. Not used by default.

		Example: hashes of output programs can be unchanged after being re-linked,
		despite the libraries being different. This method can thus prevent stale unit test
		results (waf_unit_test.py).

		Hashing input file timestamps is another possibility for the implementation.
		This may cause unnecessary rebuilds when input tasks are frequently executed.
		Here is an implementation example::

			lst = []
			for node in self.inputs + self.dep_nodes:
				st = os.stat(node.abspath())
				lst.append(st.st_mtime)
				lst.append(st.st_size)
			self.m.update(Utils.h_list(lst))

		The downside of the implementation is that it absolutely requires all build directory
		files to be declared within the current build.
		c                 óh   •— g | ].}|                      ¦   «         ¯‰j        ‰j        |                  ‘Œ/S rt   )Úis_bldr•   r.  )ru   rø   rW   s     €r1   rv   z(Task.sig_deep_inputs.<locals>.<listcomp>  s9   ø€ ÐhÐhÐh°ÐZ^×ZeÒZeÑZgÔZgÐhˆŒ�s”} TÔ*Ô	+ÐhÐhÐhr2   N)r:   rW   r<   r>   r  r  r   Úh_list)rC   rç   rW   s     @r1   Úsig_deep_inputszTask.sig_deep_inputsì  sU   ø€ ð, 	ŒÔ€#ØhÐhÐhÐh¸¼ÀtÄ~Ñ9UÐhÑhÔh€#Ø„&‡-‚-•”˜SÑ!Ô!Ñ"Ô"Ð"Ð"Ð"r2   c                 óŽ   — | j         j                             | j        | j        ¦  «        }| j                             |¦  «         dS )a1  
		Used by :py:meth:`waflib.Task.Task.signature`; it hashes :py:attr:`waflib.Task.Task.env` variables/values
		When overriding this method, and if scriptlet expressions are used, make sure to follow
		the code in :py:meth:`waflib.Task.Task.compile_sig_vars` to enable dependencies on scriptlet results.
		N)r:   rW   Úhash_env_varsr;   r#   r  r  )rC   r5  s     r1   r&   zTask.sig_vars  s<   € ð 	ŒÔ×(Ò(¨¬°4´9Ñ=Ô=€#Ø„&‡-‚-�ÑÔÐÐÐr2   Nc                 óò  — | j         j        }|                      ¦   «         }|j                             |g ¦  «        }|rÓ	 ||                      ¦   «         k    r|S n›# t          j        $ r ‚ t          $ r |j	                             |                      ¦   «         g ¦  «        D ]N}| 
                    ¦   «         s8|                     ¦   «         s$	 |j        j        |j        = Œ># t          $ r Y ŒJw xY wŒOY nw xY w|j        |= t          j        d¦  «        ‚|                      ¦   «         \  |j	        |<   |j        |<   t&          j        r-t'          j        d| |j	        |         |j        |         ¦  «         	 |                      ¦   «         |j        |<   dS # t          $ r\ |j	                             |                      ¦   «         g ¦  «        D ],}|                     ¦   «         st'          j        d|| ¦  «         Œ-‚ w xY w)a¥  
		Used by :py:meth:`waflib.Task.Task.signature`; it hashes node signatures
		obtained by scanning for dependencies (:py:meth:`waflib.Task.Task.scan`).

		The exception :py:class:`waflib.Errors.TaskRescan` is thrown
		when a file has changed. In this case, the method :py:meth:`waflib.Task.Task.signature` is called
		once again, and return here to call :py:meth:`waflib.Task.Task.scan` and searching for dependencies.
		Úrescanz(deps: scanner for %s: %r; unresolved: %rzPDependency %r for %r is missing: check the task declaration and the build order!N)r:   rW   r–   r¢   r€   Úcompute_sig_implicit_depsr   r,  ÚEnvironmentErrorÚ	node_depsrC  r/  ÚparentÚchildrenr*   rB   r$  r¡   Úraw_depsr   rŒ   r�   Úwarn)rC   rW   r3  Úprevrj   rD   s         r1   r#  zTask.sig_implicit_deps!  s*  € ð 	ŒÔ€#ð 	�Š‰
Œ
€#Ø	Œ×	Ò	˜#˜rÑ	"Ô	"€$ð 
ð %ðØˆt×-Ò-Ñ/Ô/Ò/Ð/Ø€[ð 0øå
Ô
ð 
ð 
ð 
Ø	Ý
ð 	ð 	ð 	ð Œ]×Ò˜tŸxšx™zœz¨2Ñ.Ô.ð ð ˆØ�HŠH‰JŒJð ˜qŸxšx™zœzð ðØŒ8Ô˜QœVÐ$Ð$øÝð ð ð Ø€tðøøøøð	ð ð		øøøð „|�CÐÝ	Ô	˜8Ñ	$Ô	$Ð$ð -1¯IªI©K¬KÑ)€3„=�Ñ�s”| CÑ(Ý	„\ð gÝ„:Ð8¸$ÀÄÈcÔ@RÐTWÔT`ÐadÔTeÑfÔfÐfð	Ø×5Ò5Ñ7Ô7€3„<�ÑÐÐøÝ	ð 	ð 	ð 	ØŒM×Ò˜dŸhšh™jœj¨"Ñ-Ô-ð lð l€qØ�8Š8‰:Œ:ð lÝ	„YÐaÐcdÐfjÑkÔkÐkøØð		øøøsC   ¿A ÁA0C2ÃCÃC2Ã
C+Ã(C2Ã*C+Ã+C2Ã1C2Å2F ÆA&G6c                 ó"  — | j         j        }|                      ¦   «          | j        j        j                             |                      ¦   «         g ¦  «        D ]} ||                     ¦   «         ¦  «         Œ | j          	                    ¦   «         S )zé
		Used by :py:meth:`waflib.Task.Task.sig_implicit_deps` for computing the actual hash of the
		:py:class:`waflib.Node.Node` returned by the scanner.

		:return: a hash value for the implicit dependencies
		:rtype: string or bytes
		)
r  r  Úare_implicit_nodes_readyr:   rW   rL  r€   r–   r;  r  )rC   r=  rD   s      r1   rJ  zTask.compute_sig_implicit_depsR  s{   € ð 	ŒŒ€#Ø×ÒÑ!Ô!Ð!ð
 Œ>ÔÔ'×+Ò+¨D¯HªH©J¬J¸Ñ;Ô;ð ð €aØ€3€q‡}‚}�„ÑÔÐÐØ	Œ�Š‰ŒÐr2   c                 óì  — | j         j        }	 |j        }n# t          $ r i x|_        }Y nw xY w	 ||j                 }n5# t
          $ r( i x}||j        <   |j        D ]}|j        D ]}|||<   ŒŒY nw xY wd}|j         	                    |  
                    ¦   «         g ¦  «        D ](}||v r"| j                             ||         ¦  «         d}Œ)|r%| j        D ]}|j        st          j        d¦  «        ‚ŒdS dS )zÒ
		For each node returned by the scanner, see if there is a task that creates it,
		and infer the build order

		This has a low performance impact on null builds (1.86s->1.66s) thanks to caching (28s->1.86s)
		FTz	not readyN)r:   rW   Údct_implicit_nodesrÉ   Úcurrent_grouprB   Ú	cur_tasksr=   rL  r€   r–   r?   r  r9   r   r,  )rC   rW   ÚcacheÚdctÚtskrj   Úmodifieds          r1   rS  zTask.are_implicit_nodes_readyd  sl  € ð 	ŒÔ€#ð'ØÔ!€5€5øÝ	ð 'ð 'ð 'Ø$&Ð&€3Ô˜E˜E˜Eð'øøøðØ	ˆsÔ Ô	!€3€3øÝ	ð ð ð Ø$&Ð&€3ˆˆsÔ Ñ	!ØŒmð ð €sØŒ[ð ð ˆØ€Sˆ�V€Vððð ðøøøð €(ØŒ=×Ò˜TŸXšX™ZœZ¨Ñ,Ô,ð ð €aØˆ3€h€hØ„N×Ò�s˜1”vÑÔÐØ€Høàð ,ØŒnð ,ð ,€sØŒ:ð ,åÔ˜{Ñ+Ô+Ð+ð,ð,ð ,ð,ð ,s   Ž –,«,°> ¾/A0Á/A0)5r   r3   r4   r5   r#   r0  r   rÃ   rÕ   rÖ   rÓ   rÔ   r   ÚSIG_NILr   r8  ro   Útree_weightrp   Ú	__slots__r   rL   rO   rR   rT   ra   rl   rI   rx   rŽ   r¤   rµ   r­   r×   rß   ré   rü   rÊ   r  r–   r  r  r  r%  r6  r™   r"  rE  r&   r¡   r#  rJ  rS  rt   r2   r1   r   r   †   s¦  € € € € € ðð ð 	€Øxà€ØVà	€Ø;à	€ØLà
€Ø>à€ØAà
€ØIà	€ØHà	Œ€ØJà€ðð €ðMð €ðð €ðð [€ð;ð ;ð ;ð,,ð ,ð ,ð-ð -ð -ð,ð ,ð ,ð-ð -ð -ðð ð ðð ð ð$Wð Wð Wð;ð ;ð ;ð45ð 45ð 45ðl'	ð '	ð '	ðRAð Að Að&'0ð '0ð '0ðRð ð ðDð Dð Dð6ð ð ðBIð Ið Ið*ð ð ðfð fð fðð ð ð6
ð 
ð 
ð
ð 
ð 
ðð ð ð*ð *ð *ðX21ð 21ð 21ðh	ð 	ð 	ð&ð ð ð:#ð #ð #ð4ð ð ð 	€ðð"/	ð /	ð /	ðbð ð ð$ ,ð  ,ð  ,ð  ,ð  ,r2   r   i   c                 ój  — 	 | j         S # t          $ rŸ t          j        | j        j                             dd¦  «        ¦  «        }|j        }| j        | j	        z   D ]3} || 
                    ¦   «                              dd¦  «        ¦  «         Œ4|                     ¦   «         | _         | j         cY S w xY w)Nzlatin-1Úxmlcharrefreplace)r  rÉ   r   r  r0   r   rŠ   r  r<   r=   r  r  r  s       r1   r–   r–   †  s·   € ðØ
Œ)ÐøÝ	ð ð ð Ý„y�”Ô(×/Ò/°	Ð;NÑOÔOÑPÔP€1Ø	Œ€2ØŒK˜$œ,Ñ&ð ;ð ;€qØ€B€q‡y‚y�{„{×Ò˜)Ð%8Ñ9Ô9Ñ:Ô:Ð:Ð:Ø�xŠx‰zŒz€4„9Ø
Œ)ÐÐÐðøøøs   ‚	 ‰B&B2Â1B2c                 óæ   — t           j        } ||j        ¦  «        D ]}| || j        ¦  «        v r dS Œ| j        j         ||j        ¦  «        v rdS |j        j         || j        ¦  «        v rdS dS )aC  
	Returns a non-zero value if task t1 is to be executed before task t2::

		t1.ext_out = '.h'
		t2.ext_in = '.h'
		t2.after = ['t1']
		t1.before = ['t2']
		waflib.Task.is_before(t1, t2) # True

	:param t1: Task object
	:type t1: :py:class:`waflib.Task.Task`
	:param t2: Task object
	:type t2: :py:class:`waflib.Task.Task`
	r   r   )r   Úto_listrÕ   rÖ   r0   r   rÔ   rÓ   )Út1Út2rb  rD   s       r1   Ú	is_beforere  “  s’   € õ Œ=€Ø
ˆ'�"”)Ñ
Ô
ð ð €QØˆ'ˆ'�"”*Ñ
Ô
ÐÐØ
ˆ!ˆ!ð ð „LÔ˜W˜W R¤XÑ.Ô.Ð.Ð.Ø	
ˆà„LÔ˜W˜W R¤YÑ/Ô/Ð/Ð/Ø	
ˆà	ˆr2   c                 ó>  — t          j        t          ¦  «        }t          j        t          ¦  «        }| D ]q}|j        D ]}||                              |¦  «         Œ|j        D ]}||                              |¦  «         Œ|j        D ]}||                              |¦  «         ŒŒrt          |                     ¦   «         ¦  «                             |                     ¦   «         ¦  «        }|D ]-}||         D ]"}|j	         
                    ||         ¦  «         Œ#Œ.dS )z¢
	Updates the ``run_after`` attribute of all tasks based on the task inputs and outputs

	:param tasks: tasks
	:type tasks: list of :py:class:`waflib.Task.Task`
	N)r   Údefaultdictr"   r<   r  r>   r=   ÚkeysÚintersectionr?   r  )ÚtasksrÎ   rÏ   rj   rô   ÚlinksrD   s          r1   Úset_file_constraintsrl  ¯  s#  € õ Ô�ÑÔ€ÝÔ�#ÑÔ€Ø
ð ð €QØŒ8ð ð €aØ€q„6‡:‚:ˆa�=„=€=€=ØŒ;ð ð €aØ€q„6‡:‚:ˆa�=„=€=€=ØŒ9ð ð €aØˆ„7‡;‚;ˆq�>„>€>€>ðõ 
ˆS�XŠX‰ZŒZ‰Œ×	%Ò	% d§i¢i¡k¤kÑ	2Ô	2€Ø
ð ð €QØˆqŒ6ð ð €aØ„;×Ò�d˜1”gÑÔÐÐððð r2   c                   ó6   — e Zd ZdZd„ Zd„ Z eed¦  «        ZdS )Ú	TaskGroupz…
	Wrap nxm task order constraints into a single object
	to prevent the creation of large list/set objects

	This is an optimization
	c                 ó0   — || _         || _        d| _        d S )NF)rQ  ÚnextÚdone)rC   rQ  rp  s      r1   r   zTaskGroup.__init__Í  s   € Ø€$„)Ø€$„)Ø€$„)€)€)r2   c                 óD   — | j         D ]}|j        s	t          c S Œt          S rG   )rQ  r9   rA   rš   )rC   rD   s     r1   Ú
get_hasrunzTaskGroup.get_hasrunÒ  s0   € ØŒ9ð ð €aØ
Œ(ð Ý€N€N€Nðå	€.r2   N)r   r3   r4   r5   r   rs  Úpropertyr9   rt   r2   r1   rn  rn  Æ  sI   € € € € € ðð ðð ð ð
ð ð ð ˆ(�:˜tÑ
$Ô
$€€€r2   rn  c                 óP  — t          j        t          ¦  «        }| D ]1}|                     ¦   «         }||                              |¦  «         Œ2t          |                     ¦   «         ¦  «        }t          |¦  «        }t          |¦  «        D �]}|||                  d         }t          |dz   |¦  «        D ]ì}|||                  d         }	t          ||	¦  «        r|}
|}nt          |	|¦  «        r|}
|}nŒA|||
                  }
|||                  }t          |
¦  «        dk     st          |¦  «        dk     r |D ]}|j	         
                    |
¦  «         ŒŒ£t          t          |
¦  «        t          |¦  «        ¦  «        }|D ]}|j	                             |¦  «         ŒŒí�ŒdS )z±
	Updates the ``run_after`` attribute of all tasks based on the after/before/ext_out/ext_in attributes

	:param tasks: tasks
	:type tasks: list of :py:class:`waflib.Task.Task`
	r   r   r   N)r   rg  r!   r×   rã   rh  r…   Úrangere  r?   r  rn  r"   r  )rj  Úcstr_groupsrj   Úhrh  ÚmaxiÚirc  Újrd  rô   ÚbÚgroups                r1   Úset_precedence_constraintsr~  Ú  sË  € õ Ô ¥Ñ&Ô&€Ø
ð ð €QØ×ÒÑÔ€!Øˆa„.×Ò˜ÑÔÐÐåˆ[×ÒÑÔÑ Ô €ÝˆD‰	Œ	€õ �‰+Œ+ð ñ €QØ�4˜”7Ô˜AÔ€"Ý��Q‘˜ÑÔð ð €aØ�D˜”GÔ˜QÔ€2õ ��BÑÔð Ø	€AØ	€A€AÝ�"�bÑÔð Ø	€AØ	€A€Aàà�4˜”7Ô€1Ø�4˜”7Ô€1å	ˆ!�f„fˆq‚j€j•C˜‘F”F˜Q’J�JØð ð ˆØ„[×Ò˜ÑÔÐÐðõ •c˜!‘f”f�c !™fœfÑ%Ô%€EØð ð ˆØ„[‡_‚_�UÑÔÐÐðñ+ðð r2   c                 ó6   — i }t          | |¦  «         |d         S )zµ
	Compiles a scriptlet expression into a Python function

	:param c: function to compile
	:type c: string
	:return: the function 'f' declared in the input string
	:rtype: function
	r-   )Úexec)ÚcÚdcs     r1   Úfunexrƒ    s   € ð 	€Ý€aˆ�„€Ø
ˆ3Œ€r2   z"(?P<var>\w+)|(?P<or>\|)|(?P<and>&)z^(SRC|TGT)\W+.*?$zM(?P<backslash>\\)|(?P<dollar>\$\$)|(?P<subst>\$\{(?P<var>\w+)(?P<code>.*?)\})c                 ó„  ‡‡‡— g Šˆfd„}t                                || ¦  «        p| } g Šˆfd„Šˆfd„}g }|j        }‰D �]Ž\  }}|dk    r|r |d|z  ¦  «         Œ |d¦  «         Œ)|dk    r|r |d|z  ¦  «         Œ@ |d	¦  «         ŒL|�r&|                     d
¦  «        r§ ‰|¦  «         |dd…         }|dk    rd}nu|dk    rd}nlt                               |¦  «        rd|dd…         z  }nDt                               |¦  «        rd|dd…         z  }n ‰|¦  «         |dd…         dvrd|z  } |d|›d|›d�¦  «         �Œ|                     d¦  «        r7t                               ||dd…         ¦  «        } |d|›d|›d�¦  «         �ŒW|›|›�}	 ‰|	¦  «          ||	¦  «         �Œu ‰|¦  «          |d|z  ¦  «         �Œ�|rdd                     |¦  «        z  }nd}t          | |fz  }
t          j
        d|
                     ¦   «                              ¦   «         ¦  «         t          |
¦  «        ‰fS ) zH
	Creates a compiled function to execute a process through a sub-shell
	c                 ó¶   •— | j         } |d¦  «        rdS  |d¦  «        rdS  |d¦  «        r+‰                      |d¦  «         |d¦  «        f¦  «         dS d S )	NÚdollarú$Ú	backslashrd   ÚsubstÚvarÚcodez%s)r}  rã   )ÚmatchÚgÚextrs     €r1   Úreplzcompile_fun_shell.<locals>.repl  su   ø€ Ø„k€!Ø€Q€x�[„[ð Ø
ˆ#Ø€qˆ�~„~ð Ø
ˆ&Ø€qˆ�z„zð Ø‡;‚;���%‘”˜!˜!˜F™)œ)Ð$Ñ%Ô%Ð%Ø
ˆ$Ø	ˆr2   c                 ó>   •— | ‰vr‰                      | ¦  «         d S d S rG   ©rã   ©rj   r.   s    €r1   Úadd_dvarz#compile_fun_shell.<locals>.add_dvar%  ó&   ø€ Øˆe€^€^Ø‡<‚<��?„?€?€?€?ð €^r2   c                 óª   •— |                       d¦  «        rdS |                       d¦  «        rdS |                       d¦  «        } ‰|¦  «         d|z  S ©NÚandz and Úorz or rŠ  zenv[%r]©r}  ©r  rj   r“  s     €r1   Úreplcz compile_fun_shell.<locals>.replc)  óW   ø€ à‡W‚WˆU�^„^ð Ø
ˆ'Ø‡w‚wˆt�}„}ð Ø
ˆ&à‡w‚wˆu�~„~€1Ø€8ˆA�;„;€;Ø
�a‰-Ðr2   ÚSRCztsk.inputs%sz1" ".join([a.path_from(cwdx) for a in tsk.inputs])ÚTGTztsk.outputs%sz2" ".join([a.path_from(cwdx) for a in tsk.outputs])ú:r   Nú'[a.path_from(cwdx) for a in tsk.inputs]ú([a.path_from(cwdx) for a in tsk.outputs]ú[tsk.inputs%s]r   ú[tsk.outputs%s]©rZ  ÚgenrW   ú%rz" ".join(tsk.colon(ú, z))ú?zp(z) if (z	) else ""zp('%s')z%% (%s) z,
		r¦   ú
action: %s)Úreg_actÚsubrã   Ú
startswithÚre_novarrŒ  Úre_condrƒ   ÚCOMPILE_TEMPLATE_SHELLr   r�   ÚstripÚ
splitlinesrƒ  )Úliner�  r›  ÚparmÚapprŠ  Úmethr  ÚexprÚcallr�  r“  r.   rŽ  s              @@@r1   Úcompile_fun_shellr¸    s  øøø€ ð 	€ð	ð 	ð 	ð 	ð 	õ 	�Š�D˜$ÑÔÐ' 4€Ø	€ðð ð ð ð ð	ð 	ð 	ð 	ð 	ð 	€Ø„{€Øð &ñ &�[€cˆ4ØˆE‚\€\Ø
ð =Ø€Cˆ˜ÑÑÔÐÐà€CÐ;Ñ<Ô<Ð<Ð<Ø
ˆe‚|€|Ø
ð >Ø€Cˆ˜$ÑÑÔÐÐà€CÐ<Ñ=Ô=Ð=Ð=Øñ Ø
‡o‚o�cÑÔð Ø€HˆS�M„M€MØˆQˆRˆRŒ€AØˆE‚z€zØ	2€Q€QØ	
ˆeŠˆØ	3€Q€QÝ	�Š˜Ñ	Ô	ð Ø	˜A˜a˜b˜bœEÑ	!€Q€QÝ	�Š˜Ñ	Ô	ð Ø	˜Q˜q˜r˜rœUÑ	"€Q€Qà€Xˆa�[„[€[Ø	ˆ"ˆ1ˆ"ŒÐ*Ð*Ð*Ø
�‰(€aØ€C€C¨¨¨¨a¨a¨aÐ0Ñ1Ô1Ð1Ñ1Ø�Š˜ÑÔð å�;Š;�u˜d 1 2 2œhÑ'Ô'€DØ€C€C 3 3 3¨¨¨Ð-Ñ.Ô.Ð.Ñ.à�S˜$˜$Ð€DØ€HˆT�N„N€NØ€Cˆ�I„I€I�Ià€8ˆC�=„=€=Ø€3€y�3�ÑÔÐÑØð Ø	�y—~’~ dÑ+Ô+Ñ	,€$€$à	€$å˜t T˜lÑ*€Ý„ˆL˜!Ÿ'š'™)œ)×.Ò.Ñ0Ô0Ñ1Ô1Ð1Ý	ˆq‰Œ�5ÐÐr2   z[(?P<space>\s+)|(?P<subst>\$\{(?P<var>\w+)(?P<code>.*?)\})|(?P<text>([^$ \t\n\r\f\v]|\$\$)+)c                 óú  ‡‡— g }g Šd}|j         }ˆfd„Šˆfd„}t                               | ¦  «        D �]T}|                     d¦  «        rd}Œ|                     d¦  «        r7 |d|                     d¦  «                             dd¦  «        z  ¦  «         �nÌ|                     d	¦  «        �r¶|                     d
¦  «        }|                     d¦  «        }|dk    r|r |d|z  ¦  «         �nt |d¦  «         �ng|dk    r|r |d|z  ¦  «         �nO |d¦  «         �nB|�r&|                     d¦  «        r¦ ‰|¦  «         |dd…         }|dk    rd}nu|dk    rd}nlt                               |¦  «        rd|dd…         z  }nDt                               |¦  «        rd|dd…         z  }n ‰|¦  «         |dd…         dvrd|z  } |d|›d|›d�¦  «         n„|                     d¦  «        r6t           	                    ||dd…         ¦  «        } |d|›d|›d�¦  «         n9|›|›�}	 ‰|	¦  «          |d|	z  ¦  «         n |d |z  ¦  «          ‰|¦  «         |rd!|d"         ›d|d#         ›d�}
|d#= |
|d#<   d$}�ŒVd%„ |D ¦   «         }t          d&                     |¦  «        z  }t          j        d'|                     ¦   «                              ¦   «         ¦  «         t!          |¦  «        ‰fS )(zH
	Creates a compiled function to execute a process without a sub-shell
	Fc                 ó>   •— | ‰vr‰                      | ¦  «         d S d S rG   r‘  r’  s    €r1   r“  z%compile_fun_noshell.<locals>.add_dvarp  r”  r2   c                 óª   •— |                       d¦  «        rdS |                       d¦  «        rdS |                       d¦  «        } ‰|¦  «         d|z  S r–  r™  rš  s     €r1   r›  z"compile_fun_noshell.<locals>.replct  rœ  r2   ÚspaceÚtextz[%r]z$$r‡  r‰  rŠ  r‹  r�  r¢  r   rž  r£  r¡  rŸ  r   Nr   r¤  r¦  z
tsk.colon(r§  ú)r¨  zto_list(env[z] if (z
) else [])zgen.to_list(%s)zto_list(env[%r])zmerge(r   r   Tc                 ó   — g | ]}d |z  ‘ŒS )zlst.extend(%s)rt   r  s     r1   rv   z'compile_fun_noshell.<locals>.<listcomp>·  s   € Ð*Ð*Ð* Ð˜1ÑÐ*Ð*Ð*r2   ú
	r©  )rã   Úreg_act_noshellÚfinditerr}  ri   r¬  r­  rŒ  r®  r«  ÚCOMPILE_TEMPLATE_NOSHELLrƒ   r   r�   r°  r±  rƒ  )r²  ÚbufÚmerger´  r›  r  rŠ  r‹  r¶  r·  r“   r/   r“  r.   s               @@r1   Úcompile_fun_noshellrÆ  g  s·  øø€ ð 
€Ø	€Ø	€Ø
„z€ðð ð ð ð ð	ð 	ð 	ð 	ð 	õ ×
"Ò
" 4Ñ
(Ô
(ð 6ñ 6€QØ‡W‚WˆWÑÔð 0Ø€5ØØ‡w‚wˆv�„ð -Ø€3€v�—’˜‘”×'Ò'¨¨cÑ2Ô2Ñ2Ñ3Ô3Ð3Ñ3Ø‡w‚wˆwÑÔñ +Ø	
�Š�‰Œ€3Ø
�'Š'�&‰/Œ/€4Ø	ˆU‚l€lØð 4Ø€SÐ	˜DÑ	 Ñ!Ô!Ð!Ñ!à€SÐ	2Ñ3Ô3Ð3Ñ3ØˆuŠˆØð 5Ø€SÐ	˜TÑ	!Ñ"Ô"Ð"Ñ"à€SÐ	3Ñ4Ô4Ð4Ñ4Øñ Ø‡‚�sÑÔð #à€Xˆc�]„]€]Ø	ˆaˆbˆbŒ€QØ	ˆUŠ
ˆ
Ø
3€a€aØ
ˆuŠ*ˆ*Ø
4€a€aÝ
�.Š.˜Ñ
Ô
ð Ø
˜Q˜q˜r˜rœUÑ
"€a€aÝ
�.Š.˜Ñ
Ô
ð Ø
˜a   œeÑ
#€a€aà€hˆq�k„k€kØ	
ˆ2ˆAˆ2ŒÐ+Ð	+Ð	+Ø�!‰8€qØ€S€S    Q Q QÐ	'Ñ(Ô(Ð(Ð(Ø	�Š˜Ñ	Ô	ð #å�KŠK˜˜t A B BœxÑ(Ô(€TØ€S€S¨s¨s¨s°D°D°DÐ	9Ñ:Ô:Ð:Ð:ð �c˜4˜4Ð €TØ€Xˆd�^„^€^Ø€SÐ	˜TÑ	!Ñ"Ô"Ð"Ð"ð €CÐ˜SÑ Ñ!Ô!Ð!Ø€HˆS�M„M€MØ
ð ð Ø œG˜G˜G S¨¤W W WÐ	-€3Ø
ˆ2€wØ€3€r�7Ø
€%�%à*Ð* cÐ*Ñ*Ô*€Ý &§+¢+¨cÑ"2Ô"2Ñ2€Ý„ˆL˜#Ÿ)š)™+œ+×0Ò0Ñ2Ô2Ñ3Ô3Ð3Ý	ˆs‰Œ�UÐÐr2   Fc                 óÞ  ‡— t          | t          ¦  «        rN|                      d¦  «        dk    s2|                      d¦  «        dk    s|                      d¦  «        dk    rd}njg }g Š| D ]Z}t          |t          ¦  «        r.t          ||¦  «        \  }}||z  }‰                     |¦  «         ŒE‰                     |¦  «         Œ[ˆfd„}||fS |rt          | ¦  «        S t          | ¦  «        S )a�  
	Parses a string expression such as '${CC} ${SRC} -o ${TGT}' and returns a pair containing:

	* The function created (compiled) for use as :py:meth:`waflib.Task.Task.run`
	* The list of variables that must cause rebuilds when *env* data is modified

	for example::

		from waflib.Task import compile_fun
		compile_fun('cxx', '${CXX} -o ${TGT[0]} ${SRC} -I ${SRC[0].parent.bldpath()}')

		def build(bld):
			bld(source='wscript', rule='echo "foo\${SRC[0].name}\bar"')

	The env variables (CXX, ..) on the task must not hold dicts so as to preserve a consistent order.
	The reserved keywords ``TGT`` and ``SRC`` represent the task input and output nodes

	ú<r   ú>z&&Tc                 ó4   •— ‰D ]} || ¦  «        }|r|c S Œd S rG   rt   )r  rj   r`   Úfuns_lsts      €r1   Úcomposed_funz!compile_fun.<locals>.composed_funÝ  s:   ø€ Øð ð €qØ
ˆ!ˆD‰'Œ'€CØ
ð Ø€Z€Z€Zðà
ˆ$r2   )rY   rZ   Úfindr   rã   r¸  rÆ  )r²  r   Ú	dvars_lstrj   r/   r.   rÌ  rË  s          @r1   r   r   ¼  s  ø€ õ& ˆt•SÑÔð !Ø	‡Y‚Yˆs�^„^�aÒÐ˜4Ÿ9š9 S™>œ>¨AÒ-Ð-°·²¸4±´À1Ò1DÐ1DØ€5øà€)Ø€(Øð ð €aÝ�•CÑÔð Ý˜Q Ñ&Ô&�J€CˆØ�Ñ€IØ‡O‚O�CÑÔÐÐð ‡O‚O�AÑÔÐÐðð ð ð ð ð 
�yÐ	 Ð Ø	ð #Ý	˜4Ñ	 Ô	 Ð å	˜TÑ	"Ô	"Ð"r2   c                 óÎ   — g }t          | ¦  «        D ]&}|dd…         dv r|                     d|z  ¦  «         Œ'|r*t          t          d                     |¦  «        z  ¦  «        S dS )aÍ  
	This method produces a sig_vars method suitable for subclasses that provide
	scriptlet code in their run_str code.
	If no such method can be created, this method returns None.

	The purpose of the sig_vars method returned is to ensures
	that rebuilds occur whenever the contents of the expression changes.
	This is the case B below::

		import time
		# case A: regular variables
		tg = bld(rule='echo ${FOO}')
		tg.env.FOO = '%s' % time.time()
		# case B
		bld(rule='echo ${gen.foo}', foo='%s' % time.time())

	:param vars: env variables such as CXXFLAGS or gen.foo
	:type vars: list of string
	:return: A sig_vars method relevant for dependencies if adequate, else None
	:rtype: A function, or None in most cases
	Nr   r¤  zbuf.append(%s)rÀ  )Úsortedrã   rƒ  ÚCOMPILE_TEMPLATE_SIG_VARSrƒ   )r#   rÄ  rj   s      r1   r%   r%   é  sx   € ð, 
€Ý
�‰,Œ,ð $ð $€QØ€rˆ€r„UÐ#Ð#Ð#Ø‡:‚:Ð Ñ"Ñ#Ô#Ð#øØð =Ý	Õ(¨6¯;ª;°sÑ+;Ô+;Ñ;Ñ	<Ô	<Ð<Øˆr2   r8   c
                 óº  — |pg || ||	dœ}
t          |t          ¦  «        st          |t          ¦  «        r||
d<   n||
d<    t          t          ¦  «        | t          f|
¦  «        }|t
          | <   |rt          j        |¦  «        |_        |rt          j        |¦  «        |_	        |rt          j        |¦  «        |_
        |rt          j        |¦  «        |_        |S )a»  
	Returns a new task subclass with the function ``run`` compiled from the line given.

	:param func: method run
	:type func: string or function
	:param vars: list of variables to hash
	:type vars: list of string
	:param color: color to use
	:type color: string
	:param shell: when *func* is a string, enable/disable the use of the shell
	:type shell: bool
	:param scan: method scan
	:type scan: function
	:rtype: :py:class:`waflib.Task.Task`
	)r#   rÃ   r*   r   r¡   r   r   )rY   rZ   rÒ   Útyper   r(   r   rb  rÕ   rÖ   rÓ   rÔ   )r*   Úfuncr#   rÃ   rÕ   rÖ   rÓ   rÔ   r   r¡   Úparamsr)   s               r1   Útask_factoryrÖ    së   € ð$ ˆ*�"ØØ
ØØ
ðð €õ ˆt•SÑÔð �Z¨­eÑ4Ô4ð Ø€&ˆÑÐà€&ˆ�-à…t�D�z„z�$�˜ Ñ(Ô(€Ø…ˆ�à
ð %ÝŒ}˜VÑ$Ô$€#„*Øð 'Ý”˜gÑ&Ô&€#„+Ø
ð %ÝŒ}˜VÑ$Ô$€#„*Ø	ð #ÝŒm˜EÑ"Ô"€#„)à€r2   c                 ó   — d„ }|| _         | S )zJ
	Task class decorator to enable rebuilds on input files task signatures
	c                 ón   — t                                | ¦  «         t                                | ¦  «         d S rG   )r   r"  rE  rq   s    r1   r"  z&deep_inputs.<locals>.sig_explicit_deps7  s0   € Ý×Ò˜ÑÔÐÝ×Ò�tÑÔÐÐÐr2   )r"  )r)   r"  s     r1   Údeep_inputsrÙ  3  s    € ðð ð ð +€ÔØ€r2   c                   ó*   — e Zd ZdZd„ Zd„ Zd„ Zd„ ZdS )ÚTaskSemaphorea0  
	Task semaphores provide a simple and efficient way of throttling the amount of
	a particular task to run concurrently. The throttling value is capped
	by the amount of maximum jobs, so for example, a `TaskSemaphore(10)`
	has no effect in a `-j2` build.

	Task semaphores are typically specified on the task class level::

		class compile(waflib.Task.Task):
			semaphore = waflib.Task.TaskSemaphore(2)
			run_str = 'touch ${TGT}'

	Task semaphores are meant to be used by the build scheduler in the main
	thread, so there are no guarantees of thread safety.
	c                 ó`   — || _         t          ¦   «         | _        t          ¦   «         | _        dS )zD
		:param num: maximum value of concurrent tasks
		:type num: int
		N)Únumr"   ÚlockingÚwaiting)rC   rÝ  s     r1   r   zTaskSemaphore.__init__P  s%   € ð
 €$„(Ý‘”€$„,Ý‘”€$„,€,€,r2   c                 ó<   — t          | j        ¦  «        | j        k    S )z?Returns True if this semaphore cannot be acquired by more tasks)r…   rÞ  rÝ  rq   s    r1   Ú	is_lockedzTaskSemaphore.is_lockedY  s   € å	ˆTŒ\Ñ	Ô	˜dœhÒ	&Ð&r2   c                 ó�   — |                       ¦   «         rt          d| j        z  ¦  «        ‚| j                             |¦  «         dS )zÔ
		Mark the semaphore as used by the given task (not re-entrant).

		:param tsk: task object
		:type tsk: :py:class:`waflib.Task.Task`
		:raises: :py:class:`IndexError` in case the resource is already acquired
		zCannot lock more %rN)rá  Ú
IndexErrorrÞ  r  ©rC   rZ  s     r1   ÚacquirezTaskSemaphore.acquire]  sH   € ð 
‡^‚^ÑÔð :Ý	Ð)¨D¬LÑ8Ñ	9Ô	9Ð9Ø„,×Ò�3ÑÔÐÐÐr2   c                 ó:   — | j                              |¦  «         dS )zË
		Mark the semaphore as unused by the given task.

		:param tsk: task object
		:type tsk: :py:class:`waflib.Task.Task`
		:raises: :py:class:`KeyError` in case the resource is not acquired by the task
		N)rÞ  r�   rä  s     r1   ÚreleasezTaskSemaphore.releasei  s    € ð „,×Ò�cÑÔÐÐÐr2   N)r   r3   r4   r5   r   rá  rå  rç  rt   r2   r1   rÛ  rÛ  @  sZ   € € € € € ðð ðð ð ð'ð 'ð 'ð
ð 
ð 
ðð ð ð ð r2   rÛ  )F)3r5   r[   Úrer³   r‡   r�   Úwaflibr   r   r   rA   rÜ   r˜   r    rÝ   r*  rš   r)  r(  r-  r+  r¯  rÃ  rÑ  r(   rÓ  r   Úobjectr   r   Ú
hexversionr–   re  rl  rn  r~  rƒ  Úcompiler®  r­  ÚMrª  r¸  rÁ  rÆ  r   r%   rÖ  rÙ  ÚTaskBaserÛ  rt   r2   r1   ú<module>rï     s"  ðð
ð ð (Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &ð €Ø #à
€Ø Dà
€Ø 8à€	Ø 1à€Ø >à
€Ø *à
€Ø (à€	Ø *à
€Ø +à	€Ø à€	Ø Að	Ð ðÐ ð*Ð ð €ðð
 1ð  1ð  1ð  1ð  1�dñ  1ô  1ð  1ðD €�v ˜y¨"Ñ-Ô-€Ø hð~,ð ~,ð ~,ð ~,ð ~,ˆ4ñ ~,ô ~,ð ~,ð~ „>�IÒÐð	ð 	ð 	ð ŒxÔ€„Ø€„ð
ð 
ð 
ð8ð ð ð.%ð %ð %ð %ð %�ñ %ô %ð %ð((ð (ð (ðTð ð ð ˆ"Œ*Ð9Ñ
:Ô
:€Øˆ2Œ:Ð*Ñ+Ô+€Ø
ˆ"Œ*ÐeÐgiÔgkÑ
lÔ
l€ðPð Pð Pðd �"”*Ð{Ð}ô  ~Bñ  Cô  C€ðSð Sð Sðj+#ð +#ð +#ð +#ðZð ð ð< ! t°7À2ÈrÐZ\ÐdfÐnsÐz~ð *ð *ð *ð *ðXð ð ð €Ø Að1ð 1ð 1ð 1ð 1�Fñ 1ô 1ð 1ð 1ð 1r2   