U
    '1e                     @   sd  d Z 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ZddlZddl	m
Z
 ddlmZmZ ddlmZ ddlmZ ddlmZmZ d	d
lmZmZmZmZ ddlmZ G dd dZe ZzddlZe dkZ W n   dZ Y nX dd Z!G dd dZ"e#e"j$fddZ%["dd Z&e'e(ffddZ)dd Z*e#dZ+e,e-fZ.dd Z/ddd Z0dd!d"Z1dd#d$Z2dd%d&Z3d'd( Z4d)d* Z5d+d, Z6d-d. Z7d/d0 Z8d1d2 Z9d3d4 Z:dd5d6Z;d7d8 Z<d9d: Z=d;d< Z>d=d> Z?ddl@Z@eAe@d?ZB[@d@dA ZCddBdCZDdDdE ZEddFdGZFddIdJZGG dKdL dLeHZIejJdMkrnddlKZKddlLZLdNdOdOdPdQdQdRdRdSdTdUdUdVdWdXZMddZd[ZNn
dd\d[ZNddlOZOejPQeOjRZSejPTeSreSpejPUeSZV[OzeR W n   ejWd ZRY nX ddlXZXddlYZYzeZZ[e[ Z\eFe[d]se]d^e[ ejP^ejP_e[j`Zaeaejb ZcejPQeaZdedejb ZeefecZgefeeZheceeeaedejPj_ejPj^ejiejbefejbf	d_d`Zjdadb ZkeXjXeYjYeVejPjlfdcddZmW n2   ejPneRZ\dZ[dedb ZkeXjXfdfddZmY nX [X[Ye\oejPnejPoeRd dg Zpdhdi Zqdjdk Zrdldm Zsdndo ZteAedpdqdr ZuddsdtZvedk	ZwG dudv dvZxdwdx ZyddydzZzd{d| Z{dd~dZ|ddl}m~Z~mZ ddlmZ dd ZdddZdddZdddZejPjnfddZejPjejPj_fddZejPjejPj_ejfddZejPjnejPj_ejPjejfddZddlmZ dd Zdd Zdd ZG dd dZG dd deZdd ZG dd dZdd Zdd ZdddZG dd dZG dd dZdd Zdd Zdd Zdd ZddlZdd Zdd Zdd ZdddZdddZdd ZG ddĄ de,ZG ddƄ de,ZddȄ ZG ddʄ dejZG dd̄ d̃Zddd΄ZddЄ Zdd҄ ZddԄ ZdS )z3.5.34z6Gazillions of miscellaneous internal utility functions    N)literal_eval)decodebytesencodebytes)BytesIO)md5)get_rl_tempfileget_rl_tempdir   )rl_safe_execrl_safe_evalsafer_globalsrl_extended_literal_eval)Imagec                   @   s(   e Zd Zedd Zedd ZeZdS )	__UNSET__c                   C   s   dS )NF r   r   r   7/tmp/pip-unpacked-wheel-109iniqw/reportlab/lib/utils.py__bool__   s    z__UNSET__.__bool__c                   C   s   dS )Nr   r   r   r   r   r   __str__   s    z__UNSET__.__str__N)__name__
__module____qualname__staticmethodr   r   __repr__r   r   r   r   r      s
   

r   PyPyFc                 C   s   t | t tkS N)type
isFunctionvr   r   r   r   !   s    r   c                   @   s   e Zd Zdd ZdS )cc                 C   s   d S r   r   selfr   r   r   m%       zc.mN)r   r   r   r"   r   r   r   r   r   $   s   r   c                 C   s   t | |kS r   )r   )r   mtr   r   r   isMethod'   s    r%   c                 C   s   t | t tkS r   )r   sysr   r   r   r   isModule+   s    r'   c                 C   s
   t | |S r   )
