
 Pc        +   @   s  d  Z  d d k Z d d k Z d d k Z d d k Z d d k Z d d k Z d d k Z d d k Z d d k	 Z	 d d k
 Z
 y d d k l Z Wn) e j
 o d e f d     YZ n Xy d d k Z Wn? e j
 o3 y d d k Z Wqe j
 o d Z qXn Xd d k l Z y d d k l Z Wn# e j
 o d d k l Z n Xy d d k l Z Wn= e j
 o1 y d d k l Z Wqe j
 o qXn Xy d d k Z WnO e j
 oC d	 e f d
     YZ d e f d     YZ e e _ e _ n# Xe i i Z d   Z e e i _ d i   Z d Z d Z  d d d d g Z! d Z" y d d k l# Z# Wn) e j
 o d e$ f d     YZ# n Xe i% dL j Z& d Z' e& o d e i( j o
 d Z' n d d d   Z) d! d d"  Z* d#   Z+ e, e d$  oO d d d%  Z- d! d d&  Z. d'   Z/ e) Z0 e* Z1 e+ Z2 e- Z) e. Z* e/ Z+ n y d( i d)  Z3 Wn( e4 j
 o d d k5 Z5 d*   Z6 n Xd+   Z6 d, e6 _  e i7 Z7 e& o d-   Z8 e8 Z7 n d.   Z9 d/   Z: d0   Z; e i< d1 e i=  Z> d2   Z? d3   Z@ d4   ZA e i< d5  ZB d6   ZC e i% d7 j o
 eA Z@ n e& o
 eC Z@ n d8 e@ _  d9   ZD d:   ZE d;   ZF d<   ZG d=   ZH e i< d>  ZI d?   ZJ d@   ZK dA   ZL dB   ZM dC e f dD     YZN e& o& e iO ZP dE   ZO eQ e dF eO  n e iR dG j o> y e	 iS   e	 iT   WqXeU j
 o e	 iT e	 _S qXXn dH   ZV dI   ZW dJ   ZX dK   ZY d S(M   s   
Utilities and platform-specific fixes

The portability fixes try to provide a consistent behavior of the Waf API
through Python versions 2.3 to 3.X and across different platforms (win32, linux, etc)
iN(   t   dequeR    c           B   s   e  Z d  Z d   Z RS(   s.   A deque for Python 2.3 which does not have onec         C   s   |  i  d  S(   Ni    (   t   pop(   t   self(    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   popleft   s    (   t   __name__t
   __module__t   __doc__R   (    (    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyR       s   (   t   Errors(   t   UserDict(   t   md5t	   threadingc           B   s   e  Z d  Z RS(   so   
			A fake threading class for platforms lacking the threading module.
			Use ``waf -j1`` on those platforms
		(   R   R   R   (    (    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyR
   1   s   t   Lockc           B   s    e  Z d  Z d   Z d   Z RS(   s   Fake Lock classc         C   s   d  S(   N(    (   R   (    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   acquire9   s    c         C   s   d  S(   N(    (   R   (    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   release;   s    (   R   R   R   R   R   (    (    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyR   7   s   	c          O   sY   y t  |  |   WnA t t f j
 o
   n' t j
 o t i t i     n Xd  S(   N(   t   run_oldt   KeyboardInterruptt
   SystemExitt	   Exceptiont   syst
   excepthookt   exc_info(   t   argst   kwargs(    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   run@   s    t   iluvcuteoverloadi  i  s   \t   |t   /t   -i    (   t   defaultdictR   c           B   s    e  Z d  Z d   Z d   Z RS(   sU   
		defaultdict was introduced in python 2.5, so we leave it for python 2.4 and 2.3
		c         C   s    t  t |   i   | |  _ d  S(   N(   t   superR   t   __init__t   default_factory(   R   R   (    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyR   _   s    c         C   sK   y t  t |   i |  SWn* t j
 o |  i   } | |  | <| SXd  S(   N(   R   R   t   __getitem__t   KeyErrorR   (   R   t   keyt   value(    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyR    b   s    
(   R   R   R   R   R    (    (    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyR   [   s   	t   win32t   clis
   [K%s%s%st   NOCOLORs   %s%s%st   rs	   ISO8859-1c         C   s   t  i d j oW d | j oJ | d 7} t |  |  } z | i   } Wd | i   X| i |  } n. t |  |  } z | i   } Wd | i   X| S(   s$  
	Read an entire file into a string, use this function instead of os.open() whenever possible.

	In practice the wrapper node.read(..) should be preferred to this function::

		def build(ctx):
			from waflib import Utils
			txt = Utils.readf(self.path.find_node('wscript').abspath())
			txt = ctx.path.find_node('wscript').read()

	:type  fname: string
	:param fname: Path to file
	:type  m: string
	:param m: Open mode
	:type encoding: string
	:param encoding: encoding value, only used for python 3
	:rtype: string
	:return: Content of the file
	i   t   bN(   R   t
   hexversiont   opent   readt   closet   decode(   t   fnamet   mt   encodingt   ft   txt(    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   readfq   s    
t   wc         C   sl   t  i d j o* d | j o | i |  } | d 7} n t |  |  } z | i |  Wd | i   Xd S(   sb  
	Write an entire file from a string, use this function instead of os.open() whenever possible.

	In practice the wrapper node.write(..) should be preferred to this function::

		def build(ctx):
			from waflib import Utils
			txt = Utils.writef(self.path.make_node('i_like_kittens').abspath(), 'some data')
			self.path.make_node('i_like_kittens').write('some data')

	:type  fname: string
	:param fname: Path to file
	:type   data: string
	:param  data: The contents to write to the file
	:type  m: string
	:param m: Open mode
	:type encoding: string
	:param encoding: encoding value, only used for python 3
	i   R(   N(   R   R)   t   encodeR*   t   writeR,   (   R.   t   dataR/   R0   R1   (    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   writef   s    c         C   s_   t  |  d  } t   } z/ x( |  o  | i d  }  | i |   q WWd | i   X| i   S(   s3  
	Compute a hash value for a file by using md5. This method may be replaced by
	a faster version if necessary. The following uses the file size and the timestamp value::

		import stat
		from waflib import Utils
		def h_file(fname):
			st = os.stat(fname)
			if stat.S_ISDIR(st[stat.ST_MODE]): raise IOError('not a file')
			m = Utils.md5()
			m.update(str(st.st_mtime))
			m.update(str(st.st_size))
			m.update(fname)
			return m.digest()
		Utils.h_file = h_file

	:type fname: string
	:param fname: path to the file to hash
	:return: hash of the file contents
	t   rbi@ N(   R*   R	   R+   t   updateR,   t   digest(   R.   R1   R/   (    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   h_file   s    	 t   O_NOINHERITc         C   s  t  i t  i Bt  i B} d | j o | t  i O} n y t  i |  |  } Wn# t j
 o t d |    n Xt i	 d j oW d | j oJ | d 7} t |  |  }  z |  i
   } Wd  |  i   X| i |  } n1 t  i | |  }  z |  i
   } Wd  |  i   X| S(   Nt   +s   Cannot read from %ri   R(   (   t   osR=   t   O_RDONLYt   O_BINARYt   O_RDWRR*   t   OSErrort   IOErrorR   R)   R+   R,   R-   t   fdopen(   R1   R/   R0   t   flagst   fdR2   (    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   readf_win32   s&    
c         C   s   t  i d j o* d | j o | i |  } | d 7} n t i t i Bt i Bt i Bt i B} d | j o | t i	 O} n y t i
 |  |  } Wn# t j
 o t d |    n Xt i | |  }  z |  i |  Wd  |  i   Xd  S(   Ni   R(   R>   s   Cannot write to %r(   R   R)   R5   R?   t   O_CREATt   O_TRUNCt   O_WRONLYR=   RA   RB   R*   RC   RD   RE   R6   R,   (   R1   R7   R/   R0   RF   RG   (    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   writef_win32   s    %c         C   s   y' t  i |  t  i t  i Bt  i B } Wn# t j
 o t d |    n Xt  i | d  } t   } z/ x( |  o  | i	 d  }  | i
 |   qn WWd  | i   X| i   S(   Ns   Cannot read from %rR9   i@ (   R?   R*   RA   R@   R=   RC   RD   RE   R	   R+   R:   R,   R;   (   R.   RG   R1   R/   (    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   h_file_win32   s    '	 t    t   hexc         C   s6   t  i |   } t | t  p | i d  } n | S(   Ns   utf-8(   t   binasciit   hexlifyt
   isinstancet   strR-   (   t   st   ret(    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   to_hex  s    c         C   s   |  i  d  S(   NRO   (   R5   (   RT   (    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyRV     s    s`   
Return the hexadecimal representation of a string

:param s: string to convert
:type s: string
c         C   sj  |  p y d d k  } Wn9 t j
 o- g  } t d  D] } | | d q9 ~ SXd } d } | i | |  } | i i i | | | i |   } g  } t t	 | |   D]2 }	 | t
 | i d |	 d |	 d !i d   q ~ Sn t |   d j o" |  d	 d
 j o |  t i 7}  n t i i |   p& t d |   }
 t i |
 _ |
  n t i |   S(   s   
		List the contents of a folder in a portable manner.
		On Win32, return the list of drive letters: ['C:', 'X:', 'Z:']

		:type s: string
		:param s: a string, which can be empty on Windows
		iNt   ABCDEFGHIJKLMNOPQRSTUVWXYZs   :\i   i   i   t   asciii   t   :s   %s is not a directory(   t   ctypest   ImportErrort   listt   create_string_buffert   windllt   kernel32t   GetLogicalDriveStringsAt   byreft   ranget   intRS   t   rawR-   t   lenR?   t   sept   patht   isdirRC   t   errnot   ENOENTt   listdir(   RT   RZ   t   _[1]t   xt   dlent	   maxdrivest   buft   ndrivest   _[2]t   it   e(    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   listdir_win32*  s"    +%X$
c         C   s   t  |  t  o t |  i d   }  n t  |  t  oY d } xK t d  D]= } | t |   j  o$ | d d | t |  |  7} qL qL W| S|  S(   s  
	Convert a string, tuple or version number into an integer. The number is supposed to have at most 4 digits::

		from waflib.Utils import num2ver
		num2ver('1.3.2') == num2ver((1,3,2)) == num2ver((1,3,2,0))

	:type ver: string or tuple of numbers
	:param ver: a version number
	t   .i    i   i   i   (   RR   RS   t   tuplet   splitRb   Re   Rc   (   t   verRU   Rs   (    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   num2verI  s    
 (c          C   s7   t  i   \ }  } } t i |  | |  } d i |  S(   s^   
	Extract the stack to display exceptions

	:return: a string represening the last exception
	RN   (   R   R   t	   tracebackt   format_exceptiont   join(   t   exc_typet	   exc_valuet   tbt	   exc_lines(    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   ex_stack]  s    c         C   s#   t  |  t  o |  i   S|  Sd S(   s  
	Convert a string argument to a list by splitting on spaces, and pass
	through a list argument unchanged::

		from waflib.Utils import to_list
		lst = to_list("a b c d")

	:param sth: List or a string of items separated by spaces
	:rtype: list
	:return: Argument converted to list

	N(   RR   RS   Rx   (   t   sth(    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   to_listg  s    s   *
c         C   s   h  } t  i |   } x | D]} } | i   } | p& | i d  p | i d  d j  o q n | i d  } d i | d  i   | | d i   <q W| S(   s  
	Parse a string with key = value pairs into a dictionary::

		from waflib import Utils
		x = Utils.str_to_dict('''
			a = 1
			b = test
		''')

	:type  s: string
	:param s: String to parse
	:rtype: dict
	:return: Dictionary containing parsed key-value pairs
	t   #t   =i    i   (   t   re_nlRx   t   stript
   startswitht   findR}   (   R2   t   tblt   linesRm   t   tmp(    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   str_to_dictz  s     .+c         C   s   |  i  d  S(   NR   (   Rx   (   Rg   (    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt
   split_path  s    c         C   sG   |  i  d  o* |  i d  d } d | d | d <| S|  i d  S(   Ns   //R   i   i    (   R   Rx   (   Rg   RU   (    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   split_path_cygwin  s
    s   [/\\]c         C   sM   |  i  d  o- t i t |   d } d | d | d <| St i t |   S(   Ns   \\i   s   \i    (   R   t   reRx   t   re_sp(   Rg   RU   (    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   split_path_win32  s
    t   cygwins   
Split a path by / or \. This function is not like os.path.split

:type  path: string
:param path: path to split
:return:     list of strings
c         C   st   t  i i |   p] y t  i |   Wqp t j
 o9 } t  i i |   p t i d |  d |  ql qp Xn d S(   sq   
	Ensure that a directory exists (similar to ``mkdir -p``).

	:type  dir: string
	:param dir: Path to directory
	s   Cannot create the folder %rt   exN(   R?   Rg   Rh   t   makedirsRC   R   t   WafError(   Rg   Rt   (    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt	   check_dir  s    c         K   sE   x> | i    D]0 \ } } t |  |  p t |  | |  q q Wd S(   s   
	Set default attributes on a class instance

	:type cls: class
	:param cls: the class to update the given attributes in.
	:type kw: dict
	:param kw: dictionary of attributes names and values.
	N(   t   itemst   hasattrt   setattr(   t   clst   kwt   kt   v(    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt	   def_attrs  s    	 c         C   s+   t  i d  i d |   } | i   } | S(   s   
	Convert a string to an identifier suitable for C defines.

	:type  s: string
	:param s: String to convert
	:rtype: string
	:return: Identifier suitable for C defines
	s   [^a-zA-Z0-9]t   _(   R   t   compilet   subt   upper(   RT   t   fu(    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   quote_define_name  s    	c         C   s,   t    } | i t |   i    | i   S(   s   
	Hash lists. For tuples, using hash(tup) is much more efficient

	:param lst: list to hash
	:type lst: list of strings
	:return: hash of the list
	(   R	   R:   RS   R5   R;   (   t   lstR/   (    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   h_list  s    	c         C   sx   y |  i  SWnf t j
 oZ y t i |   } Wn t j
 o d } n Xy | |  _  Wn t j
 o n X| SXd S(   sf   
	Hash functions

	:param fun: function to hash
	:type  fun: function
	:return: hash of the function
	t   nocodeN(   t   codet   AttributeErrort   inspectt	   getsourceRD   (   t   funt   h(    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   h_fun  s    s   (\\\\)|(\$\$)|\$\{([^}]+)\}c            s     f d   } t  i | |   S(   s   
	Replace ${VAR} with the value of VAR taken from a dict or a config set::

		from waflib import Utils
		s = Utils.subst_vars('${PREFIX}/bin', env)

	:type  expr: string
	:param expr: String to perform substitution on
	:param params: Dictionary or config set to look up variable values.
	c            sl   |  i  d  o d S|  i  d  o d Sy   i |  i  d   SWn! t j
 o   |  i  d  SXd  S(   Ni   s   \i   t   $i   (   t   groupt   get_flatR   (   R/   (   t   params(    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   repl_var  s    (   t	   reg_substR   (   t   exprR   R   (    (   R   s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt
   subst_vars  s    
c         C   s(   |  d j o d S|  d	 j o d Sd S(
   s   
	Return the binary format based on the unversioned platform name.

	:param key: platform name
	:type  key: string
	:return: string representing the binary format
	t   darwins   mac-oR$   R   t   uwint   msyst   pet   elf(   s   win32R   R   R   (    (   R"   (    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   destos_to_binfmt  s
    c          C   s   t  i }  |  d j o d d k l } | i d  }  |  d j o d S|  i d  o d S|  d	 j o d
 S|  d j o d S|  d j o d S|  i   }  n |  d j o d S|  d j p |  i d
  o |  d j o |  St i	 d |   d S(   s>  
	Return the unversioned platform name.
	Some Python platform names contain versions, that depend on
	the build environment, e.g. linux2, freebsd6, etc.
	This returns the name without the version number. Exceptions are
	os2 and win32, which are returned verbatim.

	:rtype: string
	:return: Unversioned platform name
	t   javai(   t   Systems   os.names   Mac OS XR   s   Windows R$   s   OS/2t   os2s   HP-UXt   hpuxt   SunOSt   Solarist   sunost   powerpct   sunos2s   \d+$i    (   R   R   (
   R   t   platformt	   java.langR   t   getPropertyR   t   lowert   endswithR   Rx   (   RT   R   (    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   unversioned_sys_platform"  s(    	* c          O   s   d S(   s0   
	A function that does nothing

	:return: None
	N(    (   R   R   (    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   nadaE  s    t   Timerc           B   s    e  Z d  Z d   Z d   Z RS(   s   
	Simple object for timing the execution of commands.
	Its string representation is the current time::

		from waflib.Utils import Timer
		timer = Timer()
		a_few_operations()
		s = str(timer)
	c         C   s   t  i  i   |  _ d  S(   N(   t   datetimet   utcnowt
   start_time(   R   (    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyR   W  s    c         C   s   t  i  i   |  i } t | i  } | i d } | i | d d } | i | d | d t | i  d d } d } | o | d | 7} n | p | o | d | 7} n | p | p | o | d | 7} n d | | f S(	   Ni  i<   i  RN   s   %dds   %dhs   %dms   %s%.3fs(   R   R   R   Rc   t   dayst   secondst   floatt   microseconds(   R   t   deltaR   t   hourst   minutesR   t   result(    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   __str__Z  s    .(   R   R   R   R   R   (    (    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyR   M  s   		c         C   s!   t  |  |  t i |  |  d S(   sw   
		shutil.copy2 does not copy the file attributes on windows, so we
		hack into the shutil module to fix the problem
		N(   t   oldt   shutilt   copystat(   t   srct   dst(    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   copy2k  s    R   R   c         C   s{   t  i d  } h  } x_ t |   i   D]K } y/ | i | i    \ } } } } | | | <Wq( t j
 o q( Xq( W| S(   sX   
	Read property files, used by msvc.py

	:param path: file to read
	:type path: string
	s   ^([^=]+)=\'(.*)\'$(   R   R   R3   t
   splitlinesRx   R   t
   ValueError(   Rg   t   spt   dct   lineR   t   leftt   right(    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   read_la_file|  s     !	c            s     f d   }   i  | _  | S(   s  
	Decorator: let a function disable the garbage collector during its execution.
	It is used in the build context when storing/loading the build cache file (pickle)

	:param fun: function to execute
	:type fun: function
	:return: the return value of the function executed
	c             s/   z t  i     |  |   } Wd  t  i   X| S(   N(   t   gct   disablet   enable(   R   R   RU   (   R   (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyR1     s
    
(   R   (   R   R1   (    (   R   s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   nogc  s    	c            s%   h      f d   }  | _  | S(   s   
	Decorator: let a function cache its results, use like this::

		@run_once
		def foo(k):
			return 345*2343

	:param fun: function to execute
	:type fun: function
	:return: the return value of the function executed
	c            s=   y  |  SWn* t  j
 o   |   } |  |  <| SXd  S(   N(   R!   (   R   RU   (   R   t   cache(    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   wrap  s    
(   t	   __cache__(   R   R   (    (   R   R   s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   run_once  s    	c         C   s\   t  p d  Sy t  i |  d | d  } Wn t j
 o n Xt i i |  o | Sd  S(   Ns:   Software\Microsoft\Windows\CurrentVersion\App Paths\%s.exei    (   t   winregt   Nonet
   QueryValuet   WindowsErrorR?   Rg   t   isfile(   R"   t   filenameR   (    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   get_registry_app_path  s    (   s   win32R%   (Z   R   R?   R   Ri   R{   R   R   R   R   R   t
   subprocesst   collectionsR    R[   R\   t   _winregR   R   t   waflibR   R   t   hashlibR	   R
   t   objectR   t   ThreadR   R   R5   t   SIG_NILt   O644t   O755t   rot_chrt   rot_idxR   t   dictR   t   is_win32t	   indicatort   environR3   R8   R<   R   RH   RL   RM   t	   readf_oldt
   writef_oldt
   h_file_oldRm   t   LookupErrorRP   RV   Rk   Ru   Rz   R   R   R   t   MR   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   R   t   nameR   R   t   NotImplementedErrorR   R   R   R   (    (    (    s9   /home/data/ftp/pub/unpacked/waf.tmpconfig/waflib/Utils.pyt   <module>
   s   l
	
%		
				
		
					

									#			
			