
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
ct„j#~  ã               @   s^  d ddddddddd	d
dddg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Zddl	Z	ddl
Z
ddlZddlmZ ddlmZ ejdded�Zeƒ jejƒ G dd„ deƒZG dd„ deƒZejdd„ ƒZG dd„ deƒZdd „ Zdd„ Zdd„ Zdd„ ZG d d„ dƒZ d!Z!e
j"d"ƒZ#dOd$d%„Z$d&d'„ Z%e
j"d(e
j&ƒZ'd)d*„ Z(d+d,„ Z)d-d.„ Z*G d/d0„ d0ƒZ+G d1d2„ d2ƒZ,G d3d4„ d4e,ƒZ-d5d6„ Z.G d7d„ de/ƒZ0d8d9d:d;d<œZ1e2ƒ Z3G d=d>„ d>ƒZ4d?d@„ Z5e6e7e8eje9fZ:G dAdB„ dBe2ƒZ;dCdD„ Z<e=ee.e+e-dE�e>ee<e4e;dE�iZ?ddFedGœdHd
„Z@ddFedGœdId„ZAe=dFdJdKœdLd„ZBe=dJdFdMœdNd„ZCdS )PÚ	readPlistÚ
writePlistÚreadPlistFromBytesÚwritePlistToBytesÚPlistÚDataÚDictÚInvalidFileExceptionÚFMT_XMLÚ
FMT_BINARYÚloadÚdumpÚloadsÚdumpsé    N)ÚBytesIO)Úwarn)ÚParserCreateÚPlistFormatzFMT_XML FMT_BINARY)Úmodulec               @   s(   e Zd Zf Zdd„ Zdd„ Zdd„ ZdS )Ú_InternalDictc             C   s:   y| | }W n t k
r(   t|ƒ‚Y nX tdtdƒ |S )NzLAttribute access from plist dicts is deprecated, use d[key] notation insteadé   )ÚKeyErrorÚAttributeErrorr   ÚDeprecationWarning)ÚselfÚattrÚvalue© r   ú /usr/lib64/python3.6/plistlib.pyÚ__getattr__V   s    z_InternalDict.__getattr__c             C   s   t dtdƒ || |< d S )NzLAttribute access from plist dicts is deprecated, use d[key] notation insteadr   )r   r   )r   r   r   r   r   r   Ú__setattr___   s    z_InternalDict.__setattr__c             C   s8   y
| |= W n t k
r&   t|ƒ‚Y nX tdtdƒ d S )NzLAttribute access from plist dicts is deprecated, use d[key] notation insteadr   )r   r   r   r   )r   r   r   r   r   Ú__delattr__d   s    
z_InternalDict.__delattr__N)Ú__name__Ú
__module__Ú__qualname__Ú	__slots__r   r    r!   r   r   r   r   r   O   s   	r   c                   s   e Zd Z‡ fdd„Z‡  ZS )r   c                s   t dtdƒ tƒ jf |Ž d S )Nz?The plistlib.Dict class is deprecated, use builtin dict insteadr   )r   r   ÚsuperÚ__init__)r   Úkwargs)Ú	__class__r   r   r'   o   s    zDict.__init__)r"   r#   r$   r'   Ú__classcell__r   r   )r)   r   r   m   s   c          	   c   s2   t | tƒr(t| |ƒ�}|V  W d Q R X n| V  d S )N)Ú
isinstanceÚstrÚopen)Ú
pathOrFileÚmodeÚfpr   r   r   Ú_maybe_openu   s    
r1   c                   s0   e Zd Z‡ fdd„Zedd„ ƒZdd„ Z‡  ZS )r   c                s   t dtdƒ tƒ jf |Ž d S )NzJThe Plist class is deprecated, use the load() and dump() functions insteadr   )r   r   r&   r'   )r   r(   )r)   r   r   r'   „   s    zPlist.__init__c          	   C   s2   t |dƒ�}t|ƒ}W d Q R X | ƒ }|j|ƒ |S )NÚrb)r1   r   Úupdate)Úclsr.   r0   r   Zplistr   r   r   ÚfromFile‰   s
    