isinstance)r   Z_str   r   r   isSeq.   s    r)   c                 C   s
   t | tS r   r(   strr   r   r   r   isNative1   s    r,   c                 C   s   t t| r| n| d S )Nutf8)r   isBytesencode	hexdigestsr   r   r   	_digester9   s    r3   r-   c                 C   sD   t | tr| S z| |W S    tdt| t|f  Y nX d S )NzasBytes(%s,enc=%s) error: )r(   bytesr/   annotateExceptionasciir   encr   r   r   asBytes<   s    
 r9   c                 C   sD   t | tr| S z| |W S    tdt| t|f  Y nX d S )NzasUnicode(%s,enc=%s) error: )r(   r+   decoder5   r6   r7   r   r   r   	asUnicodeC   s    
 r;   c                 C   sV   t | tr| S zt | tr$| |nt| W S    tdt| t|f  Y nX d S )NzasUnicodeEx(%s,enc=%s) error: )r(   r+   r4   r:   r5   r6   r7   r   r   r   asUnicodeExJ   s    
 r<   c                 C   s   t | |dS )N)r8   )r;   r7   r   r   r   asNativeQ   s    r=   c                 C   s
   t | gS r   )r4   )ir   r   r   int2ByteT   s    r?   c                 C   s   t | ttfS r   )r(   r+   r4   r   r   r   r   isStrW   s    r@   c                 C   s
   t | tS r   )r(   r4   r   r   r   r   r.   Z   s    r.   c                 C   s
   t | tS r   r*   r   r   r   r   	isUnicode]   s    rA   c                 C   s
   t | tS r   r(   r   r   r   r   r   isClass`   s    rC   c                 C   s\   t | ttttttttt	t
tttjtjtjtjtjtjtjtjtjtjtjtjtjtjf S r   )r(   floatintr   tuplelistdictr+   r4   complexboolslice_rl_NoneTypetypesFunctionType
LambdaTypeCodeTypeMappingProxyTypeSimpleNamespaceGeneratorType
MethodTypeBuiltinFunctionTypeBuiltinMethodType
ModuleTypeTracebackType	FrameTypeGetSetDescriptorTypeMemberDescriptorType)xr   r   r   isNonPrimitiveInstancec   s              r]   c                 C   s   t | t S r   rB   r   r   r   r   instantiatedk   s    r^   c                 C   s4   t | tr| |S t | tr"| S t| |S d S r   )r(   r+   r/   r4   )r\   r8   r   r   r   bytestrn   s
    


r_   c                 C   s   t t|  dS Nlatin1)base64_encodebytespickledumpsstripr:   )argsr   r   r   encode_labelv   s    rg   c                 C   s   t t| dS r`   )rc   loadsbase64_decodebytesr/   )labelr   r   r   decode_labely   s    rk   c                 C   s   t | ts| dS | S zconverts first 256 unicodes 1-1ra   )r(   r+   r:   r1   r   r   r   
rawUnicode|   s    rm   c                 C   s   t | tr| dS | S rl   )r(   r+   r/   r1   r   r   r   rawBytes   s    rn   execc                 C   s*   t | tr| S tt | tr| n| dS r`   )r(   rE   ordr+   r:   r1   r   r   r   char2int   s    rq   c                 C   s   |j |k	r|||d S r   )__traceback__with_traceback)tr   br   r   r   
rl_reraise   s    

rv   c                  K   s*   dd l }|  D ]\}}t||| qd S Nr   )builtinsitemssetattr)Zkwdrx   kr   r   r   r   rl_add_builtins   s    r|   c                 C   sR   z>| st djd } ddlm} t| |r:t| jr:| nd W S    Y d S X d S )Nr	   
__loader__r   )zipimporter)r&   	_getframe	f_globals	zipimportr~   r(   len_files)ldrr~   r   r   r   zipImported   s    r   .ttfc           
      C   s   ddl m}m}m} ddlm} | }g }|j}| D ]H}||sDq6||D ]0}	|||	}	||	rL|rt|	 |rL||	 qLq6|S )Nr   )isfileisdirjoin)listdir)	os.pathr   r   r   osr   lowerappendendswith)
ZdirListextr   r   Z	path_joinr   RADfnr   r   r   
_findFiles   s     
 r   c                   @   sV   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdddZdd Z	dd Z
dd ZdS )CIDictc                 O   s"   |D ]}|  | q|  | d S r   )update)r!   rf   kwdsar   r   r   __init__   s     zCIDict.__init__c                 C   s   |  D ]\}}|| |< qd S r   )ry   )r!   r   r{   r   r   r   r   r      s     zCIDict.updatec                 C   s,   z|  }W n   Y nX t| || d S r   )r   rH   __setitem__r!   r{   r   r   r   r   r      s
    zCIDict.__setitem__c                 C   s&   z|  }W n   Y nX t| |S r   )r   rH   __getitem__r!   r{   r   r   r   r      s
    zCIDict.__getitem__c                 C   s&   z|  }W n   Y nX t| |S r   )r   rH   __delitem__r   r   r   r   r      s
    zCIDict.__delitem__Nc                 C   s(   z
| | W S  t k
r"   | Y S X d S r   )KeyError)r!   r{   Zdvr   r   r   get   s    
z
CIDict.getc                 C   s"   z| |  W dS    Y dS X d S )NTFr   r   r   r   r   __contains__   s
    zCIDict.__contains__c                 G   s,   z|  }W n   Y nX tj| |f|  S r   )r   rH   popr!   r{   r   r   r   r   r      s
    z
CIDict.popc                 G   s,   z|  }W n   Y nX tj| |f|  S r   )r   rH   
setdefaultr   r   r   r   r      s
    zCIDict.setdefault)N)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s   
r   mac)oglezBMP )r   EPSF)r   ZGIFf)r   JPEG)ZttxtPICT)r   ZPNGf)r   z.PPM)r   TIFF)ZCAROzPDF )ZMSIEZTEXT)ZBMPZEPSr   ZGIFZJPGr   ZPCTr   PNGZPPMZTIFr   PDFZHTMLr   c                 C   sp   z^|d ks|d kr@|d k	r@zt |  \}}W n   Y W d S X t| || t|  W n   Y nX d S r   )_KNOWN_MAC_EXTuppermacfsZFSSpecZSetCreatorType
macostoolsZtouched)filenamecreatorcodefiletyper   r   r   r   markfilename   s    
r   c                 C   s   d S r   r   )r   r   r   r   r   r   r      s    )r   z#can't handle compact distro type %rc
                 C   s   ||  d|} || }
|
||fkr(dS |
|rBd| td fS |
|r\d| td fS || }t|}|
|r| |d |rd| ||	 d fS |t| krdS tj|  | fS )z3if the name starts with a known prefix strip it off/)r	    r	   N)replace
startswith_archivepfxlen_archivedirpfxlenr   r   pathisabs)r   _archivepfx_archivedirpfx_archive_archivediros_path_normpathZos_path_normcaseZ	os_getcwdZos_sepZ
os_sep_lenZnfncwdnr   r   r   __startswith_rl  s      
 
 

  r   c                 C   s   t | d S )Nr	   )r   r   r   r   r   _startswith_rl3  s    r   c              
   C   s^   t | \}}||}|s |g krZ|ttt|fddtt||fddttj 7 }|S )Nc                 S   s
   |t | S r   )r   )r\   r   pjoinr   r   r   <lambda>:  r#   zrl_glob.<locals>.<lambda>c                 S   s
   || |S r   r   )r\   pfnfnmatchr   r   r   r   :  r#   )r   rG   mapr   filter__rl_loader__r   keys)patternglobr   _RL_DIRr   r   r   rr   r   r   rl_glob6  s
    :r   c                 C   s   | S r   r   r   r   r   r   r   ?  s    c                 C   s   || S r   r   )r   r   r   r   r   r   A  s    .pyc                   C   s   t S )z*return truth if a file system distribution_isFSDr   r   r   r   isFileSystemDistroF  s    r   c                   C   s   t  S )z.return truth if not a file system distributionr   r   r   r   r   isCompactDistroJ  s    r   c                   C   s   t S )z1return truth if a source file system distribution)_isFSSDr   r   r   r   isSourceDistroN  s    r   c                 C   s   t jt jt j| S r   )r   r   normcaseabspathnormpath)pr   r   r   normalize_pathR  s    r   invalidate_cachesc                   C   s   d S r   r   r   r   r   r   r   U  r#   r   c              
   C   s  dd t jD }|rRt|ttfr&|n|fD ]$}|r,t|}||kr,|d| q,|rddtdfD ](}||krd|rtd|  || qhqdnt	
 }||kr|d| t j}z
z|t _t  |rNt  td td	t|   td
tt	
   tdtt j  tdtd|  tt	jd|  f  tdt|  td t| W W dS  tk
r   td| t jt	
 f  Y n2   tdtt  d | t jt	
 f  Y nX W 5 |t _t  |rtdt|  X dS )zEDynamically imports possible packagized module, or raises ImportErrorc                 S   s   g | ]}t |qS r   )r   ).0r   r   r   r   
<listcomp>Y  s     z#recursiveImport.<locals>.<listcomp>r   r   .zremoved "%s" from pathz===== restore sys.path=%sz++++++++++++++++++++z+++++ modulename=%sz+++++ cwd=%sz+++++ sys.path=%sz+++++ os.paths.isfile(%s)=%sz./%s.pyz+++++ opath=%sz--------------------z/Could not import %r
using sys.path %r in cwd=%rz;Exception %s while importing %r
using sys.path %r in cwd=%rr	   N)r&   r   r(   rG   rF   r   insertprintremover   getcwd_importlib_invalidate_cachesreprr6   r   	importlibimport_moduleImportErrorr5   r+   exc_info)
modulenameZbaseDirZnoCWDdebugr   r   Zopathr   r   r   recursiveImportW  s^      (     r   c                   @   s   e Zd ZdZdd ZdS )ArgvDictValuezGA type to allow clients of getArgvDict to specify a conversion functionc                 C   s   || _ || _d S r   )valuefunc)r!   r   r   r   r   r   r     s    zArgvDictValue.__init__N)r   r   r   __doc__r   r   r   r   r   r     s   r   c                  K   s   dd }t jdd }i }|  D ]\}}t|trD|j|j }}nd}d}|d }|D ]@}	|	|rX|	t|d }
|	|	 |||
|||< d} qqX|s"||||||< q"|S )z Builds a dictionary from its keyword arguments with overrides from sys.argv.
        Attempts to be smart about conversions, but the value can be an instance
        of ArgDictValue to allow specifying a conversion function.
    c                 S   s   |r||} n~t | r|} npt| tr0t|} n\t| trDt|} nHt| tr^tt|i } n.t| trxtt|i } ntd|t| f | S )NzCan't convert string %r to %s)	r@   r(   rD   rE   rG   r   rF   	TypeErrorr   )r   avr   r   r   r   handleValue  s    






z getArgvDict.<locals>.handleValuer	   Nr   =)
r&   argvry   r(   r   r   r   r   r   r   )kwr   r   r   r{   r   r   ZhandledZker   r   r   r   r   getArgvDict  s&    


 r   c              
   C   sp   z4ddl m} | d kr,tjtjtd} || W S  tk
rj } zt|dkrT W Y d S d }~X Y nX d S )Nr   )Hyphenzhyphen.mashedzNo module named pyHnj)	Zreportlab.lib.pyHnjr   r   r   r   dirname__file__r   r+   )ZhDictr   ZerrMsgr   r   r   getHyphenater  s     
 r   c                 C   sT   z2| j j}|d}|dkr.||d d W S |W S  tk
rN   t|  Y S X dS )zReturn a shortened class namer   r   r	   N)	__class__r   rfindAttributeErrorr+   )r!   namer>   r   r   r   
_className  s    
 r  ru   c                 C   s~   d|krd| }zt | |W S  tk
rx   ts8td kr: t| } t| }d|krltjdkrl|tjd}t	| Y S X d S )Nr   ru   
)
openIOErrorr   r   r   get_datar   linesepr   r   )r  moder2   r   r   r   open_for_read_by_name  s      
 r  )unquoteurlparse)urlopenc                 C   s   t |  S r   )r  read)r  r   r   r   	rlUrlRead  s    r  c              
      s   t fdd ddlmm r^dd l}dd lfdd}|ddd	t|d
fd fdd	}|t	 d< || |S )Nc                 S   s   z|  dd\}}W n tk
r2   tddY nX |s<d}|d}|dkr|d||d	 kr|||d d	 }|d	| }nd
}|dkrt|d}n||d}|S )zUse "data" URL.,r	   z
data errorzbad data URLztext/plain;charset=US-ASCII;r   r   Nr   base64r6   zlatin-1)split
ValueErrorr  r  ri   r/   )urlr  typdatasemiencodingr   r   r   
datareader  s    	
z!open_for_read.<locals>.datareaderr   )trustedHoststrustedSchemesc                    s,     | } | dr | dd S | d d S )Nz(?s:   i)	translater   r1   )r   r   r   xre  s    
zopen_for_read.<locals>.xrer   z^(?:|z)\Zru   c              	      s   t | dr| S zt| |W S    zpdk	rjt| }|d rj|d dksV|d rb|d ksjtdt| dd  dkr nt| W  Y S    td	|  Y nX Y nX dS )
z)attempt to open a file or URL for readingr  Nr   )r  filer	   zAttempted untrusted host access   zdata:zCannot open resource "%s")	hasattrr  r  matchr  r   r   r  r  )r  r  purl)r  r  r  r   r   open_for_read  s    
 .*z$open_for_read.<locals>.open_for_readr)  )ru   )
r  reportlab.rl_configr  r  rer   compiler   r   globals)r  r  r+  r"  r)  r   )r  r   r  r  r   r)    s    

r)  c              
   C   sJ   t | |}| |k	r>t|dr>| | W  5 Q R  S Q R X n| S d S )N__exit__)r)  r&  r  )r  r  fr   r   r   open_and_read  s
    
r0  rt   c                 C   s   t | |dS Nr  )r0  r  )r  r  r   r   r   open_and_readlines   s    r2  c                 C   sD   t | drdS || rdS ts&td kr*dS t| } | ttj kS )Nr  TF)r&  r   r   r   rG   r   r   )r   os_path_isfiler   r   r   	rl_isfile#  s    
   r4  c                 C   sf   || rdS t std krdS t|| } | tjs>| tj7 } ttt| fddttj	
 dkS )NTFc                 S   s
   |  |S r   )r   )r\   pnr   r   r   r   /  r#   zrl_isdir.<locals>.<lambda>r   )r   r   r   r   r   sepr   rG   r   r   r   )r5  os_path_isdirr   r   r   r   rl_isdir*  s       
r8  c                    sV   | st std kr| S t|   tjs> tj7   fddtj D S )Nc                    s&   g | ]}|  r|t d  qS r   )r   r   r   r\   r5  r   r   r   5  s     
 zrl_listdir.<locals>.<listcomp>)r   r   r   r   r   r6  r   r   )r5  r7  r   Z
os_listdirr   r:  r   
rl_listdir1  s      
r;  c           	   
   C   s   || st std kr|| S t|| }ztj| }W n tk
rR   ||  Y S X |d }|d }||d? d@ d |d? d@ |d@ |d? d@ |d? d	@ |d@ d
> dddf	S )Nr%     	      i           ?   r	   r   )r   r   r   r   r   )	r5  r3  r   Zos_path_getmtimeZtime_mktimer   er2   dr   r   r   rl_getmtime7  s     rE  )utilc                 C   sN   dD ]<}t j|| | }t j|rt| |}|j   S qtdd S )N)r   z.pywz.pyoz.pycz.pydzno suitable file found)	r   r   r   r   importlib_utilspec_from_file_locationloaderload_moduler   )r  dirr   r   specr   r   r   __rl_get_module__C  s    rM  c              
   C   s   | t jkrt j|  }t j| = nd }zzt| |W W ~S    t rdd l}t|}|dks`| rdtpztj	t|
dtj}||}||  Y W S td| |f Y nX W 5 |r|t j| < X d S )Nr   r   r   z%s[%s])r&   modulesrM  r   r   r   r   r   r   r   r   r6  r~   rJ  r   )r  rK  Zomr   Zzir   r   r   rl_get_moduleK  s"    


