zmc
2023-12-22 9fdbf60165db0400c2e8e6be2dc6e88138ac719a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
U
T±dk5ãæ@s" ddlZddlZddlZddlZddlZddlZddlZddlmZddl    m
Z
ddl m Z m Z ddlmZmZmZmZmZddlmZddlmZdd    lmZdd
lmZe e¡Zd Zd Zd Z d Z!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3d Z4d!Z5d"Z6d#Z7d$Z8d%Z9d&Z:d'Z;d(Z<d)Z=d*Z>d+Z?d,Z@d-ZAd.ZBd/ZCd0ZDd1ZEd2ZFd3ZGd4ZHd5ZId6ZJd7ZKd8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIœZLdJdK„eL M¡DƒZNe"ddLddLdMfdNe#ddLddLdMfdNe"ddLdOdLdMfdPe#ddLdOdLdMfdPe"ddLddLdMfdQe#ddLddLdMfdQe"ddLdOdLdMfdRe#ddLdOdLdMfdRe"ddLddSdMfdTe#ddLddSdMfdTe"ddLdOdSdMfdUe#ddLdOdSdMfdUe"ddLddSdMfdVe#ddLddSdMfdVe"ddLdOdSdMfdWe#ddLdOdSdMfdWe"ddLddXdMfdYe#ddLddXdMfdYe"ddLdOdXdMfdZe#ddLdOdXdMfdZe"ddLddXdMfd[e#ddLddXdMfd[e"ddLdOdXdMfd\e#ddLdOdXdMfd\e"ddLdd]dMfd^e#ddLdd]dMfd^e"ddLdOd]dMfd_e#ddLdOd]dMfd_e"ddLdd]dMfd`e#ddLdd]dMfd`e"ddLdOd]dMfdae#ddLdOd]dMfdae"ddLddbdMfdce"ddLddddMfdee"ddLddddMfdee#ddLddddMfdfe"ddLdOdddMfdge"ddSddddMfdhe#ddSddddMfdie"ddjddkdMfdle#ddjddkdMfdme"ddLddkdMfdne"ddSddkdMfdoe#ddSddkdMfdpe"ddjddkdMfdle#ddjddkdMfdme"ddLddqdSfdre#ddLddqdSfdre"dOdLddsdMfdte#dOdLddsdMfdte"dOdLdOdsdMfdue#dOdLdOdsdMfdue"dOdLddvdMfdwe#dOdLddvdMfdwe"dOdLddvdxfdye#dOdLddvdxfdye"dOdLddzd{fd|e#dOdLddzd{fd|e"dOdLdd}d~fde#dOdLdd}d~fde"dOdLddvdLfd€e#dOdLddvdLfd€e"dOdLddzdfd‚e#dOdLddzdfd‚e"dOdLdd}dƒfd„e#dOdLdd}dƒfd„e"dOdLddvdSfdwe#dOdLddvdSfdwe"dOdLddzd…fd†e#dOdLddzd…fd†e"dOdLdd}d‡fdˆe#dOdLdd}d‡fdˆe"dOdLddvd‰fdwe#dOdLddvd‰fdwe"dOdLddŠdMfd‹e#dOdLddŠdMfdŒe"dOdLdddMfdŽe#dOdLdddMfde"dOdLdddxfde#dOdLdddxfd‘e"dOdLdddLfd’e#dOdLdddLfd“e"dOdLdddSfdŽe#dOdLdddSfde"d”dLddLdMfd•e#d”dLddLdMfd•e"d”dLdOdLdMfd–e#d”dLdOdLdMfd–e"d”dLddSdMfd—e#d”dLddSdMfd—e"d”dLdOdSdMfd˜e#d”dLdOdSdMfd˜e"d”dLddXdMfd™e#d”dLddXdMfd™e"d”dLdOdXdMfdše#d”dLdOdXdMfdše"d”dLdd]dMfd›e#d”dLdd]dMfd›e"d”dLddqdSfdœe#d”dLddqdSfdœe"d”dLdOd]dMfde#d”dLdOd]dMfde"dždLddvdMfdŸe#dždLddvdMfdŸe"dždLddzdxfd e#dždLddzdxfd e"dždLdd}d{fd¡e#dždLdd}d{fd¡e"dždLdddMfd¢e"d£dLddsdMfd¤e#d£dLddsdMfd¤e"d¥dLddsdMfd¦e#d¥dLddsdMfd¦iqZOePd§d¨„eODƒƒZQd©dªd«d¬d­d®gZRd¯d°„ZSd±d²„ZTd³d´„ZUiZViZWGdµd¶„d¶e ƒZXGd·d¸„d¸eƒZYeVeY_VeWeY_We M¡D]B\ZZZ[e[ \d¹dº¡Z[e]eYd»e[eVeZdƒe]eYd¼e[eWeZƒ    q2[V[W[Z[[Gd½d¾„d¾eYƒZ^e^Z_Gd¿dÀ„dÀejƒZ`dÁe"dddLdfdÂe"ddd]dfdÃe"dddqdOfdÄe"d”dd]dfdÅe"d”ddqdOfdÆe"ddOdkdfdÇe"dddddfdÈe"ddOdddfdÉe"dd”dkdfdÊe"dOddsdfdËe"dOddvdfdÌe"dOddvdOfdÍe"džddvdfdÎe"d£ddsdfdÏe"d¥ddsdfdÐe#ddOdkdfdÑe#dddddfdÒe#ddOdddfdÓe#dd”dkdfdԜZadÕdքZbGd×d؄d؃ZcdÙdڄZde ee`jfe`eS¡e ge`jfeb¡e he`jfed¡e ie`jfdÛdÜg¡e je`jfdÝ¡dS)ÞéN)ÚMutableMapping)ÚFraction)ÚNumberÚRationalé)ÚImageÚ    ImageFileÚImageOpsÚ ImagePaletteÚTiffTags)Úi16be)Úi32be©Úo8©ÚTYPESFTésIIsMMéiiiii
iéiiiiiii(i-i1i2i;i=i@iBiCéDiEiJiRiSi[iii˜‚i»ƒéI†is‡ii‡i¼ii–Æi—ÆÚrawZ
tiff_ccittZgroup3Zgroup4Ztiff_lzwÚ    tiff_jpegÚjpegÚtiff_adobe_deflateZ tiff_raw_16ZpackbitsZtiff_thunderscanÚ tiff_deflateZ tiff_sgilogZ tiff_sgilog24ÚlzmaZzstdZwebp)réééééééi€i€i)€i²€it‡iu‡imˆiPÃiQÃcCsi|]\}}||“qS©r$)Ú.0ÚkÚvr$r$úJd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\PIL/TiffImagePlugin.pyÚ
<dictcomp>Šsr)©rr$)Ú1z1;Ir)r+z1;IR)r+r+)r+z1;R)r)ÚLzL;2I)r,zL;2IR)r,zL;2)r,zL;2R)r)r,zL;4I)r,zL;4IR)r,zL;4)r,zL;4R)r#)r,zL;I)r,zL;IR)r,r,)r,zL;R)é )úI;16zI;12)é)r.r.)úI;16Br0)r.zI;16R)ÚIúI;16S)r1úI;16BS)r)é )ÚFúF;32F)r5úF;32BF)r1zI;32N)r1úI;32S)r1úI;32BS)r#r#)ÚLAr:)r#r#r#)ÚRGBr;)r;zRGB;R)r#r#r#r#)ÚRGBAr<)r)ÚRGBXr=)r#r#r#r#r#©rr)r=ZRGBXX)r#r#r#r#r#r#)rrr)r=ZRGBXXX)r<ZRGBa)rr)r<ZRGBaX)rrr)r<ZRGBaXX)rr)r<ZRGBAX)rrr)r<ZRGBAXX)iç)r/r/r/)r;zRGB;16L)r;zRGB;16B)r/r/r/r/)r<zRGBA;16L)r<zRGBA;16B)r=zRGBX;16L)r=zRGBX;16B)r<zRGBa;16L)r<zRGBa;16Br)ÚPzP;1)r?zP;1R)r?zP;2)r?zP;2R)r?zP;4)r?zP;4R)r?r?)ÚPAr@)r?zP;Rr )ÚCMYKrA)rAZCMYKX)rAZCMYKXX)rAzCMYK;16Lr!)r;r=r#)ÚLABrBccs|]}t|dƒVqdS)rN)Úlen)r%Zkey_tpr$r$r(Ú    <genexpr>srDóMM*óII*sMM*sII*sMM+sII+cCs|dd…tkS©Nr)ÚPREFIXES©Úprefixr$r$r(Ú_acceptsrKcCs<t|ƒdk}t|rd|n|ƒ |¡}|r8|ddd…S|S)Nréÿÿÿÿ)ÚabsÚ IFDRationalÚlimit_rational)ÚvalÚmax_valÚinvÚn_dr$r$r(Ú_limit_rationals rTcCsPt|ƒ}|j|jf}t|ƒ|kr.t|t|ƒƒ}t|ƒ|krLt|Ž}t||ƒ}|S©N)rÚ    numeratorÚ denominatorÚminrTrMÚmax)rPrQZmin_valÚfracrSr$r$r(Ú_limit_signed_rationals   
r[c@sReZdZdZdZd4dd„Zedd„ƒZedd    „ƒZd
d „Z    d d „Z
dd„Z dd„Z dd„Z dd„Zdd„ZedƒZedƒZedƒZedƒZedƒZedƒZedƒZedƒZed ƒZed!ƒZed"ƒZed#ƒZed$ƒZed%ƒZed&ƒZed'ƒZed(ƒZ ed)ƒZ!ed*ƒZ"ed+ƒZ#ed,ƒZ$ed-ƒZ%ed.ƒZ&ed/ƒZ'ed0ƒZ(ed1ƒZ)e*e+d2ƒrNed2ƒZ,d3S)5rNzÀ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Ú_valrcCs†t|tƒr&|j|_|j|_|j|_dSt|tƒrB|j|_|j|_n ||_||_|dkrbtdƒ|_n |dkrvt|ƒ|_n t||ƒ|_dS)z®
        :param value: either an integer numerator, a
        float/rational/other number, or an IFDRational
        :param denominator: Optional integer denominator
        NrÚnanr)    Ú
