o
    Ñ­j¶½  ã                   @  sl  d dl m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mZ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 erdd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'd(„Z/G d)d*„ d*ƒZ0G d+d,„ d,e1ƒZ2G d-d.„ d.ƒZ3G d/d0„ d0e0ƒZ4dad5d6„Z5G d7d8„ d8ejƒZ6d9d:d;d<d=d>d?d?d?d@dAdBdCdDdEdFœZ7dGdH„ Z8G dIdJ„ dJƒZ9G dKdL„ dLƒZ:dMdN„ Z;dbdVdW„Z<e8dXfdYdZ„Z=d[d\„ Z>e ?e6j@e6e5¡ e Ae6j@e=¡ e Be6j@e<¡ e Ce6j@d]d^g¡ e De6j@d_¡ dS )cé    )ÚannotationsN)ÚIntEnum)ÚIOÚTYPE_CHECKINGÚAnyÚNoReturné   )ÚImageÚ
ImageChopsÚ	ImageFileÚImagePaletteÚImageSequence)Úi16be)Úi32be)Úo8)Úo16be)Úo32be)Ú_imagings   \w\w\w\ws   ‰PNG

)Ú1r   )ÚLúL;2)r   úL;4)r   r   )úI;16ú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/CropPilot/venv/lib/python3.10/site-packages/PIL/PngImagePlugin.pyr(   g   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/   r0   r1   |   s
    r1   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Ú	plaintextÚmsgr/   r/   r0   Ú_safe_zlib_decompressŠ   s   r>   c                 C  s   t  | |¡d@ S )Nl   ÿÿ )r4   Úcrc32)ÚdataÚseedr/   r/   r0   Ú_crc32“   ó   rB   c                   @  sp   e Zd Zd&dd„Zd'dd	„Zd(d
d„Zd)dd„Zd*dd„Zd+dd„Zdd„ Z	d,dd„Z
d,dd„Zd-d.d#d$„Zd%S )/ÚChunkStreamÚfpú	IO[bytes]ÚreturnÚNonec                 C  s   || _ g | _d S ©N)rE   Úqueue©ÚselfrE   r/   r/   r0   Ú__init__œ   ó   
zChunkStream.__init__útuple[bytes, int, int]c                 C  s�   d}| j dus	J ‚| jr| j ¡ \}}}| j  |¡ n| j  d¡}|dd… }| j  ¡ }t|ƒ}t|ƒsCtj	sCdt
|ƒ› d�}t|ƒ‚|||fS )z.Fetch a new chunk. Returns header information.Nr#   r"   zbroken PNG file (chunk ú))rE   rJ   ÚpopÚseekÚreadÚtellÚi32Úis_cidr   ÚLOAD_TRUNCATED_IMAGESÚreprÚSyntaxError)rL   ÚcidÚposÚlengthr:   r=   r/   r/   r0   rS       s   

zChunkStream.readc                 C  s   | S rI   r/   ©rL   r/   r/   r0   Ú	__enter__µ   ó   zChunkStream.__enter__ÚargsÚobjectc                 G  s   |   ¡  d S rI   )Úclose)rL   r`   r/   r/   r0   Ú__exit__¸   s   zChunkStream.__exit__c                 C  s   d  | _ | _d S rI   )rJ   rE   r]   r/   r/   r0   rb   »   rC   zChunkStream.closerZ   Úbytesr[   Úintr\   c                 C  s$   | j d usJ ‚| j  |||f¡ d S rI   )rJ   Úappend©rL   rZ   r[   r\   r/   r/   r0   Ú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Údecoderg   r/   r/   r0   ÚcallÂ   s   zChunkStream.callr@   c              
   C  s®   t jr|d d? d@ r|  ||¡ dS | jdusJ ‚z"t|t|ƒƒ}t| j d¡ƒ}||kr:dt|ƒ› d�}t|ƒ‚W dS  t	j
yV } zdt|ƒ› d�}t|ƒ|‚d}~ww )	zRead and verify checksumr   é   r   Nr"   z(broken PNG file (bad header checksum in rP   z(broken PNG file (incomplete checksum in )r   rW   Úcrc_skiprE   rB   rU   rS   rX   rY   ÚstructÚerror)rL   rZ   r@   Úcrc1Úcrc2r=   Úer/   r/   r0   ÚcrcÈ   s    þ
€þzChunkStream.crcc                 C  s   | j dusJ ‚| j  d¡ dS )zRead checksumNr"   )rE   rS   )rL   rZ   r@   r/   r/   r0   rq   Ý   s   zChunkStream.crc_skipó   IENDÚendchunkúlist[bytes]c              
   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)	rS   rr   rs   ÚOSErrorrw   r   Ú
_safe_readrE   rf   )rL   ry   ÚcidsrZ   r[   r\   rv   r=   r/   r/   r0   Úverifyã   s   
€þý
özChunkStream.verifyN)rE   rF   rG   rH   )rG   rO   )rG   rD   )r`   ra   rG   rH   ©rG   rH   )rZ   rd   r[   re   r\   re   rG   rH   )rZ   rd   r@   rd   rG   rH   )rx   )ry   rd   rG   rz   )r)   r*   r+   rM   rS   r^   rc   rb   rh   ro   rw   rq   r~   r/   r/   r/   r0   rD   ›   s    







