B
    -a                @   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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 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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?d0Z@d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBZAdCdD eAB D ZCed dEddEdFfdGed dEddEdFfdGed dEdHdEdFfdIed dEdHdEdFfdIeddEddEdFfdJeddEddEdFfdJeddEdHdEdFfdKeddEdHdEdFfdKed dEddLdFfdMed dEddLdFfdMed dEdHdLdFfdNed dEdHdLdFfdNeddEddLdFfdOeddEddLdFfdOeddEdHdLdFfdPeddEdHdLdFfdPed dEddQdFfdRed dEddQdFfdRed dEdHdQdFfdSed dEdHdQdFfdSeddEddQdFfdTeddEddQdFfdTeddEdHdQdFfdUeddEdHdQdFfdUed dEddVdFfdWed dEddVdFfdWed dEdHdVdFfdXed dEdHdVdFfdXeddEddVdFfdYeddEddVdFfdYeddEdHdVdFfdZeddEdHdVdFfdZeddEdd[dFfd\eddEdd]dFfd^eddEdd]dFfd_eddLdd]dFfd`eddLdd]dFfdaed dbddcdFfdded dbddcdFfdeeddEddcdFfdfeddLddcdFfdgeddLddcdFfdheddbddcdFfddeddbddcdFfdeeddEddidLfdjeddEddidLfdjedHdEddkdFfdledHdEddkdFfdledHdEdHdkdFfdmedHdEdHdkdFfdmedHdEddndFfdoedHdEddndFfdoedHdEddndpfdqedHdEddndpfdqedHdEddrdsfdtedHdEddrdsfdtedHdEddudvfdwedHdEddudvfdwedHdEddndEfdxedHdEddndEfdxedHdEddrdyfdzedHdEddrdyfdzedHdEddud{fd|edHdEddud{fd|edHdEddndLfdoedHdEddndLfdoedHdEddrd}fd~edHdEddrd}fd~edHdEddudfdedHdEddudfdedHdEddndfdoedHdEddndfdoedHdEdddFfdedHdEdddFfdedHdEdddFfdedHdEdddFfdedHdEdddpfdedHdEdddpfdedHdEdddEfdedHdEdddEfdedHdEdddLfdedHdEdddLfdeddEddEdFfdeddEddEdFfdeddEdHdEdFfdeddEdHdEdFfdeddEddLdFfdeddEddLdFfdeddEdHdLdFfdeddEdHdLdFfdeddEddQdFfdeddEddQdFfdeddEdHdQdFfdeddEdHdQdFfdeddEddVdFfdeddEddVdFfdeddEddidLfdeddEddidLfdeddEdHdVdFfdeddEdHdVdFfdeddEddndFfdeddEddndFfdeddEddrdpfdeddEddrdpfdeddEddudsfdeddEddudsfdeddEdddFfdeddEddkdFfdeddEddkdFfdeddEddkdFfdeddEddkdFfdioZDddddgZEdd ZFdd ZGdd ZHi ZIi ZJG dd deZKG dd deZLeIeL_IeJeL_JxNeB D ]B\ZMZNeNOddZNePeLdeN eIeM d  ePeLdeN eJeM  qW [I[J[M[NG dd deLZQeQZRG dd dejZSdedddEdfdedddVdfdedddidHfdedddVdfdedddidHfdeddHdcdfdeddd]dfdeddHd]dfdedddcdfdedHddkdfdedHddnd fdedHddndHfdedddndfdedddkdfdedddkdfdeddHdcdfdeddd]dfdeddHd]dfdedddcdfdȜZTddʄ ZUG dd̄ d̃ZVdd΄ ZWeXeSjYeSeF eZeSjYeU e[eSjYeW e\eSjYddg e]eSjYdѡ dS )    N)MutableMapping)Fraction)NumberRational   )Image	ImageFileImagePaletteTiffTags)o8)TYPESFTs   IIs   MM   i  i  i  i  i
  i  i  i  i  i  i  i  i  i(  i-  i1  i2  i;  i=  i@  iD  iJ  iR  iS  i[  i  i  i  iI  is  ii  i  i  i  i  rawZ
tiff_ccittZgroup3Zgroup4Ztiff_lzw	tiff_jpegjpegtiff_adobe_deflateZtiff_raw_16ZpackbitsZtiff_thunderscantiff_deflateZtiff_sgilogZtiff_sgilog24lzmaZzstdZwebp)r                        i  i  i)  i  it  iu  im  iP  iQ  c             C   s   i | ]\}}||qS  r   ).0kvr   r   7/tmp/pip-unpacked-wheel-rysjrues/PIL/TiffImagePlugin.py
<dictcomp>   s    r    )r   r   )1z1;Ir   )r!   z1;IR)r!   r!   )r!   z1;R)r   )LzL;2I)r"   zL;2IR)r"   zL;2)r"   zL;2R)r   )r"   zL;4I)r"   zL;4IR)r"   zL;4)r"   zL;4R)r   )r"   zL;I)r"   zL;IR)r"   r"   )r"   zL;R)   )zI;16zI;12)   )zI;16zI;16)zI;16BzI;16B)IzI;16S)r%   zI;16BS)r   )    )FzF;32F)r'   zF;32BF)r%   zI;32N)r%   zI;32S)r%   zI;32BS)r   r   )LAr(   )r   r   r   )RGBr)   )r)   zRGB;R)r   r   r   r   )RGBAr*   )r   )RGBXr+   )r   r   r   r   r   )r   r   )r+   ZRGBXX)r   r   r   r   r   r   )r   r   r   )r+   ZRGBXXX)r*   ZRGBa)r   r   )r*   ZRGBaX)r   r   r   )r*   ZRGBaXX)r   r   )r*   ZRGBAX)r   r   r   )r*   ZRGBAXX)i  )r$   r$   r$   )r)   zRGB;16L)r)   zRGB;16B)r$   r$   r$   r$   )r*   zRGBA;16L)r*   zRGBA;16B)r+   zRGBX;16L)r+   zRGBX;16B)r*   zRGBa;16L)r*   zRGBa;16Br   )PzP;1)r,   zP;1R)r,   zP;2)r,   zP;2R)r,   zP;4)r,   zP;4R)r,   r,   )PAr-   )r,   zP;Rr   )CMYKr.   )r.   ZCMYKX)r.   ZCMYKXX)r.   zCMYK;16Lr   )r)   r+   r   )LABr/   s   MM *s   II* s   MM* s   II *c             C   s   | d d t kS )Nr   )PREFIXES)prefixr   r   r   _accept  s    r2   c             C   s<   t | dk}t|rd|  n| |}|r8|d d d S |S )Nr   )absIFDRationallimit_rational)valmax_valinvn_dr   r   r   _limit_rational  s    r;   c             C   sP   t | }|j|jf}t||k r.t| t|}t||krLt | } t| |}|S )N)r   	numeratordenominatorminr;   r4   max)r7   r8   Zmin_valfracr:   r   r   r   _limit_signed_rational  s    
rA   c               @   s>  e Zd ZdZdZd3d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)d2S )4r5   zImplements 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rB|j| _|j| _n|| _|| _|dkrbtd| _n |dkrvt|| _n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   )	
isinstancer5   r<   rB   r=   rC   rD   r   float)selfvaluer=   r   r   r   __init__/  s    


zIFDRational.__init__c             C   s   | j S )N)rB   )ar   r   r   r<   I  s    zIFDRational.numeratorc             C   s   | j S )N)rC   )rK   r   r   r   r=   M  s    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   )r=   r<   rD   Zlimit_denominator)rH   Zmax_denominatorfr   r   r   r6   Q  s    
zIFDRational.limit_rationalc             C   s   t t| jS )N)strrG   rD   )rH   r   r   r   __repr__^  s    zIFDRational.__repr__c             C   s
   | j  S )N)rD   __hash__)rH   r   r   r   rO   a  s    zIFDRational.__hash__c             C   s0   | j }t|tr|j }t|tr(t|}||kS )N)rD   rF   r5   rG   )rH   otherr7   r   r   r   __eq__d  s    

zIFDRational.__eq__c             C   s   | j | j| jgS )N)rD   rB   rC   )rH   r   r   r   __getstate__l  s    zIFDRational.__getstate__c             C   s,   t | d |\}}}|| _|| _|| _d S )Nr   )r5   rJ   rD   rB   rC   )rH   staterD   rB   rC   r   r   r   __setstate__o  s
    
zIFDRational.__setstate__c                s    fdd}|S )Nc                s   t | j | S )N)getattrrD   )rH   args)opr   r   delegatew  s    z'IFDRational._delegate.<locals>.delegater   )rW   rX   r   )rW   r   	_delegatev  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__N)r   )*__name__
__module____qualname____doc__	__slots__rJ   propertyr<   r=   r6   rN   rO   rQ   rR   rT   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   r   r   r   r   r5   !  sL   
r5   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g ed8d8d]d:d;Z$ed8d<d= Z%ed>d8d^d?d@Z&ed>dAdB Z'edCdDd_dEdFZ(edCdGdH Z)edId8d`dJdKZ*edIdLdM Z+edNdDdadOdPZ,edNdQdR Z-dSdT Z.dUdV Z/dbdXdYZ0dZd[ Z1dS )c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
                   ~PIL.TiffTags.TYPES`

    .. versionadded:: 3.0.0
       II*     Nc             C   s   |dd t kr$tdt| d|dk	r0|n
|dd | _| jtkrPd| _n| jtkrbd| _ntd|| _i | _| 	  | 
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.
        Nr   znot a TIFF file (header z not valid)r   ><znot a TIFF IFDr"   F)r0   SyntaxErrorrepr_prefixMM_endianIIgrouptagtypereset_unpacknext_legacy_api)rH   ifhr1   r   r   r   r   rJ     s    

zImageFileDirectory_v2.__init__c             C   s   | j S )N)r   )rH   r   r   r   <lambda>      zImageFileDirectory_v2.<lambda>c             C   s   | j S )N)_offset)rH   r   r   r   r     r   c             C   s   | j S )N)r   )rH   r   r   r   r     r   c             C   s   t dd S )Nz"Not allowing setting of legacy api)	Exception)rH   rI   r   r   r   
legacy_api  s    z ImageFileDirectory_v2.legacy_apic             C   s(   i | _ i | _i | _i | _d | _d | _d S )N)_tags_v1_tags_v2_tagdatar   _nextr   )rH   r   r   r   r     s    zImageFileDirectory_v2.resetc             C   s   t t| S )N)rM   dict)rH   r   r   r   __str__  s    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)r   coderI   )rH   r   r   r      s   z/ImageFileDirectory_v2.named.<locals>.<dictcomp>)items)rH   r   )rH   r   named  s    
zImageFileDirectory_v2.namedc             C   s   t t| jt| jB S )N)lensetr   r   )rH   r   r   r   __len__  s    zImageFileDirectory_v2.__len__c             C   sf   || j kr>| j| }| j| }| j| \}}|| || j| |< | j | }| jrbt|ttfsb|f}|S )N)r   r   r   _load_dispatchr   rF   tuplebytes)rH   tagdatatypsizehandlerr7   r   r   r   __getitem__  s    



z!ImageFileDirectory_v2.__getitem__c             C   s   || j kp|| jkS )N)r   r   )rH   r   r   r   r   __contains__  s    z"ImageFileDirectory_v2.__contains__c             C   s   |  ||| j d S )N)_setitemr   )rH   r   rI   r   r   r   __setitem__!  s    z!ImageFileDirectory_v2.__setitem__c          
      s  t ttf}t|| j t||r(|gn|}|| jkrp jrN j| j|< n"tj	| j|< t
dd |D rt
dd |D rtjntj| j|< nt
dd |D rt
dd |D rtj| j|< nDt
dd |D rtj| j|< n$t
dd |D rtjntj| j|< ndt
dd |D r.tj| j|< nBt
d	d |D rPtj| j|< n t
d
d |D rptj| j|< | j| tj	krdd |D }n | j| tjkrdd |D }| j| tjkot|t}|st fdd|D }|r| jn| j}|s jdks@| j| tjks@ jd krt|dkr|s|rd| j| tjtjgkrd|f}y|\||< W n> tk
r   td| dt| d |d ||< Y nX n|||< d S )Nc             s   s   | ]}t |tV  qd S )N)rF   r5   )r   r   r   r   r   	<genexpr>/  s    z1ImageFileDirectory_v2._setitem.<locals>.<genexpr>c             s   s   | ]}|d kV  qdS )r   Nr   )r   r   r   r   r   r   2  s    c             s   s   | ]}t |tV  qd S )N)rF   int)r   r   r   r   r   r   5  s    c             s   s&   | ]}d |  kodk n  V  qdS )r   i   Nr   )r   r   r   r   r   r   6  s    c             s   s&   | ]}d |  k odk n  V  qdS )i i   Nr   )r   r   r   r   r   r   8  s    c             s   s   | ]}|d kV  qdS )r   Nr   )r   r   r   r   r   r   =  s    c             s   s   | ]}t |tV  qd S )N)rF   rG   )r   r   r   r   r   r   @  s    c             s   s   | ]}t |tV  qd S )N)rF   rM   )r   r   r   r   r   r   B  s    c             s   s   | ]}t |tV  qd S )N)rF   r   )r   r   r   r   r   r   D  s    c             S   s&   g | ]}t |tr|d dn|qS )asciireplace)rF   rM   encode)r   r   r   r   r   
<listcomp>I  s   z2ImageFileDirectory_v2._setitem.<locals>.<listcomp>c             S   s"   g | ]}t |trt|n|qS r   )rF   r   rG   )r   r   r   r   r   r   M  s    c             3   s   | ]}  |V  qd S )N)Zcvt_enum)r   rI   )infor   r   r   Q  s    r   zMetadata Warning, tag z had too many entries: z, expected 1r   )r   r   rM   r
   r   r   rF   r   type	UNDEFINEDallZRATIONALZSIGNED_RATIONALSHORTSIGNED_SHORTLONGSIGNED_LONGDOUBLEASCIIBYTEr   r   r   r   lengthr   
ValueErrorwarningswarn)rH   r   rI   r   Z	basetypesvaluesis_ifddestr   )r   r   r   $  s^    

 zImageFileDirectory_v2._setitemc             C   s.   | j |d  | j|d  | j|d  d S )N)r   popr   r   )rH   r   r   r   r   __delitem__t  s    z!ImageFileDirectory_v2.__delitem__c             C   s   t t| jt| jB S )N)iterr   r   r   )rH   r   r   r   __iter__y  s    zImageFileDirectory_v2.__iter__c             C   s   t | j| |S )N)structunpackr   )rH   fmtr   r   r   r   r   |  s    zImageFileDirectory_v2._unpackc             G   s   t j| j| f| S )N)r   packr   )rH   r   r   r   r   r   _pack  s    zImageFileDirectory_v2._packc                s    fdd}|S )Nc                sB   ddl m} | jdr2| jdd  dd| < | ft < | S )Nr   )r   load_r   _ )r
   r   rt   
startswithr   r   )funcr   )idxr   r   r   	decorator  s
    z9ImageFileDirectory_v2._register_loader.<locals>.decoratorr   )r   r   r   r   )r   r   r   _register_loader  s    z&ImageFileDirectory_v2._register_loaderc                s    fdd}|S )Nc                s   | t  < | S )N)_write_dispatch)r   )r   r   r   r     s    z9ImageFileDirectory_v2._register_writer.<locals>.decoratorr   )r   r   r   )r   r   _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   |  dt|  |S )Nz{}{})r   formatr   )rH   r   r   )r   r   r   r   r     s    z7ImageFileDirectory_v2._register_basic.<locals>.<lambda>c                s   d  fdd|D S )Nr   c             3   s   | ]}  |V  qd S )N)r   )r   rI   )r   rH   r   r   r     s    zJImageFileDirectory_v2._register_basic.<locals>.<lambda>.<locals>.<genexpr>)join)rH   r   )r   )rH   r   r     s    )T)r
   r   r   calcsizer   r   )Zidx_fmt_namer   r   r   r   )r   r   r   _register_basic  s    
z%ImageFileDirectory_v2._register_basicHshortr"   longbzsigned bytehzsigned shortlzsigned longrL   rG   ddoubler   Tc             C   s   |S )Nr   )rH   r   r   r   r   r   	load_byte  s    zImageFileDirectory_v2.load_bytec             C   s   |S )Nr   )rH   r   r   r   r   
write_byte  s    z ImageFileDirectory_v2.write_byter   c             C   s"   | dr|d d }|ddS )N    r3   zlatin-1r   )endswithdecode)rH   r   r   r   r   r   load_string  s    
z!ImageFileDirectory_v2.load_stringc             C   s   d| dd d S )Nr   r   r   r   )r   )rH   rI   r   r   r   write_string  s    z"ImageFileDirectory_v2.write_stringr   r   c                sV   |  dt|d |}fdd t fddt|d d d |dd d D S )	Nz{}Lr   c                s    r| |fS t | |S )N)r5   )rK   r   )r   r   r   combine  s    z4ImageFileDirectory_v2.load_rational.<locals>.combinec             3   s   | ]\}} ||V  qd S )Nr   )r   numdenom)r   r   r   r     s    z6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>r   r   )r   r   r   r   zip)rH   r   r   valsr   )r   r   r   load_rational  s    z#ImageFileDirectory_v2.load_rationalc                s   d  fdd|D S )Nr   c             3   s"   | ]} j dt|d V  qdS )2Ll    N)r   )r   r;   )r   r@   )rH   r   r   r     s    z7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>)r   )rH   r   r   )rH   r   write_rational  s    z$ImageFileDirectory_v2.write_rationalr   c             C   s   |S )Nr   )rH   r   r   r   r   r   load_undefined  s    z$ImageFileDirectory_v2.load_undefinedc             C   s   |S )Nr   )rH   rI   r   r   r   write_undefined  s    z%ImageFileDirectory_v2.write_undefined
   c                sV   |  dt|d |}fdd t fddt|d d d |dd d D S )	Nz{}lr   c                s    r| |fS t | |S )N)r5   )rK   r   )r   r   r   r     s    z;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec             3   s   | ]\}} ||V  qd S )Nr   )r   r   r   )r   r   r   r     s    z=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>r   r   )r   r   r   r   r   )rH   r   r   r   r   )r   r   r   load_signed_rational  s    z*ImageFileDirectory_v2.load_signed_rationalc                s   d  fdd|D S )Nr   c             3   s$   | ]} j dt|dd V  qdS )2lii   N)r   )r   rA   )r   r@   )rH   r   r   r     s   z>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>)r   )rH   r   r   )rH   r   write_signed_rational  s    
z+ImageFileDirectory_v2.write_signed_rationalc             C   s4   | |}t||kr0td| dt| d|S )Nz&Corrupt EXIF data.  Expecting to read z bytes but only got z. )readr   OSError)rH   fpr   retr   r   r   _ensure_read  s
    
z"ImageFileDirectory_v2._ensure_readc          
   C   s  |    | | _yАxt| d| |dd D ]}| d| |d\}}}}t|| jj	}t
|d}d| d| d	| d| d
	}	y| j| \}
}W n* tk
r   t|	d|   w6Y nX ||
 }|dkr.| }| d|\}|	d| d| 7 }	|| t||}|| n|d | }t||krttd| dt| d|  t|	 q6|st|	 q6|| j|< || j|< |	d|dkrd| nt| 7 }	t|	 q6W | d| |d\| _W n2 tk
r }	 ztt|	 d S d }	~	X Y nX d S )Nr   r   r   HHL4sr#   unknownztag: z (z
) - type: )z - unsupported type r   r"   z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read z bytes but only got z. Skipping tag z
 - value: r&   z<table: %d bytes>)r   tellr   ranger   r   r
   r   r   r   r   getr   KeyErrorloggerdebugseekr   
_safe_readr   r   r   r   r   r   r   r   rM   )rH   r   ir   r   countr   tagnametypnamemsgZ	unit_sizer   r   hereoffsetr   r   r   load  sN    
&





zImageFileDirectory_v2.loadr   c             C   s0  |  dt| j}g }|t| t| jd  d }d }xt| j D ]\}}|tkrdt|}| j|}t	d| d| dt
|  |tjkot|t}|r| jdkrd}	nd	}	t|	|d
}
| j| }x| D ]\}}||
|< qW |
|}n*t|tr|n|f}| j| | f| }t|| jj}|r@dn
t|d}d| d| d| d| d	}|dt|dkrdt| nt| 7 }t	| |rd}n(|tjtjtjgkrt|}nt|}t|dkr|||||dddf qJ|||||  d||f |t|d d d 7 }qJW |d k	r|| \}}}}}|r`td|  d| d|d | }|||||f||< x\|D ]T\}}}}}t	| d| d| dt
| dt
| 	 ||  d||||7 }qW |d7 }x6|D ].\}}}}}||7 }t|d@ r|d7 }qW |S )Nr   r#   r   zTag z, Type: z	, Value: r}   s   II*    s   MM *   )r   ifdr   zsave: z (z
) - type: r   z
 - value: r$   z<table: %d bytes>r   r   r   r"   r   z&multistrip support not yet implementedr   r   r   s       ) r   r   r   sortedr   STRIPOFFSETSr   r  r  r  r   r
   r   rF   r   r   rz   tobytesr   r   r   r   r   r   rM   r   r   r   appendljustNotImplementedErrorr   )rH   r  resultentriesZstripoffsetsr   rI   r   r   r   r  r   Zifd_tagZ	ifd_valuer   r	  r
  r  r  r   r   r   r  .  sf     