isinstancerNrVr\rWr]r^rÚfloat)ÚselfÚvaluerWr$r$r(Ú__init__=s
 
 
  zIFDRational.__init__cCs|jSrU)r\©rbr$r$r(rVWszIFDRational.numeratorcCs|jSrU)r]rer$r$r(rW[szIFDRational.denominatorcCs.|jdkr|j|jfS|j |¡}|j|jfS)z…
 
        :param max_denominator: Integer, the maximum denominator value
        :returns: Tuple of (numerator, denominator)
        r)rWrVr^Zlimit_denominator)rbZmax_denominatorÚfr$r$r(rO_s
  zIFDRational.limit_rationalcCstt|jƒƒSrU)Ústrrar^rer$r$r(Ú__repr__lszIFDRational.__repr__cCs
|j ¡SrU)r^Ú__hash__rer$r$r(rioszIFDRational.__hash__cCs0|j}t|tƒr|j}t|tƒr(t|ƒ}||kSrU)r^r`rNra)rbÚotherrPr$r$r(Ú__eq__rs 
 
zIFDRational.__eq__cCs|j|j|jgSrU)r^r\r]rer$r$r(Ú __getstate__zszIFDRational.__getstate__cCs,t |d¡|\}}}||_||_||_dS)Nr)rNrdr^r\r])rbÚstater^r\r]r$r$r(Ú __setstate__}s
 
zIFDRational.__setstate__cs‡fdd„}|S)Ncst|jˆƒ|ŽSrU)Úgetattrr^)rbÚargs©Úopr$r(Údelegate…sz'IFDRational._delegate.<locals>.delegater$)rrrsr$rqr(Ú    _delegate„s zIFDRational._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__N)r)-Ú__name__Ú
__module__Ú __qualname__Ú__doc__Ú    __slots__rdÚpropertyrVrWrOrhrirkrlrnrtrurvrwrxryrzr{r|r}r~rr€rr‚rƒr„r…r†r‡rˆr‰rŠr‹rŒrrŽÚhasattrrrr$r$r$r(rN/sT 
 
 
  rNc@seZdZdZd^dd„Zedd„ƒZedd„ƒZed    d„ƒZej    d
d „ƒZd d „Z
dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Zeeeejd*d+fejd,d-fejd.d/fejd0d1fej d2d3fej!d4d5fej"d6d7fej#d,d-fej$d8d9fg    ƒƒed:d:ƒd_d<d=„ƒZ%ed:ƒd>d?„ƒZ&ed@d:ƒd`dAdB„ƒZ'ed@ƒdCdD„ƒZ(edEdFƒdadGdH„ƒZ)edEƒdIdJ„ƒZ*edKd:ƒdbdLdM„ƒZ+edKƒdNdO„ƒZ,edPdFƒdcdQdR„ƒZ-edPƒdSdT„ƒZ.dUdV„Z/dWdX„Z0dddZd[„Z1d\d]„Z2dS)eÚImageFileDirectory_v2aThis 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*NcCsÈt|ƒs dt|ƒ›d}t|ƒ‚|dk    r,|n
|dd…|_|jtkrLd|_n|jtkr^d|_n d}t|ƒ‚|ddk|_||_i|_    | 
¡|jr¦|  d    |d
d…¡n|  d |d d…¡\|_ d |_ dS)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.
        znot a TIFF file (header z  not valid)Nrú>ú<znot a TIFF IFDé+ÚQr#r,rF)rKÚreprÚ SyntaxErrorÚ_prefixÚMMÚ_endianÚIIÚ_bigtiffÚgroupÚtagtypeÚresetÚ_unpackÚnextÚ _legacy_api)rbÚifhrJr¤Úmsgr$r$r(rdîs" 
 
