o
    svXjö, ã                   @   sˆ  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Zd dlmZ d dl	m
Z
 d dl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 e e¡ZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3d Z4d!Z5d"Z6d#Z7d$Z8d%Z9d&Z:d'Z;d(Z<d)Z=d*Z>d+Z?d,Z@d-ZAd.ZBd/ZCd0ZDd1ZEd2ZFd3ZGd4ZHd5ZId6ZJd7ZKi dd8“d9d:“d;d<“d=d>“d?d@“dAdB“dCdD“dEdF“dGdH“dIdJ“dKdL“dMdN“dOdP“dQdR“dSdT“dUdV“dWdX“ZLdYdZ„ eL M¡ D ƒZNi e"d d[dd[d\fd]“e#d d[dd[d\fd]“e"d d[d9d[d\fd^“e#d d[d9d[d\fd^“e"dd[dd[d\fd_“e#dd[dd[d\fd_“e"dd[d9d[d\fd`“e#dd[d9d[d\fd`“e"d d[ddad\fdb“e#d d[ddad\fdb“e"d d[d9dad\fdc“e#d d[d9dad\fdc“e"dd[ddad\fdd“e#dd[ddad\fdd“e"dd[d9dad\fde“e#dd[d9dad\fde“e"d d[ddfd\fdg“i e#d d[ddfd\fdg“e"d d[d9dfd\fdh“e#d d[d9dfd\fdh“e"dd[ddfd\fdi“e#dd[ddfd\fdi“e"dd[d9dfd\fdj“e#dd[d9dfd\fdj“e"d d[ddkd\fdl“e#d d[ddkd\fdl“e"d d[d9dkd\fdm“e#d d[d9dkd\fdm“e"dd[ddkd\fdn“e#dd[ddkd\fdn“e"dd[d9dkd\fdo“e#dd[d9dkd\fdo“e"dd[ddpd\fdq“e"d d[ddrd\fds“¥i e"dd[ddrd\fds“e#dd[ddrd\fdt“e"dd[d9drd\fdu“e"ddaddrd\fdv“e#ddaddrd\fdw“e"d dxddyd\fdz“e#d dxddyd\fd{“e"dd[ddyd\fd|“e"ddaddyd\fd}“e#ddaddyd\fd~“e"ddxddyd\fdz“e#ddxddyd\fd{“e"dd[dddafd€“e#dd[dddafd€“e"d9d[dd�d\fd‚“e#d9d[dd�d\fd‚“e"d9d[d9d�d\fdƒ“¥i e#d9d[d9d�d\fdƒ“e"d9d[dd„d\fd…“e#d9d[dd„d\fd…“e"d9d[dd„d†fd‡“e#d9d[dd„d†fd‡“e"d9d[ddˆd‰fdŠ“e#d9d[ddˆd‰fdŠ“e"d9d[dd‹dŒfd�“e#d9d[dd‹dŒfd�“e"d9d[dd„d[fdŽ“e#d9d[dd„d[fdŽ“e"d9d[ddˆd�fd�“e#d9d[ddˆd�fd�“e"d9d[dd‹d‘fd’“e#d9d[dd‹d‘fd’“e"d9d[dd„dafd…“e#d9d[dd„dafd…“¥i e"d9d[ddˆd“fd”“e#d9d[ddˆd“fd”“e"d9d[dd‹d•fd–“e#d9d[dd‹d•fd–“e"d9d[dd„d—fd…“e#d9d[dd„d—fd…“e"d9d[dd˜d\fd™“e#d9d[dd˜d\fdš“e"d9d[dd›d\fdœ“e#d9d[dd›d\fd�“e"d9d[dd›d†fdž“e#d9d[dd›d†fdŸ“e"d9d[dd›d[fd “e#d9d[dd›d[fd¡“e"d9d[dd›dafdœ“e#d9d[dd›dafd�“e"d;d[dd[d\fd¢“¥i e#d;d[dd[d\fd¢“e"d;d[d9d[d\fd£“e#d;d[d9d[d\fd£“e"d;d[ddad\fd¤“e#d;d[ddad\fd¤“e"d;d[d9dad\fd¥“e#d;d[d9dad\fd¥“e"d;d[ddfd\fd¦“e#d;d[ddfd\fd¦“e"d;d[d9dfd\fd§“e#d;d[d9dfd\fd§“e"d;d[ddkd\fd¨“e#d;d[ddkd\fd¨“e"d;d[dddafd©“e#d;d[dddafd©“e"d;d[d9dkd\fdª“e#d;d[d9dkd\fdª“¥e"d?d[dd„d\fd«e#d?d[dd„d\fd«e"d?d[ddˆd†fd¬e#d?d[ddˆd†fd¬e"d?d[dd‹d‰fd­e#d?d[dd‹d‰fd­e"d?d[dd›d\fd®e"dAd[dd�d\fd¯e#dAd[dd�d\fd¯e"dEd[dd�d\fd°e#dEd[dd�d\fd°i¥ZOePd±d²„ eOD ƒƒZQg d³¢ZRd´dµ„ ZSd¶d·„ ZTd¸d¹„ ZUi ZVi ZWG dºd»„ d»eƒZXG d¼d½„ d½eƒZYeVeY_VeWeY_We M¡ D ]!\ZZZ[e[ \d¾d¿¡Z[e]eYdÀe[ eVeZ d ƒ e]eYdÁe[ eWeZ ƒ �q([V[W[Z[[G dÂdÃ„ dÃeYƒZ^e^Z_G dÄdÅ„ dÅejƒZ`i dÆdÆe"ddd[df“dÇdÇe"dddkdf“dÈdÈe"dddd9f“dÉdÉe"d;ddkdf“dÊdÊe"d;ddd9f“dËdÌe"dd9dydf“dÍdÍe"dddrdf“dÎdÎe"dd9drdf“dÏdÐe"dd;dydf“dÑdÑe"d9dd�df“dÒdÒe"d9dd„d f“dÓdÓe"d9dd„d9f“dÔdÔe"d?dd„df“dÕdÕe"dAdd�df“dÖdÖe"dEdd�df“d×d×e#dd9dydf“dØdØe#dddrdf“dÙe#dd9drdfdÚe#dd;dydfdÛœ¥ZadÜdÝ„ ZbG dÞdß„ dßƒZcdàdá„ Zde ee`jfe`eS¡ e ge`jfeb¡ e he`jfed¡ e ie`jfdâdãg¡ e je`jfdä¡ dS )åé    N)ÚMutableMapping)ÚFraction)ÚNumberÚRationalé   )ÚImageÚ	ImageFileÚImageOpsÚImagePaletteÚTiffTags)Úi16be)Úi32be©Úo8©ÚTYPESFTé   s   IIs   MMé   i  i  i  i  i
  i  é  i  i  i  i  i  i  i(  i-  i1  i2  i;  i=  i@  iB  iC  éD  iE  iJ  iR  iS  i[  i  i  i˜‚  i»ƒ  éI†  is‡  ii‡  i¼  i  i–Æ  i—Æ  Úrawé   Ú
tiff_ccitté   Úgroup3é   Úgroup4é   Útiff_lzwé   Ú	tiff_jpegé   Újpegé   Útiff_adobe_deflatei€  Útiff_raw_16i€  Úpackbitsi)€  Útiff_thunderscani²€  Útiff_deflateit‡  Útiff_sgilogiu‡  Útiff_sgilog24imˆ  ÚlzmaiPÃ  ÚzstdiQÃ  Úwebpc                 C   s   i | ]\}}||“qS © r/   )Ú.0ÚkÚvr/   r/   úP/var/www/html/myproject/venv/lib/python3.10/site-packages/PIL/TiffImagePlugin.pyÚ
<dictcomp>Š   s    r4   ©r   r/   )Ú1z1;I)r6   z1;IR)r6   r6   )r6   z1;R)r   )ÚLzL;2I)r7   zL;2IR)r7   zL;2)r7   zL;2R)r   )r7   zL;4I)r7   zL;4IR)r7   zL;4)r7   zL;4R)r$   )r7   zL;I)r7   zL;IR)r7   r7   )r7   zL;R)é   )úI;16zI;12)é   )r9   r9   )úI;16Br;   )r9   zI;16R)ÚIúI;16S)r<   úI;16BS)r   )é    )ÚFúF;32F)r@   úF;32BF)r<   zI;32N)r<   úI;32S)r<   úI;32BS)r$   r$   )ÚLArE   )r$   r$   r$   )ÚRGBrF   )rF   zRGB;R)r$   r$   r$   r$   )ÚRGBArG   ©r   )ÚRGBXrI   )r$   r$   r$   r$   r$   ©r   r   )rI   ÚRGBXX)r$   r$   r$   r$   r$   r$   )r   r   r   )rI   ÚRGBXXX)rG   ÚRGBa)r   r   )rG   ÚRGBaX)r   r   r   )rG   ÚRGBaXX)r   r   )rG   ÚRGBAX)r   r   r   )rG   ÚRGBAXX)iç  )r:   r:   r:   )rF   zRGB;16L)rF   zRGB;16B)r:   r:   r:   r:   )rG   zRGBA;16L)rG   zRGBA;16B)rI   zRGBX;16L)rI   zRGBX;16B)rG   zRGBa;16L)rG   zRGBa;16B)ÚPzP;1)rR   zP;1R)rR   zP;2)rR   zP;2R)rR   zP;4)rR   zP;4R)rR   rR   )ÚPArS   )rR   zP;R)ÚCMYKrT   )rT   ÚCMYKX)rT   ÚCMYKXX)rT   zCMYK;16L)rF   rI   )ÚLABrW   c                 c   s   � | ]	}t |d  ƒV  qdS )r   N)Úlen)r0   Úkey_tpr/   r/   r3   Ú	<genexpr>  ó   € rZ   )ó   MM *ó   II* s   MM* s   II *s   MM +s   II+ c                 C   s   | d d… t v S ©Nr   )ÚPREFIXES©Úprefixr/   r/   r3   Ú_accept  ó   rb   c                 C   s<   t | ƒdk}t|rd|  n| ƒ |¡}|r|d d d… S |S )Nr   éÿÿÿÿ)ÚabsÚIFDRationalÚlimit_rational)ÚvalÚmax_valÚinvÚn_dr/   r/   r3   Ú_limit_rational  s   rl   c                 C   sP   t | ƒ}|j|jf}t|ƒ|k rt| t|ƒƒ}t|ƒ|kr&t |Ž } t| |ƒ}|S ©N)r   Ú	numeratorÚdenominatorÚminrl   re   Úmax)rh   ri   Úmin_valÚfracrk   r/   r/   r3   Ú_limit_signed_rational  s   
rt   c                   @   sX  e Zd ZdZ	 dZd4dd„Zedd„ ƒZedd	„ ƒZd
d„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Z	 edƒZedƒZedƒZedƒZedƒZedƒZedƒZedƒZed ƒZed!ƒZed"ƒZed#ƒZed$ƒZed%ƒZed&ƒZed'ƒZed(ƒZ ed)ƒZ!ed*ƒZ"ed+ƒZ#ed,ƒZ$ed-ƒZ%ed.ƒZ&ed/ƒZ'ed0ƒZ(ed1ƒZ)e*e+d2ƒrªed2ƒZ,d3S d3S )5rf   zÀImplements a rational class where 0/0 is a legal value to match
    the in the wild use of exif rationals.

    e.g., DigitalZoomRatio - 0.00/0.00  indicates that no digital zoom was used
    )Ú
