a
    &gh                     @  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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&rd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#Z0ej1Z2d$e2 Z3G d%d& d&eZ4G d'd( d(eZ5d)d)d*d+d,Z6dqd)d-d-d.d/d0Z7G d1d2 d2Z8G d3d4 d4e9Z:G d5d6 d6Z;G d7d8 d8eZ<G d9d: d:e8Z=d)d;d<d=d>Z>G d?d@ d@ejZ?dAdBdCdDdEdFdGdGdGdHdIdJdKdLdMdNZ@dOd)d)dPdQdRdSZAG dTdU dUZBG dVdW dWZCG dXdY dYeZDdZdOd[d\d\d]d^d]d_d`daZEdZdOdbdPdcdddeZFeAdfdZdOdbd[d;dPdfdgdhZGdZdidjdkdldmZHeIe?jJe?e> eKe?jJeG eLe?jJeF eMe?jJdndog eNe?jJdp dS )r    )annotationsN)Callable)IntEnum)IOAny
NamedTupleNoReturncast   )Image
ImageChops	ImageFileImagePaletteImageSequence)i16be)i32be)o8)o16be)o32be)	deprecate)DeferredErrorF)_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 r3   r3   b/mounts/lovelace/software/anaconda3/envs/metaDMG/lib/python3.9/site-packages/PIL/PngImagePlugin.pyr,   k   s   r,   c                   @  s   e Zd ZdZdZdS )Blendr   r
   N)r-   r.   r/   	OP_SOURCEOP_OVERr3   r3   r3   r4   r5      s   r5   bytes)s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dobjZ	plaintextmsgr3   r3   r4   _safe_zlib_decompress   s    rB   int)dataseedr:   c                 C  s   t | |d@ S )Nl    )r;   crc32)rD   rE   r3   r3   r4   _crc32   s    rG   c                   @  s   e Zd ZdddddZdddd	Zd dd
dZdddddZddddZdddddddZdddddddZ	ddddddZ
ddddddZd$ddd d!d"Zd#S )%ChunkStream	IO[bytes]Nonefpr:   c                 C  s   || _ g | _d S N)rL   queueselfrL   r3   r3   r4   __init__   s    zChunkStream.__init__ztuple[bytes, int, int]r:   c                 C  s   d}| j dusJ | jr6| j \}}}| j | n*| j d}|dd }| j  }t|}t|stj	sdt
| d}t||||fS )z.Fetch a new chunk. Returns header information.Nr'   r&   zbroken PNG file (chunk ))rL   rN   popseekreadtelli32is_cidr   LOAD_TRUNCATED_IMAGESreprSyntaxError)rP   cidposlengthr9   rA   r3   r3   r4   rV      s    
zChunkStream.readc                 C  s   | S rM   r3   rP   r3   r3   r4   	__enter__   s    zChunkStream.__enter__object)argsr:   c                 G  s   |    d S rM   )close)rP   rc   r3   r3   r4   __exit__   s    zChunkStream.__exit__c                 C  s   d  | _ | _d S rM   )rN   rL   r`   r3   r3   r4   rd      s    zChunkStream.closer8   rC   )r]   r^   r_   r:   c                 C  s$   | j d usJ | j |||f d S rM   )rN   appendrP   r]   r^   r_   r3   r3   r4   push   s    zChunkStream.pushc                 C  s,   t d||| t| d|d ||S )z"Call the appropriate chunk handlerzSTREAM %r %s %sZchunk_ascii)loggerdebuggetattrdecoderg   r3   r3   r4   call   s    zChunkStream.call)r]   rD   r:   c              
   C  s   t jr&|d d? d@ r&| || dS | jdus4J zBt|t|}t| jd}||krtdt| d}t|W n@ t	j
y } z&dt| d}t||W Y d}~n
d}~0 0 dS )	zRead and verify checksumr      r
   Nr&   z(broken PNG file (bad header checksum in rS   z(broken PNG file (incomplete checksum in )r   rZ   crc_skiprL   rG   rX   rV   r[   r\   structerror)rP   r]   rD   Zcrc1Zcrc2rA   er3   r3   r4   crc   s    zChunkStream.crcc                 C  s   | j dusJ | j d dS )zRead checksumNr&   )rL   rV   )rP   r]   rD   r3   r3   r4   rp      s    zChunkStream.crc_skip   IENDzlist[bytes])endchunkr:   c              
   C  s   g }| j d usJ z|  \}}}W n4 tjyX } zd}t||W Y d }~n
d }~0 0 ||krdq| |t| j | || q|S )Nztruncated PNG file)	rL   rV   rq   rr   OSErrorrt   r   
_safe_readrf   )rP   rv   Zcidsr]   r^   r_   rs   rA   r3   r3   r4   verify   s     zChunkStream.verifyN)ru   )r-   r.   r/   rQ   rV   ra   re   rd   rh   rn   rt   rp   ry   r3   r3   r3   r4   rH      s   rH   c                   @  s<   e Zd ZU dZded< ded< edddd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strz
str | None)textr{   r|   r:   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
        )r}   __new__r{   r|   )clsr~   r{   r|   rP   r3   r3   r4   r     s    ziTXt.__new__)NN)r-   r.   r/   __doc____annotations__staticmethodr   r3   r3   r3   r4   rz      s   
 rz   c                   @  sd   e Zd ZdZddddZdddddd	d
dZddddddddddZddddddddZdS )PngInfoz<
    PNG chunk container (for use with save(pnginfo=))

    rJ   rR   c                 C  s
   g | _ d S rM   chunksr`   r3   r3   r4   rQ     s    zPngInfo.__init__Fr8   bool)r]   rD   