rD   c                   @  s0   e Zd ZU dZded< ded< eddd„ƒZdS )	ÚiTXtzq
    Subclass of string to allow iTXt chunks to look like strings while
    keeping their extra information

    zstr | bytes | NoneÚlangÚtkeyNc                 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__r�   r‚   )ÚclsÚtextr�   r‚   rL   r/   r/   r0   r„     s   	ziTXt.__new__)NN)r)   r*   r+   Ú__doc__Ú__annotations__Ústaticmethodr„   r/   r/   r/   r0   r€   ø   s   
 r€   c                   @  sF   e Zd ZdZddd„Zdddd„Z			dddd„Z	dd dd„ZdS )!ÚPngInfoz<
    PNG chunk container (for use with save(pnginfo=))

    rG   rH   c                 C  s
   g | _ d S rI   )Úchunksr]   r/   r/   r0   rM     s   
zPngInfo.__init__FrZ   rd   r@   Ú
after_idatÚboolc                 C  s   | j  |||f¡ 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

        N)r‹   rf   )rL   rZ   r@   rŒ   r/   r/   r0   Úadd  s   
zPngInfo.addÚ Úkeyústr | bytesÚvaluer�   r‚   Úzipc                 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)Ú
isinstancerd   ÚencoderŽ   r4   Úcompress)rL   r�   r’   r�   r‚   r“   r/   r/   r0   Úadd_itxt&  s   



 þ(zPngInfo.add_itxtústr | bytes | iTXtc                 C  sÒ   t |tƒr"| j|||jdur|jnd|jdur|j|d�S d|d�S t |tƒsAz| dd¡}W n ty@   | j|||d� Y S w t |tƒsL| dd¡}|r]|  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

        Nó    )r“   r”   r•   ó   zTXtó     ó   tEXtr˜   )r™   r€   rœ   r�   r‚   rd   rš   ÚUnicodeErrorrŽ   r4   r›   )rL   r�   r’   r“   r/   r/   r0   Úadd_textI  s,   
ûû
	ÿ