_numeratorÚ_denominatorÚ_valr   c                 C   sŠ   t |tƒr|j| _|j| _|j| _dS t |tƒr!|j| _|j| _n|| _|| _|dkr2tdƒ| _dS |dkr=t|ƒ| _dS t||ƒ| _dS )z®
        :param value: either an integer numerator, a
        float/rational/other number, or an IFDRational
        :param denominator: Optional integer denominator
        Nr   Únanr   )	Ú
isinstancerf   rn   ru   ro   rv   rw   r   Úfloat)ÚselfÚvaluero   r/   r/   r3   Ú__init__=  s   


zIFDRational.__init__c                 C   ó   | j S rm   )ru   ©r{   r/   r/   r3   rn   W  ó   zIFDRational.numeratorc                 C   r~   rm   )rv   r   r/   r/   r3   ro   [  r€   zIFDRational.denominatorc                 C   s.   | j dkr| j| j fS | j |¡}|j|j fS )z…

        :param max_denominator: Integer, the maximum denominator value
        :returns: Tuple of (numerator, denominator)
        r   )ro   rn   rw   Úlimit_denominator)r{   Úmax_denominatorÚfr/   r/   r3   rg   _  s   
zIFDRational.limit_rationalc                 C   s   t t| jƒƒS rm   )Ústrrz   rw   r   r/   r/   r3   Ú__repr__l  s   zIFDRational.__repr__c                 C   s
   | j  ¡ S rm   )rw   Ú__hash__r   r/   r/   r3   r†   o  s   
zIFDRational.__hash__c                 C   s0   | j }t|tƒr|j }t|tƒrt|ƒ}||kS rm   )rw   ry   rf   rz   )r{   Úotherrh   r/   r/   r3   Ú__eq__r  s   

zIFDRational.__eq__c                 C   s   | j | j| jgS rm   )rw   ru   rv   r   r/   r/   r3   Ú__getstate__z  rc   zIFDRational.__getstate__c                 C   s,   t  | d¡ |\}}}|| _|| _|| _d S )Nr   )rf   r}   rw   ru   rv   )r{   Ústaterw   ru   rv   r/   r/   r3   Ú__setstate__}  s
   

zIFDRational.__setstate__c                    ó   ‡ fdd„}|S )Nc                    s   t | jˆ ƒ|Ž S rm   )Úgetattrrw   )r{   Úargs©Úopr/   r3   Údelegate…  rc   z'IFDRational._delegate.<locals>.delegater/   )r�   r‘   r/   r�   r3   Ú	_delegate„  s   zIFDRational._delegateÚ__add__Ú__radd__Ú__sub__Ú__rsub__Ú__mul__Ú__rmul__Ú__truediv__Ú__rtruediv__Ú__floordiv__Ú__rfloordiv__Ú__mod__Ú__rmod__Ú__pow__Ú__rpow__Ú__pos__Ú__neg__Ú__abs__Ú	__trunc__Ú__lt__Ú__gt__Ú__le__Ú__ge__Ú__bool__Ú__ceil__Ú	__floor__Ú	__round__Ú__int__Nr5   )-Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú	__slots__r}   Úpropertyrn   ro   rg   r…   r†   rˆ   r‰   r‹   r’   r“   r”   r•   r–   r—   r˜   r™   rš   r›   rœ   r�   rž   rŸ   r    r¡   r¢   r£   r¤   r¥   r¦   r§   r¨   r©   rª   r«   r¬   Úhasattrr   r­   r/   r/   r/   r3   rf   /  s\    



ÿrf   c                   @   s  e Zd ZdZd^dd„Zedd„ ƒZedd„ ƒZed	d„ ƒZej	d
d„ ƒZdd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zeeeejd*d+fejd,d-fejd.d/fejd0d1fej d2d3fej!d4d5fej"d6d7fej#d,d-fej$d8d9fg	ƒƒ ed:d:ƒd_d<d=„ƒZ%ed:ƒd>d?„ ƒZ&ed@d:ƒd_dAdB„ƒZ'ed@ƒdCdD„ ƒZ(edEdFƒd_dGdH„ƒZ)edEƒdIdJ„ ƒZ*edKd:ƒd_dLdM„ƒZ+edKƒdNdO„ ƒZ,edPdFƒd_dQdR„ƒZ-edPƒdSdT„ ƒZ.dUdV„ Z/dWdX„ Z0d`dZd[„Z1d\d]„ Z2dS )aÚImageFileDirectory_v2a  This class represents a TIFF tag directory.  To speed things up, we
    don't decode tags unless they're asked for.

    Exposes a dictionary interface of the tags in the directory::

        ifd = ImageFileDirectory_v2()
        ifd[key] = 'Some Data'
        ifd.tagtype[key] = TiffTags.ASCII
        print(ifd[key])
        'Some Data'

    Individual values are returned as the strings or numbers, sequences are
    returned as tuples of the values.

    The tiff metadata type of each item is stored in a dictionary of
    tag types in
    :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v2.tagtype`. The types
    are read from a tiff file, guessed from the type added, or added
    manually.

    Data Structures:

        * ``self.tagtype = {}``

          * Key: numerical TIFF tag number
          * Value: integer corresponding to the data type from
            :py:data:`.TiffTags.TYPES`

          .. versionadded:: 3.0.0

    'Internal' data structures:

        * ``self._tags_v2 = {}``

          * Key: numerical TIFF tag number
          * Value: decoded data, as tuple for multiple values

        * ``self._tagdata = {}``

          * Key: numerical TIFF tag number
          * Value: undecoded byte string from file

        * ``self._tags_v1 = {}``

          * Key: numerical TIFF tag number
          * Value: decoded data in the v1 format

    Tags will be found in the private attributes ``self._tagdata``, and in
    ``self._tags_v2`` once decoded.

    ``self.legacy_api`` is a value for internal use, and shouldn't be changed
    from outside code. In cooperation with
    :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`, if ``legacy_api``
    is true, then decoded tags will be populated into both ``_tags_v1`` and
    ``_tags_v2``. ``_tags_v2`` will be used if this IFD is used in the TIFF
    save routine. Tags should be read from ``_tags_v1`` if
    ``legacy_api == true``.

    ó   II*     Nc                 C   sÊ   t |ƒsdt|ƒ› d�}t|ƒ‚|dur|n|dd… | _| jtkr&d| _n| jtkr/d| _nd}t|ƒ‚|d dk| _|| _i | _		 |  