&


.zImageFileDirectory_v2.tobytesc             C   sN   |  dkr&|| j| ddd  |  }| |}|| |t| S )Nr   ZHL*   r   )r   writer   r   r  r   )rH   r   r  r  r   r   r   savez  s    

zImageFileDirectory_v2.save)r{   NN)T)T)T)T)T)r   )2rt   ru   rv   rw   rJ   ry   r1   r  r   setterr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   listmapr
   r   r   ZSIGNED_BYTEr   r   FLOATr   ZIFDr   r   r   r   r   r   r   r   r   r   r   r  r  r  r   r   r   r   rz     sf   
P






	7
Lrz   r   r   r   Z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|| d| _d S )NT)superrJ   r   )rH   rV   kwargs)	__class__r   r   rJ     s    zImageFileDirectory_v1.__init__c             C   s   | j S )N)r   )rH   r   r   r   r     r   zImageFileDirectory_v1.<lambda>c             C   s   | j S )N)r   )rH   r   r   r   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`

        )r1   )r1   r   r   r   )clsoriginalr  r   r   r   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`

        )r1   )rz   r1   r   r   r   r   )rH   r  r   r   r   to_v2  s
    zImageFileDirectory_v1.to_v2c             C   s   || j kp|| jkS )N)r   r   )rH   r   r   r   r   r     s    z"ImageFileDirectory_v1.__contains__c             C   s   t t| jt| jB S )N)r   r   r   r   )rH   r   r   r   r     s    zImageFileDirectory_v1.__len__c             C   s   t t| jt| jB S )N)r   r   r   r   )rH   r   r   r   r     s    zImageFileDirectory_v1.__iter__c             C   s    xdD ]}|  ||| qW d S )N)FT)r   )rH   r   rI   r   r   r   r   r     s    