zPlist.fromFilec          
   C   s$   t |dƒ�}t| |ƒ W d Q R X d S )NÚwb)r1   r   )r   r.   r0   r   r   r   Úwrite’   s    zPlist.write)r"   r#   r$   r'   Úclassmethodr5   r7   r*   r   r   )r)   r   r      s   	c             C   s2   t dtdƒ t| dƒ�}t|d dtd�S Q R X d S )Nz8The readPlist function is deprecated, use load() insteadr   r2   F)ÚfmtÚuse_builtin_typesÚ	dict_type)r   r   r1   r   r   )r.   r0   r   r   r   r   ˜   s
    c             C   s8   t dtdƒ t|dƒ�}t| |tddd� W d Q R X d S )Nz9The writePlist function is deprecated, use dump() insteadr   r6   TF)r9   Ú	sort_keysÚskipkeys)r   r   r1   r   r	   )r   r.   r0   r   r   r   r   ¦   s    c             C   s    t dtdƒ tt| ƒd dtd�S )NzBThe readPlistFromBytes function is deprecated, use loads() insteadr   F)r9   r:   r;   )r   r   r   r   r   )Údatar   r   r   r   ³   s    c             C   s,   t dtdƒ tƒ }t| |tddd� |jƒ S )NzAThe writePlistToBytes function is deprecated, use dumps() insteadr   TF)r9   r<   r=   )r   r   r   r   r	   Úgetvalue)r   Úfr   r   r   r   ¿   s
    c               @   s:   e Zd Zdd„ Zedd„ ƒZddd„Zdd	„ Zd
d„ ZdS )r   c             C   s   t |tƒstdƒ‚|| _d S )Nzdata must be as bytes)r+   ÚbytesÚ	TypeErrorr>   )r   r>   r   r   r   r'   Ó   s    
zData.__init__c             C   s   | t |ƒƒS )N)Ú_decode_base64)r4   r>   r   r   r   Ú
fromBase64Ø   s    zData.fromBase64éL   c             C   s   t | j|ƒS )N)Ú_encode_base64r>   )r   Úmaxlinelengthr   r   r   ÚasBase64Þ   s    zData.asBase64c             C   s4   t || jƒr| j|jkS t |tƒr,| j|kS tS d S )N)r+   r)   r>   rA   ÚNotImplemented)r   Úotherr   r   r   Ú__eq__á   s
    

zData.__eq__c             C   s   d| j jt| jƒf S )Nz%s(%s))r)   r"   Úreprr>   )r   r   r   r   Ú__repr__é   s    zData.__repr__N)rE   )	r"   r#   r$   r'   r8   rD   rH   rK   rM   r   r   r   r   r   Ì   s
   
sŽ   <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
zv[\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0b\x0c\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f]rE   c             C   sT   |d d }g }x8t dt| ƒ|ƒD ]$}| ||| … }|jtj|ƒƒ q"W dj|ƒS )Né   é   r   ó    )ÚrangeÚlenÚappendÚbinasciiZ
b2a_base64Újoin)ÚsrG   Z
maxbinsizeÚpiecesÚiÚchunkr   r   r   rF     s    rF   c             C   s(   t | tƒrtj| jdƒƒS tj| ƒS d S )Nzutf-8)r+   r,   rT   Z
a2b_base64Úencode)rV   r   r   r   rC     s    
rC   z{(?P<year>\d\d\d\d)(?:-(?P<month>\d\d)(?:-(?P<day>\d\d)(?:T(?P<hour>\d\d)(?::(?P<minute>\d\d)(?::(?P<second>\d\d))?)?)?)?)?Zc             C   sN   d}t j| ƒjƒ }g }x,|D ]$}|| }|d kr2P |jt|ƒƒ qW tj|Ž S )NÚyearÚmonthÚdayÚhourÚminuteÚsecond)r[   r\   r]   r^   r_   r`   )Ú_dateParserÚmatchÚ	groupdictrS   ÚintÚdatetime)rV   ÚorderZgdZlstÚkeyÚvalr   r   r   Ú_date_from_string  s    
ri   c             C   s    d| j | j| j| j| j| jf S )Nz%04d-%02d-%02dT%02d:%02d:%02dZ)r[   r\   r]   r^   r_   r`   )Údr   r   r   Ú_date_to_string&  s    rk   c             C   sZ   t j| ƒ}|d k	rtdƒ‚| jddƒ} | jddƒ} | jddƒ} | jddƒ} | jd	d
ƒ} | S )Nz<strings can't contains control characters; use bytes insteadz
Ú
úú&z&amp;ú<z&lt;ú>z&gt;)Ú_controlCharPatÚsearchÚ
ValueErrorÚreplace)ÚtextÚmr   r   r   Ú_escape,  s    
rw   c               @   s¤   e Z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d!d"„ Zd#d$„ Zd%d&„ Zd'S )(Ú_PlistParserc             C   s"   g | _ d | _d | _|| _|| _d S )N)ÚstackÚcurrent_keyÚrootÚ_use_builtin_typesÚ
_dict_type)r   r:   r;   r   r   r   r'   9  s
    z_PlistParser.__init__c             C   s8   t ƒ | _| j| j_| j| j_| j| j_| jj|ƒ | j	S )N)