¡  | jrT|  d	|d
d… ¡n	|  d|dd… ¡\| _d| _dS )a—  Initialize an ImageFileDirectory.

        To construct an ImageFileDirectory from a real file, pass the 8-byte
        magic header to the constructor.  To only set the endianness, pass it
        as the 'prefix' keyword argument.

        :param ifh: One of the accepted magic headers (cf. PREFIXES); also sets
              endianness.
        :param prefix: Override the endianness of the file.
        znot a TIFF file (header z not valid)Nr   ú>ú<znot a TIFF IFDé+   ÚQr$   r7   r   F)rb   ÚreprÚSyntaxErrorÚ_prefixÚMMÚ_endianÚIIÚ_bigtiffÚgroupÚtagtypeÚresetÚ_unpackÚnextÚ_legacy_api)r{   Úifhra   rÂ   Úmsgr/   r/   r3   r}   î  s$   

,ÿ
zImageFileDirectory_v2.__init__c                 C   r~   rm   )r½   r   r/   r/   r3   Ú<lambda>  ó    zImageFileDirectory_v2.<lambda>c                 C   r~   rm   )Ú_offsetr   r/   r/   r3   rÊ     rË   c                 C   r~   rm   )rÇ   r   r/   r/   r3   rÊ     rË   c                 C   s   d}t |ƒ‚)Nz"Not allowing setting of legacy api)Ú	Exception)r{   r|   rÉ   r/   r/   r3   Ú
legacy_api  s   z ImageFileDirectory_v2.legacy_apic                 C   s(   i | _ i | _i | _i | _d | _d | _d S rm   )Ú_tags_v1Ú_tags_v2Ú_tagdatarÃ   Ú_nextrÌ   r   r/   r/   r3   rÄ     s   
zImageFileDirectory_v2.resetc                 C   s   t t| ƒƒS rm   )r„   Údictr   r/   r/   r3   Ú__str__  ó   zImageFileDirectory_v2.__str__c                    s   ‡ fdd„ˆ   ¡ D ƒS )z�
        :returns: dict of name|key: value

        Returns the complete tag dictionary, with named tags where possible.
        c                    s"   i | ]\}}t  |ˆ j¡j|“qS r/   )r   ÚlookuprÂ   Úname)r0   Úcoder|   r   r/   r3   r4   (  s    ÿÿz/ImageFileDirectory_v2.named.<locals>.<dictcomp>)Úitemsr   r/   r   r3   Únamed"  s   
þzImageFileDirectory_v2.namedc                 C   ó   t t| jƒt| jƒB ƒS rm   )rX   ÚsetrÑ   rÐ   r   r/   r/   r3   Ú__len__-  ó   zImageFileDirectory_v2.__len__c                 C   sf   || j vr| j| }| j| }| j| \}}|| || jƒ| |< | j | }| jr1t|ttfƒs1|f}|S rm   )rÐ   rÑ   rÃ   Ú_load_dispatchrÎ   ry   ÚtupleÚbytes)r{   ÚtagÚdataÚtypÚsizeÚhandlerrh   r/   r/   r3   Ú__getitem__0  s   



z!ImageFileDirectory_v2.__getitem__c                 C   ó   || j v p	|| jv S rm   )rÐ   rÑ   ©r{   râ   r/   r/   r3   Ú__contains__;  ó   z"ImageFileDirectory_v2.__contains__c                 C   s   |   ||| j¡ d S rm   )Ú_setitemrÎ   )r{   râ   r|   r/   r/   r3   Ú__setitem__>  rë   z!ImageFileDirectory_v2.__setitem__c              
      sª  t ttf}t || j¡‰ t||ƒr|gn|}|| jvr²ˆ jr%ˆ j| j|< n�tj	| j|< t