z!ImageFileDirectory_v1.__setitem__c             C   sr   || j krP| j| }| j| }| j| \}}x"dD ]}| ||| ||| q2W | j | }t|ttfsn|f}|S )N)FT)r   r   r   r   r   rF   r   r   )rH   r   r   r   r   r   legacyr7   r   r   r   r     s    




z!ImageFileDirectory_v1.__getitem__)rt   ru   rv   rw   rJ   ry   tagsZtagdatar   __annotations__classmethodr%  r&  r   r   r   r   r   __classcell__r   r   )r"  r   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 fddZdd Zdd Zdd Zdd Z  ZS )TiffImageFileZTIFFz
Adobe TIFFFNc                s   d | _ d | _t || d S )N)tag_v2r   r   rJ   )rH   r   filename)r"  r   r   rJ     s    zTiffImageFile.__init__c             C   s   | j d}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   Nr3   z*** TiffImageFile._open ***z- __first: z- ifh: r   )r   r   rz   r-  r  r   Z_TiffImageFile__first_TiffImageFile__next_TiffImageFile__frame_TiffImageFile__fp
_frame_pos	_n_framesr  r  r   _seek)rH   r   r   r   r   _open  s    

zTiffImageFile._openc             C   sT   | j d krN|  }| t| j x | j d krB| |  d  q$W | | | j S )Nr   )r3  r   r4  r   r2  r  )rH   currentr   r   r   n_frames  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)	Z_seek_checkr4  r   Z_decompression_bomb_checkr   corenewmodeim)rH   framer   r   r   r  %  s
    

