o
    svXjŽ¶  ã                   @   sF  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
mZmZmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ e e¡Ze d¡jZdZ ddddddddddddddddœZ!e d¡Z"ej#Z$	 de$ Z%	 G dd „ d eƒZ&G d!d"„ d"eƒZ'd#d$„ Z(d%d&„ Z)dUd'd(„Z*G d)d*„ d*ƒZ+G d+d,„ d,e,ƒZ-G d-d.„ d.ƒZ.G d/d0„ d0e+ƒZ/d1d2„ Z0G d3d4„ d4ejƒZ1d5d6d7d8d9d:d;d;d<d=d>d?d@dAdBœZ2dCdD„ Z3G dEdF„ dFƒZ4G dGdH„ dHƒZ5dIdJ„ Z6dKdL„ Z7e3dMfdNdO„Z8dPdQ„ Z9e	 :e1j;e1e0¡ e	 <e1j;e8¡ e	 =e1j;e7¡ e	 >e1j;dRdSg¡ e	 ?e1j;dT¡ dS )Vé    N)ÚIntEnumé   )ÚImageÚ
ImageChopsÚ	ImageFileÚImagePaletteÚImageSequence)Úi16be)Úi32be)Úo8)Úo16be)Úo32be)Ú	deprecates   \w\w\w\ws   ‰PNG

)Ú1r   )ÚLúL;2)r   úL;4)r   r   )ÚIúI;16B)ÚRGBr   )r   zRGB;16B)ÚPúP;1)r   úP;2)r   úP;4)r   r   )ÚLAr   )ÚRGBAzLA;16B)r   r   )r   zRGBA;16B))r   r   )é   r   )é   r   )é   r   )é   r   )r   r   )r   r   )r   é   )r   r    )r   r    )r   r    )r   r   )r   r   )r   é   )r   r!   s   ^ÿ* ÿ*$é@   c                   @   s   e Zd ZdZ	 dZ	 dZdS )ÚDisposalr   r   r   N)Ú__name__Ú
__module__Ú__qualname__ÚOP_NONEÚOP_BACKGROUNDÚOP_PREVIOUS© r*   r*   úO/var/www/html/myproject/venv/lib/python3.10/site-packages/PIL/PngImagePlugin.pyr#   c   s    r#   c                   @   s   e Zd ZdZ	 dZdS )ÚBlendr   r   N)r$   r%   r&   Ú	OP_SOURCEÚOP_OVERr*   r*   r*   r+   r,   x   s
    r,   c                 C   s„   t dtdi ¡ D ],\}}|  |¡r4| t|ƒd … } | |jv r4t|› | › �d|j› d| › �ƒ ||    S qdt› d| › d�}t|ƒ‚)NÚAPNG_DISPOSE_ÚAPNG_BLEND_é
   Ú.zmodule 'z' has no attribute 'ú')	r#   r,   ÚitemsÚ
startswithÚlenÚ__members__r   r$   ÚAttributeError)ÚnameÚenumÚprefixÚmsgr*   r*   r+   Ú__getattr__†   s   

 €r=   c                 C   s*   t  ¡ }| | t¡}|jrd}t|ƒ‚|S )NzDecompressed Data Too Large)ÚzlibÚdecompressobjÚ
decompressÚMAX_TEXT_CHUNKÚunconsumed_tailÚ
ValueError)ÚsÚdobjÚ	plaintextr<   r*   r*   r+   Ú_safe_zlib_decompress‘   s   rG   c                 C   s   t  | |¡d@ S )Nl   ÿÿ )r>   Úcrc32)ÚdataÚseedr*   r*   r+   Ú_crc32š   ó   rK   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d„ZdS )ÚChunkStreamc                 C   s   || _ g | _d S ©N)ÚfpÚqueue©ÚselfrO   r*   r*   r+   Ú__init__£   ó   
zChunkStream.__init__c                 C   s‚   d}| j r| j  ¡ \}}}| j |¡ n| j d¡}|dd… }| j ¡ }t|ƒ}t|ƒs<tj	s<dt
|ƒ› d�}t|ƒ‚|||fS )z.Fetch a new chunk. Returns header information.Nr   r   zbroken PNG file (chunk ú))rP   ÚpoprO   ÚseekÚreadÚtellÚi32Úis_cidr   ÚLOAD_TRUNCATED_IMAGESÚreprÚSyntaxError)rR   ÚcidÚposÚlengthrD   r<   r*   r*   r+   rX   §   s   