,ÿzImageFileDirectory_v2.__init__cCs|jSrU)rŸrer$r$r(Ú<lambda>ózImageFileDirectory_v2.<lambda>cCs|jSrU)Ú_offsetrer$r$r(r¬r­cCs|jSrU)r©rer$r$r(r¬r­cCsd}t|ƒ‚dS)Nz"Not allowing setting of legacy api)Ú    Exception)rbrcr«r$r$r(Ú
legacy_apisz ImageFileDirectory_v2.legacy_apicCs(i|_i|_i|_i|_d|_d|_dSrU)Ú_tags_v1Ú_tags_v2Ú_tagdatar¥Ú_nextr®rer$r$r(r¦s zImageFileDirectory_v2.resetcCs tt|ƒƒSrU)rgÚdictrer$r$r(Ú__str__szImageFileDirectory_v2.__str__cs‡fdd„ˆ ¡DƒS)z
        :returns: dict of name|key: value
 
        Returns the complete tag dictionary, with named tags where possible.
        cs"i|]\}}t |ˆj¡j|“qSr$)r Úlookupr¤Úname)r%Úcodercrer$r(r)(sÿz/ImageFileDirectory_v2.named.<locals>.<dictcomp>)Úitemsrer$rer(Únamed"s
þzImageFileDirectory_v2.namedcCstt|jƒt|jƒBƒSrU)rCÚsetr³r²rer$r$r(Ú__len__-szImageFileDirectory_v2.__len__cCsf||jkr>|j|}|j|}|j|\}}||||jƒ||<|j|}|jrbt|ttfƒsb|f}|SrU)r²r³r¥Ú_load_dispatchr°r`ÚtupleÚbytes)rbÚtagÚdataÚtypÚsizeÚhandlerrPr$r$r(Ú __getitem__0s
 
 
 
z!ImageFileDirectory_v2.__getitem__cCs||jkp||jkSrU)r²r³©rbrÁr$r$r(Ú __contains__;sz"ImageFileDirectory_v2.__contains__cCs| |||j¡dSrU)Ú_setitemr°)rbrÁrcr$r$r(Ú __setitem__>sz!ImageFileDirectory_v2.__setitem__c
sÀtttf}t ||j¡‰t||ƒr(|gn|}||jkrpˆjrNˆj|j|<n"tj    |j|<t
dd„|Dƒƒr’t
dd„|Dƒƒr„tj ntj |j|<nÞt
dd„|Dƒƒr t
dd„|DƒƒrÆtj |j|<nDt
dd„|Dƒƒrætj|j|<n$t
dd„|Dƒƒrþtjntj|j|<ndt
dd„|Dƒƒr.tj|j|<nBt
d    d„|DƒƒrPtj|j|<n t
d
d„|Dƒƒrptj|j|<|j|tj    kr’d d „|Dƒ}n |j|tj kr²d d „|Dƒ}|j|tjkoÌt|tƒ}|sêt‡fdd„|Dƒƒ}|rö|jn|j}|s´ˆjdks@|j|tjks@ˆjdkr´t|ƒdkr´|s´|rd|j|tj tj fkrd|f}z|\||<Wn>tk
r°t d|›dt|ƒ›d¡|d||<YnXn|||<dS)Ncss|]}t|tƒVqdSrU)r`rN©r%r'r$r$r(rDLsz1ImageFileDirectory_v2._setitem.<locals>.<genexpr>css|]}|dkVqdS©rNr$rËr$r$r(rDOscss|]}t|tƒVqdSrU)r`ÚintrËr$r$r(rDRscss&|]}d|kodknVqdS)rrNr$rËr$r$r(rDSscss&|]}d|kodknVqdS)i€ÿÿi€Nr$rËr$r$r(rDUscss|]}|dkVqdSrÌr$rËr$r$r(rDZscss|]}t|tƒVqdSrU)r`rarËr$r$r(rD]scss|]}t|tƒVqdSrU)r`rgrËr$r$r(rD_scss|]}t|tƒVqdSrU)r`rÀrËr$r$r(rDascSs&g|]}t|tƒr| dd¡n|‘qS)ÚasciiÚreplace)r`rgÚencoderËr$r$r(Ú
<listcomp>esÿz2ImageFileDirectory_v2._setitem.<locals>.<listcomp>cSs"g|]}t|tƒrt|ƒn|‘qSr$)r`rÍrarËr$r$r(rÑjsc3s|]}ˆ |¡VqdSrU)Zcvt_enum©r%rc©Úinfor$r(rDnsrzMetadata Warning, tag z had too many entries: z , expected 1r)rrÀrgr r·r¤r`r¥ÚtypeÚ    UNDEFINEDÚallZRATIONALZSIGNED_RATIONALÚSHORTÚ SIGNED_SHORTÚLONGÚ SIGNED_LONGÚDOUBLEÚASCIIÚBYTErµr¿r±r²ÚlengthrCÚ
ValueErrorÚwarningsÚwarn)rbrÁrcr°Z    basetypesÚvaluesÚis_ifdÚdestr$rÓr(rÉAsz
  ÿý
ÿý
 þÿþý
ýýþÿzImageFileDirectory_v2._setitemcCs.|j |d¡|j |d¡|j |d¡dSrU)r²Úpopr±r³rÇr$r$r(Ú __delitem__‘sz!ImageFileDirectory_v2.__delitem__cCstt|jƒt|jƒBƒSrU)Úiterr¼r³r²rer$r$r(Ú__iter__–szImageFileDirectory_v2.__iter__cCst |j||¡SrU)ÚstructÚunpackr¡)rbÚfmtrÂr$r$r(r§™szImageFileDirectory_v2._unpackcGstj|j|f|žŽSrU)rêÚpackr¡)rbrìrãr$r$r(Ú_packœszImageFileDirectory_v2._packcs‡‡fdd„}|S)NcsBddlm}|j d¡r2|jdd… dd¡|ˆ<ˆ|ftˆ<|S)NrrÚload_r Ú_ú )r rrÚ
startswithrÏr¾)Úfuncr©ÚidxrÄr$r(Ú    decorator s
   z9ImageFileDirectory_v2._register_loader.<locals>.decoratorr$)rõrÄrör$rôr(Ú_register_loaderŸsz&ImageFileDirectory_v2._register_loadercs‡fdd„}|S)Ncs |tˆ<|SrU)Ú_write_dispatch)ró©rõr$r(rö«sz9ImageFileDirectory_v2._register_writer.<locals>.decoratorr$)rõrör$rùr(Ú_register_writerªs z&ImageFileDirectory_v2._register_writercsXddlm}|\}‰}|||<t dˆ¡‰ˆd‡‡fdd„    ft|<‡fdd„t|<dS)    Nrrú=Tcs| t|ƒˆ›ˆ›|¡SrU)r§rC©rbrÂr°©rìrÄr$r(r¬¹sz7ImageFileDirectory_v2._register_basic.<locals>.<lambda>csd ‡‡fdd„|Dƒ¡S)Nr­c3s|]}ˆ ˆ|¡VqdSrU)rîrÒ)rìrbr$r(rD¾szJImageFileDirectory_v2._register_basic.<locals>.<lambda>.<locals>.<genexpr>©Újoin©rbrã)rìrer(r¬½s)T)r rrêÚcalcsizer¾rø)Z idx_fmt_namerrõr¸r$rýr(Ú_register_basic±s 
þz%ImageFileDirectory_v2._register_basicÚHÚshortr,ÚlongÚbz signed byteÚhz signed shortÚlz signed longrfraÚdÚdoublerœZlong8rTcCs|SrUr$rür$r$r(Ú    load_byteÒszImageFileDirectory_v2.load_bytecCs*t|tƒrt|ƒ}t|tƒr&t|fƒ}|SrU)r`rNrÍrÀ©rbrÂr$r$r(Ú
write_byteÖs
 
 
 
z ImageFileDirectory_v2.write_bytercCs"| d¡r|dd…}| dd¡S)NórLzlatin-1rÏ)ÚendswithÚdecoderür$r$r(Ú load_stringÞs
 z!ImageFileDirectory_v2.load_stringcCs0t|tƒrt|ƒ}t|tƒs(| dd¡}|dS)NrÎrÏr)r`rÍrgrÀrЩrbrcr$r$r(Ú write_stringäs
 
 
 z"ImageFileDirectory_v2.write_stringr r#csV| t|ƒd›d|¡}‡fdd„‰t‡fdd„t|ddd…|ddd…ƒDƒƒS)    Nrr,csˆr ||fSt||ƒSrU©rN©Úar©r°r$r(Úcombineñsz4ImageFileDirectory_v2.load_rational.<locals>.combinec3s|]\}}ˆ||ƒVqdSrUr$©r%ÚnumZdenom©rr$r(rDôsz6ImageFileDirectory_v2.load_rational.<locals>.<genexpr>rr©r§rCr¿Úzip©rbrÂr°Úvalsr$©rr°r(Ú load_rationalís z#ImageFileDirectory_v2.load_rationalcsd ‡fdd„|Dƒ¡S)Nr­c3s"|]}ˆjdt|dƒžŽVqdS)Ú2LlÿÿN)r")rîrT©r%rZrer$r(rDøsz7ImageFileDirectory_v2.write_rational.<locals>.<genexpr>rþrr$rer(Úwrite_rationalösÿz$ImageFileDirectory_v2.write_rationalr"cCs|SrUr$rür$r$r(Úload_undefinedüsz$ImageFileDirectory_v2.load_undefinedcCst|tƒrt|ƒ dd¡}|S)NrÎrÏ)r`rÍrgrÐrr$r$r(Úwrite_undefineds
z%ImageFileDirectory_v2.write_undefinedé
csV| t|ƒd›d|¡}‡fdd„‰t‡fdd„t|ddd…|ddd…ƒDƒƒS)    Nrrcsˆr ||fSt||ƒSrUrrrr$r(r
sz;ImageFileDirectory_v2.load_signed_rational.<locals>.combinec3s|]\}}ˆ||ƒVqdSrUr$rrr$r(rD sz=ImageFileDirectory_v2.load_signed_rational.<locals>.<genexpr>rrrrr$r r(Úload_signed_rationals z*ImageFileDirectory_v2.load_signed_rationalcsd ‡fdd„|Dƒ¡S)Nr­c3s$|]}ˆjdt|ddƒžŽVqdS)Ú2liÿÿÿi€N)r))rîr[r#rer$r(rDsÿz>ImageFileDirectory_v2.write_signed_rational.<locals>.<genexpr>rþrr$rer(Úwrite_signed_rationalsþz+ImageFileDirectory_v2.write_signed_rationalcCs8| |¡}t|ƒ|kr4d|›dt|ƒ›d}t|ƒ‚|S)Nz&Corrupt EXIF data.  Expecting to read ú bytes but only got z. )ÚreadrCÚOSError)rbÚfprÄÚretr«r$r$r(Ú _ensure_reads 
 ÿz"ImageFileDirectory_v2._ensure_readc
CsŒ| ¡| ¡|_z:|jr0| d| |d¡¡n| d| |d¡¡d}t|ƒD]Ä}|jrp| d| |d¡¡n| d| |d    ¡¡\}}}}t ||j    ¡j
}t   |d
¡}    d |›d |›d |    ›d |›d    }
z|j |\} } Wn.tk
rt |
d|›¡YqPYnX|| } | |jrdndkr~| ¡}| |jr>dnd|¡\}|
d|›d|›7}
| |¡t || ¡}| |¡n |d| …}t|ƒ| krÄt d| ›dt|ƒ›d|›¡t |
¡qP|sÖt |
¡qP||j|<||j|<|
d| dkrd| nt|ƒ7}
t |
¡qP|jr4| d| |d¡¡n| d| |d¡¡\|_Wn8tk
r†}
zt t|
ƒ¡WY¢dSd}
~
XYnXdS)Nrœr#rrrZHHQ8séÚHHL4sr-Úunknownztag: ú (ú
) - type: ú)z - unsupported type rr,z Tag Location: z - Data Location: z/Possibly corrupt EXIF data.  Expecting to read r+z. Skipping tag ú
 - value: r4ú<table: %d bytes>)r¦Útellr®r£r§r0Úranger r·r¤r¸rÚgetr¾ÚKeyErrorÚloggerÚdebugÚseekrÚ
_safe_readrCrárâr³r¥rr¨r-rg)rbr.Z    tag_countÚirÁrÃÚcountrÂÚtagnameÚtypnamer«Z    unit_sizerÅrÄÚhereÚoffsetr$r$r(Úload sh
ÿüÿý
 
 
   ÿ
 
 
 
ÿ ÿý
zImageFileDirectory_v2.loadrc Cs"| dt|jƒ¡}g}|t|ƒt|jƒdd}d}t|j ¡ƒD]â\}}|tkr`t|ƒ}|j |¡}t     d|›d|›dt
|ƒ›¡|t j kožt |tƒ}|rô|jdkr´d}    nd    }    t|    |d
}
|j|} |  ¡D]\} } | |
| <qÖ|
 |¡}n*t |tƒr|n|f} |j||f| žŽ}t  ||j¡j}|r8d n