after_idatr:   c                 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   )rP   r]   rD   r   r3   r3   r4   add!  s    
zPngInfo.add str | bytes)keyvaluer{   r|   zipr:   c                 C  s   t |ts|dd}t |ts,|dd}t |tsB|dd}t |tsX|dd}|r| d|d | d | d t|  n$| d|d | d | d |  dS )	zAppends 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)
isinstancer8   encoder   r;   compress)rP   r   r   r{   r|   r   r3   r3   r4   add_itxt-  s    



 zPngInfo.add_itxtzstr | bytes | iTXt)r   r   r   r:   c                 C  s   t |tr>| j|||jdur"|jnd|jdur4|jnd|dS t |ts|z|dd}W n" tyz   | j|||d Y S 0 t |ts|dd}|r| d|d t	
|  n| d|d	 |  dS )
zAppends 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   rz   r   r{   r|   r8   r   UnicodeErrorr   r;   r   )rP   r   r   r   r3   r3   r4   add_textP  s$    
	

zPngInfo.add_textN)F)r   r   F)F)r-   r.   r/   r   rQ   r   r   r   r3   r3   r3   r4   r     s      $ r   c                   @  s&   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.   r/   r   r3   r3   r3   r4   r   x  s   
r   c                      s  e Zd Zddd fddZddddd	Zdd
ddZdd
ddZddddddZddddddZddddddZ	ddddddZ
ddddddZddddddZddddddZddddd d!Zddddd"d#Zddddd$d%Zddddd&d'Zddddd(d)Zddddd*d+Zddddd,d-Zddddd.d/Zddddd0d1Zddddd2d3Z  ZS )4	PngStreamrI   rJ   rK   c                   sZ   t  | i | _i | _d| _d| _g | _d | _d | _d | _	d | _
ti g d | _d| _d S )Nr   r   r   r   )superrQ   im_infoim_textim_sizeim_modeim_tile
im_paletteim_custom_mimetypeim_n_frames_seq_numr   rewind_statetext_memoryrO   	__class__r3   r4   rQ     s    zPngStream.__init__rC   )chunklenr:   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_MEMORYr@   )rP   r   rA   r3   r3   r4   check_text_memory  s    
zPngStream.check_text_memoryrR   c                 C  s   t | j | j| j| _d S rM   )r   r   copyr   r   r   r`   r3   r3   r4   save_rewind  s
    zPngStream.save_rewindc                 C  s&   | j j | _| j j| _| j j| _d S rM   )r   r   r   r   r   r   r   r   r`   r3   r3   r4   rewind  s    