zPngInfo.add_textNr   ©F)rZ   rd   r@   rd   rŒ   r�   rG   rH   )r�   r�   F)r�   r‘   r’   r‘   r�   r‘   r‚   r‘   r“   r�   rG   rH   )r�   r‘   r’   r�   r“   r�   rG   rH   )r)   r*   r+   r‡   rM   rŽ   rœ   r£   r/   r/   r/   r0   rŠ     s    
ú$ÿrŠ   c                      sä   e Zd Z‡ fdd„Zd3dd„Zd4d	d
„Zd4dd„Zd5dd„Zd5dd„Zd6dd„Z	d6dd„Z
d5dd„Zd5dd„Zd5dd„Zd5dd „Zd5d!d"„Zd5d#d$„Zd5d%d&„Zd5d'd(„Zd5d)d*„Zd5d+d,„Zd5d-d.„Zd5d/d0„Zd5d1d2„Z‡  ZS )7Ú	PngStreamc                   sR   t ƒ  |¡ i | _i | _d| _d | _d | _d | _d | _d | _	d | _
d | _d| _d S )N©r   r   r   )ÚsuperrM   Úim_infoÚim_textÚim_sizeÚim_modeÚim_tileÚ
im_paletteÚim_custom_mimetypeÚim_n_framesÚ_seq_numÚrewind_stateÚtext_memoryrK   ©Ú	__class__r/   r0   rM   r  s   
zPngStream.__init__Úchunklenre   rG   rH   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_MEMORYr9   )rL   rµ   r=   r/   r/   r0   Úcheck_text_memoryƒ  s   
ÿÿûzPngStream.check_text_memoryc                 C  s   | j  ¡ | j| jdœ| _d S )N)ÚinfoÚtileÚseq_num)r¨   Úcopyr¬   r°   r±   r]   r/   r/   r0   Úsave_rewindŒ  s   ýzPngStream.save_rewindc                 C  s,   | j d  ¡ | _| j d | _| j d | _d S )Nr¸   r¹   rº   )r±   r»   r¨   r¬   r°   r]   r/   r/   r0   Úrewind“  s   zPngStream.rewindr[   r\   rd   c                 C  s¾   t  | j|¡}| d¡}t d|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 %rr   zCompression method %sr   úUnknown compression method z in iCCP chunkr!   Úicc_profile)r   r|   rE   Úfindrk   rl   rY   r>   r9   rW   r4   rs   r¨   )rL   r[   r\   r:   ÚiÚcomp_methodr=   r¿   r/   r/   r0   Ú
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|   rE   rW   r9   rU   rª   Ú_MODESr«   Ú
im_rawmodeÚ	Exceptionr¨   rY   ©rL   r[   r\   r:   r=   r/   r/   r0   Ú
chunk_IHDR³  s$    ÿ
zPngStream.chunk_IHDRr   c                 C  sd   d| j v rd| j d || jfg}n| jd urd| j d< dd| j || jfg}|| _|| _d}t|ƒ‚)NÚbboxr“   TÚdefault_imager¦   zimage data found)r¨   rÊ   r¯   rª   r¬   Úim_idatÚEOFError)rL   r[   r\   r¹   r=   r/   r/   r0   Ú
chunk_IDATÇ  s   


zPngStream.chunk_IDATc                 C  s   d}t |ƒ‚)Nzend of PNG image)rÑ   )rL   r[   r\   r=   r/   r/   r0   Ú
chunk_IENDÔ  s   zPngStream.chunk_IENDc                 C  s&   t  | j|¡}| jdkrd|f| _|S )Nr   r   )r   r|   rE   r«   r­   ©rL   r[   r\   r:   r/   r/   r0   Ú
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|   rE   r«   Ú_simple_paletteÚmatchrÀ   r¨   Úi16)rL   r[   r\   r:   rÁ   r/   r/   r0   Ú
chunk_tRNSß  s   



	
û
ü
þ zPngStream.chunk_tRNSc                 C  s$   t  | j|¡}t|ƒd | jd< |S )Nç     jø@Úgamma)r   r|   rE   rU   r¨   rÔ   r/   r/   r0   Ú
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/   r0   Ú	<genexpr>ÿ  ó   € z'PngStream.chunk_cHRM.<locals>.<genexpr>Úchromaticity)r   r|   rE   rr   ÚunpackÚlenÚtupler¨   )rL   r[   r\   r:   Úraw_valsr/   r/   r0   Ú
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|   rE   rW   r9   r¨   rÌ   r/   r/   r0   Ú
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|   rE   rW   r9   rU   r¨   )	rL   r[   r\   r:   r=   ÚpxÚpyÚunitrë   r/   r/   r0   Ú
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”   r•   ÚreplaceÚexif)
r   r|   rE   Úsplitr9   rn   r¨   r©   r·   rä   )rL   r[   r\   r:   ÚkÚvÚv_strr/   r/   r0   Ú
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|   rE   ró   r9   rY   r>   rW   r4   rs   rn   r¨   r©   r·   rä   )rL   r[   r\   r:   rô   rõ   rÂ   r=   r/   r/   r0   Ú
chunk_zTXt6  s:   þ
þÿzPngStream.chunk_zTXtc                 C  s~  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 |dkr‚|
| j
d< 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   s   XML:com.adobe.xmpÚxmpr”   r•   r–   )r   r|   rE   ró   r9   rä   r>   rW   r4   rs   r¨   rn   r¢   r€   r©   r·   )rL   r[   r\   Úrr:   rô   ÚcfÚcmr�   Útkrõ   r/   r/   r0   Ú
chunk_iTXtX  sN   ÿ ÿÿ
ÿzPngStream.chunk_iTXtc                 C  s    t  | j|¡}d| | jd< |S )Nó   Exif  rò   )r   r|   rE   r¨   rÔ   r/   r/   r0   Ú
chunk_eXIf‚  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|   rE   rW   r9   r¯   ÚwarningsÚwarnrU   r¨   r®   )rL   r[   r\   r:   r=   Ún_framesr/   r/   r0   Ú
chunk_acTLˆ  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|   rE   rW   r9   rU   r°   rY   rª   r¨   rÙ   Úfloat)rL   r[   r\   r:   r=   ÚseqÚwidthÚheightrí   rî   Úim_wÚim_hÚ	delay_numÚ	delay_denr/   r/   r0   Ú
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   rW   r|   rE   r9   rU   r°   rY   rÒ   )rL   r[   r\   r:   r=   r  r/   r/   r0   Ú
chunk_fdAT¹  s   zPngStream.chunk_fdAT)rµ   re   rG   rH   r   )r[   re   r\   re   rG   rd   )r[   re   r\   re   rG   r   )r)   r*   r+   rM   r·   r¼   r½   rÃ   rÍ   rÒ   rÓ   rÕ   rÚ   rÝ   rç   ré   rð   r÷   rø   rþ   r   r  r  r  Ú__classcell__r/   r/   r³   r0   r¥   q  s,    

	









	