t |d ¡}d |›d|›d|›d|›d    }|dt|ƒdkr€dt|ƒnt| ƒ7}t     |¡|r¢d}n(|t jt jt jfkrÂt|ƒ}nt| ƒ}t|ƒdkrö| |||| dd¡df¡qF| |||| d|¡|f¡|t|ƒddd7}qF|dk    rˆ||\}}}}}|rZd}t|ƒ‚| d| d|¡d|¡}|||||f||<|D]T\}}}}}t     |›d|›d|›dt
|ƒ›dt
|ƒ›    ¡|| d||||¡7}qŒ|d7}|D].\}}}}}||7}t|ƒd@rî|d7}qî|S)Nrr-rzTag z, Type: z    , Value: ršsII*sMM*)r¤Úifdr3zsave: r4r5r6r7r/r8rrr­r,rz&multistrip support not yet implementedrrñr2s) rîrCr²ÚsortedrºÚ STRIPOFFSETSr¥r;r=r>rr rÚr`rµr¡r—Útobytesr¿rør·r¤r¸rrgrÞrÝrÖÚappendÚljustÚNotImplementedErrorr§)rbrFÚresultÚentriesZ stripoffsetsrÁrcrÃrärªrHrãZifd_tagZ    ifd_valuerÂrCrDr«rBr$r$r(rKcsj  
 
 
  ÿ
 
 
. zImageFileDirectory_v2.tobytescCsN| ¡dkr&| |j| ddd¡¡| ¡}| |¡}| |¡|t|ƒS)NrZHLé*r#)r9ÚwriterŸrîrKrC)rbr.rFrOr$r$r(Úsave°s  
 
zImageFileDirectory_v2.save)r˜NN)T)T)T)T)T)r)3rr‘r’r“rdr•rJrFr°Úsetterr¦r¶r»r½rÆrÈrÊrÉrçrér§rîr÷rúrÚlistÚmapr rØrÚZ SIGNED_BYTErÙrÛÚFLOATrÜZIFDZLONG8r r rrr!r$r%r&r(r*r0rGrKrSr$r$r$r(r—±sz<
    
  P 
 
 
 
 
 
 
 
 
÷þÿ 
 
 
 
 
 
C
Mr—rñrðrïZwrite_cs~eZdZUdZ‡fdd„Zedd„ƒZedd„ƒZee    d<e
dd    „ƒZ d
d „Z d d „Z dd„Zdd„Zdd„Zdd„Z‡ZS)Ú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
    cstƒj||Žd|_dS)NT)Úsuperrdr©)rbrpÚkwargs©Ú    __class__r$r(rdØszImageFileDirectory_v1.__init__cCs|jSrU)r±rer$r$r(r¬Ür­zImageFileDirectory_v1.<lambda>cCs|jSrU)r³rer$r$r(r¬Ýr­r¥cCs(||jd}|j|_|j|_|j|_|S)a2Returns 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`
 
        rI)rJr³r¥r¨)ÚclsÚoriginalrHr$r$r(Úfrom_v2ãs
zImageFileDirectory_v1.from_v2cCs4t|jd}t|jƒ|_t|jƒ|_t|jƒ|_|S)a2Returns 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`
 
        rI)r—rJrµr³r¥r²)rbrHr$r$r(Úto_v2õs
   zImageFileDirectory_v1.to_v2cCs||jkp||jkSrU)r±r³rÇr$r$r(rÈsz"ImageFileDirectory_v1.__contains__cCstt|jƒt|jƒBƒSrU)rCr¼r³r±rer$r$r(r½    szImageFileDirectory_v1.__len__cCstt|jƒt|jƒBƒSrU)rèr¼r³r±rer$r$r(ré szImageFileDirectory_v1.__iter__cCsdD]}| |||¡qdS©N)FT)rÉ)rbrÁrcr°r$r$r(rÊsz!ImageFileDirectory_v1.__setitem__cCsn||jkrL|j|}|j|}|j|\}}dD]}| |||||ƒ|¡q0|j|}t|ttfƒsj|f}|Sra)r±r³r¥r¾rÉr`r¿rÀ)rbrÁrÂrÃrÄrÅÚlegacyrPr$r$r(rÆs
 
 
 
z!ImageFileDirectory_v1.__getitem__)rr‘r’r“rdr•ÚtagsZtagdatarµÚ__annotations__Ú classmethodr_r`rÈr½rérÊrÆÚ __classcell__r$r$r[r(rXÅs
 
rXcsŠeZdZdZdZdZd‡fdd„    Zdd„Zed    d
„ƒZ    d d „Z
d d„Z dd„Z dd„Z dd„Z‡fdd„Zdd„Zdd„Zdd„Z‡ZS)Ú TiffImageFileZTIFFz
Adobe TIFFFNcsd|_d|_tƒ ||¡dSrU)Útag_v2rÁrYrd)rbr.Úfilenamer[r$r(rd-szTiffImageFile.__init__cCs |j d¡}|ddkr(||j d¡7}t|ƒ|_d|_|jj|_|_d|_|j|_    g|_
d|_ t   d¡t   d|j›¡t   dt|ƒ›¡| d    ¡dS)
z#Open the first image in a TIFF filer#rr›NrLz*** TiffImageFile._open ***z - __first: z- ifh: r)r.r,r—rhrHr¨Z_TiffImageFile__firstÚ_TiffImageFile__nextÚ_TiffImageFile__frameÚ_fpÚ
_frame_posÚ    _n_framesr=r>rÚ_seek)rbrªr$r$r(Ú_open6s  
 
zTiffImageFile._opencCsP|jdkrJ| ¡}| t|jƒ¡|jdkr@| | ¡d¡q"| |¡|jS)Nr)rnr9rorCrmr?)rbÚcurrentr$r$r(Ún_framesQs
 
 
zTiffImageFile.n_framescCs<| |¡sdS| |¡t |j¡tj |j|j¡|_dS)z%Select a given frame as current imageN)    Z _seek_checkrorZ_decompression_bomb_checkrÄÚcoreÚnewÚmodeÚim)rbÚframer$r$r(r?[s
 
 
 zTiffImageFile.seekc CsH|j|_|j ¡t|jƒ|krú|js2d}t|ƒ‚t d|›d|j    ›d|j›d|j ¡›¡|j 
|j¡|j  |j¡t d|j ¡¡|j   |j¡|j j|jkr²d|_n
|j j|_|jdkrÐ|d|_t|jƒdkrê|jdk|_|j    d7_    q|j 
|j|¡|j   |j¡| ¡t |j ¡|_|_||_    | ¡dS)    Nzno more images in TIFF filezSeeking to frame z , on frame z    , __next z , location: zLoading tags, location: %srr)rlr.r9rCrmrjÚEOFErrorr=r>rkr?rLrhrGr¨rnÚ is_animatedZ _reload_exifrXr_rÁrHÚ_setup)rbrwr«r$r$r(rofs6
$ÿ
 
 
 zTiffImageFile._seekcCs|jS)zReturn the current frame number)rkrer$r$r(r9ŒszTiffImageFile.tellcCst|jkr| |jt¡SiS)z™
        Returns a dictionary containing the XMP tags.
        Requires defusedxml to be installed.
 
        :returns: XMP tags in a dictionary.
        )ÚXMPrhZ_getxmprer$r$r(ÚgetxmpszTiffImageFile.getxmpcCs²i}|j d¡}|r®|dd…dkr®t|dd…ƒ}t |ddd¡d}t|d|d|…ƒ}|d|d||…}d    |i||<|t d||d¡dd…}q|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.
        rNrs8BIMr!rrr'rÂ)rhr;Úi16ÚmathÚceilÚi32)rbÚblocksrPÚidÚnrÄrÂr$r$r(Úget_photoshop_blocks™s  $z"TiffImageFile.get_photoshop_blockscs|jr|jr| ¡Stƒ ¡SrU)ÚtileÚuse_load_libtiffÚ _load_libtiffrYrGrer[r$r(rG®s zTiffImageFile.loadcCs |jr^tjjtjjtjjtjjtjjtjjtjj    dœ 
|j¡}|dk    r^|j   |¡|_ |j j |_|jsœd|_|j ¡| ¡}tjD]}||krq‚| |¡q‚dS)N)rrrr r!r"r#T)Ú_tile_orientationrZ    TransposeZFLIP_LEFT_RIGHTZ
ROTATE_180ZFLIP_TOP_BOTTOMZ    TRANSPOSEZ
ROTATE_270Z
TRANSVERSEZ    ROTATE_90r;rvZ    transposerÄÚ_sizeryÚ!_close_exclusive_fp_after_loadingr.r9Zgetexifr ÚTAGS_V2_GROUPSÚget_ifd)rbÚmethodÚexifÚkeyr$r$r(Úload_end³s,ùø    
 
 
zTiffImageFile.load_endc
 
Cstj |¡| ¡t|jƒdks.d}t|ƒ‚|jdd}t|jddƒ}z6t|jdƒojt     
|j  ¡¡}t|jdƒr‚|j  ¡Wntk
rœd}YnX|rª||d<t  |jd    t|ƒ|j¡}z| |j|¡Wn2tk
r}zd
}t|ƒ|‚W5d }~XYnX|jo|j }t|jd ƒrFt d ¡| |j ¡¡\}}    n\|rxt d¡|sh|j d¡| d¡\}}    n*t d¡|j d¡| |j ¡¡\}}    |rÎzt     |¡Wntk
rÌYnXg|_d|_| ¡|rø|j ¡d |_|    dkr
t|    ƒ‚tj |¡S)zWOverload method triggered when we detect a compressed tiff
        Calls out to libtiffrzNot exactly one tilerrÚfilenoÚflushFrÚlibtiffzCouldn't set the imageNÚgetvaluez5have getvalue. just sending in a string from getvaluez3have fileno, calling fileno version of the decoder.sfpfpz+don't have fileno or getvalue. just reading)rrGZ load_preparerCr…r-rUr–r.ÚosÚdupr‘r’Z _getdecoderrur¿Z decoderconfigÚsetimagervràZ _exclusive_fpryr=r>rr”r?r,ÚcloseÚreadonlyr)
rbr«Zextentsrpr.ÚdecoderÚeZ close_self_fprƒÚerrr$r$r(r‡Òsh  
ÿ
 
 
 
 
 
zTiffImageFile._load_libtiffc
Cs:d|jkrd}t|ƒ‚t|j td¡|_|j td¡|_|j td¡}|jdkrVd}|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 td¡}t|ƒdkrJt|ƒt|ƒkrBdkrJnnd}|j td¡}|j td¡}|dkrvd}    n|dkr†d}    nd}    |    t|ƒ7}    t|ƒ}
|j t|jdkrÀ|dkrÀdnd¡} | tkrèt
 d| ¡d}t|ƒ‚| |
kr|d| …}n| |
kr|
dkr|| }t|ƒ| kr6d}t|ƒ‚|jj|||||f} t
  d| ›¡zt| \|_} Wn<t k
r¨}zt
  d¡d}t|ƒ|‚W5d}~XYnXt
  d| ›¡t
  d|j›¡|j|j!d<|j t"d¡}|j t#d¡}|r~|r~|j t$¡}|dkr&||f|j!d <nX|dkrH|d!|d!f|j!d <n6|dkrp||f|j!d <||f|j!d"<n||f|j!d"<d}}}g|_%t&pž|jd#k|_'|j'r€|dkrî| dd…d| dd…} t
  d| ›¡t| \|_} | d$krüd%} d&| kr|  (d&d'¡} d(| kr(|  (d(d'¡} |dkrN|jd)krN|jdkrNd*} | |jd+|jj)f}|j% *d,dd||fd|f¡nXt+|jks˜t,|jkrÂt+|jkrÈ|jt+}|j t-|¡}|jd}n"|jt,}|j t.¡}|j t/¡}|D]Ð}|||kr|t0|ƒd-}nd}| }|jdkr6| |}||    }|t|ƒdf}|j% *|j||t|||ƒt|||ƒf||f¡||}||jdkrîd||}}||jdkrîd}}|d7}qînt
  d.¡d}t|ƒ‚t1|jkrô|jt1|j!d/<|jd0kr(d1d2„|jt2Dƒ}t3 4d3d4 5|¡¡|_6|j d5¡|_7dS)6z-Setup this image object based on current tagsi¼z+Windows Media Photo files not yet supportedrrrr!z*** Summary ***z- compression: z- photometric_interpretation: z- planar_configuration: z- fill_order: z- YCbCr subsampling: z- size: r*r$)rr!r#rr r)rr!z.More samples per pixel than can be decoded: %sz#Invalid value for samples per pixelNzunknown data organizationz format key: z- unsupported formatzunknown pixel modez - raw mode: z - pil mode: Ú compressionrÚdpigR¸…ëQ@Ú
resolutionrr.úI;16Nz;16Bz;16Nz;16Lrr;Fr“r#z- unsupported data organizationÚ icc_profile©r?r@cSsg|]}t|dƒ‘qS©rr)r%rr$r$r(rÑ sz(TiffImageFile._setup.<locals>.<listcomp>úRGB;Lr­i)8rhr-ÚCOMPRESSION_INFOr;Ú COMPRESSIONÚ _compressionÚPLANAR_CONFIGURATIONZ_planar_configurationÚPHOTOMETRIC_INTERPRETATIONÚ    FILLORDERr=r>rÁÚYCBCRSUBSAMPLINGrÍÚ
IMAGEWIDTHÚ IMAGELENGTHr‰rÄÚ SAMPLEFORMATrCrYrXÚ BITSPERSAMPLEÚ EXTRASAMPLESÚSAMPLESPERPIXELÚMAX_SAMPLESPERPIXELÚerrorržrJÚ    OPEN_INFOrur<rÔÚ X_RESOLUTIONÚ Y_RESOLUTIONÚRESOLUTION_UNITr…Ú READ_LIBTIFFr†rÏrFrLrJÚ TILEOFFSETSÚ ROWSPERSTRIPÚ    TILEWIDTHÚ
TILELENGTHÚsumÚ
ICCPROFILEÚCOLORMAPr
rrÿÚpaletterˆ)rbr«ÚphotoZ    fillorderZxsizeZysizeZ sample_formatZ    bps_tupleZ extra_tupleZ    bps_countZbps_actual_countZsamples_per_pixelrÚrawmoder›ZxresZyresZresunitÚxÚyZlayerrÚoffsetsrÚwrFÚstrideZ tile_rawmoderÀr$r$r(rz/s
 
 
 
2
 
 þ
ÿ
ú
 
 
 
 
 
 
 
 ÿþý  
 
   üÿ
  zTiffImageFile._setup)NN)rr‘r’ÚformatÚformat_descriptionrŠrdrpr•rrr?ror9r|r„rGrr‡rzrfr$r$r[r(rg(s     
     &     ]rgr+r,r:r?r@r8r.r2r6r;r=r<rAÚYCbCrrBr9r0r3r7)r+r,r:r?r@r1r.r2r5r;r=r<rArÊrBr9r0r3r7c2 CsD    zt|j\}}}}}}Wn:tk
rT}    zd|j›d}
t|
ƒ|    ‚W5d}    ~    XYnXt|d} |j} |j} z | d}Wn.tk
r¦|j d¡}t    |t
ƒr¢d}YnX|dkr¶d}n|dkrÄd}n |dkrÐd    }t pÚ|dk}d
| t <|j d | t<|j d
| t<d | kr| d }n:d | krJ| d }t    |tƒrNt ¡}| |¡|}ni}t dt|ƒ¡t    |tƒrt| ¡}|D]j}t    |tjƒr¦|tjkr¦| |¡| |<n| |¡| |<z|j|| j|<Wntk
rÞYnXqxt|dƒr4tt t!t"t#t$fD]2}||j%kr|j%|| |<|j%j|| j|<q|  d|j d¡¡}|rV|| t&<t'dft dft!dft dft!dftdft(dft)dft*dft+dff
D] \}}|| kr–| || |<q–|  d¡}|rèd| t<|d | t <|d
| t!<|dkr|| t,<t-|ƒd
krt-|ƒ| t.<|dk    r&|| t/<|d
kr8|| t0<t1| krL|| t1<nŒ|jdkrØ| t1d krØ|jdkrÎ| 2¡}| ¡}t3|j4ƒD]:}t3|j5ƒD](}|||fdkr´d nd|||f<qšqŒ|}n
t6 7|¡}|jd krR|j8 9d!d"¡}g}t-|ƒd#}t3d#ƒD]>}|d$d%„|||||d
…Dƒ7}|d gd&|7}q
|| t:<t-|ƒ|j d |d d'd(}|rÐ|  d)t;¡}|d kr”d
nt<|||j d
ƒ} |dkrÚt<| d'd(d(|j d
ƒ} n
|j d
} | d krèd
} |d kröd
n|| }!|j d
| d
| }"| | t=<|!d*kr2tj>| jt?<|!f|"d
||j d
|!|"d
f| t?<t@t3d |!|"|!ƒƒ| tA<tB |d
¡| tC<|jd+kr¼tDd,tEd-i F¡D]\}#}$|  G|#|$¡q¤tHtItJtKg}%|rðd.| kr*| d.}&t    |&t
ƒr|&d ks|&d/kr d0}
tL|
ƒ‚|dkr"d1}
tL|
ƒ‚|&| tM<t d2¡t d3tN|  F¡ƒ¡d }'t|d4ƒrz| Od ¡tP Q| R¡¡}'WntSjTk
rŽYnXi}(|%tEt?tAtUtVg7}%t,|d i})i}*t|d5ƒrÌ|jW ¡}*tX|diƒ|*–}+t0|+krì|+t0=tY Z|  F¡|+ F¡¡D]Ò\}#}$|#tj[krxtXtj\d6d7ƒs(q|#| jkrD| j|#|(|#<n4t    |$t
t]t^tfƒs^qnt _|#¡j`},|,rx|,|(|#<|#|)kr|#|%krt    |$t^ƒr®|$ ad8d9¡d:|)|#<n"t    |$tbƒrÈt]|$ƒ|)|#<n|$|)|#<qt0|)krt-|)t0ƒd
kr|)t0d |)t0<t d;tN|) F¡ƒ¡|jd<kr&d=}t|) F¡ƒ}-|- c¡|||'||-|(f}.t d|jd>|.| ¡}    |     e|j8d?|j ¡|     ad@¡d
d…\}/}0|'s–| f|0¡|/rpq¤qp|'rÐztP g|'¡Wntk
rÎYnX|/d k    r0dA|/›dB}
t|
ƒ‚n@|%D] }#| |#=qô|  h|¡}1ti j||dd?|j |1||d
ffg¡dC| k    r@| |_kdS)DNzcannot write mode z as TIFFrIrrrrrrrrZtiffinforŽzTiffinfo Keys: %srhr¡Ú descriptionrŸZ x_resolutionZ y_resolutionZresolution_unitZsoftwareÚ    date_timeZartistÚ    copyrightržrr*)r+r,r+éÿr¢r;r¤rcSsg|] }|d‘qSr£r$rËr$r$r(rѲsz_save.<locals>.<listcomp>rr"r#Z
strip_sizerrÊ)rr)rrÎé€rÎrÏrÎÚqualityédzInvalid quality settingz5quality setting only supported for 'jpeg' compressionzSaving using libtiff encoderz    Items: %sr‘rÁZlibtiff_support_custom_tagsFrÎrÏrzConverted items: %s)r0r.r r“r>i@zencoder error z when writing image fileÚ_debug_multipage)lÚ    SAVE_INFOrur<r-r—Ú encoderinfoÚ encoderconfigrÔr;r`rÍÚ WRITE_LIBTIFFr¨rÄr¬r­rÀrZExifrGr=r>rUrXr`r r‹rŒr¥r¯r–r·rµr¶ÚIPTC_NAA_CHUNKÚPHOTOSHOP_CHUNKr{rhr¾ÚIMAGEDESCRIPTIONÚSOFTWAREÚ    DATE_TIMEÚARTISTÚ    COPYRIGHTr¯rCr±r°r®r©Úcopyr:ÚheightÚwidthr    ÚinvertrvZ
getpaletter¿Ú
STRIP_SIZErXrºrÚÚSTRIPBYTECOUNTSr¿rJÚCOMPRESSION_INFO_REVr¦r«ÚREFERENCEBLACKWHITErºÚ
setdefaultr»r¼r¹ÚTILEBYTECOUNTSràÚ JPEGQUALITYrIr?r•r–r‘ÚioÚUnsupportedOperationÚTRANSFERFUNCTIONÚSUBIFDrÁroÚ    itertoolsÚchainZ LIBTIFF_CORErsrargr·rÕrÐrNÚsortZ _getencoderr—rRr˜rSrÚ_saverÒ)2rvr.rirÂrJrÁrÈÚbitsÚextrar›r«rHrÔrÕrr“rÔrŽrZiccr¸ržZ inverted_imZpxrÄrÃZlutZcolormapÚcolorsrArÇZ im_strip_sizeZrows_per_stripZstrip_byte_countsZstrips_per_imagerÁrcZ    blocklistrÐrlÚtypesZattsZ
legacy_ifdZ supplied_tagsrÕrcrÚerrcoderÂrFr$r$r(rð2s°
 
 
 
 
 
 
 
 ú ö
 
 
 
 
 
 
 *
   &" "
 
 
 
  ÿ
ÿ þ 
 
 
 
û      
 
 
 
 
 
 
ÿ
rðc @sôeZdZdddddddddddddg Zdddd    d
d hZd:d d„Zdd„Zdd„Zdd„Zdd„Z    dd„Z
dd„Z e j fdd„Zdd„Zdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zd+d,„Zd-d.„Zd/d0„Zd1d2„Zd3d4„Zd5d6„Zd;d7d8„Zd9S)<ÚAppendingTiffWriterrrrrr#ri riii    FcCsvt|dƒr||_d|_nF||_d|_zt||r2dndƒ|_Wn tk
r\t|dƒ|_YnX|j ¡|_| ¡dS)Nr,FTzw+bzr+b)    r–rfÚclose_fpr¸Úopenr-r9Ú    beginningÚsetup)rbÚfnrtr$r$r(rdqs
 zAppendingTiffWriter.__init__cCsŒ|j |jtj¡d|_d|_|j d¡|_}|s>d|_    dSd|_    |dkrX| 
