o
    “j)Ð  ã                   @  sâ  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 d dl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 ddl m!Z! ddl"m#Z# dZ$e$r„d dl%m&Z& d dlm'Z'm(Z( ddlm)Z) e *e+¡Z,e -d¡j.Z/dZ0dddddddddddd d!d"d#d$œZ1e -d%¡Z2ej3Z4	 d&e4 Z5	 G d'd(„ d(e	ƒZ6G d)d*„ d*e	ƒZ7dd.d/„Z8d€d�d3d4„Z9G d5d6„ d6ƒZ:G d7d8„ d8e;ƒZ<G d9d:„ d:ƒZ=G d;d<„ d<eƒZ>G d=d>„ d>e:ƒZ?d‚dAdB„Z@G dCdD„ dDejƒZAdEdFdGdHdIdJdKdKdKdLdMdNdOdPdQdRœZBdƒdWdX„ZCG dYdZ„ dZƒZDG d[d\„ d\ƒZEd„dadb„ZFG dcdd„ ddeƒZGd…dndo„ZHd†drds„ZIeCdfd‡dudv„ZJdˆdzd{„ZKe LeAjMeAe@¡ e NeAjMeJ¡ e OeAjMeI¡ e PeAjMd|d}g¡ e QeAjMd~¡ dS )‰é    )ÚannotationsN)ÚIntEnum)ÚFraction)ÚIOÚ
NamedTupleÚcasté   )ÚImageÚ
ImageChopsÚ	ImageFileÚImagePaletteÚImageSequence)Úi16be)Úi32be)Úo8)Úo16be)Úo32be)Ú	deprecate)ÚDeferredErrorF)ÚCallable)ÚAnyÚNoReturn)Ú_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© r4   r4   ú\C:\Users\psant\Downloads\Anu Raj Backend\school\venv\Lib\site-packages\PIL/PngImagePlugin.pyr-   n   s    r-   c                   @  s   e Zd ZdZ	 dZdS )ÚBlendr   r   N)r.   r/   r0   Ú	OP_SOURCEÚOP_OVERr4   r4   r4   r5   r6   ƒ   s
    r6   ÚsÚbytesÚreturnc                 C  s*   t  ¡ }| | t¡}|jrd}t|ƒ‚|S )Nz=Decompressed data too large for PngImagePlugin.MAX_TEXT_CHUNK)ÚzlibÚdecompressobjÚ
decompressÚMAX_TEXT_CHUNKÚunconsumed_tailÚ
ValueError)r9   ZdobjÚ	plaintextÚmsgr4   r4   r5   Ú_safe_zlib_decompress‘   s   rD   ÚdataÚseedÚintc                 C  s   t  | |¡d@ S )Nl   ÿÿ )r<   Úcrc32)rE   rF   r4   r4   r5   Ú_crc32š   ó   rI   c                   @  sr   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d„Z	d-dd„Z
d-dd„Zd.d/d#d$„Zd%S )0ÚChunkStreamÚfpú	IO[bytes]r;   ÚNonec                 C  s   || _ g | _d S ©N)rL   Úqueue©ÚselfrL   r4   r4   r5   Ú__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 ú))rL   rP   ÚpopÚseekÚreadÚtellÚi32Úis_cidr   ÚLOAD_TRUNCATED_IMAGESÚreprÚSyntaxError)rR   ÚcidÚposÚlengthr9   rC   r4   r4   r5   rY   §   s   

zChunkStream.readc                 C  s   | S rO   r4   ©rR   r4   r4   r5   Ú	__enter__¼   s   zChunkStream.__enter__ÚargsÚobjectc                 G  s   |   ¡  d S rO   )Úclose)rR   re   r4   r4   r5   Ú__exit__¿   s   zChunkStream.__exit__c                 C  s   d  | _ | _d S rO   )rP   rL   rc   r4   r4   r5   rg   Â   rJ   zChunkStream.closer`   r:   ra   rG   rb   c                 C  s$   | j d usJ ‚| j  |||f¡ d S rO   )rP   Úappend©rR   r`   ra   rb   r4   r4   r5   ÚpushÅ   s   zChunkStream.pushc                 C  s,   t  d|||¡ t| d| d¡› �ƒ||ƒS )z"Call the appropriate chunk handlerzSTREAM %r %s %sZchunk_ÚasciiN)ÚloggerÚdebugÚgetattrÚdecoderj   r4   r4   r5   ÚcallÉ   s   zChunkStream.callrE   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 rV   z(broken PNG file (incomplete checksum in )r   r]   Úcrc_skiprL   rI   r[   rY   r^   r_   ÚstructÚerror)rR   r`   rE   Zcrc1Zcrc2rC   Úer4   r4   r5   ÚcrcÏ   s    þ
€þzChunkStream.crcc                 C  s   | j dusJ ‚| j  d¡ dS )zRead checksumNr'   )rL   rY   )rR   r`   rE   r4   r4   r5   rs   ä   s   zChunkStream.crc_skipó   IENDÚendchunkúlist[bytes]c              
   C  s€   g }| j d us	J ‚	 z	|  ¡ \}}}W n tjy' } zd}t|ƒ|‚d }~ww ||kr/	 |S |  |t | j |¡¡ | |¡ q
)NTztruncated PNG file)	rL   rY   rt   ru   ÚOSErrorrw   r   Ú
_safe_readri   )rR   ry   Zcidsr`   ra   rb   rv   rC   r4   r4   r5   Úverifyê   s    
€þý
özChunkStream.verifyN©rL   rM   r;   rN   )r;   rU   )r;   rK   )re   rf   r;   rN   ©r;   rN   )r`   r:   ra   rG   rb   rG   r;   rN   )r`   r:   ra   rG   rb   rG   r;   r:   )r`   r:   rE   r:   r;   rN   )rx   )ry   r:   r;   rz   )r.   r/   r0   rS   rY   rd   rh   rg   rk   rq   rw   rs   r}   r4   r4   r4   r5   rK   ¢   s    