zPngStream.rewindr8   )r^   r_   r:   c                 C  s   | j d usJ t| j |}|d}td|d |  ||d  }td| |dkrnd| d}t|zt||d d  }W n6 ty   tj	rd }n Y n t
jy   d }Y n0 || jd	< |S )
Nr   ziCCP profile name %rr
   zCompression method %sr   Unknown compression method z in iCCP chunkr%   icc_profile)rL   r   rx   findrj   rk   r\   rB   r@   rZ   r;   rr   r   )rP   r^   r_   r9   icomp_methodrA   r   r3   r3   r4   
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
y   Y n0 |d rd| jd	< |d
 rd}t||S )N   zTruncated IHDR chunkr   r&   r'   	      r
   	interlace   zunknown filter category)rL   r   rx   rZ   r@   rX   r   _MODESr   
im_rawmode	Exceptionr   r\   rP   r^   r_   r9   rA   r3   r3   r4   
chunk_IHDR  s$     
zPngStream.chunk_IHDRr   c                 C  sp   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|d S )Nbboxr   Tdefault_imager   zimage data found)	r   r   _Tiler   r   r   r   Zim_idatEOFError)rP   r^   r_   r   rA   r3   r3   r4   
chunk_IDAT  s    


zPngStream.chunk_IDATc                 C  s   d}t |d S )Nzend of PNG image)r   )rP   r^   r_   rA   r3   r3   r4   
chunk_IEND  s    zPngStream.chunk_IENDc                 C  s4   | j d usJ t| j |}| jdkr0d|f| _|S )Nr   r   )rL   r   rx   r   r   rP   r^   r_   r9   r3   r3   r4   
chunk_PLTE  s
    

zPngStream.chunk_PLTEc                 C  s   | j d usJ t| j |}| jdkrZt|rN|d}|dkrX|| jd< q|| jd< nD| jdv rtt|| jd< n*| jdkrt|t|dt|df| jd< |S )	Nr   r   r   transparency)r   r   r   r   r%   r&   )	rL   r   rx   r   _simple_palettematchr   r   i16)rP   r^   r_   r9   r   r3   r3   r4   
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   rx   rX   r   r   r3   r3   r4   
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   Nr3   ).0eltr3   r3   r4   	<genexpr>  r   z'PngStream.chunk_cHRM.<locals>.<genexpr>Zchromaticity)rL   r   rx   rq   unpacklentupler   )rP   r^   r_   r9   Zraw_valsr3   r3   r4   
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   rx   rZ   r@   r   r   r3   r3   r4   
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< n|dkr||f| jd	< |S )
Nr   zTruncated pHYs chunkr   r&   r'   r
   
F%u?dpiZaspect)rL   r   rx   rZ   r@   rX   r   )	rP   r^   r_   r9   rA   pxpyunitr   r3   r3   r4   
chunk_pHYs&  s    zPngStream.chunk_pHYsc                 C  s   | j d usJ t| j |}z|dd\}}W n tyJ   |}d}Y n0 |r|dd}|dd}|dkrt|n|| j|< || j|< | t	| |S )Nr   r
   r   r   r   replaces   exif)
rL   r   rx   splitr@   rm   r   r   r   r   )rP   r^   r_   r9   kvk_strv_strr3   r3   r4   
chunk_tEXt8  s    

zPngStream.chunk_tEXtc           
      C  s
  | j d usJ t| j |}z|dd\}}W n tyJ   |}d}Y n0 |rZ|d }nd}|dkrzd| d}t|zt|dd  }W n6 ty   tjrd}n Y n tj	y   d}Y n0 |r|
dd}|
dd	}	|	 | j|< | j|< | t|	 |S )
Nr   r
   r   r   r   z in zTXt chunkr   r   r   )rL   r   rx   r   r@   r\   rB   rZ   r;   rr   rm   r   r   r   r   )
rP   r^   r_   r9   r   r   r   rA   r   r   r3   r3   r4   
chunk_zTXtL  s6    