dd„ |D ƒƒrGt
dd„ |D ƒƒr@tjntj| j|< nkt
dd„ |D ƒƒrƒt
dd„ |D ƒƒr`tj| j|< nRt
dd„ |D ƒƒrptj| j|< nBt
dd„ |D ƒƒr|tjntj| j|< n/t
dd„ |D ƒƒr“tj| j|< nt
d	d„ |D ƒƒr£tj| j|< nt
d
d„ |D ƒƒr²tj| j|< | j| tj	krÂdd„ |D ƒ}n| j| tjkrÑdd„ |D ƒ}| j| tjkoÝt|tƒ}|sët‡ fdd„|D ƒƒ}|rð| jn| j}|�sOˆ jdk�s| j| tjk�sˆ jd u �rOt|ƒdk�rO|�sO|�r'| j| tjtjfv �r'|f}z|\||< W d S  t�yN   t d|› dt|ƒ› d�¡ |d ||< Y d S w |||< d S )Nc                 s   ó   � | ]}t |tƒV  qd S rm   )ry   rf   ©r0   r2   r/   r/   r3   rZ   L  ó   € z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>c                 s   ó   � | ]}|d kV  qdS ©r   Nr/   rï   r/   r/   r3   rZ   O  ó   € c                 s   rî   rm   )ry   Úintrï   r/   r/   r3   rZ   R  rð   c                 s   s(   � | ]}d |  kodk n  V  qdS )r   r   Nr/   rï   r/   r/   r3   rZ   S  ó   €& c                 s   s(   � | ]}d |  k odk n  V  qdS )i €ÿÿi €  Nr/   rï   r/   r/   r3   rZ   U  rõ   c                 s   rñ   rò   r/   rï   r/   r/   r3   rZ   Z  ró   c                 s   rî   rm   )ry   rz   rï   r/   r/   r3   rZ   ]  rð   c                 s   rî   rm   )ry   r„   rï   r/   r/   r3   rZ   _  rð   c                 s   rî   rm   )ry   rá   rï   r/   r/   r3   rZ   a  rð   c                 S   s&   g | ]}t |tƒr| d d¡n|‘qS )ÚasciiÚreplace)ry   r„   Úencoderï   r/   r/   r3   Ú
<listcomp>e  s    ÿÿz2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c                 S   s"   g | ]}t |tƒrt|ƒn|‘qS r/   )ry   rô   rz   rï   r/   r/   r3   rù   j  s   " c                 3   s   � | ]}ˆ   |¡V  qd S rm   )Úcvt_enum©r0   r|   ©Úinfor/   r3   rZ   n  rð   r   zMetadata Warning, tag z had too many entries: z, expected 1r   )r   rá   r„   r   rÖ   rÂ   ry   rÃ   ÚtypeÚ	UNDEFINEDÚallÚRATIONALÚSIGNED_RATIONALÚSHORTÚSIGNED_SHORTÚLONGÚSIGNED_LONGÚDOUBLEÚASCIIÚBYTErÓ   rà   rÏ   rÐ   ÚlengthrX   Ú
ValueErrorÚwarningsÚwarn)r{   râ   r|   rÎ   Ú	basetypesÚvaluesÚis_ifdÚdestr/   rü   r3   rì   A  sr   

ÿ
ýÿ
ýþ þÿÿúzImageFileDirectory_v2._setitemc                 C   s.   | j  |d ¡ | j |d ¡ | j |d ¡ d S rm   )rÐ   ÚpoprÏ   rÑ   ré   r/   r/   r3   Ú__delitem__‘  s   z!ImageFileDirectory_v2.__delitem__c                 C   rÛ   rm   )ÚiterrÜ   rÑ   rÐ   r   r/   r/   r3   Ú__iter__–  rÞ   zImageFileDirectory_v2.__iter__c                 C   s   t  | j| |¡S rm   )ÚstructÚunpackr¿   )r{   Úfmtrã   r/   r/   r3   rÅ   ™  s   zImageFileDirectory_v2._unpackc                 G   s   t j| j| g|¢R Ž S rm   )r  Úpackr¿   )r{   r  r  r/   r/   r3   Ú_packœ  rÞ   zImageFileDirectory_v2._packc                    s   ‡ ‡fdd„}|S )Nc                    sB   ddl m} | j d¡r| jdd …  dd¡|ˆ < ˆ| ftˆ < | S )Nr   r   Úload_r   Ú_ú )r   r   r®   Ú
startswithr÷   rß   )Úfuncr   ©Úidxrå   r/   r3   Ú	decorator   s
   z9ImageFileDirectory_v2._register_loader.<locals>.decoratorr/   )r!  rå   r"  r/   r   r3   Ú_register_loaderŸ  s   z&ImageFileDirectory_v2._register_loaderc                    rŒ   )Nc                    s   | t ˆ < | S rm   )Ú_write_dispatch)r  ©r!  r/   r3   r"  «  s   z9ImageFileDirectory_v2._register_writer.<locals>.decoratorr/   )r!  r"  r/   r%  r3   Ú_register_writerª  s   z&ImageFileDirectory_v2._register_writerc                    sX   ddl m} | \}‰ }|||< t dˆ  ¡‰ˆd‡ ‡fdd„	ft|< ‡ fdd„t|< d S )	Nr   r   ú=Tc                    s   |   t|ƒˆ › ˆ › �|¡S rm   )rÅ   rX   ©r{   rã   rÎ   ©r  rå   r/   r3   rÊ   ¹  s   z7ImageFileDirectory_v2._register_basic.<locals>.<lambda>c                    s   d  ‡‡ fdd„|D ƒ¡S )Nó    c                 3   s   � | ]	}ˆ  ˆ |¡V  qd S rm   )r  rû   )r  r{   r/   r3   rZ   ¾  r[   zJImageFileDirectory_v2._register_basic.<locals>.<lambda>.<locals>.<genexpr>©Újoin©r{   r  )r  r   r3   rÊ   ½  s   ©T)r   r   r  Úcalcsizerß   r$  )Úidx_fmt_namer   r!  r×   r/   r)  r3   Ú_register_basic±  s   
þz%ImageFileDirectory_v2._register_basicÚHÚshortr7   ÚlongÚbzsigned byteÚhzsigned shortÚlzsigned longrƒ   rz   ÚdÚdoublerº   Úlong8r   Tc                 C   ó   |S rm   r/   r(  r/   r/   r3   Ú	load_byteÒ  ó   zImageFileDirectory_v2.load_bytec                 C   s*   t |tƒr	t|ƒ}t |tƒrt|fƒ}|S rm   )ry   rf   rô   rá   ©r{   rã   r/   r/   r3   Ú
write_byteÖ  s
   


z ImageFileDirectory_v2.write_byter   c                 C   s"   |  d¡r|d d… }| dd¡S )Nó    rd   zlatin-1r÷   )ÚendswithÚdecoder(  r/   r/   r3   Úload_stringÞ  s   
z!ImageFileDirectory_v2.load_stringc                 C   s0   t |tƒr	t|ƒ}t |tƒs| dd¡}|d S )Nrö   r÷   r@  )ry   rô   r„   rá   rø   ©r{   r|   r/   r/   r3   Úwrite_stringä  s
   

z"ImageFileDirectory_v2.write_stringr   r$   c                    óV   |   t|ƒd › d�|¡}‡fdd„‰ t‡ fdd„t|d d d… |dd d… ƒD ƒƒS )	Nr   r7   c                    ó   ˆ r| |fS t | |ƒS rm   ©rf   ©Úar5  ©rÎ   r/   r3   Úcombineñ  ó   z4ImageFileDirectory_v2.load_rational.<locals>.combinec                 3   ó   � | ]
\}}ˆ ||ƒV  qd S rm   r/   ©r0   ÚnumÚdenom©rL  r/   r3   rZ   ô  ó   € z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r   r   ©rÅ   rX   rà   Úzip©r{   rã   rÎ   Úvalsr/   ©rL  rÎ   r3   Úload_rationalí  ó   0z#ImageFileDirectory_v2.load_rationalc                    ó   d  ‡ fdd„|D ƒ¡S )Nr*  c                 3   s(   � | ]}ˆ j d gt|dƒ¢R Ž V  qdS )Ú2Ll   ÿÿ N)r  rl   ©r0   rs   r   r/   r3   rZ   ø  s   € 
ÿz7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>r+  r-  r/   r   r3   Úwrite_rationalö  s   ÿz$ImageFileDirectory_v2.write_rationalr"   c                 C   r;  rm   r/   r(  r/   r/   r3   Úload_undefinedü  r=  z$ImageFileDirectory_v2.load_undefinedc                 C   s   t |tƒrt|ƒ dd¡}|S )Nrö   r÷   )ry   rô   r„   rø   rD  r/   r/   r3   Úwrite_undefined   s   
z%ImageFileDirectory_v2.write_undefinedé
   c                    rF  )	Nr   r7  c                    rG  rm   rH  rI  rK  r/   r3   rL  
  rM  z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec                 3   rN  rm   r/   rO  rR  r/   r3   rZ     rS  z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r   r   rT  rV  r/   rX  r3   Úload_signed_rational  rZ  z*ImageFileDirectory_v2.load_signed_rationalc                    r[  )Nr*  c                 3   s*   � | ]}ˆ j d gt|ddƒ¢R Ž V  qdS )Ú2liÿÿÿi   €N)r  rt   r]  r   r/   r3   rZ     s
   € ÿ
ÿz>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>r+  r-  r/   r   r3   Úwrite_signed_rational  s   þz+ImageFileDirectory_v2.write_signed_rationalc                 C   s8   |  |¡}t|ƒ|krd|› dt|ƒ› d�}t|ƒ‚|S )Nz&Corrupt EXIF data.  Expecting to read ú bytes but only got z. )ÚreadrX   ÚOSError)r{   Úfprå   ÚretrÉ   r/   r/   r3   Ú_ensure_read  s   
ÿÿÿz"ImageFileDirectory_v2._ensure_readc              
   C   sr  |   ¡  | ¡ | _�z| jr|  d|  |d¡¡n	|  d|  |d¡¡d }t|ƒD ]Ø}| jr7|  d|  |d¡¡n	|  d|  |d	¡¡\}}}}t || j	¡j
}t |d
¡}	d|› d|› d|	› d|› d�	}
z	| j| \}}W n ty~   t |
d|› � ¡ Y q(w || }|| jr‰dndkr·| ¡ }|  | jr—dnd|¡\}|
d|› d|› �7 }
| |¡ t ||¡}| |¡ n|d |… }t|ƒ|krÙt d|› dt|ƒ› d|› �¡ t |
¡ q(|sát |
¡ q(|| j|< || j|< |
d|dkrõd| nt|ƒ 7 }
t |
¡ q(| j�r|  d|  |d¡¡n	|  d|  |d¡¡\| _W d S  t�y8 }
 zt t|
ƒ¡ W Y d }
~
d S d }
~
ww )Nrº   r$   r2  r   r   ÚHHQ8sé   ÚHHL4sr8   Úunknownztag: ú (ú
) - type: ú)z - unsupported type r   r7   z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read re  z. Skipping tag ú
 - value: r?   ú<table: %d bytes>)rÄ   ÚtellrÌ   rÁ   rÅ   rj  Úranger   rÖ   rÂ   r×   r   Úgetrß   ÚKeyErrorÚloggerÚdebugÚseekr   Ú
_safe_readrX   r  r  rÑ   rÃ   r»   rÆ   rg  r„   )r{   rh  Ú	tag_countÚirâ   rä   Úcountrã   ÚtagnameÚtypnamerÉ   Ú	unit_sizeræ   rå   ÚhereÚoffsetr/   r/   r3   Úload   sz   
ÿüÿ
ýþ
ÿÿþÿ



ÿÿý€þzImageFileDirectory_v2.loadr   c                 C   s  |   dt| jƒ¡}g }|t|ƒ t| jƒd  d }d }t| j ¡ ƒD ]ì\}}|tkr/t|ƒ}| j |¡}t 	d|› d|› dt
|ƒ› �¡ |tjkoNt|tƒ}|ry| jdkrYd}	nd	}	t|	|d
�}
| j| }| ¡ D ]\}}||
|< qj|
 |¡}nt|tƒr€|n|f}| j| | g|¢R Ž }t || j¡j}|ršdnt |d¡}d|› d|› d|› d|› d�	}|dt|ƒdkr½dt|ƒ nt|ƒ 7 }t 	|¡ |rÍd}n|tjtjtjfv rÜt|ƒ}nt|ƒ}t|ƒdkrõ| |||| dd¡df¡ q#| ||||   d|¡|f¡ |t|ƒd d d 7 }q#|d u�r>|| \}}}}}|�r'd}t|ƒ‚|   d|  d|¡d | ¡}|||||f||< |D ]*\}}}}}t 	|› d|› d|› dt
|ƒ› dt
|ƒ› �	¡ ||   d||||¡7 }�q@|d7 }|D ]\}}}}}||7 }t|ƒd@ �r‡|d7 }�qq|S )Nr2  r8   r   zTag z, Type: z	, Value: r¸   s   II*    s   MM *   )rÂ   Úifdrn  zsave: ro  rp  rq  rr  r:   rs  r   r@  r*  r7   r   z&multistrip support not yet implementedr   r  rm  s       ) r  rX   rÐ   ÚsortedrÙ   ÚSTRIPOFFSETSrÃ   rv  rx  ry  r»   r   r  ry   rÓ   r¿   rµ   Útobytesrà   r$  rÖ   rÂ   r×   r   r„   r	  r  rÿ   ÚappendÚljustÚNotImplementedErrorrÅ   )r{   rƒ  ÚresultÚentriesÚstripoffsetsrâ   r|   rä   r  rÈ   r…  r  Úifd_tagÚ	ifd_valuerã   r  r€  rÉ   r~  r/   r/   r3   rˆ  c  sl    


ÿ


.€zImageFileDirectory_v2.tobytesc                 C   sN   |  ¡ dkr| | j|  ddd¡ ¡ |  ¡ }|  |¡}| |¡ |t|ƒ S )Nr   ÚHLé*   r$   )rt  Úwriter½   r  rˆ  rX   )r{   rh  rƒ  rŒ  r/   r/   r3   Úsave°  s   

zImageFileDirectory_v2.save)r¶   NNr.  rH   )3r®   r¯   r°   r±   r}   r³   ra   rƒ  rÎ   ÚsetterrÄ   rÔ   rÚ   rÝ   rç   rê   rí   rì   r  r  rÅ   r  r#  r&  r1  ÚlistÚmapr   r  r  ÚSIGNED_BYTEr  r  ÚFLOATr  ÚIFDÚLONG8r<  r?  rC  rE  rY  r^  r_  r`  rb  rd  rj  r„  rˆ  r”  r/   r/   r/   r3   rµ   ±  s|    
< 
P