r   ÚparserÚhandle_begin_elementZStartElementHandlerÚhandle_end_elementZEndElementHandlerÚhandle_dataZCharacterDataHandlerZ	ParseFiler{   )r   Zfileobjr   r   r   Úparse@  s    


z_PlistParser.parsec             C   s*   g | _ t| d| d ƒ}|d k	r&||ƒ d S )NZbegin_)r>   Úgetattr)r   ÚelementÚattrsÚhandlerr   r   r   r   H  s    z!_PlistParser.handle_begin_elementc             C   s"   t | d| d ƒ}|d k	r|ƒ  d S )NZend_)rƒ   )r   r„   r†   r   r   r   r€   N  s    z_PlistParser.handle_end_elementc             C   s   | j j|ƒ d S )N)r>   rS   )r   r>   r   r   r   r�   S  s    z_PlistParser.handle_datac             C   sŒ   | j d k	rFt| jd ti ƒƒs.td| jj ƒ‚|| jd | j < d | _ nB| jsT|| _n4t| jd tg ƒƒsxtd| jj ƒ‚| jd j|ƒ d S )Né   zunexpected element at line %déÿÿÿÿrˆ   rˆ   rˆ   )	rz   r+   ry   Útypers   r~   ÚCurrentLineNumberr{   rS   )r   r   r   r   r   Ú
add_objectV  s    
z_PlistParser.add_objectc             C   s   dj | jƒ}g | _|S )NÚ )rU   r>   )r   r>   r   r   r   Úget_dataf  s    z_PlistParser.get_datac             C   s"   | j ƒ }| j|ƒ | jj|ƒ d S )N)r}   r‹   ry   rS   )r   r…   rj   r   r   r   Ú
begin_dictm  s    
z_PlistParser.begin_dictc             C   s*   | j rtd| j | jjf ƒ‚| jjƒ  d S )Nz%missing value for key '%s' at line %d)rz   rs   r~   rŠ   ry   Úpop)r   r   r   r   Úend_dictr  s    z_PlistParser.end_dictc             C   s:   | j st| jd ti ƒƒ r,td| jj ƒ‚| jƒ | _ d S )Nr‡   zunexpected key at line %drˆ   )rz   r+   ry   r‰   rs   r~   rŠ   r�   )r   r   r   r   Úend_keyx  s    z_PlistParser.end_keyc             C   s   g }| j |ƒ | jj|ƒ d S )N)r‹   ry   rS   )r   r…   Úar   r   r   Úbegin_array~  s    
z_PlistParser.begin_arrayc             C   s   | j jƒ  d S )N)ry   r�   )r   r   r   r   Ú	end_arrayƒ  s    z_PlistParser.end_arrayc             C   s   | j dƒ d S )NT)r‹   )r   r   r   r   Úend_true†  s    z_PlistParser.end_truec             C   s   | j dƒ d S )NF)r‹   )r   r   r   r   Ú	end_false‰  s    z_PlistParser.end_falsec             C   s   | j t| jƒ ƒƒ d S )N)r‹   rd   r�   )r   r   r   r   Úend_integerŒ  s    z_PlistParser.end_integerc             C   s   | j t| jƒ ƒƒ d S )N)r‹   Úfloatr�   )r   r   r   r   Úend_real�  s    z_PlistParser.end_realc             C   s   | j | jƒ ƒ d S )N)r‹   r�   )r   r   r   r   Ú
end_string’  s    z_PlistParser.end_stringc             C   s2   | j r| jt| jƒ ƒƒ n| jtj| jƒ ƒƒ d S )N)r|   r‹   rC   r�   r   rD   )r   r   r   r   Úend_data•  s    z_PlistParser.end_datac             C   s   | j t| jƒ ƒƒ d S )N)r‹   ri   r�   )r   r   r   r   Úend_dateœ  s    z_PlistParser.end_dateN)r"   r#   r$   r'   r‚   r   r€   r�   r‹   r�   rŽ   r�   r‘   r“   r”   r•   r–   r—   r™   rš   r›   rœ   r   r   r   r   rx   8  s&   rx   c               @   s8   e Zd Zddd„Zdd„ Zdd„ Zdd
d„Zdd„ Zd	S )Ú_DumbXMLWriterr   ú	c             C   s   || _ g | _|| _|| _d S )N)Úfilery   Ú_indent_levelÚindent)r   rŸ   Úindent_levelr¡   r   r   r   r'   ¡  s    z_DumbXMLWriter.__init__c             C   s,   | j j|ƒ | jd| ƒ |  jd7  _d S )Nz<%s>r‡   )ry   rS   Úwritelnr    )r   r„   r   r   r   Úbegin_element§  s    z_DumbXMLWriter.begin_elementc             C   s    |  j d8  _ | jd| ƒ d S )Nr‡   z</%s>)r    r£   )r   r„   r   r   r   Úend_element¬  s    z_DumbXMLWriter.end_elementNc             C   s8   |d k	r&t |ƒ}| jd|||f ƒ n| jd| ƒ d S )Nz<%s>%s</%s>z<%s/>)rw   r£   )r   r„   r   r   r   r   Úsimple_element²  s    z_DumbXMLWriter.simple_elementc             C   sH   |r8t |tƒr|jdƒ}| jj| j| j ƒ | jj|ƒ | jjdƒ d S )Nzutf-8ó   
)r+   r,   rZ   rŸ   r7   r    r¡   )r   Úliner   r   r   r£   º  s    