rK   c                   @  s4   e Zd ZU dZded< ded< e	d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ÚtkeyNÚtextÚstrú
str | Noner;   c                 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
        N)r„   Ú__new__r�   r‚   )Úclsrƒ   r�   r‚   rR   r4   r4   r5   r†   
  s   ziTXt.__new__)NN)rƒ   r„   r�   r…   r‚   r…   r;   r€   )r.   r/   r0   Ú__doc__Ú__annotations__Ústaticmethodr†   r4   r4   r4   r5   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=))

    r;   rN   c                 C  s
   g | _ d S rO   ©Úchunksrc   r4   r4   r5   rS   !  ó   
zPngInfo.__init__Fr`   r:   rE   Ú
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�   ri   )rR   r`   rE   r�   r4   r4   r5   Ú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)Ú
isinstancer:   Úencoder‘   r<   Úcompress)rR   r“   r•   r�   r‚   r–   r4   r4   r5   Úadd_itxt0  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‚   r:   r�   ÚUnicodeErrorr‘   r<   rž   )rR   r“   r•   r–   r4   r4   r5   Úadd_textS  s,   
ûû
	ÿ
zPngInfo.add_textNr   ©F)r`   r:   rE   r:   r�   r�   r;   rN   )r’   r’   F)r“   r”   r•   r”   r�   r”   r‚   r”   r–   r�   r;   rN   )r“   r”   r•   r    r–   r�   r;   rN   )r.   r/   r0   rˆ   rS   r‘   rŸ   r¦   r4   r4   r4   r5   r‹     s    
ú$ÿr‹   c                   @  ó&   e Zd ZU ded< ded< ded< dS )Ú_RewindStatez dict[str | tuple[int, int], Any]Úinfozlist[ImageFile._Tile]Útilez
int | NoneÚseq_numN©r.   r/   r0   r‰   r4   r4   r4   r5   r©   {  ó   
 r©   c                      sæ   e Zd Zd5‡ fdd„Zd6d	d
„Zd7dd„Zd7dd„Zd8dd„Zd8dd„Zd9dd„Z	d9dd„Z
d8dd„Zd8dd„Zd8dd „Zd8d!d"„Zd8d#d$„Zd8d%d&„Zd8d'd(„Zd8d)d*„Zd8d+d,„Zd8d-d.„Zd8d/d0„Zd8d1d2„Zd8d3d4„Z‡  ZS ):Ú	PngStreamrL   rM   r;   rN   c                   sZ   t ƒ  |¡ i | _i | _d| _d| _g | _d | _d | _d | _	d | _
ti g d ƒ| _d| _d S )N©r   r   r’   r   )ÚsuperrS   Úim_infoÚim_textÚim_sizeÚim_modeÚim_tileÚ
im_paletteÚim_custom_mimetypeÚim_n_framesÚ_seq_numr©   Úrewind_stateÚtext_memoryrQ   ©Ú	__class__r4   r5   rS   ‚  s   
zPngStream.__init__ÚchunklenrG   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_MEMORYrA   )rR   r¿   rC   r4   r4   r5   Úcheck_text_memory“  s   
ÿÿûzPngStream.check_text_memoryc                 C  s   t | j ¡ | j| jƒ| _d S rO   )r©   r²   Úcopyr¶   rº   r»   rc   r4   r4   r5   Úsave_rewindœ  s
   
ýzPngStream.save_rewindc                 C  s&   | j j ¡ | _| j j| _| j j| _d S rO   )r»   rª   rÂ   r²   r«   r¶   r¬   rº   rc   r4   r4   r5   Úrewind£  s   
zPngStream.rewindra   rb   r:   c                 C  sÌ   | j d usJ ‚t | j |¡}| d¡}t d|d |… ¡ ||d  }t d|¡ |dkr7d|› d�}t|ƒ‚zt||d d … ƒ}W n tyS   tj	rPd }n‚ Y n t
jy^   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)rL   r   r|   Úfindrm   rn   r_   rD   rA   r]   r<   ru   r²   )rR   ra   rb   r9   ÚiÚcomp_methodrC   rÆ   r4   r4   r5   Ú
chunk_iCCP¨  s*   
þÿ
zPngStream.chunk_iCCPc                 C  s®   | j d usJ ‚t | j |¡}|dk rtjr|S d}t|ƒ‚t|dƒt|dƒf| _zt|d |d f \| _| _	W n	 t
yA   Y nw |d rKd| jd	< |d
 rUd}t|ƒ‚|S )Né   zTruncated IHDR chunkr   r'   r(   é	   é   r   Ú	interlaceé   zunknown filter category)rL   r   r|   r]   rA   r[   r´   Ú_MODESrµ   Ú
im_rawmodeÚ	Exceptionr²   r_   ©rR   ra   rb   r9   rC   r4   r4   r5   Ú
chunk_IHDRÄ  s&    ÿ
zPngStream.chunk_IHDRr   c                 C  sl   d| j v rt d| j d || j¡g}n| jd urd| j d< t dd| j || j¡g}|| _|| _d}t|ƒ‚)NÚbboxr–   TÚdefault_imager°   zimage data found)	r²   r   Ú_TilerÑ   r¹   r´   r¶   Zim_idatÚEOFError)rR   ra   rb   r«   rC   r4   r4   r5   Ú
chunk_IDATÙ  s   


zPngStream.chunk_IDATc                 C  s   d}t |ƒ‚)Nzend of PNG image)rØ   )rR   ra   rb   rC   r4   r4   r5   Ú
chunk_IENDæ  s   zPngStream.chunk_IENDc                 C  s4   | j d usJ ‚t | j |¡}| jdkrd|f| _|S )Nr    r   )rL   r   r|   rµ   r·   ©rR   ra   rb   r9   r4   r4   r5   Ú
chunk_PLTEê  s
   

zPngStream.chunk_PLTEc                 C  sÌ   | j d usJ ‚t | j |¡}| jdkr/t |¡r(| d¡}|dkr&|| jd< |S || jd< |S | jdkrAt|ƒr:dnd| jd< |S | jdv rOt|ƒ| jd< |S | jdkrdt|ƒt|d	ƒt|d
ƒf| jd< |S )Nr    r›   r   Útransparencyr   éÿ   )r   r   r   r&   r'   )	rL   r   r|   rµ   Ú_simple_paletteÚmatchrÇ   r²   Úi16)rR   ra   rb   r9   rÈ   r4   r4   r5   Ú
chunk_tRNSò  s&   




ù
ú
ü
þ zPngStream.chunk_tRNSc                 C  s2   | j d usJ ‚t | j |¡}t|ƒd | jd< |S )Nç     jø@Úgamma)rL   r   r|   r[   r²   rÛ   r4   r4   r5   Ú
chunk_gAMA	  s   zPngStream.chunk_gAMAc                 C  sT   | j d usJ ‚t | j |¡}t dt|ƒd › d�|¡}tdd„ |D ƒƒ| jd< |S )Nú>r'   ÚIc                 s  s   � | ]}|d  V  qdS )rã   Nr4   )Ú.0Úeltr4   r4   r5   Ú	<genexpr>  ó   € z'PngStream.chunk_cHRM.<locals>.<genexpr>Zchromaticity)rL   r   r|   rt   ÚunpackÚlenÚtupler²   )rR   ra   rb   r9   Zraw_valsr4   r4   r5   Ú
chunk_cHRM  s
   zPngStream.chunk_cHRMc                 C  sL   | j d usJ ‚t | j |¡}|dk rtjr|S d}t|ƒ‚|d | jd< |S )Nr   zTruncated sRGB chunkr   Zsrgb)rL   r   r|   r]   rA   r²   rÓ   r4   r4   r5   Ú
chunk_sRGB  s   zPngStream.chunk_sRGBc           	      C  s˜   | j d usJ ‚t | j |¡}|dk rtjr|S d}t|ƒ‚t|dƒt|dƒ}}|d }|dkr?|d |d f}|| jd< |S |dkrJ||f| jd	< |S )
NrÌ   zTruncated pHYs chunkr   r'   r(   r   ç¦
F%uš?ÚdpiZaspect)rL   r   r|   r]   rA   r[   r²   )	rR   ra   rb   r9   rC   ÚpxÚpyÚunitrò   r4   r4   r5   Ú
chunk_pHYs+  s    
þzPngStream.chunk_pHYsc                 C  sš   | j d usJ ‚t | j |¡}z
| dd¡\}}W n ty%   |}d}Y nw |rK| dd¡}| dd¡}|dkr:|n|| j|< || j|< |  t	|ƒ¡ |S )Nr›   r   r¡   r—   r˜   Úreplaces   exif)
rL   r   r|   ÚsplitrA   rp   r²   r³   rÁ   rí   )rR   ra   rb   r9   ÚkÚvÚk_strÚv_strr4   r4   r5   Ú
chunk_tEXt=  s   ý
zPngStream.chunk_tEXtc           
      C  s  | j d usJ ‚t | j |¡}z
| dd¡\}}W n ty%   |}d}Y nw |r-|d }nd}|dkr=d|› d�}t|ƒ‚z
t|dd … ƒ}W n tyW   tjrTd}n‚ Y n tj	yb   d}Y nw |r‚| 
dd¡}| 
dd	¡}	|	 | j|< | j|< |  t|	ƒ¡ |S )
Nr›   r   r¡   r   rÅ   z in zTXt chunkr—   r˜   r÷   )rL   r   r|   rø   rA   r_   rD   r]   r<   ru   rp   r²   r³   rÁ   rí   )
rR   ra   rb   r9   rù   rú   rÉ   rC   rû   rü   r4   r4   r5   Ú
chunk_zTXtQ  s<   þ
þÿzPngStream.chunk_zTXtc                 C  sŒ  | j d usJ ‚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yT   | Y S w |dkr€|dkr~zt|
ƒ}
W n tyr   tjrq| Y S ‚  tj	y}   | 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™   )rL   r   r|   rø   rA   rí   rD   r]   r<   ru   r²   rp   r¥   r€   r³   rÁ   )rR   ra   rb   Úrr9   rù   ÚcfÚcmr�   Ztkrú   rû   Zlang_strZtk_strrü   r4   r4   r5   Ú
chunk_iTXtt  sP   ÿ ÿÿ
ÿzPngStream.chunk_iTXtc                 C  s.   | j d usJ ‚t | j |¡}d| | jd< |S )Nó   Exif  Úexif)rL   r   r|   r²   rÛ   r4   r4   r5   Ú
chunk_eXIfŸ  s   zPngStream.chunk_eXIfc                 C  sž   | j d usJ ‚t | j |¡}|dk rtjr|S d}t|ƒ‚| jd ur,d | _t d¡ |S t|ƒ}|dks8|dkr?t 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)rL   r   r|   r]   rA   r¹   ÚwarningsÚwarnr[   r²   r¸   )rR   ra   rb   r9   rC   Ún_framesr4   r4   r5   Ú
chunk_acTL¦  s&   


zPngStream.chunk_acTLc                 C  sN  | j d usJ ‚t | j |¡}|dk rtjr|S d}t|ƒ‚t|ƒ}| jd u r*|dks6| jd ur<| j|d kr<d}t|ƒ‚|| _t|dƒt|dƒ}}t|dƒt|d	ƒ}}	| j\}
}|| |
ksf|	| |krld
}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)rL   r   r|   r]   rA   r[   rº   r_   r´   r²   rá   Úfloat)rR   ra   rb   r9   rC   ÚseqÚwidthÚheightró   rô   Zim_wZim_hZ	delay_numZ	delay_denr4   r4   r5   Ú
chunk_fcTL»  s<   ÿÿ
zPngStream.chunk_fcTLc                 C  s„   | j d usJ ‚|dk rtjrt | j |¡}|S d}t|ƒ‚t | j d¡}t|ƒ}| j|d kr5d}t|ƒ‚|| _|  |d |d ¡S )Nr'   z"APNG contains truncated fDAT chunkr   r  )	rL   r   r]   r|   rA   r[   rº   r_   rÙ   )rR   ra   rb   r9   rC   r  r4   r4   r5   Ú
chunk_fdATÙ  s   zPngStream.chunk_fdATr~   )r¿   rG   r;   rN   r   )ra   rG   rb   rG   r;   r:   )ra   rG   rb   rG   r;   r   )r.   r/   r0   rS   rÁ   rÃ   rÄ   rÊ   rÔ   rÙ   rÚ   rÜ   râ   rå   rï   rð   rö   rý   rþ   r  r  r  r  r  Ú__classcell__r4   r4   r½   r5   r¯   �  s,    

	














#
+

r¯   Úprefixr�   c                 C  s
   |   t¡S rO   )Ú
startswithÚ_MAGIC)r  r4   r4   r5   Ú_acceptî  rŽ   r!  c                      s”   e Zd ZdZdZd%dd„Zed&dd	„ƒZd%‡ f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 ).ÚPngImageFileZPNGzPortable network graphicsr;   rN   c              	   C  sÒ  | j d usJ ‚t| j  d¡ƒsd}t|ƒ‚| j | _d| _g | _t| j ƒ| _	 | j ¡ \}}}z
| j 	|||¡}W n0 t
yA   Y qq tyh   t d|||¡ t | j |¡}|dd…  ¡ rf| 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'   ).rL   r!  rY   r_   Ú_fpÚ_PngImageFile__frameÚprivate_chunksr¯   Úpngrq   rØ   ÚAttributeErrorrm   rn   r   r|   Úislowerri   rw   rµ   Ú_moder´   Ú_sizer²   rª   Ú_textr¶   r«   r¸   Zcustom_mimetyper¹   r
  ÚgetrÖ   r·   r   ÚrawÚpaletteÚ_PngImageFile__prepare_idatZ!_close_exclusive_fp_after_loadingrÃ   Ú_PngImageFile__rewind_idatrZ   Ú_PngImageFile__rewindÚ_seekÚis_animated)rR   rC   r`   ra   rb   r9   ÚrawmoderE   r4   r4   r5   Ú_openú  s\   €üð