d¡n |dkrl| 
d¡n d    }t |ƒ‚|  ¡|  ¡dS)
NrrTFrFršrEr™zInvalid TIFF file header)rfr?rùr•ÚSEEK_SETÚwhereToWriteNewIFDOffsetÚoffsetOfNewPager,ÚIIMMÚisFirstÚ    setEndianÚ RuntimeErrorÚskipIFDsÚgoToEnd)rbÚiimmr«r$r$r(rús   zAppendingTiffWriter.setupcCs„|jr
dS|j |j¡|j d¡}|s,dS||jkrBd}t|ƒ‚| ¡}||j7}|j |j¡|     |¡|j |¡| 
¡dS)Nrz1IIMM of new page doesn't match IIMM of first page) rrfr?rþr,rÿrÚreadLongrýÚ    writeLongÚfixIFD)rbrr«Ú
ifd_offsetr$r$r(Úfinalize˜s 
 
 
 zAppendingTiffWriter.finalizecCs| ¡| ¡dSrU)r
rúrer$r$r(ÚnewFrame±szAppendingTiffWriter.newFramecCs|SrUr$rer$r$r(Ú    __enter__¶szAppendingTiffWriter.__enter__cCs|jr| ¡dS)NF)r÷r˜)rbÚexc_typeÚ    exc_valueÚ    tracebackr$r$r(Ú__exit__¹szAppendingTiffWriter.__exit__cCs|j ¡|jSrU)rfr9rþrer$r$r(r9¾szAppendingTiffWriter.tellcCs*|tjkr||j7}|j ||¡| ¡SrU)r•rürþrfr?r9)rbrFÚwhencer$r$r(r?Ás
 
zAppendingTiffWriter.seekcCs^|j dtj¡|j ¡}d|d}d|kr:dkrNnn|j t|ƒ¡|j ¡|_dS)Nrr/)rfr?r•ÚSEEK_ENDr9rRrÀrþ)rbÚposZ    pad_bytesr$r$r(rÈs 
 zAppendingTiffWriter.goToEndcCs.||_|jd|_|jd|_|jd|_dS)Nr,rZHHL)ÚendianÚlongFmtÚshortFmtÚ    tagFormat)rbrr$r$r(rÒs  zAppendingTiffWriter.setEndiancCsP| ¡}|dkr"|j ¡d|_qL|j |¡| ¡}|j |dtj¡qdS)Nrrr-)rrfr9rýr?Ú    readShortr•ÚSEEK_CUR)rbr    Únum_tagsr$r$r(rØs zAppendingTiffWriter.skipIFDscCs |j |¡SrU)rfrRr r$r$r(rRãszAppendingTiffWriter.writecCst |j|j d¡¡\}|S)Nr)rêrërrfr,rr$r$r(ræszAppendingTiffWriter.readShortcCst |j|j d¡¡\}|SrG)rêrërrfr,rr$r$r(rêszAppendingTiffWriter.readLongcCsN|j dtj¡|j t |j|¡¡}|dk    rJ|dkrJd|›d}t|ƒ‚dS)Néþÿÿÿrú wrote only ú bytes but wanted 4©    rfr?r•rrRrêrírr©rbrcZ bytes_writtenr«r$r$r(ÚrewriteLastShortToLongîs
 z*AppendingTiffWriter.rewriteLastShortToLongcCsN|j dtj¡|j t |j|¡¡}|dk    rJ|dkrJd|›d}t|ƒ‚dS)Nrrrú bytes but wanted 2)    rfr?r•rrRrêrírrrr$r$r(ÚrewriteLastShortõs
 z$AppendingTiffWriter.rewriteLastShortcCsN|j dtj¡|j t |j|¡¡}|dk    rJ|dkrJd|›d}t|ƒ‚dS)Néüÿÿÿrrrrrr$r$r(ÚrewriteLastLongüs
 z#AppendingTiffWriter.rewriteLastLongcCs>|j t |j|¡¡}|dk    r:|dkr:d|›d}t|ƒ‚dS)Nrrr!)rfrRrêrírrrr$r$r(Ú
writeShorts zAppendingTiffWriter.writeShortcCs>|j t |j|¡¡}|dk    r:|dkr:d|›d}t|ƒ‚dS)Nrrr)rfrRrêrírrrr$r$r(r    s zAppendingTiffWriter.writeLongcCs| ¡|j ¡dSrU)r
rfr˜rer$r$r(r˜szAppendingTiffWriter.closec Cs| ¡}t|ƒD]ê}t |j|j d¡¡\}}}|j|}||}|dk}|sj| ¡}    |    |j    7}    | 
|    ¡||j kræ|j  ¡}
|r¬|j ||dk|dkd|j |
d¡n0|j |    ¡|j ||dk|dkd|j |
¡d}    }
q|r|j dtj¡qdS)Nr#rr)ÚisShortÚisLong)rr:rêrërrfr,Ú
fieldSizesrrþr$ÚTagsr9Ú
fixOffsetsr?r•r) rbrrArÁZ
field_typerBZ
field_sizeZ
total_sizeÚis_localrFZcur_posr$r$r(rs: 
 
 
 
 
ÿ ÿ 
zAppendingTiffWriter.fixIFDcCs¶|s|sd}t|ƒ‚t|ƒD]”}|r,| ¡n| ¡}||j7}|r–|dkr–|dkr^d}t|ƒ‚| |¡|j dtj    ¡| 
t j ¡|j dtj    ¡q|r¦|  |¡q| |¡qdS)Nz offset is neither short nor longrrznot implementediöÿÿÿr#)rr:rrrþr rfr?r•rr%r rÚr"r$)rbrBr&r'r«rArFr$r$r(r*6s" 
 
  zAppendingTiffWriter.fixOffsetsN)F)FF)rr‘r’r(r)rdrúr