*
 rO  c                 C   s*   zt | tjW S  tk
r$   Y dS X d S rw   )r(   r   r  )imr   r   r   _isPILImage`  s    rQ  c                   @   s|   e Zd ZdZi ZdZdddZdd Zdd Ze	d	d
 Z
e	dddZdd Zdd Zdd Zdd Zdd Zdd ZdS )ImageReaderz%Wraps up PIL to get data from bitmapsNc                 C   s^  t |tr|j| _d S || _|| _d | _d | _d | _d | _d | _	t
|r|| _t|dd | _z| jj| _W n" tk
r   dt|  | _Y nX nzddlm} |dkrtdt|d}t |ts|t|  }}|  ~|| _| | j| _t |tr|nt|| j_| | j t| jdd dkr6| j| _W n    td	||  f  Y nX d S )
NfpzPILIMAGE_%dr   )imageReaderFlagszYimageReaderFlags values other than 0 are no longer supported; all images are interned nowru   formatr   z
fileName=%r identity=%s)r(   rR  __dict___identfileName_image_width_heightZ_transparent_datarQ  getattrrS  r  idr*  rT  r  r)  r   r  close_read_imager+   r   check_pil_image_size_jpeg_fhjpeg_fhr5   identity)r!   rX  identrT  rS  tfpr   r   r   r   j  sD    


zImageReader.__init__c                 C   s\   | j }t|s"tt| dddd}| j}d| jjtt| |rFd| pHd|rTd| pVdf S )z9try to return information that will identify the instancerS  Nr  z[%s@%s%s%s]z	 ident=%rr   z filename=%r)rX  r@   r]  rW  r  r   hexr^  )r!   r   re  r   r   r   rd    s
    zImageReader.identityc                 C   s
   t |S r   )r   r  r!   rS  r   r   r   r`    s    zImageReader._read_imagec                 C   sn   | j }|d krd S |j\}}|j}td|dkr2dn