zPngImageFile._openúdict[str, str | iTXt]c                 C  sR   | j d u r| jr| j}|  | jd ¡ |  ¡  | jr|  |¡ | j d us&J ‚| j S )Nr   )r-  r5  r&  rX   r
  Úload)rR   Úframer4   r4   r5   rƒ   >  s   

zPngImageFile.textc                   s`   | j du rd}t|ƒ‚| j  | jd d d ¡ | jdusJ ‚| j ¡  | j ¡  tƒ  ¡  dS )zVerify PNG fileNz)verify must be called directly after openr   r&   r(   )rL   ÚRuntimeErrorrX   r«   r(  r}   rg   r±   )rR   rC   r½   r4   r5   r}   N  s   


zPngImageFile.verifyr:  rG   c              
   C  s†   |   |¡sd S || jk r|  dd¡ | j}zt| jd |d ƒD ]}|  |¡ q W d S  tyB } z|  |¡ d}t|ƒ|‚d }~ww )Nr   Tr   zno more images in APNG file)Z_seek_checkr&  r4  ÚrangerØ   rX   )rR   r:  Z
last_frameÚfrv   rC   r4   r4   r5   rX   ^  s   

ÿ

€ýzPngImageFile.seekFrÄ   r�   c           	   	   C  s:  | j d usJ ‚t| jtƒr| jj‚|  d }|dkrb|r<| j | j¡ | j  ¡  | j| _	d | _
| j j| _| j j| _| j| _d | _d | _| j dd¡| _| j d¡| _| j d¡| _| j d¡}d| _nå|| jd krrd|› �}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 �q!w |dkrÅd}t#|ƒ‚|dkrÓ|rÑd}t"|ƒ‚d	}z
| j  $|||¡ W nB t%yç   Y �q! t#�y   |dkrþ|d
8 }|rþ|| _	Y �q!t | j|¡ Y n t&�y   t' (d|||¡ t | j|¡ Y nw q�|| _| j j| _| j d¡| _| j d¡| _| j d¡}| j�sGd}t#|ƒ‚|�rM|| _| jd u �r^| jt)j*k�r^t)j+| _d | _| jt)j*k�r| j�r}| j ¡ | _|  ,| j| j¡| _d S d S | jt)j+k�r›t-j. /| j0| j1¡| _|  ,| 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)2r(  rœ   r%  r   ÚexrX   r3  rÄ   r2  r1  Z_imr²   rª   r¶   r«   rL   Ú_prev_imÚdisposer.  rÖ   Z
dispose_opÚblend_opr&  rA   r9  ÚimÚpasteÚdispose_extentrÂ   r   r|   rY   rt   ru   r_   rØ   rq   ÚUnicodeDecodeErrorr)  rm   rn   r-   r3   r2   Ú_cropr	   ÚcoreÚfillÚmodeÚsize)	rR   r:  rÄ   rE  rC   Zframe_startr`   ra   rb   r4   r4   r5   r4  m  s¬   