z_DumbXMLWriter.writeln)r   rž   )N)r"   r#   r$   r'   r¤   r¥   r¦   r£   r   r   r   r   r�      s
   

r�   c               @   sF   e Zd Zddd„Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Z	dS )Ú_PlistWriterr   ó   	r‡   TFc             C   s.   |r|j tƒ tj| |||ƒ || _|| _d S )N)r7   ÚPLISTHEADERr�   r'   Ú
_sort_keysÚ	_skipkeys)r   rŸ   r¢   r¡   ZwriteHeaderr<   r=   r   r   r   r'   Ç  s
    
z_PlistWriter.__init__c             C   s"   | j dƒ | j|ƒ | j dƒ d S )Nz<plist version="1.0">z</plist>)r£   Úwrite_value)r   r   r   r   r   r7   Ñ  s    

z_PlistWriter.writec             C   s4  t |tƒr| jd|ƒ �n|dkr0| jdƒ �n |dkrD| jdƒ nìt |tƒr‚d|  ko`dk n  rx| jd	d
| ƒ nt|ƒ‚n®t |tƒrž| jdt|ƒƒ n’t |tƒr´| j|ƒ n|t |t	ƒrÊ| j
|ƒ nft |ttfƒrä| j|ƒ nLt |tjƒ�r| jdt|ƒƒ n,t |ttfƒ�r | j|ƒ ntdt|ƒ ƒ‚d S )NÚstringTÚtrueFZfalser‡   é?   é@   Zintegerz%dÚrealZdatezunsupported type: %srˆ   lûÿÿÿ         l            )r+   r,   r¦   rd   ÚOverflowErrorr˜   rL   ÚdictÚ
write_dictr   Ú
write_datarA   Ú	bytearrayÚwrite_bytesre   rk   ÚtupleÚlistÚwrite_arrayrB   r‰   )r   r   r   r   r   r®   Ö  s.    





z_PlistWriter.write_valuec             C   s   | j |jƒ d S )N)r¹   r>   )r   r>   r   r   r   r·   û  s    z_PlistWriter.write_datac             C   s~   | j dƒ |  jd8  _tddt| jjdd	ƒ| j ƒ ƒ}x&t||ƒjdƒD ]}|rL| j|ƒ qLW |  jd7  _| j	dƒ d S )
Nr>   r‡   é   rE   rª   ó    é   r§   s           )
r¤   r    ÚmaxrR   r¡   rt   rF   Úsplitr£   r¥   )r   r>   rG   r¨   r   r   r   r¹   þ  s    
z_PlistWriter.write_bytesc             C   s†   |rx| j dƒ | jr"t|jƒ ƒ}n|jƒ }x@|D ]8\}}t|tƒsR| jrJq0tdƒ‚| jd|ƒ | j	|ƒ q0W | j
dƒ n
| jdƒ d S )Nrµ   zkeys must be stringsrg   )r¤   r¬   ÚsortedÚitemsr+   r,   r­   rB   r¦   r®   r¥   )r   rj   rÃ   rg   r   r   r   r   r¶     s    

z_PlistWriter.write_dictc             C   s@   |r2| j dƒ x|D ]}| j|ƒ qW | jdƒ n
| jdƒ d S )NÚarray)r¤   r®   r¥   r¦   )r   rÄ   r   r   r   r   r¼     s    

z_PlistWriter.write_arrayN)r   rª   r‡   TF)
r"   r#   r$   r'   r7   r®   r·   r¹   r¶   r¼   r   r   r   r   r©   Æ  s    
%r©   c             C   s”   d	}x|D ]}| j |ƒr
dS q
W xntjdftjdftjdffD ]N\}}| j |ƒsRq>x8|D ]0}||jdƒj|ƒ }| d t|ƒ… |krXdS qXW q>W dS )
Nó   <?xmló   <plistTzutf-8z	utf-16-bez	utf-16-leÚasciiF)rÅ   rÆ   )Ú
startswithÚcodecsÚBOM_UTF8ÚBOM_UTF16_BEÚBOM_UTF16_LEÚdecoderZ   rR   )ÚheaderÚprefixesZpfxZbomÚencodingÚstartÚprefixr   r   r   Ú_is_fmt_xml*  s    



rÓ   c               @   s   e Zd Zddd„ZdS )r   úInvalid filec             C   s   t j| |ƒ d S )N)rs   r'   )r   Úmessager   r   r   r'   L  s    zInvalidFileException.__init__N)rÔ   )r"   r#   r$   r'   r   r   r   r   r   K  s   ÚBÚHÚLÚQ)r‡   r   rN   r¿   c               @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )Ú_BinaryPlistParserc             C   s   || _ || _d S )N)r|   r}   )r   r:   r;   r   r   r   r'   [  s    z_BinaryPlistParser.__init__c             C   s¨   y||| _ | j jdtjƒ | j jdƒ}t|ƒdkr6tƒ ‚tjd|ƒ\}| _	}}}| j j|ƒ | j
||ƒ| _tg| | _| j|ƒS  tttjttfk
r¢   tƒ ‚Y nX d S )Né    z>6xBBQQQiàÿÿÿ)Ú_fpÚseekÚosÚSEEK_ENDÚreadrR   r   ÚstructÚunpackÚ	_ref_sizeÚ
_read_intsÚ_object_offsetsÚ
_undefinedÚ_objectsÚ_read_objectÚOSErrorÚ
IndexErrorÚerrorr´   rs   )r   r0   ÚtrailerÚoffset_sizeÚnum_objectsÚ
top_objectÚoffset_table_offsetr   r   r   r‚   _  s    
z_BinaryPlistParser.parsec             C   sL   |dkrH| j jdƒd d@ }d|> }dt|  }tj|| j j|ƒƒd S |S )Né   r‡   r   rO   rp   )rÜ   rà   Ú_BINARY_FORMATrá   râ   )r   ÚtokenLrv   rV   r@   r   r   r   Ú	_get_sizex  s    z_BinaryPlistParser._get_sizec                sv   | j jˆ| ƒ‰ ˆtkr2tjd|› tˆ › �ˆ ƒS ˆ sHtˆ ƒˆ| krNtƒ ‚t‡ ‡fdd„tdˆ| ˆƒD ƒƒS d S )Nrp   c             3   s&   | ]}t jˆ ||ˆ … d ƒV  qdS )ÚbigN)rd   Ú
from_bytes)Ú.0rX   )r>   Úsizer   r   ú	<genexpr>‰  s   z0_BinaryPlistParser._read_ints.<locals>.<genexpr>r   )	rÜ   rà   rò   rá   râ   rR   r   rº   rQ   )r   Únrø   r   )r>   rø   r   rä   ‚  s    z_BinaryPlistParser._read_intsc             C   s   | j || jƒS )N)rä   rã   )r   rú   r   r   r   Ú
_read_refsŒ  s    z_BinaryPlistParser._read_refsc                sø  ˆ j | }|tk	r|S ˆ j| }ˆ jj|ƒ ˆ jjdƒd }|d@ |d@  }}|dkr^d }�nŒ|dkrnd}�n||dkr~d}�nl|dkrŽd	}�n\|d
krºtjˆ jjd|> ƒd|dkd�}�n0|dkrÞtj	dˆ jjdƒƒd }�n|dk�rtj	dˆ jjdƒƒd }�næ|dk�rDtj	dˆ jjdƒƒd }t
j
dddƒt
j|d� }�n¦|dk�rŒˆ j|ƒ}ˆ jj|ƒ}t|ƒ|k�rxtƒ ‚ˆ j�sêt|ƒ}�n^|dk�rÎˆ j|ƒ}ˆ jj|ƒ}	t|	ƒ|k�rÀtƒ ‚|	jdƒ}�n|dk�rˆ j|ƒd }ˆ jj|ƒ}	t|	ƒ|k�rtƒ ‚|	jdƒ}nØ|dk�rXˆ j|ƒ}ˆ j|ƒ}
g }|ˆ j |< |j‡ fdd„|
D ƒƒ n’|dk�räˆ j|ƒ}ˆ j|ƒ}ˆ j|ƒ}
ˆ jƒ }|ˆ j |< y2x,t||
ƒD ]\}}ˆ j|ƒ|ˆ j|ƒ< �q W W n tk
�rà   tƒ ‚Y nX ntƒ ‚|ˆ j |< |S ) Nr‡   r   éð   rñ   r¿   Fé	   TrP   r½   rõ   rO   )Úsignedé"   z>frN   é#   z>dé3   iÑ  )Zsecondsr²   éP   rÇ   é`   r   zutf-16beé    c             3   s   | ]}ˆ j |ƒV  qd S )N)rè   )r÷   Úx)r   r   r   rù   Ü  s    z2_BinaryPlistParser._read_object.<locals>.<genexpr>éÐ   )rç   ræ   rå   rÜ   rÝ   rà   rd   rö   rá   râ   re   Z	timedeltarô   rR   r   r|   r   rÍ   rû   Úextendr}   Úziprè   rB   )r   ÚrefÚresultÚoffsetÚtokenZtokenHró   r@   rV   r>   Zobj_refsZkey_refsÚkÚor   )r   r   rè   �  s‚    


