zChunkStream.readc                 C   s   | S rN   r*   ©rR   r*   r*   r+   Ú	__enter__»   ó   zChunkStream.__enter__c                 G   s   |   ¡  d S rN   )Úclose)rR   Úargsr*   r*   r+   Ú__exit__¾   s   zChunkStream.__exit__c                 C   s   d  | _ | _d S rN   )rP   rO   rb   r*   r*   r+   re   Á   rL   zChunkStream.closec                 C   s   | j  |||f¡ d S rN   )rP   Úappend©rR   r_   r`   ra   r*   r*   r+   ÚpushÄ   s   zChunkStream.pushc                 C   s*   t  d|||¡ t| d| d¡ ƒ||ƒS )z"Call the appropriate chunk handlerzSTREAM %r %s %sÚchunk_Úascii)ÚloggerÚdebugÚgetattrÚdecoderi   r*   r*   r+   ÚcallÇ   s   zChunkStream.callc              
   C   s    t jr|d d? d@ r|  ||¡ dS z"t|t|ƒƒ}t| j d¡ƒ}||kr3dt|ƒ› d�}t|ƒ‚W dS  t	j
yO } zdt|ƒ› d�}t|ƒ|‚d}~ww )	zRead and verify checksumr   é   r   Nr   z(broken PNG file (bad header checksum in rU   z(broken PNG file (incomplete checksum in )r   r\   Úcrc_skiprK   rZ   rO   rX   r]   r^   ÚstructÚerror)rR   r_   rI   Úcrc1Úcrc2r<   Úer*   r*   r+   ÚcrcÍ   s   þ
€þzChunkStream.crcc                 C   s   | j  d¡ dS )zRead checksumr   N)rO   rX   )rR   r_   rI   r*   r*   r+   rs   á   s   zChunkStream.crc_skipó   IENDc              
   C   sr   g }	 z	|   ¡ \}}}W n tjy  } zd}t|ƒ|‚d }~ww ||kr(	 |S |  |t | j|¡¡ | |¡ q)NTztruncated PNG file)	rX   rt   ru   ÚOSErrorry   r   Ú
_safe_readrO   rh   )rR   ÚendchunkÚcidsr_   r`   ra   rx   r<   r*   r*   r+   Úverifyæ   s   
€þý
özChunkStream.verifyN)rz   )r$   r%   r&   rS   rX   rc   rg   re   rj   rq   ry   rs   r   r*   r*   r*   r+   rM   ¢   s    rM   c                   @   s   e Zd ZdZeddd„ƒZdS )ÚiTXtzq
    Subclass of string to allow iTXt chunks to look like strings while
    keeping their extra information

    Nc                 C   s   t  | |¡}||_||_|S )zÇ
        :param cls: the class to use when creating the instance
        :param text: value for this key
        :param lang: language code
        :param tkey: UTF-8 version of the key name
        )ÚstrÚ__new__ÚlangÚtkey)ÚclsÚtextrƒ   r„   rR   r*   r*   r+   r‚     s   	ziTXt.__new__)NN)r$   r%   r&   Ú__doc__Ústaticmethodr‚   r*   r*   r*   r+   r€   û   s    r€   c                   @   s6   e Zd ZdZdd„ Zddd„Zddd	„Zdd
d„ZdS )ÚPngInfoz<
    PNG chunk container (for use with save(pnginfo=))

    c                 C   s
   g | _ d S rN   )Úchunksrb   r*   r*   r+   rS     s   
zPngInfo.__init__Fc                 C   s*   ||g}|r|  d¡ | j  t|ƒ¡ dS )a"  Appends an arbitrary chunk. Use with caution.

        :param cid: a byte string, 4 bytes long.
        :param data: a byte string of the encoded data
        :param after_idat: for use with private chunks. Whether the chunk
                           should be written after IDAT

        TN)rh   rŠ   Útuple)rR   r_   rI   Ú
after_idatÚchunkr*   r*   r+   Úadd  s   

zPngInfo.addÚ c                 C   s²   t |tƒs| dd¡}t |tƒs| dd¡}t |tƒs!| dd¡}t |tƒs,| dd¡}|rE|  d|d | d | d t |¡ ¡ dS |  d|d | d | d | ¡ dS )	zùAppends an iTXt chunk.

        :param key: latin-1 encodable text key name
        :param value: value for this key
        :param lang: language code
        :param tkey: UTF-8 version of the key name
        :param zip: compression flag

        úlatin-1Ústrictúutf-8ó   iTXts     ó    s      N)Ú
isinstanceÚbytesÚencoderŽ   r>   Úcompress)rR   ÚkeyÚvaluerƒ   r„   Úzipr*   r*   r+   Úadd_itxt)  s   



 þ(zPngInfo.add_itxtc                 C   s°   t |tƒr| j|||j|j|d�S t |tƒs0z| dd¡}W n ty/   | j|||d� Y S w t |tƒs;| dd¡}|rL|  d|d t	 
|¡ ¡ dS |  d|d | ¡ dS )	zæAppends a text chunk.

        :param key: latin-1 encodable text key name
        :param value: value for this key, text or an
           :py:class:`PIL.PngImagePlugin.iTXt` instance
        :param zip: compression flag

        )r›   r�   r‘   ó   zTXtó     ó   tEXtr”   N)r•   r€   rœ   rƒ   r„   r–   r—   ÚUnicodeErrorrŽ   r>   r˜   )rR   r™   rš   r›   r*   r*   r+   Úadd_textE  s   
	
ÿ
zPngInfo.add_textN©F)r�   r�   F)r$   r%   r&   r‡   rS   rŽ   rœ   r¡   r*   r*   r*   r+   r‰     s    