ÿþã!
þþzPngImageFile._seekc                 C  s   | j S rO   )r&  rc   r4   r4   r5   rZ   Ñ  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.  Zdecoderconfigr1  Ú_PngImageFile__idatr   Úload_preparerc   r4   r4   r5   rM  Ô  s   zPngImageFile.load_prepareÚ
read_bytesr:   c                 C  sÞ   | j dusJ ‚| jdusJ ‚| jdkrU| j d¡ | j  ¡ \}}}|dvr/| j  |||¡ dS |dkrMz
| j  |||¡ W n	 tyF   Y nw |d | _n|| _| jdks|dkr]| j}nt|| jƒ}| j| | _| j |¡S )zinternal: read more image dataNr   r'   )ó   IDATs   DDATr$  r¡   r$  )r(  rL   rL  rY   rk   rq   rØ   Úmin)rR   rN  r`   ra   rb   r4   r4   r5   Ú	load_readÝ  s,   
ÿ
îzPngImageFile.load_readc           	      C  st  | j dusJ ‚| jdusJ ‚| jdkr| j | j¡ 	 | j d¡ z
| j  ¡ \}}}W n tjtfy7   Y q¿w |dkr=q¿|dkrP| jrPd| _| j  	|||¡ q¿z
| j  
|||¡ W nc tyc   Y q¿ ty•   |dkrq|d8 }z	t | j|¡ W n ty’ } ztjrŒW Y d}~Y q¿|‚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�r6| jtjk�r8|  | j| j ¡}| jj!dkrùd| j"v rù| #d| j"d ¡}n.| jj!dk�r"d| j"v �r"| j"d }t$|t%ƒ�r| &|¡ nt$|t'ƒ�r"| (|¡ | )d¡}| j *|| j |¡ | j| _dS dS dS )z%internal: finished reading image dataNr   Tr'   rx   r>  r$  r#  r   r&   r   rÝ   r%   r    )+r(  rL   rL  rY   rt   ru   r_   r5  r1  rk   rq   rF  rØ   r   r|   r{   r]   r)  rm   rn   r*  r'  ri   r³   r-  rg   r@  rB  r6   r8   rG  rC  rE  rJ  rª   Zconvert_transparentrœ   r:   ZputpalettealphasrG   ZputpalettealphaÚconvertrD  )	rR   r`   ra   rb   rv   r9   ÚupdatedÚmaskÚtr4   r4   r5   Úload_end   sz   
ÿ€üÿ€üâ
#