"
*

r¥   Úprefixrd   rG   r�   c                 C  s   | d d… t kS )Nr#   )Ú_MAGIC)r  r/   r/   r0   Ú_acceptÍ  rC   r  c                      sŽ   e Zd ZdZdZd$dd„Zedd„ ƒZd$d	d
„Zd%dd„Z	d&d'dd„Z
d(dd„Zd$dd„Zd)dd„Zd$dd„Zd*dd „Zd+‡ fd"d#„Z‡  ZS ),ÚPngImageFileÚPNGzPortable network graphicsrG   rH   c              	   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  rE   rS   rY   Ú_fpÚ_PngImageFile__frameÚprivate_chunksr¥   Úpngro   rÑ   ÚAttributeErrorrk   rl   r   r|   Úislowerrf   rw   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_idatrT   Ú_PngImageFile__rewindÚ_seekÚis_animated)rL   r=   rZ   r[   r\   r:   Úrawmoder@   r/   r/   r0   Ú_openÙ  sZ   €üð






zPngImageFile._openc                 C  sD   | j d u r| jr| j}|  | jd ¡ |  ¡  | jr|  |¡ | j S )Nr   )r+  r5  r$  rR   r  Úload)rL   Úframer/   r/   r0   r†     s   

zPngImageFile.textc                 C  sl   | j du rd}t|ƒ‚| j  | jd d d ¡ | jdusJ ‚| j ¡  | j ¡  | jr1| j  ¡  d| _ dS )zVerify PNG fileNz)verify must be called directly after openr   r!   r#   )rE   ÚRuntimeErrorrR   r¹   r&  r~   rb   Ú_exclusive_fp)rL   r=   r/   r/   r0   r~   +  s   




zPngImageFile.verifyr9  re   c                 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$  r4  ÚrangerÑ   rR   )rL   r9  Ú
last_frameÚfrv   r=   r/   r/   r0   rR   =  s   



€ýýzPngImageFile.seekFr½   r�   c              	   C  s  | j d usJ ‚|  |dkr]|r6| 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rmd|› �}t|ƒ‚|  ¡  | jr}| 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�s?d}t |ƒ‚| jd u �rP| jt&j'k�rPt&j(| _d | _| jt&j'k�rq| j�ro| j ¡ | _|  )| j| j¡| _d S d S | jt&j(k�r�t*j+ ,| j-| j.¡| _|  )| j| j¡| _d S d S )Nr   rÏ   Fr  r  rÎ   r   zcannot seek to frame Tr"   rx   zNo more images in APNG fileó   fcTLzAPNG missing frame datar"  r!  zimage not found in APNG frame)/r&  r#  rR   r3  r½   r2  r0  ÚimÚpyaccessr¨   r¸   r¬   r¹   rE   Ú_prev_imÚdisposer-  rÏ   Ú
dispose_opÚblend_opÚdispose_extentr$  r9   r8  Úpaster»   r   r|   rS   rr   rs   rY   rÑ   ro   ÚUnicodeDecodeErrorr'  rk   rl   r(   r.   r-   Ú_cropr	   ÚcoreÚfillÚmodeÚsize)rL   r9  r½   r=   Úframe_startrZ   r[   r\   r/   r/   r0   r4  L  s¦   