r‰   c                       s¼   e Zd Z‡ f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'd(„ Zd)d*„ Z‡  ZS )+Ú	PngStreamc                    sR   t ƒ  |¡ i | _i | _d| _d | _d | _d | _d | _d | _	d | _
d | _d| _d S )N©r   r   r   )ÚsuperrS   Úim_infoÚim_textÚim_sizeÚim_modeÚim_tileÚ
im_paletteÚim_custom_mimetypeÚim_n_framesÚ_seq_numÚrewind_stateÚtext_memoryrQ   ©Ú	__class__r*   r+   rS   f  s   
zPngStream.__init__c                 C   s2   |  j |7  _ | j tkrd| j › d�}t|ƒ‚d S )Nz%Too much memory used in text chunks: z>MAX_TEXT_MEMORY)r°   ÚMAX_TEXT_MEMORYrC   )rR   Úchunklenr<   r*   r*   r+   Úcheck_text_memoryw  s   
ÿÿûzPngStream.check_text_memoryc                 C   s   | j  ¡ | j| jdœ| _d S )N)ÚinfoÚtileÚseq_num)r¦   Úcopyrª   r®   r¯   rb   r*   r*   r+   Úsave_rewind€  s   ýzPngStream.save_rewindc                 C   s(   | j d | _| j d | _| j d | _d S )Nr¶   r·   r¸   )r¯   r¦   rª   r®   rb   r*   r*   r+   Úrewind‡  s   zPngStream.rewindc                 C   s¾   t  | j|¡}| d¡}t d|d |… ¡ t d|| ¡ || }|dkr0d|› d�}t|ƒ‚zt||d d … ƒ}W n tyL   t j	rId }n‚ Y n t
jyW   d }Y nw || jd< |S )	Nr”   ziCCP profile name %rzCompression method %sr   úUnknown compression method z in iCCP chunkr   Úicc_profile)r   r|   rO   Úfindrm   rn   r^   rG   rC   r\   r>   ru   r¦   )rR   r`   ra   rD   ÚiÚcomp_methodr<   r½   r*   r*   r+   Ú
chunk_iCCPŒ  s(   
þÿ
zPngStream.chunk_iCCPc                 C   s    t  | j|¡}|dk rt jr|S d}t|ƒ‚t|dƒt|dƒf| _zt|d |d f \| _| _	W n	 t
y:   Y nw |d rDd| jd	< |d
 rNd}t|ƒ‚|S )Né   zTruncated IHDR chunkr   r   r   é	   é   r   Ú	interlaceé   zunknown filter category)r   r|   rO   r\   rC   rZ   r¨   Ú_MODESr©   Ú
im_rawmodeÚ	Exceptionr¦   r^   ©rR   r`   ra   rD   r<   r*   r*   r+   Ú
chunk_IHDR§  s$    ÿ
zPngStream.chunk_IHDRc                 C   s\   d| j v rd| j d || jfg}n| jd urd| j d< dd| j || jfg}|| _|| _t‚)NÚbboxr›   TÚdefault_imager¤   )r¦   rÈ   r­   r¨   rª   Úim_idatÚEOFError)rR   r`   ra   r·   r*   r*   r+   Ú
chunk_IDAT»  s   


zPngStream.chunk_IDATc                 C   s   t ‚rN   )rÏ   )rR   r`   ra   r*   r*   r+   Ú
chunk_IENDÇ  s   zPngStream.chunk_IENDc                 C   s&   t  | j|¡}| jdkrd|f| _|S )Nr   r   )r   r|   rO   r©   r«   ©rR   r`   ra   rD   r*   r*   r+   Ú
chunk_PLTEË  s   

zPngStream.chunk_PLTEc                 C   sš   t  | j|¡}| jdkr(t |¡r!| d¡}|dkr|| jd< |S || jd< |S | jdv r6t|ƒ| jd< |S | jdkrKt|ƒt|dƒt|dƒf| jd< |S )	Nr   r”   r   Útransparency©r   r   r   r   r   r   )	r   r|   rO   r©   Ú_simple_paletteÚmatchr¾   r¦   Úi16)rR   r`   ra   rD   r¿   r*   r*   r+   Ú
chunk_tRNSÒ  s   



	
û
ü
þ zPngStream.chunk_tRNSc                 C   s$   t  | j|¡}t|ƒd | jd< |S )Nç     jø@Úgamma)r   r|   rO   rZ   r¦   rÒ   r*   r*   r+   Ú
chunk_gAMAæ  s   zPngStream.chunk_gAMAc                 C   sB   t  | j|¡}t dt|ƒd  |¡}tdd„ |D ƒƒ| jd< |S )Nz>%dIr   c                 s   s   � | ]}|d  V  qdS )rÚ   Nr*   )Ú.0Úeltr*   r*   r+   Ú	<genexpr>ò  s   € z'PngStream.chunk_cHRM.<locals>.<genexpr>Úchromaticity)r   r|   rO   rt   Úunpackr6   r‹   r¦   )rR   r`   ra   rD   Úraw_valsr*   r*   r+   Ú
chunk_cHRMì  s   zPngStream.chunk_cHRMc                 C   s>   t  | j|¡}|dk rt jr|S d}t|ƒ‚|d | jd< |S )Nr   zTruncated sRGB chunkr   Úsrgb)r   r|   rO   r\   rC   r¦   rÊ   r*   r*   r+   Ú
chunk_sRGBõ  s   zPngStream.chunk_sRGBc           	      C   sŠ   t  | j|¡}|dk rt jr|S d}t|ƒ‚t|dƒt|dƒ}}|d }|dkr8|d |d f}|| jd< |S |dkrC||f| jd	< |S )
NrÃ   zTruncated pHYs chunkr   r   r   r   ç¦
F%uš?ÚdpiÚaspect)r   r|   rO   r\   rC   rZ   r¦   )	rR   r`   ra   rD   r<   ÚpxÚpyÚunitrç   r*   r*   r+   Ú
chunk_pHYs  s   
þzPngStream.chunk_pHYsc                 C   sŒ   t  | j|¡}z
| dd¡\}}W n ty   |}d}Y nw |rD| dd¡}| dd¡}|dkr3|n|| j|< || j|< |  t	|ƒ¡ |S )Nr”   r   ó    r�   r‘   ÚreplaceÚexif)
r   r|   rO   ÚsplitrC   rp   r¦   r§   rµ   r6   )rR   r`   ra   rD   ÚkÚvÚv_strr*   r*   r+   Ú
chunk_tEXt  s   ý
zPngStream.chunk_tEXtc                 C   sú   t  | j|¡}z
| dd¡\}}W n ty   |}d}Y nw |r&|d }nd}|dkr6d|› d�}t|ƒ‚z
t|dd … ƒ}W n tyP   t jrMd}n‚ Y n tj	y[   d}Y nw |r{| 
dd¡}| 
dd	¡}| | j|< | j|< |  t|ƒ¡ |S )
Nr”   r   rí   r   r¼   z in zTXt chunkr�   r‘   rî   )r   r|   rO   rð   rC   r^   rG   r\   r>   ru   rp   r¦   r§   rµ   r6   )rR   r`   ra   rD   rñ   rò   rÀ   r<   r*   r*   r+   Ú
chunk_zTXt)  s:   þ
þÿzPngStream.chunk_zTXtc                 C   sl  t  | j|¡ }}z
| dd¡\}}W n ty   | Y S w t|ƒdk r'|S |d |d |dd … }}}z| dd¡\}}	}
W n tyM   | Y S w |dkry|dkrwzt|
ƒ}
W n tyk   t jrj| Y S ‚  tj	yv   | Y S w |S z| 
dd¡}| 
dd¡}|	 
dd¡}	|
 
dd¡}
W n tyž   | Y S w t|
||	ƒ | j|< | j|< |  t|
ƒ¡ |S )Nr”   r   r   r   r�   r‘   r’   )r   r|   rO   rð   rC   r6   rG   r\   r>   ru   rp   r    r€   r¦   r§   rµ   )rR   r`   ra   ÚrrD   rñ   ÚcfÚcmrƒ   Útkrò   r*   r*   r+   Ú
chunk_iTXtK  sJ   ÿ ÿÿÿzPngStream.chunk_iTXtc                 C   s    t  | j|¡}d| | jd< |S )Nó   Exif  rï   )r   r|   rO   r¦   rÒ   r*   r*   r+   Ú
chunk_eXIfs  s   zPngStream.chunk_eXIfc                 C   s�   t  | j|¡}|dk rt jr|S d}t|ƒ‚| jd ur%d | _t d¡ |S t|ƒ}|dks1|dkr8t d¡ |S || _t|dƒ| j	d< d| _
|S )	Nr   z"APNG contains truncated acTL chunkz4Invalid APNG, will use default PNG image if possibler   l        r   Úloopz
image/apng)r   r|   rO   r\   rC   r­   ÚwarningsÚwarnrZ   r¦   r¬   )rR   r`   ra   rD   r<   Ún_framesr*   r*   r+   Ú
chunk_acTLy  s$   


zPngStream.chunk_acTLc                 C   s@  t  | j|¡}|dk rt jr|S d}t|ƒ‚t|ƒ}| jd u r#|dks/| jd ur5| j|d kr5d}t|ƒ‚|| _t|dƒt|dƒ}}t|dƒt|d	ƒ}}	| j\}
}|| |
ks_|	| |kred
}t|ƒ‚||	|| |	| f| j	d< t
|dƒt
|dƒ}}|dkrƒd}t|ƒt|ƒ d | j	d< |d | j	d< |d | j	d< |S )Né   z"APNG contains truncated fcTL chunkr   r   ú#APNG contains frame sequence errorsr   r   rÄ   r   zAPNG contains invalid framesrÌ   é   é   éd   éè  Údurationé   Údisposalé   Úblend)r   r|   rO   r\   rC   rZ   r®   r^   r¨   r¦   rØ   Úfloat)rR   r`   ra   rD   r<   ÚseqÚwidthÚheightré   rê   Úim_wÚim_hÚ	delay_numÚ	delay_denr*   r*   r+   Ú
chunk_fcTL�  s4   
zPngStream.chunk_fcTLc                 C   sv   |dk rt jrt  | j|¡}|S d}t|ƒ‚t  | jd¡}t|ƒ}| j|d kr.d}t|ƒ‚|| _|  |d |d ¡S )Nr   z"APNG contains truncated fDAT chunkr   r  )	r   r\   r|   rO   rC   rZ   r®   r^   rÐ   )rR   r`   ra   rD   r<   r  r*   r*   r+   Ú
chunk_fdATª  s   zPngStream.chunk_fdAT)r$   r%   r&   rS   rµ   rº   r»   rÁ   rË   rÐ   rÑ   rÓ   rÙ   rÜ   rã   rå   rì   rô   rõ   rú   rü   r  r  r  Ú__classcell__r*   r*   r±   r+   r£   e  s,    		"(r£   c                 C   s   | d d… t kS )Nr   )Ú_MAGIC)r;   r*   r*   r+   Ú_accept¾  rL   r  c                       s‚   e Zd ZdZdZdd„ Zedd„ ƒZdd„ Zd	d
„ Z	ddd„Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Z‡ fdd„Zdd„ Z‡  ZS )ÚPngImageFileÚPNGzPortable network graphicsc              	   C   sÄ  t | j d¡ƒsd}t|ƒ‚| j| _d| _g | _t| jƒ| _	 | j ¡ \}}}z
| j 	|||¡}W n0 t
y:   Y n0 tya   t d|||¡ t | j|¡}|dd…  ¡ r_| j ||f¡ Y nw | j ||¡ q| jj| _| jj| _| jj| _d | _| jj| _| jj| _| jjp‹d| _| j  dd	¡| _!| jj"r¦| jj"\}}t# $||¡| _%|d
kr°|d | _&n|| _&| jjd urÚd	| _'| j (¡  | j&| _)| j *¡ | _+| j!rÕ|  jd7  _|  ,d¡ | jdk| _-d S )Nr   znot a PNG filer   Tú%r %s %s (unknown)r   r   rÍ   Fó   fdATr   ).r  rO   rX   r^   Ú_fpÚ_PngImageFile__frameÚprivate_chunksr£   Úpngrq   rÏ   r8   rm   rn   r   r|   Úislowerrh   ry   r©   Úmoder¨   Ú_sizer¦   r¶   Ú_textrª   r·   r¬   Úcustom_mimetyper­   r   ÚgetrÍ   r«   r   ÚrawÚpaletteÚ_PngImageFile__prepare_idatÚ!_close_exclusive_fp_after_loadingrº   Ú_PngImageFile__rewind_idatrY   Ú_PngImageFile__rewindÚ_seekÚis_animated)rR   r<   r_   r`   ra   rD   ÚrawmoderI   r*   r*   r+   Ú_openÊ  sZ   €üð