÷þÿ






CMrµ   r  r  r  Úwrite_c                       s€   e Zd ZU dZ‡ fdd„Zedd„ ƒZedd„ ƒZee	d< 	 e
dd	„ ƒZd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚImageFileDirectory_v1aþ  This class represents the **legacy** interface to a TIFF tag directory.

    Exposes a dictionary interface of the tags in the directory::

        ifd = ImageFileDirectory_v1()
        ifd[key] = 'Some Data'
        ifd.tagtype[key] = TiffTags.ASCII
        print(ifd[key])
        ('Some Data',)

    Also contains a dictionary of tag types as read from the tiff image file,
    :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v1.tagtype`.

    Values are returned as a tuple.

    ..  deprecated:: 3.0.0
    c                    s   t ƒ j|i |¤Ž d| _d S )NT)Úsuperr}   rÇ   )r{   rŽ   Úkwargs©Ú	__class__r/   r3   r}   Ø  s   
zImageFileDirectory_v1.__init__c                 C   r~   rm   )rÏ   r   r/   r/   r3   rÊ   Ü  rË   zImageFileDirectory_v1.<lambda>c                 C   r~   rm   )rÑ   r   r/   r/   r3   rÊ   Ý  rË   rÃ   c                 C   s(   | |j d�}|j|_|j|_|j|_|S )a2  Returns an
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`
        instance with the same data as is contained in the original
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`
        instance.

        :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`

        r`   )ra   rÑ   rÃ   rÆ   )ÚclsÚoriginalr…  r/   r/   r3   Úfrom_v2ã  s
   zImageFileDirectory_v1.from_v2c                 C   s4   t | jd�}t| jƒ|_t| jƒ|_t| jƒ|_|S )a2  Returns an
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`
        instance with the same data as is contained in the original
        :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`
        instance.

        :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2`

        r`   )rµ   ra   rÓ   rÑ   rÃ   rÐ   )r{   r…  r/   r/   r3   Úto_v2õ  s
   zImageFileDirectory_v1.to_v2c                 C   rè   rm   )rÏ   rÑ   ré   r/   r/   r3   rê     rë   z"ImageFileDirectory_v1.__contains__c                 C   rÛ   rm   )rX   rÜ   rÑ   rÏ   r   r/   r/   r3   rÝ   	  rÞ   zImageFileDirectory_v1.__len__c                 C   rÛ   rm   )r  rÜ   rÑ   rÏ   r   r/   r/   r3   r    rÞ   zImageFileDirectory_v1.__iter__c                 C   s   dD ]	}|   |||¡ qd S ©N)FT)rì   )r{   râ   r|   rÎ   r/   r/   r3   rí     s   ÿz!ImageFileDirectory_v1.__setitem__c                 C   sn   || j vr&| j| }| j| }| j| \}}dD ]}|  ||| ||ƒ|¡ q| j | }t|ttfƒs5|f}|S r¦  )rÏ   rÑ   rÃ   rß   rì   ry   rà   rá   )r{   râ   rã   rä   rå   ræ   Úlegacyrh   r/   r/   r3   rç     s   



z!ImageFileDirectory_v1.__getitem__)r®   r¯   r°   r±   r}   r³   ÚtagsÚtagdatarÓ   Ú__annotations__Úclassmethodr¤  r¥  rê   rÝ   r  rí   rç   Ú__classcell__r/   r/   r   r3   r�  Å  s   
 
r�  c                       sŠ   e Zd ZdZdZdZd‡ fdd„	Zdd„ Zed	d
„ ƒZ	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Z‡ fdd„Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚTiffImageFileÚTIFFz
Adobe TIFFFNc                    s"   d | _ 	 d | _	 tƒ  ||¡ d S rm   )Útag_v2râ   rž  r}   )r{   rh  Úfilenamer   r/   r3   r}   -  s
   zTiffImageFile.__init__c                 C   s    | j  d¡}|d dkr|| j  d¡7 }t|ƒ| _d| _| jj | _| _d| _| j | _	g | _
d| _t d¡ t d| j› �¡ t dt|ƒ› �¡ |  d	¡ dS )
z#Open the first image in a TIFF filer$   r   r¹   Nrd   z*** TiffImageFile._open ***z- __first: z- ifh: r   )rh  rf  rµ   r¯  r…  rÆ   Ú_TiffImageFile__firstÚ_TiffImageFile__nextÚ_TiffImageFile__frameÚ_fpÚ
_frame_posÚ	_n_framesrx  ry  r»   Ú_seek)r{   rÈ   r/   r/   r3   Ú_open6  s   

zTiffImageFile._openc                 C   sX   | j d u r)|  ¡ }|  t| jƒ¡ | j d u r$|  |  ¡ d ¡ | j d u s|  |¡ | j S )Nr   )r¶  rt  r·  rX   rµ  rz  )r{   Úcurrentr/   r/   r3   Ún_framesQ  s   


ÿ
zTiffImageFile.n_framesc                 C   s<   |   |¡sdS |  |¡ t | j¡ tj | j| j¡| _dS )z%Select a given frame as current imageN)	Ú_seek_checkr·  r   Ú_decompression_bomb_checkrå   ÚcoreÚnewÚmodeÚim)r{   Úframer/   r/   r3   rz  [  s
   

zTiffImageFile.seekc                 C   sT  | j | _| j ¡  t| jƒ|krƒ| jsd}t|ƒ‚t d|› d| j	› d| j› d| j ¡ › �¡ | j 
| j¡ | j | j¡ t d| j ¡  ¡ | j | j¡ | jj| jv rYd| _n| jj| _| jdkrh|d | _t| jƒdkru| jdk| _|  j	d7  _	t| jƒ|ks| j 
| j| ¡ | j | j¡ |  ¡  t | j¡ | _| _|| _	|  ¡  d S )	Nzno more images in TIFF filezSeeking to frame z, on frame z	, __next z, location: zLoading tags, location: %sr   r   )r´  rh  rt  rX   rµ  r²  ÚEOFErrorrx  ry  r³  rz  r‰  r¯  r„  rÆ   r¶  Úis_animatedÚ_reload_exifr�  r¤  râ   r…  Ú_setup)r{   rÁ  rÉ   r/   r/   r3   r·  f  s@   
ÿÿÿ


êzTiffImageFile._seekc                 C   r~   )zReturn the current frame number)r³  r   r/   r/   r3   rt  Œ  r€   zTiffImageFile.tellc                 C   s   t | jv r|  | jt  ¡S i S )z™
        Returns a dictionary containing the XMP tags.
        Requires defusedxml to be installed.

        :returns: XMP tags in a dictionary.
        )ÚXMPr¯  Ú_getxmpr   r/   r/   r3   Úgetxmp�  s   zTiffImageFile.getxmpc                 C   sÀ   i }| j  d¡}|r^|dd… dkr^t|dd… ƒ}t |d d d ¡d }t|d| d| … ƒ}|d| d| | … }d	|i||< |t d| | d ¡d d… }|dd… dks|S )
a5  
        Returns a dictionary of Photoshop "Image Resource Blocks".
        The keys are the image resource ID. For more information, see
        https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577409_pgfId-1037727

        :returns: Photoshop "Image Resource Blocks" in a dictionary.
        r   Nr   s   8BIMr    r   r   ra  rã   )r¯  rv  Úi16ÚmathÚceilÚi32)r{   Úblocksrh   ÚidÚnrå   rã   r/   r/   r3   Úget_photoshop_blocks™  s   "ùz"TiffImageFile.get_photoshop_blocksc                    s   | j r
| jr
|  ¡ S tƒ  ¡ S rm   )ÚtileÚuse_load_libtiffÚ_load_libtiffrž  r„  r   r   r/   r3   r„  ®  s   
zTiffImageFile.loadc                 C   s¤   | j r/tjjtjjtjjtjjtjjtjjtjj	dœ 
| j ¡}|d ur/| j |¡| _| jj| _| jsNd| _| j ¡  |  ¡ }tjD ]}||vrHqA| |¡ qAd S d S )N)r   r   r   r   r    r"   r$   T)Ú_tile_orientationr   Ú	TransposeÚFLIP_LEFT_RIGHTÚ
ROTATE_180ÚFLIP_TOP_BOTTOMÚ	TRANSPOSEÚ
ROTATE_270Ú
TRANSVERSEÚ	ROTATE_90rv  rÀ  Ú	transposerå   Ú_sizerÃ  Ú!_close_exclusive_fp_after_loadingrh  rt  Úgetexifr   ÚTAGS_V2_GROUPSÚget_ifd)r{   ÚmethodÚexifÚkeyr/   r/   r3   Úload_end³  s0   ùø	


ô	zTiffImageFile.load_endc           
   
   C   sö  t j  | ¡ |  ¡  t| jƒdksd}t|ƒ‚| jd d }t| jd d ƒ}zt| jdƒo5t	 
| j ¡ ¡}t| jdƒrA| j ¡  W n tyM   d}Y nw |rT||d< t  | jd	t|ƒ| j¡}z	| | j|¡ W n ty| } zd
}t|ƒ|‚d}~ww | joƒ| j }t| jdƒršt d¡ | | j ¡ ¡\}}	n,|r±t d¡ |s©| j d¡ | d¡\}}	nt d¡ | j d¡ | | j ¡ ¡\}}	|rÙzt	 |¡ W n	 tyØ   Y nw g | _d| _|  ¡  |rí| j ¡  d| _|	dk rõt|	ƒ‚t j  | ¡S )zWOverload method triggered when we detect a compressed tiff
        Calls out to libtiffr   zNot exactly one tiler   r   ÚfilenoÚflushFr   ÚlibtiffzCouldn't set the imageNÚgetvaluez5have getvalue. just sending in a string from getvaluez3have fileno, calling fileno version of the decoder.s   fpfpz+don't have fileno or getvalue. just reading)r   r„  Úload_preparerX   rÑ  rg  r–  r´   rh  ÚosÚduprç  rè  Ú_getdecoderr¿  rà   ÚdecoderconfigÚsetimagerÀ  r  Ú_exclusive_fprÃ  rx  ry  rB  rê  rz  rf  ÚcloseÚreadonlyræ  )
r{   rÉ   ÚextentsrŽ   rh  ÚdecoderÚeÚclose_self_fprÏ  Úerrr/   r/   r3   rÓ  Ò  sl   
€ýÿ
€þ



ÿ
zTiffImageFile._load_libtiffc              
   C   s  d| j v rd}t|ƒ‚t| j  td¡ | _| j  td¡| _| j  td¡}| jdkr+d}| j  t	d¡}t
 d¡ t
 d| j› �¡ t
 d	|› �¡ t
 d
| j› �¡ t
 d|› �¡ t
 d| j t¡› �¡ t| j  t¡ƒ}t| j  t¡ƒ}||f| _t
 d| j› �¡ | j  td¡}t|ƒdkr¢t|ƒt|ƒ  krždkr¢n nd}| j  td¡}| j  td¡}|dv r·d}	n	|dkr¾d}	nd}	|	t|ƒ7 }	t|ƒ}
| j  t| jdkrÙ|dv rÙdnd¡}|tkrìt
 d|¡ d}t|ƒ‚||
k r÷|d|… }n||
k�r|
dk�r|| }t|ƒ|k�rd}t|ƒ‚| j j|||||f}t
 d|› �¡ z	t| \| _}W n t �yF } zt
 d¡ d}t|ƒ|‚d}~ww t
 d|› �¡ t
 d| j› �¡ | j| j!d< | j  t"d¡}| j  t#d¡}|�r±|�r±| j  t$¡}|dk�r…||f| j!d < n,|dk�r–|d! |d! f| j!d < n|du �rª||f| j!d < ||f| j!d"< n||f| j!d"< d } }}g | _%t&�pÁ| jd#k| _'| j'�r1|dk�ré|dd… d |dd…  }t
 d|› �¡ t| \| _}|d$k�rðd%}d&|v �rû| (d&d'¡}d(|v �r| (d(d'¡}|dk�r| jd)k�r| jdk�rd*}|| jd+| j j)f}| j% *d,dd||fd|f¡ n¬t+| j v �s=t,| j v �rÒt+| j v �rU| j t+ }| j  t-|¡}| jd }n| j t, }| j  t.¡}| j  t/¡}|D ]h}|| |k�rz|t0|ƒ d- }nd}|}| jdk�rŒ|| }||	 }|t|ƒdf}| j% *| j||t|| |ƒt|| |ƒf||f¡ || }|| jd k�rÏd|| }}|| jd k�rÏd }}|d7 }�qhnt
 d.¡ d}t|ƒ‚t1| j v �rë| j t1 | j!d/< | jd0v �rd1d2„ | j t2 D ƒ}t3 4d3d4 5|¡¡| _6| j  d5¡| _7dS )6z-Setup this image object based on current tagsi¼  z+Windows Media Photo files not yet supportedr   r   r!   r    z*** Summary ***z- compression: z- photometric_interpretation: z- planar_configuration: z- fill_order: z- YCbCr subsampling: z- size: r5   r/   )r   r    r$   r   r   r   )r   r    z.More samples per pixel than can be decoded: %sz#Invalid value for samples per pixelNzunknown data organizationzformat key: z- unsupported formatzunknown pixel modez- raw mode: z- pil mode: Úcompressionr   ÚdpigR¸…ëQ@Ú
resolutionr   r9   úI;16Nz;16Bz;16Nz;16Lr#   rF   Fré  r$   z- unsupported data organizationÚicc_profile©rR   rS   c                 S   s   g | ]}t |d  ƒ‘qS ©r   r   )r0   r5  r/   r/   r3   rù     s    z(TiffImageFile._setup.<locals>.<listcomp>úRGB;Lr*  i  )8r¯  rg  ÚCOMPRESSION_INFOrv  ÚCOMPRESSIONÚ_compressionÚPLANAR_CONFIGURATIONÚ_planar_configurationÚPHOTOMETRIC_INTERPRETATIONÚ	FILLORDERrx  ry  râ   ÚYCBCRSUBSAMPLINGrô   Ú
IMAGEWIDTHÚIMAGELENGTHrÞ  rå   ÚSAMPLEFORMATrX   rq   rp   ÚBITSPERSAMPLEÚEXTRASAMPLESÚSAMPLESPERPIXELÚMAX_SAMPLESPERPIXELÚerrorr¼   ra   Ú	OPEN_INFOr¿  rw  rý   ÚX_RESOLUTIONÚY_RESOLUTIONÚRESOLUTION_UNITrÑ  ÚREAD_LIBTIFFrÒ  r÷   rƒ  r‰  r‡  ÚTILEOFFSETSÚROWSPERSTRIPÚ	TILEWIDTHÚ
TILELENGTHÚsumÚ
ICCPROFILEÚCOLORMAPr
   r   r,  ÚpaletterÔ  )r{   rÉ   ÚphotoÚ	fillorderÚxsizeÚysizeÚsample_formatÚ	bps_tupleÚextra_tupleÚ	bps_countÚbps_actual_countÚsamples_per_pixelrå  Úrawmoderö  ÚxresÚyresÚresunitÚxÚyÚlayerrJ  Úoffsetsr6  Úwrƒ  ÚstrideÚtile_rawmoder  r/   r/   r3   rÅ  /  s  



,þÿú

€ý









üÿ€å
zTiffImageFile._setup)NN)r®   r¯   r°   ÚformatÚformat_descriptionrß  r}   r¸  r³   rº  rz  r·  rt  rÈ  rÐ  r„  ræ  rÓ  rÅ  r¬  r/   r/   r   r3   r­  (  s"    	
	&	]r­  r6   r7   rE   rR   rS   r<   rC   r9   r=   r@   rA   rF   rI   rG   rT   ÚYCbCrrW   rD   r;   r>   rB   )r>   rB   c           2      C   s(	  zt | j \}}}}}}W n ty% }	 zd| j› d�}
t|
ƒ|	‚d }	~	ww t|d�}| j}| j}z|d }W n tyM   | j d¡}t	|t
ƒrKd }Y nw |d u rUd}n|dkr\d}n|dkrbd	}tpg|dk}d
|t< | jd |t< | jd
 |t< d|v rƒ|d }nd|v rœ|d }t	|tƒr›t ¡ }| |¡ |}ni }t dt|ƒ ¡ t	|tƒr°| ¡ }|D ]/}t	|tjƒrÇ|tjv rÇ| |¡||< n| |¡||< z
|j| |j|< W q² tyá   Y q²w t| dƒ�r	tt t!t"t#t$fD ]}|| j%v �r| j%| ||< | j%j| |j|< qð| d| j d¡¡}|�r||t&< t'dft dft!dft dft!dftdft(dft)dft*dft+dff
D ]\}}||v �rI|| ||< �q:| d¡}|�rcd|t< |d |t < |d
 |t!< |dk�ry||t,< t-|ƒd
k�ryt-|ƒ|t.< |d u�r‚||t/< |d
k�r‹||t0< t1|v�r•||t1< nF| jdv �rÛ|t1 dk�rÛ| jdk�rÖ|  2¡ }| ¡ }t3|j4ƒD ]}t3|j5ƒD ]}|||f dk�rÉdnd|||f< �q¼�qµ|} nt6 7| ¡} | jd v �r| j8 9d!d"¡}g }t-|ƒd# }t3d#ƒD ]}|d$d%„ ||| ||d
  … D ƒ7 }|dgd&|  7 }�qô||t:< t-|ƒ| jd |d  d' d(  }|�rW| d)t;¡}|dk�r9d
n	t<|| | jd
 ƒ} |dk�rVt<| d' d( d( | jd
 ƒ} n| jd
 } | dk�rcd
} |dk�rjd
n||  }!| jd
 |  d
 |  }"| |t=< |!d*k�rˆtj>|jt?< |!f|"d
  || jd
  |!|"d
   f |t?< t@t3d|!|" |!ƒƒ|tA< tB |d
¡|tC< | jd+k�rÍtDd,tEd-i F¡ D ]\}#}$| G|#|$¡ �qÁtHtItJtKg}%|�rhd.|v �r|d. }&t	|&t
ƒ�rï|&dk �sï|&d/k�rõd0}
tL|
ƒ‚|dk�r d1}
tL|
ƒ‚|&|tM< t d2¡ t d3tN| F¡ ƒ ¡ d}'t|d4ƒ�r6z| Od¡ tP Q| R¡ ¡}'W n tSjT�y5   Y nw i }(|%tEt?tAtUtVg7 }%t,|d i})i }*t| d5ƒ�rT| jW ¡ }*i tX| di ƒ¥|*¥}+t0|+v �rf|+t0= tY Z| F¡ |+ F¡ ¡D ]j\}#}$|#tj[v�r«tXtj\d6d7ƒ�s„�qp|#|jv �r’|j|# |(|#< nt	|$t
t]t^tfƒ�sž�qpt _|#¡j`},|,�r«|,|(|#< |#|)v�rÙ|#|%v�rÙt	|$t^ƒ�rÇ|$ ad8d9¡d: |)|#< �qpt	|$tbƒ�rÕt]|$ƒ|)|#< �qp|$|)|#< �qpt0|)v �rñt-|)t0 ƒd
k�rñ|)t0 d |)t0< t d;tN|) F¡ ƒ ¡ | jd<v �rd=}t|) F¡ ƒ}-|- c¡  |||'||-|(f}.t d| jd>|.|¡}	|	 e| j8d?| j ¡ 	 |	 adA¡d
d … \}/}0|'�s=| f|0¡ |/�rAn�q*|'�rXztP g|'¡ W n
 t�yW   Y nw |/dk �rgdB|/› dC�}