dt| | | d? }||krjtd|||||f d S )Nr	   1      z,PIL %s %s x %s image would use %s > %s bytes)_max_image_sizesizer  maxr   MemoryError)clsrP  max_image_sizewhr"   rm  r   r   r   ra    s     
*z ImageReader.check_pil_image_sizec                 C   s(   || _ |d k	r$ddlm} || j d S )Nr   )register_reset)rl  r*  rt  set_max_image_size)rp  rq  rt  r   r   r   ru    s    zImageReader.set_max_image_sizec                 C   s   | j }|d |S rw   )rS  seekrh  r   r   r   rb    s    
zImageReader._jpeg_fhc                 C   s   d S r   r   r    r   r   r   rc    s    zImageReader.jpeg_fhc                 C   s0   | j d ks| jd kr$| jj\| _ | _| j | jfS r   )rZ  r[  rY  rm  r    r   r   r   getSize  s    zImageReader.getSizec                 C   s$  z | j dkrd| _| j}|j }| _|dkrttdddrH|  t|	 |dkr\dnd | _|dd	 }|
|}|| _n^|d
kr|jdkr|jdkrd|jkr|
d}t|	 d | _|
d}n
|
d}d| _t|dr|jn|j | _ | j W S    td|    Y nX dS )z'Return byte array of RGB data as stringN)ZLARGBAVERSIONr   z1.1.7rx  rk  r	   )LRGBZCMYKr   Ptransparencyr|  tobytesz
identity=%s)r\  Z_dataArY  r  r]  r   r   loadrR  r  convertrU  infor&  r  tostringr5   rd  )r!   rP  r  nmr   r   r   
getRGBData  s.    