zPngImageFile._openc                 C   sD   | j d u r| jr| j}|  | jd ¡ |  ¡  | jr|  |¡ | j S )Nr   )r%  r/  r  rW   r   Úload)rR   Úframer*   r*   r+   r†     s   

zPngImageFile.textc                 C   s^   | j du rd}t|ƒ‚| j  | jd d d ¡ | j ¡  | j ¡  | jr*| j  ¡  d| _ dS )zVerify PNG fileNz)verify must be called directly after openr   r   r   )rO   ÚRuntimeErrorrW   r·   r!  r   re   Ú_exclusive_fp)rR   r<   r*   r*   r+   r     s   




zPngImageFile.verifyc                 C   s†   |   |¡sd S || jk r|  dd¡ | j}t| jd |d ƒD ]!}z|  |¡ W q ty@ } z|  |¡ d}t|ƒ|‚d }~ww d S )Nr   Tr   zno more images in APNG file)Ú_seek_checkr  r.  ÚrangerÏ   rW   )rR   r3  Ú
last_frameÚfrx   r<   r*   r*   r+   rW   -  s   



€ýýzPngImageFile.seekFc              	   C   sø  |dkrT|r-| j  | j¡ | j ¡  | j| _d | _| jrd | _| jj	| _
| jj| _| j | _d | _d | _| j
 dd¡| _| j
 d¡| _| j
 d¡| _| j
 d¡| _d| _nÞ|| jd krdd|› �}t|ƒ‚|  ¡  | jrt| j | j| j¡ | j ¡ | _| j | _| jrŒt | j| j¡ d| _d}	 | j d