t|
ƒ‚n |%D ]}#||#= �qj| h|¡}1ti j| |dd?| j |1||d
ffg¡ dD|v �r’|| _kd S d S )ENzcannot write mode z as TIFFr`   rù  r   r!   r#   r)   r%   r   r   Útiffinforä  zTiffinfo Keys: %sr¯  rý  Údescriptionrû  Úx_resolutionÚy_resolutionÚresolution_unitÚsoftwareÚ	date_timeÚartistÚ	copyrightrú  r   r5   )r6   r7   r6   éÿ   rþ  rF   r   r   c                 S   s   g | ]}|d  ‘qS rÿ  r/   rï   r/   r/   r3   rù   ²  s    z_save.<locals>.<listcomp>r   r"   r$   Ú
strip_sizer   r5  )r   r   )r   r?  é€   r?  rA  r?  Úqualityéd   zInvalid quality settingz5quality setting only supported for 'jpeg' compressionzSaving using libtiff encoderz	Items: %srç  râ   Úlibtiff_support_custom_tagsFrö   r÷   r@  zConverted items: %s)r;   r9   rü  ré  rJ   Ti @  zencoder error z when writing image fileÚ_debug_multipage)lÚ	SAVE_INFOr¿  rw  rg  rµ   ÚencoderinfoÚencoderconfigrý   rv  ry   rô   ÚWRITE_LIBTIFFr  rå   r	  r
  rá   r   ÚExifr„  rx  ry  r–  r�  r¥  r   rá  râ  rÃ   rÍ   r´   r  r  r  ÚIPTC_NAA_CHUNKÚPHOTOSHOP_CHUNKrÆ  r¯  r  ÚIMAGEDESCRIPTIONÚSOFTWAREÚ	DATE_TIMEÚARTISTÚ	COPYRIGHTr  rX   r  r  r  r  Úcopyru  ÚheightÚwidthr	   ÚinvertrÀ  Ú
getpaletter  Ú
STRIP_SIZErp   r  r  ÚSTRIPBYTECOUNTSrà   r‡  ÚCOMPRESSION_INFO_REVr  r  ÚREFERENCEBLACKWHITErÙ   Ú
setdefaultr  r  r  ÚTILEBYTECOUNTSr  ÚJPEGQUALITYr†  rz  rì  rí  rç  ÚioÚUnsupportedOperationÚTRANSFERFUNCTIONÚSUBIFDrâ   r�   Ú	itertoolsÚchainÚLIBTIFF_COREr½  rz   r„   rÖ   rþ   rø   rf   ÚsortÚ_getencoderrð  r“  rò  r”  r   Ú_saverE  )2rÀ  rh  r°  r(  ra   r  r3  ÚbitsÚextrarö  rÉ   r…  rG  rH  rù  ré  rý   rä  rå  Úiccr×   rú  Úinverted_imÚpxr-  r,  ÚlutÚcolormapÚcolorsr}  r1  Úim_strip_sizeÚrows_per_stripÚstrip_byte_countsÚstrips_per_imagerâ   r|   Ú	blocklistrB  r´  ÚtypesÚattsÚ
legacy_ifdÚsupplied_tagsrþ   r¨  rJ  Úerrcoderã   rƒ  r/   r/   r3   rg  2  sÎ  
€þ

€ü


€
ÿú€ö
€





&ÿ
&""
€



ÿÿþ
ý
 


ÿû	

€
úÿ
þ

ÿ

þrg  c                   @   sÖ   e Zd Zg d¢Zh d£Zd1dd„Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zejfdd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd2d.d/„Zd0S )3ÚAppendingTiffWriter)r   r   r   r   r   r$   r   r   r   r   r$   r   r$   >   é  é  é	  é   r   r   Fc                 C   st   t |dƒr|| _d| _n"|| _d| _zt||rdndƒ| _W n ty-   t|dƒ| _Y nw | j ¡ | _|  ¡  d S )Nrf  FTzw+bzr+b)	r´   rƒ   Úclose_fpr×   Úopenrg  rt  Ú	beginningÚsetup)r{   Úfnr¾  r/   r/   r3   r}   q  s   
ÿzAppendingTiffWriter.__init__c                 C   sŒ   | j  | jtj¡ d | _d| _| j  d¡ | _}|sd| _	d S d| _	|dkr,|  
d¡ n|dkr6|  
d¡ nd	}t|ƒ‚|  ¡  |  ¡  d S )
Nr   r   TFr]   r¸   r\   r·   zInvalid TIFF file header)rƒ   rz  r�  rì  ÚSEEK_SETÚwhereToWriteNewIFDOffsetÚoffsetOfNewPagerf  ÚIIMMÚisFirstÚ	setEndianÚRuntimeErrorÚskipIFDsÚgoToEnd)r{   ÚiimmrÉ   r/   r/   r3   r‚    s    zAppendingTiffWriter.setupc                 C   s„   | j rd S | j | j¡ | j d¡}|sd S || jkr!d}t|ƒ‚|  ¡ }|| j7 }| j | j¡ |  	|¡ | j |¡ |  
¡  d S )Nr   z1IIMM of new page doesn't match IIMM of first page)rˆ  rƒ   rz  r†  rf  r‡  rŠ  ÚreadLongr…  Ú	writeLongÚfixIFD)r{   r�  rÉ   Ú
ifd_offsetr/   r/   r3   Úfinalize˜  s   


zAppendingTiffWriter.finalizec                 C   s   |   ¡  |  ¡  d S rm   )r’  r‚  r   r/   r/   r3   ÚnewFrame±  s   zAppendingTiffWriter.newFramec                 C   s   | S rm   r/   r   r/   r/   r3   Ú	__enter__¶  s   zAppendingTiffWriter.__enter__c                 C   s   | j r|  ¡  dS )NF)r  rò  )r{   Úexc_typeÚ	exc_valueÚ	tracebackr/   r/   r3   Ú__exit__¹  s   zAppendingTiffWriter.__exit__c                 C   s   | j  ¡ | j S rm   )rƒ   rt  r†  r   r/   r/   r3   rt  ¾  rc   zAppendingTiffWriter.tellc                 C   s*   |t jkr
|| j7 }| j ||¡ |  ¡ S rm   )rì  r„  r†  rƒ   rz  rt  )r{   rƒ  Úwhencer/   r/   r3   rz  Á  s   

zAppendingTiffWriter.seekc                 C   s^   | j  dtj¡ | j  ¡ }d|d  }d|  k rdk r'n n| j  t|ƒ¡ | j  ¡ | _d S )Nr   r:   )rƒ   rz  rì  ÚSEEK_ENDrt  r“  rá   r†  )r{   ÚposÚ	pad_bytesr/   r/   r3   rŒ  È  s   
zAppendingTiffWriter.goToEndc                 C   s.   || _ | j d | _| j d | _| j d | _d S )Nr7   r2  ÚHHL)ÚendianÚlongFmtÚshortFmtÚ	tagFormat)r{   rž  r/   r/   r3   r‰  Ò  s   zAppendingTiffWriter.setEndianc                 C   sP   	 |   ¡ }|dkr| j ¡ d | _d S | j |¡ |  ¡ }| j |d tj¡ q)NTr   r   r8   )rŽ  rƒ   rt  r…  rz  Ú	readShortrì  ÚSEEK_CUR)r{   r‘  Únum_tagsr/   r/   r3   r‹  Ø  s   øzAppendingTiffWriter.skipIFDsc                 C   s   | j  |¡S rm   )rƒ   r“  r>  r/   r/   r3   r“  ã  rÕ   zAppendingTiffWriter.writec                 C   ó   t  | j| j d¡¡\}|S )Nr   )r  r  r   rƒ   rf  rD  r/   r/   r3   r¢  æ  ó   zAppendingTiffWriter.readShortc                 C   r¥  r^   )r  r  rŸ  rƒ   rf  rD  r/   r/   r3   rŽ  ê  r¦  zAppendingTiffWriter.readLongc                 C   óR   | j  dtj¡ | j  t | j|¡¡}|d ur%|dkr'd|› d�}t|ƒ‚d S d S )Néþÿÿÿr   úwrote only ú bytes but wanted 4©	rƒ   rz  rì  r£  r“  r  r  rŸ  rŠ  ©r{   r|   Úbytes_writtenrÉ   r/   r/   r3   ÚrewriteLastShortToLongî  ó   þz*AppendingTiffWriter.rewriteLastShortToLongc                 C   r§  )Nr¨  r   r©  ú bytes but wanted 2)	rƒ   rz  rì  r£  r“  r  r  r   rŠ  r¬  r/   r/   r3   ÚrewriteLastShortõ  r¯  z$AppendingTiffWriter.rewriteLastShortc                 C   r§  )Néüÿÿÿr   r©  rª  r«  r¬  r/   r/   r3   ÚrewriteLastLongü  r¯  z#AppendingTiffWriter.rewriteLastLongc                 C   óB   | j  t | j|¡¡}|d ur|dkrd|› d�}t|ƒ‚d S d S )Nr   r©  r°  )rƒ   r“  r  r  r   rŠ  r¬  r/   r/   r3   Ú
writeShort  ó
   þzAppendingTiffWriter.writeShortc                 C   r´  )Nr   r©  rª  )rƒ   r“  r  r  rŸ  rŠ  r¬  r/   r/   r3   r�  	  r¶  zAppendingTiffWriter.writeLongc                 C   s   |   ¡  | j ¡  d S rm   )r’  rƒ   rò  r   r/   r/   r3   rò    s   zAppendingTiffWriter.closec                 C   s   |   ¡ }t|ƒD ]u}t | j| j d¡¡\}}}| j| }|| }|dk}|s5|  ¡ }	|	| j	7 }	|  
|	¡ || jv rs| j ¡ }
|rV| j||dk|dkd� | j |
d ¡ n| j |	¡ | j||dk|dkd� | j |
¡ d  }	}
q|r}| j dtj¡ qd S )Nr$   r   r   )ÚisShortÚisLong)r¢  ru  r  r  r¡  rƒ   rf  Ú
fieldSizesrŽ  r†  r³  ÚTagsrt  Ú
fixOffsetsrz  rì  r£  )r{   r¤  r}  râ   Ú
field_typer~  Ú
field_sizeÚ
total_sizeÚis_localrƒ  Úcur_posr/   r/   r3   r�    s6   




ÿÿ
€âzAppendingTiffWriter.fixIFDc                 C   s¶   |s
|s
d}t |ƒ‚t|ƒD ]J}|r|  ¡ n|  ¡ }|| j7 }|rK|dkrK|dkr/d}t |ƒ‚|  |¡ | j dtj	¡ |  
tj¡ | j dtj	¡ q|rS|  |¡ q|  |¡ qd S )Nz offset is neither short nor longr   r   znot implementediöÿÿÿr$   )rŠ  ru  r¢  rŽ  r†  r®  rƒ   rz  rì  r£  rµ  r   r  r±  r³  )r{   r~  r·  r¸  rÉ   r}  rƒ  r/   r/   r3   r»  6  s$   

îzAppendingTiffWriter.fixOffsetsN)F)FF)r®   r¯   r°   r¹  rº  r}   r‚  r’  r“  r”  r˜  rt  r^  r„  rz  rŒ  r‰  r‹  r“  r¢  rŽ  r®  r±  r³  rµ  r�  rò  r�  r»  r/   r/   r/   r3   rz  X  s2    

#rz  c              	   C   sþ   | j  ¡ }| j}t| dg ¡ƒ}t| dƒs|st| ||ƒS |  ¡ }zWt|ƒ�;}| g| D ]-}||_ ||_t|dƒs<d}	n|j	}	t
|	ƒD ]}
| |
¡ | ¡  t|||ƒ | ¡  qCq,W d   ƒ n1 sdw   Y  W |  |¡ d S W |  |¡ d S |  |¡ w )NÚappend_imagesrº  r   )rG  rR  rH  r–  rv  r´   rg  rt  rz  rº  ru  rz  r„  r“  )rÀ  rh  r°  rG  rH  rÁ  Úcur_idxÚtfÚimsÚnfrr!  r/   r/   r3   Ú	_save_allP  s2   




üøÿñrÆ  z.tifz.tiffz
image/tiff)kr^  rb  ÚloggingrÊ  rì  r  r  Úcollections.abcr   Ú	fractionsr   Únumbersr   r   Ú r   r   r	   r
   r   Ú_binaryr   rÉ  r   rÌ  r   r   Ú	getLoggerr®   rx  r  rI  ÚIFD_LEGACY_APIrW  rÀ   r¾   r	  r
  r  r  r  r  rM  r‡  r  r  rX  r  r  r  r  r`  rN  rO  rP  Ú	PREDICTORr  r  r  r  r\  ra  r  r  Ú