zPngStream.chunk_zTXtc                 C  s  | j d usJ t| j | }}z|dd\}}W n tyJ   | Y S 0 t|dk r\|S |d |d |dd    }}}z|dd\}}	}
W n ty   | Y S 0 |dkr|dkrzt|
}
W n: ty   tjr| Y S  Y n tj	y   | Y S 0 n|S |dkr |
| j
d< z4|dd}|d	d}|	d	d}|
d	d}W n tyl   | Y S 0 t||| | j
|< | j|< | t| |S )
Nr   r
   r%   r   s   XML:com.adobe.xmpZxmpr   r   r   )rL   r   rx   r   r@   r   rB   rZ   r;   rr   r   rm   r   rz   r   r   )rP   r^   r_   rr9   r   cfcmr{   Ztkr   r   Zlang_strZtk_strr   r3   r3   r4   
chunk_iTXto  sH    
 





zPngStream.chunk_iTXtc                 C  s.   | j d usJ t| j |}d| | jd< |S )N   Exif  exif)rL   r   rx   r   r   r3   r3   r4   
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rXd | _td |S t|}|dksp|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   rx   rZ   r@   r   warningswarnrX   r   r   )rP   r^   r_   r9   rA   n_framesr3   r3   r4   
chunk_acTL  s&    


zPngStream.chunk_acTLc                 C  sP  | j d usJ t| j |}|dk r:tjr.|S d}t|t|}| jd u rT|dksl| jd urx| j|d krxd}t||| _t|dt|d }}t|dt|d	 }}	| j\}
}|| |
ks|	| |krd
}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   rx   rZ   r@   rX   r   r\   r   r   r   float)rP   r^   r_   r9   rA   seqwidthheightr   r   Zim_wZim_hZ	delay_numZ	delay_denr3   r3   r4   
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rjd}t||| _| |d |d S )Nr&   z"APNG contains truncated fDAT chunkr
   r   )	rL   r   rZ   rx   r@   rX   r   r\   r   )rP   r^   r_   r9   rA   r	  r3   r3   r4   
chunk_fdAT  s    zPngStream.chunk_fdAT)r-   r.   r/   rQ   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  __classcell__r3   r3   r   r4   r   ~  s*   	
#+r   r   )prefixr:   c                 C  s
   |  tS rM   )
startswith_MAGIC)r  r3   r3   r4   _accept  s    r  c                      s   e Zd ZdZdZddddZedddd	Zddd
dZdddddZ	d%ddddddZ
ddddZddddZdddddZddddZddd d!Zd"d fd#d$Z  ZS )&PngImageFileZPNGzPortable network graphicsrJ   rR   c              	   C  s  t | jdsd}t|| j| _d| _g | _t| j| _| j \}}}z| j	|||}W nd t
yv   Y qY nP ty   td||| t| j|}|dd  r| j||f Y n0 | j|| q<| jj| _| jj| _| jj| _d | _| jj| _| jj| _| jjpd| _| j dd| _!| jj"rR| jj"\}}t#$||| _%|d	krh|d
 | _&n|| _&| jjd urd| _'| j(  | j&| _)| j* | _+| j!r|  jd7  _| ,d | jdk| _-d S )Nr'   znot a PNG filer   %r %s %s (unknown)r
   r%   r   F   fdATr&   ).r  rL   rV   r\   _fp_PngImageFile__frameprivate_chunksr   pngrn   r   AttributeErrorrj   rk   r   rx   islowerrf   rt   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_idatrW   _PngImageFile__rewind_seekis_animated)rP   rA   r]   r^   r_   r9   rawmoderD   r3   r3   r4   _open  sR    	








zPngImageFile._openzdict[str, str | iTXt]c                 C  sR   | j d u r>| jr&| j}| | jd  |   | jr>| | | j d usLJ | j S )Nr
   )r  r&  r  rU   r   load)rP   framer3   r3   r4   r~   8  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rb| j   d| _ dS )zVerify PNG fileNz)verify must be called directly after openr   r%   r'   )rL   RuntimeErrorrU   r   r  ry   rd   Z_exclusive_fp)rP   rA   r3   r3   r4   ry   H  s    



zPngImageFile.verifyrC   )r*  r:   c                 C  s   |  |sd S || jk r$| dd | j}t| jd |d D ]P}z| | W q> ty } z$| | d}t||W Y d }~q>d }~0 0 q>d S )Nr   Tr
   zno more images in APNG file)Z_seek_checkr  r%  ranger   rU   )rP   r*  Z