ÿþã!
þþzPngImageFile._seekc                 C  s   | j S rI   )r$  r]   r/   r/   r0   rT   ­  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-  Údecoderconfigr0  Ú_PngImageFile__idatr   Úload_preparer]   r/   r/   r0   rR  °  s   zPngImageFile.load_prepareÚ
read_bytesrd   c                 C  sÐ   | j dusJ ‚| jdkrN| j d¡ | j  ¡ \}}}|dvr(| j  |||¡ dS |dkrFz
| j  |||¡ W n	 ty?   Y nw |d | _n|| _| jdks|dkrV| j}nt|| jƒ}| j| | _| j |¡S )zinternal: read more image dataNr   r"   )ó   IDATs   DDATr"  rž   r"  )r&  rQ  rE   rS   rh   ro   rÑ   Úmin)rL   rS  rZ   r[   r\   r/   r/   r0   Ú	load_read¹  s*   
ÿ
îzPngImageFile.load_readc                 C  s&  | j dusJ ‚| jdkr| j | j¡ 	 | j d¡ z
| j  ¡ \}}}W n tjtfy0   Y nˆw |dkr6n‚|dkrI| jrId| _| j  	|||¡ noz
| j  
|||¡ W nc ty\   Y n\ tyŽ   |dkrj|d8 }z	t | j|¡ W n ty‹ } ztjr…W Y d}~Y n3|‚d}~ww 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 dataNr   Tr"   rx   r@  r"  r!  r   r!   r   rÖ   r    )'r&  rQ  rE   rS   rr   rs   rY   r5  r0  rh   ro   rI  rÑ   r   r|   r{   rW   r'  rk   rl   r(  r%  rf   r©   r+  rb   rC  rF  r1   r3   rJ  rA  rG  rM  r¸   Úconvert_transparentÚconvertrH  rB  )rL   rZ   r[   r\   rv   r:   ÚupdatedÚmaskr/   r/   r0   Úload_endÛ  sr   
ÿ€üÿ€üâ
#


ÿ

õ
zPngImageFile.load_endúdict[str, Any] | Nonec                 C  s6   d| j vr	|  ¡  d| j vrd| j vrd S |  ¡  ¡ S )Nrò   zRaw profile type exif)r¸   r8  ÚgetexifÚ_get_merged_dictr]   r/   r/   r0   Ú_getexif  s
   
zPngImageFile._getexifú
Image.Exifc                   s   d| j vr	|  ¡  tƒ  ¡ S )Nrò   )r¸   r8  r§   r]  r]   r³   r/   r0   r]    s   