r r rr9rérür?rrrrRrrr r"r$r%rr˜rr*r$r$r$r(röXsJó
 
 #röc     CsÒ|j ¡}|j}t| dg¡ƒ}t|dƒs:|s:t|||ƒS| ¡}z~t    |ƒl}|g|D]Z}||_||_t|dƒsxd}    n|j
}    t |    ƒD]*}
| |
¡|  ¡t|||ƒ|  ¡q†qXW5QRXW5| |¡XdS)NÚ append_imagesrrr)rÔrÞrÕrUr;r–rðr9r?rörrr:rGr ) rvr.rirÔrÕr,Zcur_idxÚtfZimsZnfrrõr$r$r(Ú    _save_allPs(
 
 
 
 r.z.tifz.tiffz
image/tiff)kréríÚloggingr~r•rêráÚcollections.abcrZ    fractionsrZnumbersrrÚrrr    r
r Ú_binaryr r}r r€rrÚ    getLoggerrr=r¸rÖZIFD_LEGACY_APIrâr¢r r¬r­r¯r¦r©rªrÙrJr±rºrãrµr¶r¨r·rërÚrÛrÜZ    PREDICTORr¿r»r¼r¹rçrìr°r®Z
JPEGTABLESr«rårÝr×rØr¾ZEXIFIFDr{rèZIMAGEJ_META_DATA_BYTE_COUNTSZIMAGEJ_META_DATAr¥rºrär´rYr²rHrKrTr[r¾rørNr—rõr¸rÏÚsetattrrXZImageFileDirectoryrgrÓrðrör.Z register_openrÈZ register_saveZregister_save_allZregister_extensionsZ register_mimer$r$r$r(Ú<module>)sæ      
î‹xú
 \wë(y