ÿ


ñzPngImageFile.load_endúdict[int, 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ª   r9  ÚgetexifZ_get_merged_dictrc   r4   r4   r5   Ú_getexif?  s
   
zPngImageFile._getexifú
Image.Exifc                   s   d| j vr	|  ¡  tƒ  ¡ S )Nr  )rª   r9  r±   rX  rc   r½   r4   r5   rX  F  s   

zPngImageFile.getexifr   )r;   r8  )r:  rG   r;   rN   r§   )r:  rG   rÄ   r�   r;   rN   )r;   rG   )rN  rG   r;   r:   )r;   rW  )r;   rZ  )r.   r/   r0   ÚformatÚformat_descriptionr7  Úpropertyrƒ   r}   rX   r4  rZ   rM  rQ  rV  rY  rX  r  r4   r4   r½   r5   r"  ö  s    
D

d

	
#
?r"  )r   ó   r›   )úL;1r^  r›   )r   ó   r›   )r   ó   r›   )r   ó   r›   )r$   rb  ra  )r   ó   r›   )r!   r^  ó   )r"   r`  rd  )r#   ra  rd  )r    rb  rd  )r   rb  r`  )r%   rb  ó   )r   r_  r   r   r   r$   rç   r   r   r!   r"   r#   r    r   r%   rL   rM   r`   rN   c                 G  sJ   d  |¡}|  tt|ƒƒ| ¡ |  |¡ t|t|ƒƒ}|  t|ƒ¡ dS )z'Write a PNG chunk (including CRC field)r¡   N)ÚjoinÚwriteÚo32rí   rI   ©rL   r`   rE   Z	byte_datarw   r4   r4   r5   Úputchunkd  s
   