JPEGTABLESr  rZ  rQ  rK  rL  r  ÚEXIFIFDrÆ  r]  ÚIMAGEJ_META_DATA_BYTE_COUNTSÚIMAGEJ_META_DATAr  rÙ   rY  r  rq   r  r_   rb   rl   rt   rß   r$  rf   rµ   r!  r×   r÷   Úsetattrr�  ÚImageFileDirectoryr­  rF  rg  rz  rÆ  Úregister_openr3  Úregister_saveÚregister_save_allÚregister_extensionsÚregister_mimer/   r/   r/   r3   Ú<module>   s  (
þýüûúùø	÷
öõôóòñðïîýüûúùø	÷
öõôóòñðïîíìëêéèçæåäãâá à!ß"Þ#Ý$Ü%Û&Ú'Ù(Ø)×*Ö+Õ,Ô-Ó.Ò/Ñ0Ð1Ï2Î3Í4Ì5Ë6Ê7É8È9Ç:Æ;Å<Ä=Ã>Â?Á@ÀA¿B¾C½D¼E»FºG¹H¸I·J¶KµL´M³N²O±P°Q¯R®S­T¬U«VªW©X¨Y§Z¦[¥\¤]£^¢_¡` aŸbžc�dœe›fšg™h˜i‹x
     \   týüûúùø	÷
öõôóòñðïîíë  ( y