¡ z
| j ¡ \}}}W n tjtfy«   Y ndw |dkr¶d}t |ƒ‚|dkrÄ|rÂd}t|ƒ‚d	}z
| j !|||¡ W n? t"y×   Y n8 t yõ   |dkrì|d
8 }|rì|| _Y n#t | j|¡ Y n t#�y   t$ %d|||¡ t | j|¡ Y nw q�|| _| jj| _| j
 d¡| _| j
 d¡| _| j
 d¡| _| j�s2t ‚| jd u �rC| jt&j'k�rCt&j(| _| jt&j'k�r[| j ¡ | _|  )| j| j¡| _d S | jt&j(k�rwt*j+ ,| j-| j.¡| _|  )| j| j¡| _d S d | _d S )Nr   rÍ   Fr
  r  rÌ   r   zcannot seek to frame Tr   rz   zNo more images in APNG fileó   fcTLzAPNG missing frame datar  r  )/r  rW   r-  r!  r»   r,  r*  ÚimÚpyaccessr¦   r¶   rª   r·   rO   Ú_prev_imÚdisposer'  rÍ   Ú
dispose_opÚblend_opÚdispose_extentr  rC   r2  Úpaster¹   r   r|   rX   rt   ru   r^   rÏ   rq   ÚUnicodeDecodeErrorr8   rm   rn   r#   r)   r(   Ú_cropr   ÚcoreÚfillr#  Úsize)rR   r3  r»   r<   Úframe_startr_   r`   ra   r*   r*   r+   r.  <  sš   