last_framefrs   rA   r3   r3   r4   rU   Z  s    


zPngImageFile.seekFr   )r*  r   r:   c           	   	   C  sL  | j d usJ t| jtr"| jj|  d }|dkr|rx| 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rd| }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^Y n0 |d
krd}t#||dkr|rd}t"|d}z| j $||| W n t%y   Y q^Y nv t#y(   |dkr|d	8 }|r|| _	Y q^t| j| Y n2 t&yX   t'(d||| t| j| Y n0 q>|| _| j j| _| jd| _| jd| _| jd}| jsd}t#||r|| _| jd u r| jt)j*krt)j+| _d | _| jt)j*kr| jrH| j | _| ,| j| j| _n4| jt)j+krHt-j./| j0| j1| _| ,| j| j| _d S )Nr   r   Fr  r  r   r
   zcannot seek to frame r&   ru   zNo more images in APNG file   fcTLzAPNG missing frame dataTr  r  zimage not found in APNG frame)2r  r   r  r   exrU   r$  r   r#  r"  Z_imr   r   r   r   rL   _prev_imdisposer  r   Z
dispose_opblend_opr  r@   r)  impastedispose_extentr   r   rx   rV   rq   rr   r\   r   rn   UnicodeDecodeErrorr  rj   rk   r,   r2   r1   _cropr   corefillmodesize)	rP   r*  r   r5  rA   Zframe_startr]   r^   r_   r3   r3   r4   r%  i  s    









zPngImageFile._seekc                 C  s   | j S rM   )r  r`   r3   r3   r4   rW     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decoderconfigr"  _PngImageFile__idatr   load_preparer`   r3   r3   r4   r=    s    zPngImageFile.load_preparer8   )
read_bytesr:   c                 C  s   | j dusJ | jdkr| jd | j  \}}}|dvrP| j ||| dS |dkrz| j ||| W n ty~   Y n0 |d | _q|| _q|dkr| j}nt|| j}| j| | _| j|S )zinternal: read more image dataNr   r&   )   IDATs   DDATr  r   r  )r  r<  rL   rV   rh   rn   r   min)rP   r>  r]   r^   r_   r3   r3   r4   	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yd   Y qY n0 |dkrtqn(|dkr| jrd| _| j 	||| qz| j 
||| W q& ty   Y qY q& tyB   |dkr|d8 }zt| j| W nD ty< } z*tjr$W Y d}~Y qn|W Y d}~n
d}~0 0 Y q& ty   td||| t| j|}|dd	  r| j||d
f Y q&0 q&| j j| _| js| j   d| _ n| jr| jtjkr| | j| j }| jj!dkrd| j"v r|#d| j"d }n\| jj!dkrdd| j"v rd| j"d }t$|t%rN|&| nt$|t'rd|(| |)d}| j*|| j | | j| _dS )z%internal: finished reading image dataNr   r&   ru   r.  r  r  r
   r%   Tr   r   r$   r   )+r  r<  rL   rV   rq   rr   r\   r&  r"  rh   rn   r6  r   r   rx   rw   rZ   r  rj   rk   r  r  rf   r   r  rd   r0  r2  r5   r7   r7  r3  r5  r:  r   Zconvert_transparentr   r8   ZputpalettealphasrC   Zputpalettealphaconvertr4  )	rP   r]   r^   r_   rs   r9   updatedmasktr3   r3   r4   load_end  sf    







zPngImageFile.load_endz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   r)  getexifZ_get_merged_dictr`   r3   r3   r4   _getexif9  s
    
zPngImageFile._getexifz
Image.Exifc                   s   d| j vr|   t  S )Nr   )r   r)  r   rG  r`   r   r3   r4   rG  @  s    
zPngImageFile.getexif)F)r-   r.   r/   formatformat_descriptionr(  propertyr~   ry   rU   r%  rW   r=  rA  rF  rH  rG  r  r3   r3   r   r4   r    s   Cd	">r  )r      r   )L;1rL  r   )r      r   )r      r   )r      r   )r#   rP  rO  )r      r   )r    rL     )r!   rN  rR  )r"   rO  rR  )r   rP  rR  )r   rP  rN  )r$   rP     )r   rM  r   r   r   r#   r   r   r   r    r!   r"   r   r   r$   rI   rJ   rL   r]   rD   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   rG   rL   r]   rD   Z	byte_datart   r3   r3   r4   putchunk^  s
    