z_BinaryPlistParser._read_objectN)	r"   r#   r$   r'   r‚   rô   rä   rû   rè   r   r   r   r   rÚ   S  s   

rÚ   c             C   s0   | dk rdS | dk rdS | d> d> r(dS dS d S )	Nr‡   r¿   r½   r   rÛ   rN   é   i   r   )Úcountr   r   r   Ú_count_to_sizeõ  s    r  c               @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )Ú_BinaryPlistWriterc             C   s   || _ || _|| _d S )N)rÜ   r¬   r­   )r   r0   r<   r=   r   r   r   r'     s    z_BinaryPlistWriter.__init__c       
      C   sä   g | _ i | _i | _| j|ƒ t| j ƒ}dg| | _t|ƒ| _t| j | _	| j
jdƒ x| j D ]}| j|ƒ q\W | j|ƒ}| j
jƒ }t|ƒ}dt| |  }| j
jtj|f| jžŽ ƒ d}||| j|||f}	| j
jtjd|	žŽ ƒ d S )Nr   s   bplist00rp   ú	>5xBBBQQQ)r  )Ú_objlistÚ	_objtableÚ_objidtableÚ_flattenrR   rå   r  rã   rò   Ú_ref_formatrÜ   r7   Ú_write_objectÚ
_getrefnumÚtellrá   Úpack)
r   r   rî   Úobjrï   rð   rí   Zoffset_formatZsort_versionrì   r   r   r   r7   
  s(    





z_BinaryPlistWriter.writec       	      C   s~  t |tƒr"t|ƒ|f| jkrZd S n8t |tƒrHt|jƒ|jf| jkrZd S nt|ƒ| jkrZd S t| j	ƒ}| j	j
|ƒ t |tƒrŽ|| jt|ƒ|f< n0t |tƒr°|| jt|jƒ|jf< n|| jt|ƒ< t |tƒ�rPg }g }|jƒ }| jrèt|ƒ}xB|D ]:\}}t |tƒ�s| j�rqîtdƒ‚|j
|ƒ |j
|ƒ qîW xLtj||ƒD ]}| j|ƒ �q:W n*t |ttfƒ�rzx|D ]}| j|ƒ �qfW d S )Nzkeys must be strings)r+   Ú_scalarsr‰   r  r   r>   Úidr  rR   r  rS   rµ   rÃ   r¬   rÂ   r,   r­   rB   Ú	itertoolsÚchainr  r»   rº   )	r   r   ZrefnumÚkeysÚvaluesrÃ   r  Úvr  r   r   r   r  7  sB    