zImageReader.getRGBDatac                 C   s   |   \}}|||  fS r   )rw  r  )r!   widthheightr   r   r   getImageData  s    zImageReader.getImageDatac              	   C   sp   d| j jkrh| j jd d }| j j}z
|j}W n(   z
|j}W n   Y Y d S X Y nX |||d  S d S d S )Nr~  rk  )rY  r  paletter  )r!   r~  r  r   r   r   getTransparent  s    

zImageReader.getTransparent)N)N)r   r   r   r   _cacherl  r   rd  r`  classmethodra  ru  rb  rc  rw  r  r  r  r   r   r   r   rR  f  s    
'
	rR  c                   @   s   e Zd ZdS )LazyImageReaderN)r   r   r   r   r   r   r   r    s   r  c                 C   s0   z
|   W S  tk
r*   t|    Y S X dS )z<Get width, height and RGB pixels from image file.  Wraps PILN)r  r  rR  )ZimageFileNamer   r   r   r    s    
r  c                   @   s   e Zd ZdZd4ddZd	d
 Zdd Zdd Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zeeeed)Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 ZdS )5	DebugMemoa  Intended as a simple report back encapsulator

    Typical usages:
        
    1. To record error data::
        
        dbg = DebugMemo(fn='dbgmemo.dbg',myVar=value)
        dbg.add(anotherPayload='aaaa',andagain='bbb')
        dbg.dump()

    2. To show the recorded info::
        
        dbg = DebugMemo(fn='dbgmemo.dbg',mode='r')
        dbg.load()
        dbg.show()

    3. To re-use recorded information::
        
        dbg = DebugMemo(fn='dbgmemo.dbg',mode='r')
            dbg.load()
        myTestFunc(dbg.payload('myVar'),dbg.payload('andagain'))

    In addition to the payload variables the dump records many useful bits
    of information which are also printed in the show() method.
    rl_dbgmemo.dbgrr  r	   r   Nc                    sZ  dd l }|| _|stj| _nt|dr.|| _nt|d| _|dkrFd S i  | _}	|rt dkrdd l}
t	 }|

d | | |	d< t }t|}tj|}|rt|pd}tjtjtjd }d}d }z$dd l}|td}|d }W n   Y nX tj t  }|  |	ttt tjtj t!tj"tj#tj$tj%tjtj||& ||tj't(td	d
t(tdd
t(tdd
t(tdd
d)dg fdd|D  t*t||d tdftdffD ]D\}}|D ]4}t||rzt(|| |	|< W n   Y nX qq||krLz|	|t|d W n   Y nX |rtjtjd }tj+|rz|t|d, f|	d< W n   Y nX i }tj-. D ]\}|dks|dks|d d dks|d d dkrfdddD }d d |D r|d gd!d |d"d  D  }t/|||< q||	d#< i | jd$< | 0| d S )%Nr   writerr  )NNN__tracebackz???zmeta_data.marproject_version
maxunicodez????api_versionversion_infowinverz
			r   c                    s   g | ]}d | | f qS )%s=%rr   )r   r{   )envr   r   r   ?  s     z&DebugMemo.__init__.<locals>.<listcomp>)Zgmtplatformversion
hexversion
executableexec_prefixprefixr   r   r   hostnamelcwdlpcwd	byteorderZmaxintr  r  r  environmentr   Zproject_meta_datar  )getwindowsversiongetfilesystemencoding)unamectermidgetgidgetuidgetegidgeteuidgetlogin	getgroupsgetpgrpgetpidgetppid)exedZlexedr   __script	reportlabZrlextra
   z
reportlab.rj  zrlextra.c                    s   g | ]}t  |d qS r   )r]  r9  )r"   r   r   r   _  s     )__version____path__r   c                 S   s   g | ]}|r|qS r   r   r   _fr   r   r   r   `  s      c                 S   s   g | ]}|r|qS r   r   r  r   r   r   r   a  s      r	   __module_versions	__payload)1socketr   r&   stdoutr&  r  storer   	tracebackr   	print_excgetvaluer   r   r   r   r   r   r   marshalrh   r   r	  environrG   r   sortr   timeasctimegmtimer  r  rg  r  r  r  r  gethostnamer  r]  r   r   r   r  rN  ry   rF   _add)r!   r   r  Z	getScriptrN  Zcapture_tracebackr  r   r  r  r  r2   r   r  Zpcwdr  r  r  Zmdr  KMr   r   Zmodule_versionsr   r   r   )r  r"   r   r     s    

 