zTiffImageFile.seekc             C   s@  | j | _| j  xt| j|kr| js0tdtd| d| j	 d| j d| j   | j
| j | j| j td| j   | j| j | jj| jkrd| _n
| jj| _| jdkr|d | _t| jdkr| jdk| _|  j	d7  _	qW | 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   )r1  r   r   r   r2  r/  EOFErrorr  r  r0  r  r  r-  r  r   r3  is_animatedr  r%  r   r  _setup)rH   r<  r   r   r   r4  0  s0    
(


zTiffImageFile._seekc             C   s   | j S )zReturn the current frame number)r0  )rH   r   r   r   r   T  s    zTiffImageFile.tellc             C   s   d| j kr| | j d S i S )z
        Returns a dictionary containing the XMP tags.
        Requires defusedxml to be installed.
        :returns: XMP tags in a dictionary.
        i  )r-  Z_getxmp)rH   r   r   r   getxmpX  s    zTiffImageFile.getxmpc                s   | j r| jr|  S t  S )N)tileuse_load_libtiff_load_libtiffr   r  )rH   )r"  r   r   r  `  s    zTiffImageFile.loadc             C   s`   | j rPtjtjtjtjtjtjtjd	| j }|d k	rP| j
|| _
| j
j| _| js\d| _d S )N)r   r   r   r   r   r   r   T)_tile_orientationr   ZFLIP_LEFT_RIGHTZ
ROTATE_180ZFLIP_TOP_BOTTOMZ	TRANSPOSEZ
ROTATE_270Z
TRANSVERSEZ	ROTATE_90r  r;  Z	transposer   _sizer>  !_close_exclusive_fp_after_loading)rH   methodr   r   r   load_ende  s    