z_BinaryPlistWriter._flattenc             C   sN   t |tƒr| jt|ƒ|f S t |tƒr<| jt|jƒ|jf S | jt|ƒ S d S )N)r+   r  r  r‰   r   r>   r  r  )r   r   r   r   r   r  g  s
    

z_BinaryPlistWriter._getrefnumc             C   s´   |dk r"| j jtjd||B ƒƒ nŽ|dk rH| j jtjd|dB d|ƒƒ nh|dk rn| j jtjd|dB d|ƒƒ nB|dk r”| j jtjd
|dB d|ƒƒ n| j jtjd|dB d|ƒƒ d S )Nrñ   z>Br‡   r¿   z>BBBr½   z>BBHé   rÛ   z>BBLé   z>BBQé   r  i   l        )rÜ   r7   rá   r  )r   r  rø   r   r   r   Ú_write_sizeo  s    z_BinaryPlistWriter._write_sizec                sè  ˆ j |ƒ}ˆ jjƒ ˆ j|< |d kr2ˆ jjdƒ �n²|dkrJˆ jjdƒ �nš|dkrbˆ jjdƒ �n‚t|tƒ�rl|dk r´yˆ jjtjdd|ƒƒ W n  tj	k
r°   t
|ƒd ‚Y nX n´|d'k rÔˆ jjtjdd|ƒƒ n”|d(k rôˆ jjtjdd|ƒƒ nt|d)k �rˆ jjtjdd|ƒƒ nR|d*k �r8ˆ jjtjdd|ƒƒ n0|d+k �r`ˆ jjd|jdddd� ƒ nt
|ƒ‚�nxt|tƒ�r’ˆ jjtjdd|ƒƒ �nRt|tjƒ�rÐ|tjdd	d	ƒ jƒ }ˆ jjtjdd|ƒƒ �nt|tƒ�r ˆ jdt|jƒƒ ˆ jj|jƒ �nät|ttfƒ�r0ˆ jdt|ƒƒ ˆ jj|ƒ �n´t|tƒ�r y|jdƒ}ˆ jdt|ƒƒ W n4 tk
�rŽ   |jdƒ}ˆ jdt|ƒd  ƒ Y nX ˆ jj|ƒ �nDt|ttfƒ�rú‡ fd!d"„|D ƒ}t|ƒ}ˆ jd#|ƒ ˆ jjtjd$ˆ j|  f|žŽ ƒ nêt|tƒ�rÜg g  }}ˆ j�r&t|jƒ ƒ}	n|jƒ }	xR|	D ]J\}
}t|
tƒ�s\ˆ j�rT�q4t d%ƒ‚|j!ˆ j |
ƒƒ |j!ˆ j |ƒƒ �q4W t|ƒ}ˆ jd&|ƒ ˆ jjtjd$ˆ j|  f|žŽ ƒ ˆ jjtjd$ˆ j|  f|žŽ ƒ nt |ƒ‚d S ),Nó    Fó   Trª   r   z>Bqr'  r‡   r¿   z>BBr½   z>BHr%  rÛ   z>BLr&  r±   z>BQr²   ó   rõ   )rþ   z>Bdr   iÑ  r  rÇ   r  zutf-16ber  r   c                s   g | ]}ˆ j |ƒ‘qS r   )r  )r÷   r  )r   r   r   ú
<listcomp>¸  s    z4_BinaryPlistWriter._write_object.<locals>.<listcomp>r  rp   zkeys must be stringsr  r  i   l        l            l            )"r  rÜ   r  rå   r7   r+   rd   rá   r  rë   r´   Úto_bytesr˜   re   Ztotal_secondsr   r(  rR   r>   rA   r¸   r,   rZ   ÚUnicodeEncodeErrorr»   rº   r  rµ   r¬   rÂ   rÃ   r­   rB   rS   )r   r   r	  r@   ÚtZrefsrV   ZkeyRefsZvalRefsZ	rootItemsr  r$  r   )r   r   r    s„    