ÿþã!

zPngImageFile._seekc                 C   s   | j S rN   )r  rb   r*   r*   r+   rY   ™  s   zPngImageFile.tellc                 C   s0   | j  d¡r| jd | _| j| _tj | ¡ dS )z"internal: prepare to read PNG filerÅ   )r   N)r¶   r'  Údecoderconfigr*  Ú_PngImageFile__idatr   Úload_preparerb   r*   r*   r+   rK  œ  s   zPngImageFile.load_preparec                 C   sÂ   | j dkrG| j d¡ | j ¡ \}}}|dvr!| j |||¡ dS |dkr?z
| j |||¡ W n	 ty8   Y nw |d | _ n|| _ | j dks|dkrO| j }nt|| j ƒ}| j | | _ | j |¡S )zinternal: read more image datar   r   )ó   IDATs   DDATr  rí   r  )rJ  rO   rX   r!  rj   rq   rÏ   Úmin)rR   Ú
read_bytesr_   r`   ra   r*   r*   r+   Ú	load_read¥  s(   
ÿ
îzPngImageFile.load_readc              	   C   sÜ  | j dkr| j | j ¡ 	 | j d¡ z
| j ¡ \}}}W n tjtfy)   Y nmw |dkr/ng|dkrB| jrBd| _| j 	|||¡ nTz
| j 
|||¡ W nH tyU   Y nA tyl   |dkrc|d8 }t | j|¡ Y n) ty”   t d|||¡ t | j|¡}|dd	…  ¡ r’| j ||df¡ Y nw q| jj| _| js¨| j ¡  d
| _d
S | jrè| jtjkrê|  | j| j¡}| jjdkrÎd| j v rÎ| !d| j d ¡}n| "d¡}| j #|| j|¡ | j| _| j$rìd
| _$d
S d
S d
S d
S )z%internal: finished reading image datar   Tr   rz   r:  r  r  r   r   Nr   rÔ   r   )%rJ  rO   rX   r!  rt   ru   r^   r/  r*  rj   rq   rC  rÏ   r   r|   r8   rm   rn   r"  r   rh   r§   r%  re   r=  r@  r,   r.   rD  r;  rA  r#  r¶   Úconvert_transparentÚconvertrB  r<  )rR   r_   r`   ra   rD   ÚupdatedÚmaskr*   r*   r+   Úload_endÆ  s`   
ÿ€üè



ÿ

õ
zPngImageFile.load_endc                 C   s6   d| j vr	|  ¡  d| j vrd| j vrd S |  ¡  ¡ S )Nrï   zRaw profile type exif)r¶   r2  ÚgetexifÚ_get_merged_dictrb   r*   r*   r+   Ú_getexifù  s
   
zPngImageFile._getexifc                    s   d| j vr	|  ¡  tƒ  ¡ S )Nrï   )r¶   r2  r¥   rU  rb   r±   r*   r+   rU     s   

zPngImageFile.getexifc                 C   s   d| j v r|  | j d ¡S i S )z™
        Returns a dictionary containing the XMP tags.
        Requires defusedxml to be installed.

        :returns: XMP tags in a dictionary.
        zXML:com.adobe.xmp)r¶   Ú_getxmprb   r*   r*   r+   Úgetxmp  s
   
	ÿÿýzPngImageFile.getxmpr¢   )r$   r%   r&   ÚformatÚformat_descriptionr1  Úpropertyr†   r   rW   r.  rY   rK  rO  rT  rW  rU  rY  r  r*   r*   r±   r+   r  Æ  s     C

]	!3r  )r   ó    )úL;1r]  )r   s    )r   s    )r   s    )r   s   )r   s    )r   s   )r   s   )r   s   )r   s   )r   s   )r   s   )r   r^  r   r   r   r   r   zI;16r   r   r   r   r   r   c                 G   sJ   d  |¡}|  tt|ƒƒ| ¡ |  |¡ t|t|ƒƒ}|  t|ƒ¡ dS )z'Write a PNG chunk (including CRC field)rí   N)ÚjoinÚwriteÚo32r6   rK   ©rO   r_   rI   ry   r*   r*   r+   Úputchunk*  s
   

rc  c                   @   ó   e Zd Zdd„ Zdd„ ZdS )Ú_idatc                 C   s   || _ || _d S rN   )rO   r�   )rR   rO   r�   r*   r*   r+   rS   8  rT   z_idat.__init__c                 C   s   |   | jd|¡ d S )NrL  )r�   rO   ©rR   rI   r*   r*   r+   r`  <  ó   z_idat.writeN©r$   r%   r&   rS   r`  r*   r*   r*   r+   re  5  s    re  c                   @   rd  )Ú_fdatc                 C   s   || _ || _|| _d S rN   )rO   r�   r¸   )rR   rO   r�   r¸   r*   r*   r+   rS   C  s   
z_fdat.__init__c                 C   s*   |   | jdt| jƒ|¡ |  jd7  _d S )Nr  r   )r�   rO   ra  r¸   rf  r*   r*   r+   r`  H  s   z_fdat.writeNrh  r*   r*   r*   r+   ri  @  s    ri  c                 C   s  | j  d| j dd¡¡}| j  d| j dd¡¡}| j  d| j dtj¡¡}| j  d| j dtj¡¡}	|r:t |¡}
nt | g|¡}
g }d}|
D ]ù}t	 
|¡D ]ñ}|j|krZ| ¡ }n|dkrg|j|| jd�}n| |¡}| j  ¡ }t|ttfƒr~|| |d< t|ttfƒr‹|| |d< t|	ttfƒr˜|	| |d< |d7 }|�r4|d	 }|d
  d¡}|d
  d¡}|tjkr¿t|ƒdk r¿tj}|tjkrë|d  ¡ }tj d| jd¡}|d }|rß| |¡}nd| j }| ||¡ n|tjkr÷|d d }n|d }t | d¡| d¡¡}| ¡ }|�s3|| d¡k�r3|| d¡k�r3t|ttfƒ�r2|d
 d  |d 7  < qNnd }| |||dœ¡ qNqG||dtt|ƒƒt|ƒƒ |�rct  !| t"||ƒdd| j d|fg¡ d}t#|ƒD ]š\}}|d }|d �s|d|j }n	|d }| |¡}|j}|d
 }t$t%| d|¡ƒƒ}| d|¡}| d|	¡}||dt|ƒt|d ƒt|d ƒt|d ƒt|d ƒt&|ƒt&dƒt'|ƒt'|ƒƒ |d7 }|dk�rê|�sêt  !|t"||ƒdd|j d|fg¡ �qit(|||ƒ}t  !||dd|j d|fg¡ |j)}�qid S )Nr  r   rý   r
  r  r   )r)  r   éÿÿÿÿÚencoderinfor   r;  r   )r   r   r   r   rÌ   r¤   éþÿÿÿr   )r;  rÌ   rk  s   acTLr›   r:  r  )*rk  r'  r¶   r#   r'   r,   r-   Ú	itertoolsÚchainr   ÚIteratorr#  r¹   rQ  r)  r•   Úlistr‹   r)   r6   r(   r   rE  rF  rG  ÚcroprB  r   Úsubtract_moduloÚgetbboxrh   ra  r   Ú_savere  Ú	enumerateÚintÚroundÚo16r   ri  r¸   )r;  rO   r�   r0  rÍ   Úappend_imagesr  rý   r
  r  rn  Ú	im_framesÚframe_countÚim_seqÚim_framerk  ÚpreviousÚprev_disposalÚ