8 
zDebugMemo.__init__c                 C   s(   | j d }| D ]\}}|||< qd S Nr  )r  ry   )r!   r   payloadr{   r   r   r   r   r  g  s    
zDebugMemo._addc                 K   s   |  | d S r   )r  )r!   r   r   r   r   addl  s    zDebugMemo.addc              
   C   s   z|  }t| j| W nt   | j }t }| D ]6\}}zt||i| W q:   d| ||< Y q:X q:||d t|| Y nX d S )Nz<unpicklable object %r>r   )tellrc   dumpr  copyr   ry   rv  )r!   r/  posSffr{   r   r   r   r   _dumpo  s    
zDebugMemo._dumpc                 C   s*   t | jd}z| | W 5 |  X d S )Nwb)r  r   r_  r  r!   r/  r   r   r   r  ~  s    zDebugMemo.dumpc                 C   s   t  }| | | S r   )r   r  r  r  r   r   r   rd     s    
zDebugMemo.dumpsc                 C   s   t || _d S r   )rc   r  r  r  r   r   r   _load  s    zDebugMemo._loadc                 C   s*   t | jd}z| | W 5 |  X d S )Nrb)r  r   r_  r  r  r   r   r   r    s    zDebugMemo.loadc                 C   s   |  t| d S r   )r  r   )r!   r2   r   r   r   rh     s    zDebugMemo.loadsc                 C   s   |  |dd   t| }|  |D ]z}||  }}t|trL|d }z.t| tj| }t	|dd |krtdpvd}W n   d }d}Y nX |  d|||f  q*d S )N   r   r  ZSAMEZ	DIFFERENTz??????unknown??????z  %s = %s (%s))
_writelnrG   r   r  r(   rF   
__import__r&   rN  r]  )r!   r{   r   r  ZvkZvk0r"   rD  r   r   r   _show_module_versions  s    
 

zDebugMemo._show_module_versionsc                 C   s   |  d||dd  f  d S )Nz*###################%s %s##################r  )r  )r!   r{   whatr   r   r   _banner  s    zDebugMemo._bannerc                 C   s   |  |d d S )NzStart  r  r   r   r   r   _start  s    zDebugMemo._startc                 C   s   |  |d d S )NzFinish r  r   r   r   r   _finish  s    zDebugMemo._finishc                 C   s"   |  | | | | | d S r   )r  r  r  r   r   r   r   _show_lines  s    

zDebugMemo._show_linesc                 C   s,   d|t j|d f }| ||d  d S )Nz%s %sr   r	   )r   r   basenamer  r   r   r   r   
_show_file  s    zDebugMemo._show_filec                 C   s2   |r.dd l }| | | || j | | d S rw   )pprintr  r  r  )r!   r{   r   r  r   r   r   _show_payload  s
    
zDebugMemo._show_payloadc                 C   s   dD ]}zR|gj }t| tj| }||j dD ]$}t||r2|d|t||f  q2W n   |d Y nX | dd|j	  qd S )N)Z	_rl_accelZ	_renderPMZsgmlopZpyRXPZpyRXPUZ_imagingr   )r  ry  _versionr  r  z	not found )
r   r  r&   rN  r   r&  r]  r  r   __self__)r!   mnr   r"   Zvnr   r   r   _show_extensions  s    