rj  c                   @  s    e Zd Zddd„Zddd„ZdS )Ú_idatrL   rM   ÚchunkúCallable[..., None]r;   rN   c                 C  s   || _ || _d S rO   )rL   rl  )rR   rL   rl  r4   r4   r5   rS   r  rT   z_idat.__init__rE   r:   c                 C  s   |   | jd|¡ d S )NrO  )rl  rL   ©rR   rE   r4   r4   r5   rg  v  ó   z_idat.writeN)rL   rM   rl  rm  r;   rN   ©rE   r:   r;   rN   ©r.   r/   r0   rS   rg  r4   r4   r4   r5   rk  o  s    
rk  c                   @  s    e Zd Zdd	d
„Zddd„ZdS )Ú_fdatrL   rM   rl  rm  r¬   rG   r;   rN   c                 C  s   || _ || _|| _d S rO   )rL   rl  r¬   )rR   rL   rl  r¬   r4   r4   r5   rS   }  s   
z_fdat.__init__rE   r:   c                 C  s*   |   | jdt| jƒ|¡ |  jd7  _d S )Nr$  r   )rl  rL   rh  r¬   rn  r4   r4   r5   rg  ‚  s   z_fdat.writeN)rL   rM   rl  rm  r¬   rG   r;   rN   rp  rq  r4   r4   r4   r5   rr  z  s    
rr  rC  úImage.ImageÚencoderinfoúdict[str, Any]c                 C  s2   |  dd¡|  dd¡|  dd¡|  dd¡f| _d S )NÚoptimizeFZcompress_leveléÿÿÿÿÚcompress_typeÚ
dictionaryr¡   )r.  Zencoderconfig)rC  rt  r4   r4   r5   Ú_apply_encoderinfo‡  s
   