prev_blendÚbase_imr>  rÌ   Údeltar¸   r3  Ú
frame_datarG  Úframe_durationÚframe_disposalÚframe_blendÚfdat_chunksr*   r*   r+   Ú_write_multiple_framesM  sÐ   






ÿÿ€Í6
ü$





õýý
Örˆ  c                 C   s   t | ||dd� d S )NT)Úsave_all)rt  )r;  rO   Úfilenamer*   r*   r+   Ú	_save_allÊ  rg  r‹  Fc           $   
   C   s  |rI| j  d| j d¡¡}tƒ }| j  dg ¡}|rt |¡}nt | g|¡}|D ]}	t |	¡D ]}
| |
j	¡ q/q(dD ]}||v rC nq;| 
¡ }n| j	}|dkr’d| j v r`td| j d > dƒ}n| jruttt| j ¡ d ƒd dƒdƒ}nd}|d	kr’|d
kr‚d}n	|dkr‰d
}nd}|› d|› �}| j  dd¡| j  dd¡| j  dd¡| j  dd¡f| _zt| \}}W n tyÌ } zd|› d�}t|ƒ|‚d }~ww | t¡ ||dt| jd ƒt| jd ƒ|dddƒ g d¢}| j  d| j d¡¡}|�rd}|d t |¡ }||d|ƒ | d¡ | j  d¡}|�rbg d ¢}|jD ]B}|d d
… \}}||v �r;| |¡ ||||ƒ �q||v �rH||||ƒ �q|dd
…  ¡ �r`|d
d… }|�s`||||ƒ �q| j	dk�rŽ|d }| j d!¡d |… }t|ƒ|k �rˆ|d7 }t|ƒ|k �s}||d"|ƒ | j  d#| j d#d ¡¡}|�s¢|dk�r| j	dk�rÔ|}t|t ƒ�r»||d$|d |… ƒ nztdtd%|ƒƒ}d&| d }||d$|d |… ƒ na| j	d'v �rëtdtd(|ƒƒ}||d$t!|ƒƒ nJ| j	d!k�r|\}} }!||d$t!|ƒt!| ƒ t!|!ƒ ƒ n.d#| j v �rd)}t|ƒ‚n!| j	dk�r5| j "¡ d*k�r5| j d*d+¡}|}||d$|d |… ƒ | j  d,¡}"|"�rZ||d-tt#|"d d. d/ ƒƒtt#|"d d. d/ ƒƒd0ƒ |�r€d1d2g}|jD ]}|d d
… \}}||v �r~| |¡ ||||ƒ �qd| j  d3¡}#|#�r§t|#t$j%ƒ�r•|# &d4¡}#|# 'd5¡�r¡|#d6d … }#||d7|#ƒ |�r´t(| |||||ƒ nt) *| t+||ƒd8d9| j d|fg¡ |�rð|jD ]#}|d d
… \}}|dd
…  ¡ �rî|d
d… }|�rî||||ƒ �qÌ||d:dƒ t,|d;ƒ�r| -¡  d S d S )<NrÍ   ry  )r   r   r   r   Úbitsr   é   r    r   r   r   ú;ÚoptimizeFÚcompress_levelrj  Úcompress_typeÚ
dictionaryrí   zcannot write mode z as PNGs   IHDRr   r”   )s   cHRMs   gAMAs   sBITó   sRGBs   tIMEr½   s   ICC Profilerž   s   iCCPr“  Úpnginfo)s   sPLTr“   rŸ   r�   r   s   PLTErÔ   s   tRNSéÿ   ó   ÿrÕ   iÿÿ  z%cannot use transparency for this moder   ÚArç   s   pHYsræ   g      à?ó   s   bKGDs   hISTrï   r   rû   r!   s   eXIfr›   r¤   rz   Úflush).rk  r'  r¶   Úsetrm  rn  r   ro  rŽ   r#  rV   rM  r)  Úmaxr6   ÚgetdataÚencoderconfigÚ	_OUTMODESÚKeyErrorr{   r`  r  ra  rG  r>   r˜   ÚremoverŠ   r"  r;  Ú
getpaletter•   r–   rx  Úgetpalettemoderv  r   ÚExifÚtobytesr5   rˆ  r   rt  re  Úhasattrr™  )$r;  rO   rŠ  r�   r‰  rÍ   Úmodesry  rn  r|  r}  r#  ÚcolorsrŒ  r0  rx   r<   rŠ   Úiccr9   rI   r¶   Úchunks_multiple_allowedÚ
info_chunkr_   rŒ   Úpalette_byte_numberÚpalette_bytesrÔ   Úalpha_bytesÚalphaÚredÚgreenÚbluerç   rï   r*   r*   r+   rt  Î  s&  ÿÿÿ€
$ü
€þ
ø