rY  c                   @  s.   e Zd ZddddddZdddd	d
ZdS )_idatrI   Callable[..., None]rJ   )rL   chunkr:   c                 C  s   || _ || _d S rM   )rL   r\  )rP   rL   r\  r3   r3   r4   rQ   l  s    z_idat.__init__r8   rD   r:   c                 C  s   |  | jd| d S )Nr?  )r\  rL   rP   rD   r3   r3   r4   rV  p  s    z_idat.writeNr-   r.   r/   rQ   rV  r3   r3   r3   r4   rZ  i  s   rZ  c                   @  s0   e Zd ZdddddddZddd	d
dZdS )_fdatrI   r[  rC   rJ   )rL   r\  r   r:   c                 C  s   || _ || _|| _d S rM   )rL   r\  r   )rP   rL   r\  r   r3   r3   r4   rQ   w  s    z_fdat.__init__r8   r]  c                 C  s*   |  | jdt| j| |  jd7  _d S )Nr  r
   )r\  rL   rW  r   r^  r3   r3   r4   rV  |  s    z_fdat.writeNr_  r3   r3   r3   r4   r`  t  s   r`  c                   @  s&   e Zd ZU ded< ded< ded< dS )_FrameImage.Imager3  z tuple[int, int, int, int] | Noner   zdict[str, Any]encoderinfoNr   r3   r3   r3   r4   ra    s   
ra  rb  r[  r}   zImage.Image | Nonezlist[Image.Image])r3  rL   r\  r:  r'  r   append_imagesr:   c                  C  s`  | j d}| j d| jdd}| j d| jdtj}	| j d| jdtj}
|rht|}nt| g|}g }d}|D ]}t	
|D ]}|j|kr| }n
||}| j  }t|ttfr|| |d< n |d u rd|jv r|jd |d< t|	ttfr|	| |d< t|
ttfr4|
| |d< |d7 }|rf|d }|j d}|j d}|tjkrt|dk rt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}|sj||dkrj||dkrjd|v rj|j d  |d 7  < qnd }|t ||| qqt|dkr|s|d jS ||dt!t|t!| |r| j|kr| |} t"#| t$t%t& t'||t"(dd| j d|g d}t)|D ]F\}}|j}|js6d|j }n|j}||}|j}|j }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$t%t& t'||t"(dd|j d|g n>t.|||}t"#|t$t%t& |t"(dd|j d|g |j/}qd S )Nr  r   r   r  r  r
   r%   r$   )r   r   r   r   r   F)Z