ürz  c                   @  r¨   )Ú_Framers  rC  z tuple[int, int, int, int] | NonerÕ   ru  rt  Nr­   r4   r4   r4   r5   r{  �  r®   r{  rl  rm  rJ  r„   r6  rÖ   úImage.Image | NoneÚappend_imagesúlist[Image.Image]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 }|�r*|d }|j  d¡}|j  d¡}|tjkr»t|ƒdk r»tj}|tjkrå|j ¡ }tj d	| jd
¡}|j}|rÙ| |¡}nd| j }| ||¡ n|tjkrð|d j}n|j}t | d	¡| d	¡¡}|jdd�}|�s)|| d¡k�r)|| d¡k�r)d|v �r)|j d  |d 7  < qHnd }| t |||ƒ¡ qHqAt|ƒdk�rF|�sF|d jS ||dt!t|ƒƒt!|ƒƒ |�r‚| j|k�r^| n|  |¡}t"|| j ƒ t# $|t%t&t' t(||ƒƒt# )dd| j d|¡g¡ d}t*|ƒD ]½\}}|j}|j�s™d|j }n|j}| |¡}|j}|j }| dd¡}t+|d ƒ ,d¡}|j-dk�rÂd}t.|ƒ‚| d|	¡} | d|
¡}!||dt!|ƒt!|d ƒt!|d ƒt!|d ƒt!|d ƒt/|j-ƒt/|j0ƒt1| ƒt1|!ƒƒ |d7 }t"|| j ƒ |dk�r%|�s%t# $|t%t&t' t(||ƒƒt# )dd|j d|¡g¡ �qˆt2|||ƒ}"t# $|t%t&t' |"ƒt# )dd|j d|¡g¡ |"j3}�qˆd S )Nr  r  r   r  r  r   rw  r&   r%   )r   r   r   r   r°   éþÿÿÿF)Z
alpha_onlys   acTLr–   r  éÿÿ  zcannot write durationr>  )4rt  r.  rª   r-   r1   r6   r7   Ú	itertoolsÚchainr   ÚIteratorrJ  rÂ   rR  rœ   Úlistrî   r3   rí   r2   rC  r	   rH  rI  rK  rÕ   ZcroprD  r
   Zsubtract_moduloZgetbboxri   r{  rh  rz  r   Ú_saver   r   r:   rk  r×   Ú	enumerater   Zlimit_denominatorÚ	numeratorrA   Úo16Údenominatorr   rr  r¬   )#rC  rL   rl  rJ  r6  rÖ   r}  r  r  r  r  r‚  Z	im_framesZframe_countÚim_seqÚim_framert  ÚpreviousZprev_disposalZ
prev_blendZbase_imrA  rÕ   ÚdeltaZ
default_imr¬   r:  Z
frame_datarK  Zframe_durationÚdelayrC   Zframe_disposalZframe_blendZfdat_chunksr4   r4   r5   Ú_write_multiple_frames–  sð   	







ÿÿþýü€Î4

üý




õýý
r�  Úfilenamer”   c                 C  s   t | ||dd� d S )NT)Úsave_all)r…  )rC  rL   r�  r4   r4   r5   Ú	_save_all)  ro  r’  r‘  c           )   
     sJ  |rU| j  d| j d¡¡}tƒ }tƒ ‰ | j  dg ¡}t | g|¡D ]}t |¡D ]}	| |	j	¡ ˆ  |	j