zDebugMemo._show_extensions)r  r  r  r  c                 C   s   t | j }|  |D ].}|t | j kr| d|| j| f  q|D ].}|t | j krN| j| | || j|  qN|   d S )Nz
%-15s = %s)rG   r  r   r  specialsr  r  )r!   r  r{   r   r   r   show  s      zDebugMemo.showc                 C   s   | j d | S r  r  r!   r  r   r   r   r    s    zDebugMemo.payloadc                 C   s   || j d |< d S r  r  )r!   r  r   r   r   r   r     s    zDebugMemo.__setitem__c                 C   s   | j d | S r  r  r  r   r   r   r     s    zDebugMemo.__getitem__c                 C   s   | j |d  d S r1  )r  r  )r!   msgr   r   r   r    s    zDebugMemo._writeln)r  rr  r	   r   r	   N)r   r   r   r   r   r  r  r  r  rd   r  r  rh   r  r  r  r  r  r  r  r  r  r  r  r   r   r  r   r   r   r   r    s8   
[	r  c                 C   s*   | D ] }t |rt|| q|| qd S r   )r)   _flatten)r{  r   r\   r   r   r   r    s     r  c                 C   s   g }t | |j |S )z'recursively flatten the list or tuple L)r  r   )r{  r   r   r   r   flatten  s    r  c                 C   s&   | t |j}|r|S |d7 }q dS )zPapply func to the locals at each stack frame till func returns a non false valuer	   N)r&   r   f_locals)r   depth_r   r   r   find_locals  s     r  c                   @   s   e Zd Zdd Zdd ZdS )_FmtSelfDictc                 C   s   || _ || _d S r   )obj_overrideArgs)r!   r  overrideArgsr   r   r   r     s    z_FmtSelfDict.__init__c                 C   s^   z| j | W S  tk
rX   z| jj| W  Y S  tk
rR   t| j| Y  Y S X Y nX d S r   )r  r   r  rV  r]  r   r   r   r   r     s    z_FmtSelfDict.__getitem__N)r   r   r   r   r   r   r   r   r   r    s   r  c                   @   s   e Zd ZdZdd ZdS )FmtSelfDictz mixin to provide the _fmt methodc                 K   s   t | |}|| S r   )r  )r!   fmtr  r   r   r   r   _fmt	  s    
zFmtSelfDict._fmtN)r   r   r   r   r  r   r   r   r   r    s   r  c           	      C   s   g }|d}g }| }|   D ]V}||}|| | |ksB|g krZ|| || | }q|d| |g}|}q|g kr|d| |S )Nr  )r  r   r   )	txtZmWSWr{  wsOrr  rt   ltr   r   r   _simpleSplit  s    
 r  c                    sX   ddl m  t| d}||f fdd	}|rTg }|D ]}|t||| q8|}|S )Nr   stringWidthr  c                    s    | ||S r   r   )textZfNZfSr  r   r   r   !  r#   zsimpleSplit.<locals>.<lambda>)Zreportlab.pdfbase.pdfmetricsr  r;   r  extendr  )r  ZfontNameZfontSizeZmaxWidthlinesr  r{  lr   r  r   simpleSplit  s    r
  c                 C   sZ   ddl m} | dkr| S t| r*| d}|| } | dd} | dd} | d	d
} | S )zEscapes once onlyr   )escapeNr-   	&amp;amp;&amp;&amp;gt;&gt;&amp;lt;&lt;)xml.sax.saxutilsr  r.   r:   r   )r  r  r2   r   r   r   escapeTextOnce)  s     
r  c                 C   sD   t | r| S tD ]"}z| |W   S    Y qX qtd|  d S )Nz(cannot convert %r to filesystem encoding)rA   ZfsEncodingsr:   r  )r   r8   r   r   r   fileName2FSEnc5  s    r  c                 C   sb   t dg| dg}t |d\}}}z|| || || W n tk
rT   Y nX t|||S )a  
    Loop over a collection with look-ahead and look-back.
    
    From Thomas Guest, 
    http://wordaligned.org/articles/zippy-triples-served-with-python
    
    Seriously useful looping tool (Google "zippy triples")
    lets you loop a collection and see the previous and next items,
    which get set to None at the ends.
    
    To be used in layout algorithms where one wants a peek at the
    next item coming down the pipe.

    Nrk  )	itertoolschainteeStopIterationzip)ry   r  prevthisnextr   r   r   prev_this_nextA  s    r  c                 C   s   t | r| d} t| d }| d7 } d}dg}||kr| | dkr| |d  dkrn|d  d7  < |d7 }q|d  |d< ||kr|d n|d  | | 7  < |d7 }q0|d  |d< |S )a  
    Splits the string s at every unescaped comma and returns the result as a list.
    To escape a comma, double it. Individual items are stripped.
    To avoid the ambiguity of 3 successive commas to denote a comma at the beginning
    or end of an item, add a space between the item seperator and the escaped comma.
    
    >>> commasplit(u'a,b,c') == [u'a', u'b', u'c']
    True
    >>> commasplit('a,, , b , c    ') == [u'a,', u'b', u'c']
    True
    >>> commasplit(u'a, ,,b, c') == [u'a', u',b', u'c']
    r-   r	   r  r   r   r  rz  )r.   r:   r   re   r   )r2   r   r>   r   r   r   r   
commasplit[  s$     

 
r  c                 C   s   d dd | D S )a  
    Inverse of commasplit, except that whitespace around items is not conserved.
    Adds more whitespace than needed for simplicity and performance.
    
    >>> commasplit(commajoin(['a', 'b', 'c'])) == [u'a', u'b', u'c']
    True
    >>> commasplit((commajoin([u'a,', u' b ', u'c'])) == [u'a,', u'b', u'c']
    True
    >>> commasplit((commajoin([u'a ', u',b', u'c'])) == [u'a', u',b', u'c'] 
    r  c                 S   s$   g | ]}d t |dd d  qS )r  r  z,,)r;   r   )r   r>   r   r   r   r     s     zcommajoin.<locals>.<listcomp>)r   )r	  r   r   r   	commajoin{  s    r  Tc                 C   sp   |rt jjpt jj}|| r | S t jj}t j| sX|D ]}||| }||r8|  S q8|rltd| |f | S )z*search for relative files in likely placeszcannot locate %r with paths=%r)r   r   r   r   r   r   r  )r   pathsr   Zfailexistsr   r   r   r   r   r   findInPaths  s     

 r"  r   r  c              	   C   s<   t  \}}}t|||dd | t||fD | dS )z,add msg to the args of an existing exceptionc                 s   s   | ]}|r|V  qd S r   r   )r   r  r   r   r   	<genexpr>  s      z$annotateException.<locals>.<genexpr>N)r&   r   rv   r   r+   )r  r8   ZpostMsgr6  rt   r   ru   r   r   r   r5     s    r5   c                 C   sd   |  dd} |  dd} |  dd} |  dd} |  dd	} |  dd} |  dd} |  dd} | S )
zEnsure XML output is escaped just once, irrespective of input

    >>> escapeOnce('A & B')
    'A &amp; B'
    >>> escapeOnce('C &amp; D')
    'C &amp; D'
    >>> escapeOnce('E &amp;amp; F')
    'E &amp; F'

    &r  r  r  r  r  r  z&amp;#z&#)r   )r  r   r   r   
escapeOnce  s    r%  c                   @   s   e Zd ZdZdd ZdS )IdentStrz,useful for identifying things that get splitc                 C   sZ   t |tr4|j}|d dtt|   }|d7 }nd}|d| 7 }t| |}||_|S )Nr  r	   r   z[%d])r(   r&  Z_IdentStr__incr   r+   __new__)rp  r   incr!   r   r   r   r'    s    