zTiffImageFile.load_endc       	   
   C   s  t j |  |   t| jdks*td| jd d }t| jd d }y6t| jdoft	
| j }t| jdr~| j  W n tk
r   d}Y nX |r||d< t | jd	t|| j}y|| j| W n, tk
r } ztd
|W dd}~X Y nX | jo| j }t| jdr<td || j \}}n\|rntd |s^| jd |d\}}n*td | jd || j \}}g | _d| _|   |r| j  d| _|dk rt|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  Zload_preparer   rA  r   r  hasattrr   osduprI  rJ  Z_getdecoderr:  r   Zdecoderconfigsetimager;  r   Z_exclusive_fpr>  r  r  r   rL  r  r   readonlyrH  close)	rH   ZextentsrV   r   decodereZclose_self_fpnerrr   r   r   rC  y  sR    






zTiffImageFile._load_libtiffc          
   C   s  d| j krtdt| j td | _| j td| _| j td}| jdkrRd}| j t	d}t
d t
d| j  t
d	|  t
d
| j  t
d|  t
d| jd  t| j t}t| j t}||f| _t
d| j  | j td}t|dkrFt|t|  kr>dkrFn nd}| j td}| j td}|dkrrd}n|dkrd}nd}|t|7 }|t|krt|dkr|| }| j t| jdkr|dkrdnd}	t||	krtd| j j|||||f}
t
d|
  yt|
 \| _}W n8 tk