¡ q(q!dD ]}
|
|v rB qGq:| ¡ }
t‡ fdd„tdƒD ƒƒ}n| j
}| j	}
|
}g }| jrh|  ¡ pgg }|
dkr©d| j v r|td	| j d > d
ƒ}n| jrŒttt|ƒd d
ƒd	ƒ}nd
}|dkr©|dkr™d	}n	|dkr d}nd}|d|› �7 }z	t| \}}}W n tyÉ } zd|
› d�}t|ƒ|‚d }~ww |dkrÕtdddd� | t¡ ||dt|d ƒt|d	 ƒ||dddƒ	 g d¢}| j  d| j d¡¡ }�rd}|d t |¡ }||d|ƒ | d¡ | j  d¡ }�rng d¢}|jD ]G}|d d… \}}||v �rB| |¡ ||||ƒ �q&||v �rO||||ƒ �q&|d	d…  ¡ �rlt|ƒdk�ob|d }|�sl||||ƒ �q&| j	dk�r˜|d }t|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�r?| j" #¡ d)k�r?| j" d)d*¡}"|}!||d"|"d |!… ƒ | j  d+¡ }&�rd||d,tt$|&d d- d. ƒƒtt$|&d	 d- d. ƒƒd/ƒ |�rŠd0d1g}|jD ]}|d d… \}}||v �rˆ| |¡ ||||ƒ �qn| j  d2¡ }'�r±t |'t%j&ƒ�rŸ|' 'd3¡}'|' (d4¡�r«|'d5d … }'||d6|'ƒ | }(|�rÀt)| |||
|||ƒ}(|(�rât*|(| j ƒ t+ ,|(t-t.t t/||ƒƒt+ 0d7d8|(j
 d|¡g¡ |�r|jD ](}|d d… \}}|d	d…  ¡ �rt|ƒdk�o|d }|�r||||ƒ �qè||d9d:ƒ t1|d;ƒ�r#| 2¡  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 rO   r4   )rè   Ú
frame_size©rÈ   r4   r5   rê   F  rë   z"_save.<locals>.<genexpr>.<genexpr>N)Úmax)rè   ©Úsizesr”  r5   rê   F  s   €$ z_save.<locals>.<genexpr>r&   r    Úbitsr   é   r*   r)   r'   ú;zcannot write mode z as PNGrç   zSaving I mode images as PNGrË   )Ú
stacklevels   IHDRr   r›   )s   cHRMs   cICPs   gAMAs   sBITó   sRGBs   tIMErÆ   s   ICC Profiler£   s   iCCPrœ  Zpnginfo)s   sPLTrš   r¤   r¢   s   PLTErÝ   s   tRNSrÞ   ó   ÿ)r   r   rç   r   r€  r   z%cannot use transparency for this moder%   ÚArò   s   pHYsrñ   g      à?r^  s   bKGDs   hISTr  r(   r  r+   s   eXIfr–   r°   rx   r¡   Úflush)3rt  r.  rª   Úsetr�  r‚  r   rƒ  r‘   rJ  rK  rW   rî   r<  r0  Z
getpaletterP  r•  rí   Ú	_OUTMODESÚKeyErrorr{   r   rg  r   rh  r<   rž   Úremover�   r*  r:   rœ   rˆ  rC  ZgetpalettemoderG   r	   ZExifÚtobytesr  r�  rz  r   r…  r   r   rk  r×   ÚhasattrrŸ  ))rC  rL   r�  rl  r‘  rÖ   Úmodesr}  rŠ  r‹  rJ  rK  Zoutmoder0  Úcolorsr˜  r6  Z	bit_depthZ
color_typerv   rC   r�   ZiccÚnamerE   rª   Zchunks_multiple_allowedZ
info_chunkr`   r�   Zpalette_byte_numberZpalette_bytesrÝ   Zalpha_bytesÚalphaÚredÚgreenÚbluerò   r  Z	single_imr4   r–  r5   r…  -  s4  	ÿþÿ

€þ


÷




€ÿ
"üû


€
ÿý
€ÿr…  Úparamsr   ú list[tuple[bytes, bytes, bytes]]c                   sJ   ddl m} g ‰ d‡ fd
d„}|ƒ }z|| _t| |d|ƒ W | `ˆ S | `w )z4Return a list of PNG chunks representing this image.r   )ÚBytesIOrL   rM   r`   r:   rE   r;   rN   c                   s0   d  |¡}tt|t|ƒƒƒ}ˆ  |||f¡ d S )Nr¡   )rf  rh  rI   ri   ri  rŒ   r4   r5   ri     s   
zgetchunks.<locals>.appendr’   N©rL   rM   r`   r:   rE   r:   r;   rN   )Úior¯  rt  r…  )rC  r­  r¯  ri   rL   r4   rŒ   r5   Ú	getchunksü  s   þr²  z.pngz.apngz	image/png)r9   r:   r;   r:   )r   )rE   r:   rF   rG   r;   rG   )r  r:   r;   r�   r°  )rC  rs  rt  ru  r;   rN   )rC  rs  rL   rM   rl  rm  rJ  r„   r6  r„   rÖ   r|  r}  r~  r;   r|  )rC  rs  rL   rM   r�  r”   r;   rN   )rC  rs  rL   rM   r�  r”   rl  rm  r‘  r�   r;   rN   )rC  rs  r­  r   r;   r®  )RÚ
__future__r   r�  ÚloggingÚrert   r  r<   Úenumr   Z	fractionsr   Útypingr   r   r   r’   r	   r
   r   r   r   Ú_binaryr   rá   r   r[   r   r   rˆ  r   rh  Z
_deprecater   Z_utilr   ÚTYPE_CHECKINGÚcollections.abcr   r   r   r   Ú	getLoggerr.   rm   Úcompilerà   r\   r   rÐ   rß   Z	SAFEBLOCKr?   rÀ   r-   r6   rD   rI   rK   r„   r€   r‹   r©   r¯   r!  r"  r¡  rj  rk  rr  rz  r{  r�  r’  r…  r²  Zregister_openr[  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer4   r4   r4   r5   Ú<module>   sÀ    
ë

	^`  
o  ^ð

	
 
û 
P