zIdentStr.__new__Nr   r   r   r   r'  r   r   r   r   r&    s   r&  c                   @   s   e Zd ZdZdd ZdS )RLStringzallows specification of extra properties of a string using a dictionary of extra attributes
    eg fontName = RLString('proxima-nova-bold',
                    svgAttrs=dict(family='"proxima-nova"',weight='bold'))
    c                 K   s.   t | |}| D ]\}}t||| q|S r   )r+   r'  ry   rz   )rp  r   r   r!   r{   r   r   r   r'    s    zRLString.__new__Nr)  r   r   r   r   r*    s   r*  c                 C   s   t | s| d} | S )zEforce filename strings to unicode so python can handle encoding stuffr-   )rA   r:   r1   r   r   r   makeFileName  s    
r+  c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )FixedOffsetTZz&Fixed offset in minutes east from UTC.c                 C   s   t j||d| _|| _d S )N)hoursminutes)datetime	timedelta_FixedOffsetTZ__offset_FixedOffsetTZ__name)r!   rs  r"   r  r   r   r   r     s    zFixedOffsetTZ.__init__c                 C   s   | j S r   )r1  r!   dtr   r   r   	utcoffset  s    zFixedOffsetTZ.utcoffsetc                 C   s   | j S r   )r2  r3  r   r   r   tzname  s    zFixedOffsetTZ.tznamec                 C   s
   t dS rw   )r/  r0  r3  r   r   r   dst  s    zFixedOffsetTZ.dstN)r   r   r   r   r   r5  r6  r7  r   r   r   r   r,    s
   r,  c                   @   s.   e Zd ZdddZedd Zedd ZdS )		TimeStampNc                 C   s   |d krddl m} tjdd }|s.|rX|r:t|nd}t|}d }}d| _	n8t }t
t|}ttjd }tjd d	 }d| _	|| _|| _t
|d d
 | _|| _|| _d S )Nr   )	invariantSOURCE_DATE_EPOCHr   g   6AUTCg      @i  <   r<  )r*  r9  r   r  r   re   rE   r  r  r6  rF   	localtimetimezonert   r  ZYMDhmsdhhdmm)r!   r9  rt   r  r?  r@  r   r   r   r     s$    
zTimeStamp.__init__c                 C   s2   | j r$tj| jt| j| j| j S tj S d S r   )r6  r/  fromtimestamprt   r,  r?  r@  nowr    r   r   r   r/    s    zTimeStamp.datetimec                 C   s   t | jS r   )r  r  r  r    r   r   r   r    s    zTimeStamp.asctime)N)r   r   r   r   propertyr/  r  r   r   r   r   r8    s
   

r8  c                 C   st   t |stdt| |f t|}| }|s@tdt|  |rT|d dkrTdnd}td||f i t| dd	S )
z/Can call down into e.g. object1.object2[4].attrz!invalid recursive access of %s.%szempty recursive access of %sr   z[.(r   r   zobj%s%s)r  )gr	  )r@   r   r   r=   re   r  r   rH   )r  r  rD  dotr   r   r   recursiveGetAttr  s      rF  c                 C   sX   | d}t|dkr$t| || n0d|dd }|d }t| |}t||| dS )z7Can call down into e.g. object1.object2[4].attr = valuer   r	   Nrz  )r  r   rz   r   rF  )r  r  r   tokensmostlastparentr   r   r   recursiveSetAttr  s    

rK  c                 C   sT   | d}t|dkr"t| | n.d|d d }|d }t| |}t|| d S )Nr   r	   rz  )r  r   delattrr   rF  )r  r  rG  rH  rI  rJ  r   r   r   recursiveDelAttr  s    

rM  c                 c   sp   d}t | }||k rlz.| d|}| || V  |d }| s@W qlW q tk
rh   | |d V  Y qlY qX qdS )z:yield sublists of L separated by None; the Nones disappearr   Nr	   )r   indexr  )r{  r>   r   jr   r   r   yieldNoneSplits$  s     rP  )r-   )r-   )r-   )r-   )r-   )N)N)r   )NNr   )NN)Nr   r   )N)ru   )ru   )ru   )rt   )r   )TF)r-   r   r  )N)r  r   r   rc   r&   r  rM   r/  r   astr   r  r   ri   r   rb   ior   hashlibr   Zreportlab.lib.rltempfiler   r   r   r
   r   r   ZPILr   r   r  python_implementationZisPyPyr   r   r   r"   r%   r'   rF   rG   r)   r,   rL   r+   r4   ZstrTypesr3   r9   r;   r<   r=   r?   r@   r.   rA   rC   r]   r^   r_   rg   rk   rm   rn   rx   r]  Zrl_execrq   rv   r|   r   r   rH   r   r  r   r   r   r   r  r   r   r   Z__RL_DIRr   r   r   r   r   r   r}   r   r   NotImplementedErrorr   r   archiver   r6  r   r   r   r   r   r   r   r   r   r   r   r   splitextr   r   r   r   r   r   r   Z
haveImagesr   r   r   r  r  urllib.parser  r  urllib.requestr  r  r)  r0  r2  r4  r   r8  r   r;  getmtimemktimerE  rF  rG  rM  rO  rQ  rR  r  r  r  r  r  r  r  r  r  r
  r  r  r  r  r  r  r"  r5   r%  r&  r*  r+  tzinfor,  r8  rF  rK  rM  rP  r   r   r   r   <module>   sL  8








	
8
 


"
.,
	


:

   w
 

!
	