alpha_onlys   acTLr   r.  r  )0rc  r  r   r,   r0   r5   r6   	itertoolschainr   Iteratorr:  r   rB  r   listr   r2   r   r1   r3  r   r8  r9  r;  r   cropr4  r   Zsubtract_moduloZgetbboxrf   ra  rW  r   _saver	   r   r8   rZ  r   	enumeraterC   roundo16r   r`  r   ) r3  rL   r\  r:  r'  r   rd  r  r   r  r  rh  Z	im_framesZframe_countim_seqim_framerc  previousZprev_disposalZ
prev_blendZbase_imr1  r   deltar   r*  Z
frame_datar;  Zframe_durationZframe_disposalZframe_blendZfdat_chunksr3   r3   r4   _write_multiple_frames  s    	















rt  r   )r3  rL   filenamer:   c                 C  s   t | ||dd d S )NT)save_all)rl  )r3  rL   ru  r3   r3   r4   	_save_all  s    rw  )r3  rL   ru  r\  rv  r:   c           (   
     st  |r| j d| jd}t }t  | j dg }t| g|D ],}t|D ]}	||	j	  |	j
 qPqBdD ]}
|
|v rt qqt| }
t fddtdD }n| j
}| j	}
|
}|
dkrPd| j v rtd	| j d > d
}n0| jrttt| j d	 d d
d	}nd
}|dkrP|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||W Y d }~n
d }~0 0 |dkrtdddd |t ||dt|d t|d	 ||ddd	 g d}| j d | jd }|rpd!}|d" t| }||d#| |d$ | j d%}|rg d&}|jD ]}|d d \}}||v r|| |||| nR||v r|||| n:|d	d  rt|dko|d }|s|||| q| j	dkrj|d }| j !d'd | }t||k r^|d7 }qD||d(| | j d)| jd)d }|s|dkrv| j	dkr|} t"|t#r||d*|d |   n0tdtd+|}d,| d }!||d*|!d |   n~| j	d-v r$tdtd.|}||d*t$| nP| j	d'kr\|\}"}#}$||d*t$|"t$|# t$|$  nd)| j v rd/}t|nB| j	dkr| j % d0kr| j !d0d1}!|} ||d*|!d |   | j d2}%|%r||d3tt&|%d d4 d5 tt&|%d	 d4 d5 d6 |rNd7d8g}|jD ]6}|d d \}}||v r|| |||| q| j d9}&|&rt"|&t'j(rx|&)d:}&|&*d;r|&d<d  }&||d=|& | }'|rt+| |||
|||}'|'rt,-|'t.t/t# t0||t,1d>d?|'j
 d|g |rP|jD ]P}|d d \}}|d	d  rt|dko8|d }|r|||| q||d@d t2|dArp|3  d S )BNr   rd  )r$   r   r   c                 3  s$   | ] t  fd dD V  qdS )c                 3  s   | ]}|  V  qd S rM   r3   )r   
frame_sizer   r3   r4   r   2  r   z"_save.<locals>.<genexpr>.<genexpr>N)max)r   sizesry  r4   r   2  r   z_save.<locals>.<genexpr>r%   r   bitsr
      r)   r(   r&   ;optimizeFZcompress_levelre  compress_type
dictionaryr   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   r   s   PLTEr   s   tRNS      )r   r   r   r   i  z%cannot use transparency for this moder$   Ar   s   pHYsr   g      ?rL  s   bKGDs   hISTr   r'   r   r*   s   eXIfr   r   ru   flush)4rc  r  r   setrg  rh  r   ri  r   r:  r;  rT   r   r,  r@  r!  rz  r   ZgetdataZencoderconfig	_OUTMODESKeyErrorrw   r   rV  r  rW  r;   r   remover   r  r3  Z
getpaletter   r8   ro  ZgetpalettemoderC   r   ZExiftobytesr  rt  r   rl  r	   r   rZ  r   hasattrr  )(r3  rL   ru  r\  rv  r   modesrd  rp  rq  r:  r;  Zoutmodecolorsr}  r'  Z	bit_depth
color_typers   rA   r   ZiccnamerD   r   Zchunks_multiple_allowedZ
info_chunkr]   r   Zpalette_byte_numberZpalette_bytesr   Zalpha_bytesalpharedgreenbluer   r   Z	single_imr3   r{  r4   rl    s*   	

$


 









"





rl  r   z list[tuple[bytes, bytes, bytes]])r3  paramsr:   c                   sV   ddl m} g  ddddd fdd}| }z|| _t| |d	| W | `n| `0  S )
z4Return a list of PNG chunks representing this image.r   )BytesIOrI   r8   rJ   rT  c                   s0   d |}tt|t|} |||f d S )Nr   )rU  rW  rG   rf   rX  r   r3   r4   rf     s    
zgetchunks.<locals>.appendr   )ior  rc  rl  )r3  r  r  rf   rL   r3   r   r4   	getchunks  s    r  z.pngz.apngz	image/png)r   )O
__future__r   rg  loggingrerq   r   r;   collections.abcr   enumr   typingr   r   r   r   r	   r   r   r   r   r   r   _binaryr   r   r   rX   r   r   ro  r   rW  Z
_deprecater   Z_utilr   TYPE_CHECKINGr   	getLoggerr-   rj   compiler   rY   r  r   r   Z	SAFEBLOCKr>   r   r,   r5   rB   rG   rH   r}   rz   r   r   r   r  r  r  rY  rZ  r`  ra  rt  rw  rl  r  Zregister_openrI  Zregister_saveZregister_save_allZregister_extensionsZregister_mimer3   r3   r3   r4   <module>!   s   

	^`  m  ]  X