zPngImageFile.getexifr   )r9  re   rG   rH   r¤   )r9  re   r½   r�   rG   rH   )rG   re   )rS  re   rG   rd   )rG   r\  )rG   r`  )r)   r*   r+   ÚformatÚformat_descriptionr7  Úpropertyr†   r~   rR   r4  rT   rR  rV  r[  r_  r]  r  r/   r/   r³   r0   r  Õ  s    
C



a

	
"
:r  )r   ó   r˜   )úL;1rd  r˜   )r   ó   r˜   )r   ó   r˜   )r   ó   r˜   )r   rh  rg  )r   ó   r˜   )r   rd  ó   )r   rf  rj  )r   rg  rj  )r   rh  rj  )r   rh  rf  )r    rh  ó   )r   re  r   r   r   r   ÚIr   r   r   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Úo32rä   rB   ©rE   rZ   r@   rw   r/   r/   r0   Úputchunk:  s
   

rq  c                   @  ó   e Zd Zdd„ Zd
dd„Zd	S )Ú_idatc                 C  s   || _ || _d S rI   )rE   Úchunk)rL   rE   rt  r/   r/   r0   rM   H  rN   z_idat.__init__r@   rd   rG   rH   c                 C  s   |   | jd|¡ d S )NrT  )rt  rE   ©rL   r@   r/   r/   r0   rn  L  ó   z_idat.writeN©r@   rd   rG   rH   ©r)   r*   r+   rM   rn  r/   r/   r/   r0   rs  E  s    rs  c                   @  rr  )Ú_fdatc                 C  s   || _ || _|| _d S rI   )rE   rt  rº   )rL   rE   rt  rº   r/   r/   r0   rM   S  s   
z_fdat.__init__r@   rd   rG   rH   c                 C  s*   |   | jdt| jƒ|¡ |  jd7  _d S )Nr"  r   )rt  rE   ro  rº   ru  r/   r/   r0   rn  X  s   z_fdat.writeNrw  rx  r/   r/   r/   r0   ry  P  s    ry  c                  C  s<  | j  d¡}| j  d| j dd¡¡}| j  d| j dtj¡¡}	| j  d| j dtj¡¡}
|r4t |¡}nt | g|¡}g }d}|D ]ü}t	 
|¡D ]ô}|j|krT| ¡ }n| |¡}| j  ¡ }t|ttfƒrl|| |d< n|d u r|d|jv r||jd |d< t|	ttfƒr‰|	| |d< t|
ttfƒr–|
| |d< |d7 }|�r1|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¡¡}|jdd�}|�s0|| d¡k�r0|| d¡k�r0d|v �r0|d d  |d 7  < qHnd }| |||dœ¡ qHqAt|ƒdk�rN|�sN|d d
 S ||dtt|ƒƒt|ƒƒ |�r{| j|k�ri|  |¡} t  | 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|
¡}||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¡ �q�t'|||ƒ}t  ||dd|j d|fg¡ |j(}�q�d S )Nr  r  r   r  r  r   éÿÿÿÿÚencoderinfor!   rA  r    )r   r   r   r   rÎ   r¦   éþÿÿÿF)Ú
alpha_only)rA  rÎ   r{  s   acTLr“   r@  r  ))r{  r-  r¸   r(   r,   r1   r2   Ú	itertoolsÚchainr   ÚIteratorrM  r»   rX  r™   Úlistrå   r.   rä   r-   r	   rK  rL  rN  ÚcroprH  r
   Úsubtract_moduloÚgetbboxrf   ro  r   Ú_savers  Ú	enumeratere   ÚroundÚo16r   ry  rº   ) rA  rE   rt  rM  r6  rÏ   Úappend_imagesr  r  r  r  r  Ú	im_framesÚframe_countÚim_seqÚim_framer{  ÚpreviousÚprev_disposalÚ
prev_blendÚbase_imrD  rÎ   Údeltarº   r9  Ú
frame_datarN  Úframe_durationÚframe_disposalÚframe_blendÚfdat_chunksr/   r/   r0   Ú_write_multiple_frames]  sØ   






ÿÿ
€Î4
ü
$





õýý
Ör˜  rA  úImage.ImagerE   rF   Úfilenamer‘   rH   c                 C  s   t | ||dd� d S )NT)Úsave_all)r…  )rA  rE   rš  r/   r/   r0   Ú	_save_allÞ  rv  rœ  Fc           '   
     sD  |rU| j  d| j d¡¡}tƒ }tƒ ‰ | j  dg ¡}t | g|¡D ]}t |¡D ]}	| |	j	¡ ˆ  |	j
¡ q(q!dD ]}
|
|v rB nq:| ¡ }
t‡ fdd„tdƒD ƒƒ}n| j
}| j	}
|
}|
dkr£d| j v rqtd	| j d > d
ƒ}n| jr†ttt| j ¡ d	 ƒd d
ƒd	ƒ}nd
}|dkr£|dkr“d	}n	|dkršd}nd}|d|› �7 }| 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|d ƒt|d	 ƒ||dddƒ	 g d¢}| j  d| j d¡¡}|�r d}|d t |¡ }||d|ƒ | d ¡ | j  d!¡}|�rxg d"¢}|jD ]G}|d d… \}}||v �rL| |¡ ||||ƒ �q0||v �rY||||ƒ �q0|d	d…  ¡ �rvt|ƒdk�ol|d }|�sv||||ƒ �q0| 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�rK| j $¡ d,k�rK| j  d,d-¡}!|} ||d&|!d | … ƒ | j  d.¡}%|%�rp||d/tt%|%d d0 d1 ƒƒtt%|%d	 d0 d1 ƒƒd2ƒ |�r–d3d4g}|jD ]}|d d… \}}||v �r”| |¡ ||||ƒ �qz| j  d5¡}&|&�r½t!|&t&j'ƒ�r«|& (d6¡}&|& )d7¡�r·|&d8d … }&||d9|&ƒ |�rÊt*| |||
|||ƒ} | �rßt+ ,| t-||ƒd:d;| j
 d|fg¡ |�r|jD ](}|d d… \}}|d	d…  ¡ �rt|ƒdk�o|d }|�r||||ƒ �qå||d<dƒ t.|d=ƒ�r | /¡  d S d S )>NrÏ   r‰  )r    r   r   c                 3  s&   � | ]‰ t ‡ fd d„ˆD ƒƒV  qdS )c                 3  s   � | ]}|ˆ  V  qd S rI   r/   )rÞ   Ú
frame_size©rÁ   r/   r0   rà   õ  rá   z"_save.<locals>.<genexpr>.<genexpr>N)Úmax)rÞ   ©Úsizesrž  r0   rà   õ  s   €$ z_save.<locals>.<genexpr>r!   r   Úbitsr   é   r%   r$   r"   ú;ÚoptimizeFÚcompress_levelrz  Ú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   r   rl  r   iÿÿ  z%cannot use transparency for this moder    ÚArë   s   pHYsrê   g      à?rd  s   bKGDs   hISTrò   r#   rÿ   r&   s   eXIfr“   r¦   rx   Úflush)0r{  r-  r¸   Úsetr~  r  r   r€  rŽ   rM  rN  rQ   rå   r=  rU  r/  rŸ  rä   ÚgetdataÚencoderconfigÚ	_OUTMODESÚKeyErrorr{   rn  r  ro  r4   r›   Úremover‹   r(  rA  Ú
getpaletter™   rd   rˆ  Úgetpalettemodere   r	   ÚExifÚtobytesÚ
startswithr˜  r   r…  rs  Úhasattrr®  )'rA  rE   rš  rt  r›  rÏ   Úmodesr‰  rŒ  r�  rM  rN  ÚoutmodeÚcolorsr¢  r6  Ú	bit_depthÚ
color_typerv   r=   r‹   ÚiccÚnamer@   r¸   Úchunks_multiple_allowedÚ
info_chunkrZ   rŒ   Úpalette_byte_numberÚpalette_bytesrÖ   Úalpha_bytesÚalphaÚredÚgreenÚbluerë   rò   r/   r   r0   r…  â  s0  ÿþÿ
$ü
€þ


÷




€ÿ
"üû


€
ÿ$
€ÿr…  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d„Zddd	„Zd
S )zgetchunks.<locals>.collectorr@   rd   rG   rH   c                 S  s   d S rI   r/   ru  r/   r/   r0   rn  ²  r_   z"getchunks.<locals>.collector.writert  c                 S  s   | j  |¡ d S rI   )r@   rf   )rL   rt  r/   r/   r0   rf   µ  rC   z#getchunks.<locals>.collector.appendNrw  )rt  rd   rG   rH   )r)   r*   r+   r@   rn  rf   r/   r/   r/   r0   Ú	collector¯  s    
rË  c                 W  s0   d  |¡}tt|t|ƒƒƒ}|  |||f¡ d S )Nrž   )rm  ro  rB   rf   rp  r/   r/   r0   rf   ¸  s   
zgetchunks.<locals>.appendN)r{  r…  r@   )rA  ÚparamsrË  rf   rE   r/   r/   r0   Ú	getchunks¬  s   	þrÍ  z.pngz.apngz	image/png)r   )r  rd   rG   r�   )rA  r™  rE   rF   rš  r‘   rG   rH   )EÚ
__future__r   r~  ÚloggingÚrerr   r  r4   Úenumr   Útypingr   r   r   r   r�   r	   r
   r   r   r   Ú_binaryr   rÙ   r   rU   r   r   rˆ  r   ro  r   Ú	getLoggerr)   rk   ÚcompilerØ   rV   r  rÉ   r×   Ú	SAFEBLOCKr7   r¶   r(   r1   r>   rB   rD   rƒ   r€   rŠ   r¥   r  r  r²  rq  rs  ry  r˜  rœ  r…  rÍ  Úregister_openra  Úregister_saveÚregister_save_allÚregister_extensionsÚregister_mimer/   r/   r/   r0   Ú<module>   sª    
ë

	]`  
^  Uð 
 K