rb } zt
d td|W dd}~X Y nX t
d|  t
d| j  | j| jd< | j td}| j t d}|r8|r8| j t!}|dkr||f| jd< nX|dkr|d  |d  f| jd< n6|dkr*||f| jd< ||f| jd!< n||f| jd!< d } }}g | _"t#pX| jd"k| _$| j$r:|dkr|
dd d |
dd  }
t
d|
  t|
 \| _}|d#krd$}d%|kr|%d%d&}d'|k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 nXt(| j ksRt)| j krt(| j kr| j t( }| j t*|}| jd }n"| j t) }| j d,}| j d-}x|D ]}|| |kr|t+| d. }nd}|}| jdkr|| }|| }|t|df}| j"'| j||t|| |t|| |f||f || }|| jd krd||  }}|| jd krd }}|d7 }qW nt
d/ tdt,| j kr| j t, | jd0< | jd1krd2d3 | j t- D }t./d4d50|| _1| j d6| _2dS )7z-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: i  z- size: )r   r   )r   r   r   r   r   r   )r   r   zunknown data organizationzformat key: z- unsupported formatzunknown pixel modeNz- raw mode: z- pil mode: compressionr   dpigRQ@
resolutionr   zI;16zI;16Nz;16Bz;16Nz;16Lr   r)   FrK  iB  iC  r   z- unsupported data organizationicc_profile)r,   r-   c             S   s   g | ]}t |d  qS )r   )r   )r   r   r   r   r   r     s    z(TiffImageFile._setup.<locals>.<listcomp>zRGB;Lr   i  )3r-  r   COMPRESSION_INFOr  COMPRESSION_compressionPLANAR_CONFIGURATION_planar_configurationPHOTOMETRIC_INTERPRETATION	FILLORDERr  r  r   r   
IMAGEWIDTHIMAGELENGTHrE  r   SAMPLEFORMATr   r?   r>   BITSPERSAMPLEEXTRASAMPLESSAMPLESPERPIXELr~   r1   	OPEN_INFOr:  r  r   X_RESOLUTIONY_RESOLUTIONRESOLUTION_UNITrA  READ_LIBTIFFrB  r   r  r  r  TILEOFFSETSROWSPERSTRIPsum
ICCPROFILECOLORMAPr	   r   r   paletterD  )rH   photoZ	fillorderZxsizeZysizeZsampleFormatZ	bps_tupleZextra_tupleZ	bps_countZsamplesPerPixelkeyrawmoderT  ZxresZyresZresunitxyZlayerrK   offsetsr   wr  strideZtile_rawmoderr  r   r   r   r?    s    



2

 








 