$
"$z _BinaryPlistWriter._write_objectN)	r"   r#   r$   r'   r7   r  r  r(  r  r   r   r   r   r    s   -0r  c             C   s   | d d… dkS )Nr¿   s   bplist00r   )rÎ   r   r   r   Ú_is_fmt_binaryÖ  s    r0  )Údetectr~   ÚwriterT)r9   r:   r;   c            C   sn   |d krL| j dƒ}| jdƒ x:tjƒ D ]}|d |ƒr&|d }P q&W tƒ ‚nt| d }|||d�}|j| ƒS )NrÛ   r   r1  r~   )r:   r;   )rà   rÝ   Ú_FORMATSr#  r   r‚   )r0   r9   r:   r;   rÎ   ÚinfoÚPÚpr   r   r   r   ì  s    

c            C   s   t | ƒ}t||||d�S )N)r9   r:   r;   )r   r   )r   r9   r:   r;   r0   r   r   r   r     s    F)r9   r<   r=   c            C   s:   |t krtd|f ƒ‚t | d |||d�}|j| ƒ d S )NzUnsupported format: %rr2  )r<   r=   )r3  rs   r7   )r   r0   r9   r<   r=   r2  r   r   r   r     s    )r9   r=   r<   c            C   s    t ƒ }t| ||||d� |jƒ S )N)r9   r=   r<   )r   r   r?   )r   r9   r=   r<   r0   r   r   r   r     s    )rE   )DÚ__all__rT   rÉ   Ú
contextlibre   ÚenumÚior   r   rÞ   Úrerá   Úwarningsr   Zxml.parsers.expatr   ÚEnumr"   r   Úglobalsr3   Ú__members__rµ   r   r   Úcontextmanagerr1   r   r   r   r   r   r   r«   Úcompilerq   rF   rC   ÚASCIIra   ri   rk   rw   rx   r�   r©   rÓ   rs   r   rò   Úobjectræ   rÚ   r  r,   rd   r˜   rA   r  r  r0  r	   r
   r3  r   r   r   r   r   r   r   r   Ú<module>1   sx   

0
	
h&d! # S	
	