€ÿ
"üû


€
$
€ÿrt  c                 K   sD   G dd„ dƒ}dd„ }|ƒ }z|| _ t| |d|ƒ W | ` |jS | ` w )z4Return a list of PNG chunks representing this image.c                   @   s    e Zd Zg Zdd„ Zdd„ ZdS )zgetchunks.<locals>.collectorc                 S   s   d S rN   r*   rf  r*   r*   r+   r`  š  rd   z"getchunks.<locals>.collector.writec                 S   s   | j  |¡ d S rN   )rI   rh   )rR   r�   r*   r*   r+   rh   �  rL   z#getchunks.<locals>.collector.appendN)r$   r%   r&   rI   r`  rh   r*   r*   r*   r+   Ú	collector—  s    r²  c                 W   s0   d  |¡}tt|t|ƒƒƒ}|  |||f¡ d S )Nrí   )r_  ra  rK   rh   rb  r*   r*   r+   rh      s   
zgetchunks.<locals>.appendN)rk  rt  rI   )r;  Úparamsr²  rh   rO   r*   r*   r+   Ú	getchunks”  s   	þr´  z.pngz.apngz	image/png)r   )@rm  ÚloggingÚrert   rþ   r>   r:   r   r�   r   r   r   r   r   Ú_binaryr	   rØ   r
   rZ   r   r   rx  r   ra  Ú
_deprecater   Ú	getLoggerr$   rm   Úcompiler×   r[   r  rÇ   rÖ   Ú	SAFEBLOCKrA   r³   r#   r,   r=   rG   rK   rM   r�   r€   r‰   r£   r  r  rž  rc  re  ri  rˆ  r‹  rt  r´  Úregister_openrZ  Úregister_saveÚregister_save_allÚregister_extensionsÚregister_mimer*   r*   r*   r+   Ú<module>   s¢   !
ë

	YT  [  Uñ} G