zTiffImageFile._setupc             C   sB   z4y| j | jkr| j   W n tk
r0   Y nX W d d | _ X d S )N)r1  r   rR  AttributeError)rH   r   r   r   
_close__fp  s    
zTiffImageFile._close__fp)NN)rt   ru   rv   r   format_descriptionrF  rJ   r5  ry   r7  r  r4  r   r@  r  rH  rC  r?  r|  r+  r   r   )r"  r   r,    s    	
$U Qr,  r!   r"   r(   r,   r-   zI;32SzI;16zI;16SzF;32Fr)   r+   r*   r.   YCbCrr/   zI;32BSzI;16BzI;16BSzF;32BF)r!   r"   r(   r,   r-   r%   zI;16zI;16Sr'   r)   r+   r*   r.   r~  r/   zI;32BSzI;16BzI;16BSzF;32BFc       &      C   s  yt | j \}}}}}}W n6 tk
rP }	 ztd| j d|	W d d }	~	X Y nX t|d}
| jd| jd}|d krd}n|dkrd}n|dkrd	}tp|dk}t	| d
d|
t
< | jd |
t< | jd |
t< | jdi }tdt|  t|tr| }xH|D ]@}|||
|< y|j| |
j|< W n tk
rH   Y nX qW t| drxFttttttfD ]2}|| jkrn| j| |
|< | jj| |
j|< qnW | jd| jd}|r||
t< xht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g
D ]$\}}|| jkr
| j| |
|< q
W | jd}|rdd|
t< |d |
t< |d |
t< |dkr||
t$< t%|dkrt%||
t&< |d k	r||
t'< |dkr||
t(< ||
t)< | jdkr| j*+dd}t,d d! |D |
t-< t%|| jd |d  d" d#  }|r2t.d$| d | | jd }n
| jd }|| }| jd | d | }||
t/< |d$krxt0j1|
jt2< |f|d  || jd  ||d   f |
t2< t,t3d|| ||
t4< t5|d|
t6< |rd%| jkr,| jd% }t|t7r
|dk s
|d&krt8d'|dkr$t8d(||
t9< td) td*t:|
;   d}t|d+ry|<d t=>|? }W n t@jAk
r   Y nX i }tBt(t2t4tCtDg}i }|d |t$< i }t| d,r| jE }xtFG|
; t	| di ; |; D ]\}}|t0jHkrftIjJjKsq||
jkr2|
j| ||< n4t|t7tLtMtNfsLqnt0O|jP}|rf|||< ||kr||krt|tMr|Qd-d.d/ ||< n"t|tRrtL|||< n|||< qW td0t:|;   | jd1krd2}t|; } | S  ||||| |f}!tIT| jd3|!| jU}	|	V| j*d4| j  x.|	Qd5\}"}#}$|sX|W|$ |#r8P q8W |#dk rtd6|# d7n.|
X|}%tYZ| |dd4| j |%||dffg d8| jkr|
| _[d S )9Nzcannot write mode z as TIFF)r1   rW  r   r   r   r   r   r_  r   r   ZtiffinfozTiffinfo Keys: %sr-  rZ  descriptionrY  Zx_resolutionZy_resolutionZresolution_unitZsoftware	date_timeZartist	copyrightrX  r   )r   )r,   r-   r)   zRGB;Lc             s   s   | ]}|d  V  qdS )r   Nr   )r   r   r   r   r   r   &  s    z_save.<locals>.<genexpr>r   r   i   qualityd   zInvalid quality settingz5quality setting only supported for 'jpeg' compressionzSaving using libtiff encoderz	Items: %srI  r   r   r   r   zConverted items: %s)zI;16BzI;16zI;16NrK  )r   r   i @  zencoder error z when writing image file_debug_multipage)\	SAVE_INFOr:  r  r   rz   encoderinfor  r   WRITE_LIBTIFFrU   r^  r   rb  rc  r  r  r  rF   r  r&  r   r   rM  rk  ri  rj  IPTC_NAA_CHUNKPHOTOSHOP_CHUNKXMPr-  rp  IMAGEDESCRIPTIONSOFTWARE	DATE_TIMEARTIST	COPYRIGHTre  r   rg  rf  rd  r`  r;  Z
getpaletter   rq  r>   rn  r
   r   STRIPBYTECOUNTSr   r  COMPRESSION_INFO_REVr\  r   r   JPEGQUALITYr  r   r  rN  rO  rI  ioUnsupportedOperationREFERENCEBLACKWHITETRANSFERFUNCTIONSUBIFDr   	itertoolschainZLIBTIFF_COREr   r8  Zlibtiff_support_custom_tagsrG   rM   r   r   r   r   r5   sortZ_getencoderencoderconfigrP  r  r  r   _saver  )&r;  r   r.  ru  r1   rs  r   bitsextrarT  r  rW  rK  r   rt  Ziccr   rX  Zlutrz  Zrows_per_stripZstrip_byte_countsZstrips_per_imager  _fptypesZ	blocklistZattsZ
legacy_ifdr   rI   r   r(  rK   r   sr   r  r   r   r   r    s2   &





"

"
 




&



 r  c               @   s   e Zd ZdddddddddddddgZdddd	d
dhZd:d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/d0 Zd1d2 Zd3d4 Zd5d6 Zd;d7d8Zd9S )<AppendingTiffWriterr   r   r   r   r   i  i   iD  i  i  i	  Fc             C   sv   t |dr|| _d| _nF|| _d| _yt||r2dnd| _W n  tk
r\   t|d| _Y nX | j | _|   d S )Nr   FTzw+bzr+b)	rM  rL   close_fpr   openr   r   	beginningsetup)rH   fnr9  r   r   r   rJ     s    
zAppendingTiffWriter.__init__c             C   s   | j | jtj d | _d| _| j d | _}|s>d| _	d S d| _	|dkrX| 
d n|dkrl| 
d ntd	|   |   d S )
Nr   r   TFs   II* r}   s   MM *r|   zInvalid TIFF file header)rL   r  r  rN  SEEK_SETwhereToWriteNewIFDOffsetoffsetOfNewPager   IIMMisFirst	setEndianRuntimeErrorskipIFDsgoToEnd)rH   r  r   r   r   r    s    zAppendingTiffWriter.setupc             C   s   | j r
d S | j| j | jd}|s,d S || jkr>td|  }|| j7 }| j| j | 	| | j| | 
  d S )Nr   z1IIMM of new page doesn't match IIMM of first page)r  rL   r  r  r   r  r  readLongr  	writeLongfixIFD)rH   r  	IFDoffsetr   r   r   finalize  s    


zAppendingTiffWriter.finalizec             C   s   |    |   d S )N)r  r  )rH   r   r   r   newFrame  s    zAppendingTiffWriter.newFramec             C   s   | S )Nr   )rH   r   r   r   	__enter__  s    zAppendingTiffWriter.__enter__c             C   s   | j r|   dS )NF)r  rR  )rH   exc_type	exc_value	tracebackr   r   r   __exit__  s    zAppendingTiffWriter.__exit__c             C   s   | j  | j S )N)rL   r   r  )rH   r   r   r   r     s    zAppendingTiffWriter.tellc             C   s*   |t jkr|| j7 }| j|| |  S )N)rN  r  r  rL   r  r   )rH   r  whencer   r   r   r    s    

zAppendingTiffWriter.seekc             C   s^   | j dtj | j  }d|d  }d|  k r:dk rNn n| j t| | j  | _d S )Nr   r$   )rL   r  rN  SEEK_ENDr   r  r   r  )rH   posZpadBytesr   r   r   r    s    
zAppendingTiffWriter.goToEndc             C   s.   || _ | j d | _| j d | _| j d | _d S )Nr"   r   ZHHL)endianlongFmtshortFmt	tagFormat)rH   r  r   r   r   r  '  s    zAppendingTiffWriter.setEndianc             C   sT   xN|   }|dkr$| j d | _P | j| |  }| j|d tj qW d S )Nr   r   r#   )r  rL   r   r  r  	readShortrN  SEEK_CUR)rH   r  numTagsr   r   r   r  -  s    zAppendingTiffWriter.skipIFDsc             C   s   | j |S )N)rL   r  )rH   r   r   r   r   r  8  s    zAppendingTiffWriter.writec             C   s   t | j| jd\}|S )Nr   )r   r   r  rL   r   )rH   rI   r   r   r   r  ;  s    zAppendingTiffWriter.readShortc             C   s   t | j| jd\}|S )Nr   )r   r   r  rL   r   )rH   rI   r   r   r   r  ?  s    zAppendingTiffWriter.readLongc             C   sJ   | j dtj | j t| j|}|d k	rF|dkrFtd| dd S )Nr   zwrote only z bytes but wanted 4)	rL   r  rN  r  r  r   r   r  r  )rH   rI   bytesWrittenr   r   r   rewriteLastShortToLongC  s    z*AppendingTiffWriter.rewriteLastShortToLongc             C   sJ   | j dtj | j t| j|}|d k	rF|dkrFtd| dd S )Nr  r   zwrote only z bytes but wanted 2)	rL   r  rN  r  r  r   r   r  r  )rH   rI   r  r   r   r   rewriteLastShortI  s    z$AppendingTiffWriter.rewriteLastShortc             C   sJ   | j dtj | j t| j|}|d k	rF|dkrFtd| dd S )Nr   zwrote only z bytes but wanted 4)	rL   r  rN  r  r  r   r   r  r  )rH   rI   r  r   r   r   rewriteLastLongO  s    z#AppendingTiffWriter.rewriteLastLongc             C   s:   | j t| j|}|d k	r6|dkr6td| dd S )Nr   zwrote only z bytes but wanted 2)rL   r  r   r   r  r  )rH   rI   r  r   r   r   
writeShortU  s    zAppendingTiffWriter.writeShortc             C   s:   | j t| j|}|d k	r6|dkr6td| dd S )Nr   zwrote only z bytes but wanted 4)rL   r  r   r   r  r  )rH   rI   r  r   r   r   r  Z  s    zAppendingTiffWriter.writeLongc             C   s   |    | j  d S )N)r  rL   rR  )rH   r   r   r   rR  _  s    zAppendingTiffWriter.closec             C   s  |   }xt|D ]}t| j| jd\}}}| j| }|| }|dk}|sl|  }	|	| j	7 }	| 
|	 || jkr| j }
|r| j||dk|dkd | j|
d  n0| j|	 | j||dk|dkd | j|
 d  }	}
q|r| jdtj qW d S )Nr   r   r   )isShortisLong)r  r   r   r   r  rL   r   
fieldSizesr  r  r  Tagsr   
fixOffsetsr  rN  r  )rH   r  r  r   Z	fieldTyper  Z	fieldSizeZ	totalSizeZisLocalr  ZcurPosr   r   r   r  c  s.    





zAppendingTiffWriter.fixIFDc             C   s   |s|st dxt|D ]}|r*|  n|  }|| j7 }|r|dkr|dkrXt d| | | jdtj	 | 
tj | jdtj	 q|r| | q| | qW d S )Nz offset is neither short nor longi   r   znot implementedir   )r  r   r  r  r  r  rL   r  rN  r  r  r
   r   r  r  )rH   r  r  r  r  r  r   r   r   r    s    

zAppendingTiffWriter.fixOffsetsN)F)FF)rt   ru   rv   r  r  rJ   r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  rR  r  r  r   r   r   r   r    sH   	

#r  c          	   C   s   | j  }| j}t|dg }t| ds:|s:t| ||S |  }zt|t}xl| g| D ]^}||_ ||_t|dszd}	n|j	}	x6t
|	D ]*}
||
 |  t||| |  qW qZW W d Q R X W d | | X d S )Nappend_imagesr7  r   )r  copyr  r  r  rM  r  r   r  r7  r   r  r  r  )r;  r   r.  r  r  r  Zcur_idxtfZimsZnfrr   r   r   r   	_save_all  s(    



r  z.tifz.tiffz
image/tiff)^r  r  loggingrN  r   r   collections.abcr   Z	fractionsr   Znumbersr   r    r   r   r	   r
   _binaryr   r   	getLoggerrt   r  rl  r  ZIFD_LEGACY_APIr   r   rb  rc  re  r\  r`  ra  r  r  rg  rn  r  ri  rj  r^  rk  r  r  r  r  Z	PREDICTORrq  rm  r  rf  rd  Z
JPEGTABLESr  r  r  r  rp  ZEXIFIFDr  r  ZIMAGEJ_META_DATA_BYTE_COUNTSZIMAGEJ_META_DATAr[  r   r  rh  r0   r2   r;   rA   r   r   r5   rz   r   r   r   setattrr  ZImageFileDirectoryr,  r  r  r  r  Zregister_openr   Zregister_saveZregister_save_allZregister_extensionsZregister_mimer   r   r   r   <module>)   s  
   i\   B i o