
    fh٤                    ,   S SK Jr  S SKrS SKrS SKrS SKrS SKJr  S SKJ	r	  S SK
JrJrJrJrJrJr  SSKJrJrJrJrJrJrJr  SSKJr  SS	KJr  SS
KJr  SSKJ r   Sr!\!(       a  SSKJ"r"  SSK#J$r$   " S S\5      r%\%RL                  r'S.S jr( " S S\R(                  5      r)SSSS.r*S/S jr+\\,\-\.\/   \R.                  4   r0        S0S jr1        S1S jr2      S2S jr3 " S S\5      r4        S3S jr5S4S jr6 S5         S6S jjr7S7S  jr8          S8S! jr9S4S" jr:Sr;S9S# jr<S:S$ jr=S;S% jr>S<S& jr?      S=S' jr@S>S( jrA          S?S) jrB S@       SAS* jjrC SB       SCS+ jjrD\R                  " \)R                  \)\(5        \R                  " \)R                  \75        \R                  " \)R                  \65        \R                  " \)R                  S,5        \R                  " \)R                  S-5        g)D    )annotationsN)IntEnum)cached_property)IOAnyLiteral
NamedTupleUnioncast   )Image
ImageChops	ImageFile	ImageMathImageOpsImagePaletteImageSequence)i16le)o8)o16le)DeferredErrorF)_imaging)Bufferc                  $    \ rS rSrSrSrSrSrSrg)LoadingStrategy8   z.. versionadded:: 9.1.0r   r       N)	__name__
__module____qualname____firstlineno____doc__RGB_AFTER_FIRST RGB_AFTER_DIFFERENT_PALETTE_ONLY
RGB_ALWAYS__static_attributes__r       J/var/www/auris/envauris/lib/python3.13/site-packages/PIL/GifImagePlugin.pyr   r   8   s    !O'($Jr(   r   c                $    U R                  S5      $ )N)s   GIF87as   GIF89a)
startswith)prefixs    r)   _acceptr-   G   s    344r(   c                     ^  \ rS rSrSrSrSrSrSS jrSS jr	SS jr
\SS	 j5       r\SS
 j5       rSS jrSSS jjrSU 4S jjrSS jrSS jrSrU =r$ )GifImageFileP   GIFzCompuserve GIFFNc                    U R                   R                  S5      nU(       a(  US   (       a  U R                   R                  US   5      $ g )Nr   r   )fpread)selfss     r)   dataGifImageFile.dataW   s6    GGLLO177<<!%%r(   c                    [        S[        U5      S5       H,  nUS-  X   s=:X  a  XS-      s=:X  a  XS-      :X  a  M(     g    g   g)Nr      r   r   TF)rangelen)r5   pis      r)   _is_palette_neededGifImageFile._is_palette_needed]   sM    q#a&!$AFad:aAh:!E(: ; % r(   c                f   U R                   R                  S5      n[        U5      (       d  Sn[        U5      eUS S U R                  S'   [        US5      [        US5      4U l        US   nUS-  S-   nUS	-  (       ak  US
   U R                  S'   U R                   R                  SU-  5      nU R                  U5      (       a%  [        R                  " SU5      nU=U l
        U l        U R                   U l        U R                   R                  5       U l        S U l        U R!                  S5        g )N   znot a GIF file   version   
      r         
backgroundr:   RGBr   )r3   r4   r-   SyntaxErrorinfoi16_sizer?   r   rawglobal_palettepalette_fptell_GifImageFile__rewind	_n_frames_seek)r5   r6   msgflagsbitsr=   s         r)   _openGifImageFile._openc   s    GGLLqzz"Cc"" !u		)AYAq	)
"	Q3;&'eDIIl#Q$Y'A&&q)) $$UA.566#dl77%)

1r(   c                   U R                   c7  U R                  5       n  U R                  U R                  5       S-   S5        M%  U R                   $ ! [         a    U R                  5       S-   U l          Of = fU R	                  U5        NF)Nr   FrV   rT   rW   EOFErrorseek)r5   currents     r)   n_framesGifImageFile.n_frames}   sv    >>!iikG1JJtyy{Q6 
 ~~  1!%q1IIgs   &A "A65A6c                    U R                   b  U R                   S:g  $ U R                  5       nU(       a  g U R                  SS5        SnU R	                  U5        U$ ! [         a    Sn N!f = f)Nr   TFr^   )r5   ra   is_animateds      r)   re   GifImageFile.is_animated   sn    >>%>>Q&&))+	 JJq% K 			'	  	 K	 s   A A,+A,c                d   U R                  U5      (       d  g XR                  :  a  S U l        U R                  S5        U R                  n[	        U R                  S-   US-   5       H  n U R                  U5        M     g ! [
         a$  nU R                  U5        Sn[        U5      UeS nAff = f)Nr   r   no more images in GIF file)_seek_check_GifImageFile__frame_imrW   r;   r_   r`   )r5   frame
last_frameferX   s         r)   r`   GifImageFile.seek   s    &&<<DHJJqM\\
t||a'3A+

1 4  +		*%2sm*+s   +B
B/B**B/c                h  ^  [        T R                  [        5      (       a  T R                  R                  eUS:X  a_  ST l        S T l        ST l        T R                  R                  T R                  5        ST l	        ST R                  ;   a  T R                  S	 O(T R                  (       a  U(       a  T R                  5         UT R                  S-   :w  a  SU 3n[        U5      eT R                  T l        T R                  (       aY  T R                  R                  T R                  5        T R                  5       (       a   T R                  5       (       a  M  ST l        T R                  R!                  S5      nU(       a  US:X  a  Sn[#        U5      eS n0 nS nS nS n	 U(       d  T R                  R!                  S5      nU(       a  US:X  a  GOUS:X  Ga  T R                  R!                  S5      nT R                  5       n
US   S	:X  aB  U
b?  U
S   nUS-  (       a  U
S
   n[%        U
S5      S-  US'   SU-  nUS-	  nU(       a  UT l	        OUS   S:X  aE  SnU
(       a  X-  nT R                  5       n
U
(       a  M  SU;   a  US==   SU-   -  ss'   OXS'   S nM  US   S:X  a  US:X  a  U
b}  U
T R                  R'                  5       4US'   U
R)                  S5      (       aH  T R                  5       n
U
(       a1  [+        U
5      S
:  a"  U
S   S:X  a  [%        U
S5      T R                  S'   T R                  5       (       a   T R                  5       (       a  M  GOUS:X  Ga  T R                  R!                  S5      n[%        US5      [%        US5      pU[%        US5      -   U[%        US5      -   nnUT R,                  S   :  d  UT R,                  S   :  a^  U(       aW  [/        UT R,                  S   5      [/        UT R,                  S   5      4T l        [2        R4                  " T R0                  5        XUU4n	US   nUS-  S:g  nUS-  (       aV  US-  S-   nT R                  R!                  S
U-  5      nT R7                  U5      (       a  [8        R:                  " SU5      nOSnT R                  R!                  S5      S   nT R                  R'                  5       T l        OS nGMJ  Uc  S n[#        U5      eUT l        U(       d  g / T l        T R
                  (       a0  T R<                  R?                  T R
                  T R@                  5        Ub  UOT RB                  T l"        UT l#        US:X  a  T RD                  (       a-  [H        [J        RL                  :X  a  Ub  S!OST l'        OS"T l'        OS#T l'        U(       a	  UT l(        GO-T RB                  (       a  SS$K)J)n  U" T RB                  5      T l(        OS T l(        OT RT                  S":X  a  [H        [J        RV                  :w  d  U(       a  S%T R                  ;   aw  T R<                  RY                  T R                  S%   S5        T R<                  R[                  S![2        R\                  R^                  5      T l        S!T l'        T R                  S%	 O@ST l'        T R<                  R[                  S[2        R\                  R^                  5      T l        S,U 4S& jjnS T l        U	T l         T R@                  (       Ga  T R                  S:  Ga   T R                  S:X  a  T R@                  u  pnnUU-
  UU-
  4n[2        R4                  " U5        S"nT R                  Ra                  S%U5      nUb  T RT                  S';   a  S!nU" U5      S(-   nO6T R                  Ra                  S)S5      nT RT                  S';   a
  SnU" U5      n[2        Rb                  Re                  UUU5      T l        OT Rf                  b,  T Ri                  T R<                  T R@                  5      T l        OzUbw  T R@                  u  pnnUU-
  UU-
  4n[2        R4                  " U5        S"nUnT RT                  S';   a  S!nU" U5      S(-   n[2        Rb                  Re                  UUU5      T l        Ubu  SnUb@  US:X  a(  [H        [J        RL                  :w  a  UT R                  S%'   OT RT                  S';  a  Un[l        Rn                  " S*WWWW4T R                  WUU45      /T l        URa                  S5      (       a  US   T R                  S'   S+ H<  nUU;   a  UU   T R                  U'   M  UT R                  ;   d  M/  T R                  U	 M>     g ! [j         a     Nf = f)-Nr   commentr   zcannot seek to frame    ;rh      !   r:   rF   duration   r      r(      
   	extension   NETSCAPE2.0loop   ,	      rC   rE   @   rH   rG   rK   Fzimage not found in GIF frameRGBAPL)copytransparencyc           	       > TR                   (       av  U S-  S-   [        TR                   R                  5      :  a  Sn [        [        [
        [
        [
        4   [	        TR                   R                  U S-  U S-  S-    5      5      $ X U 4$ )Nr:   r   )_frame_paletter<   rR   r   tupleint)colorr5   s    r)   _rgb GifImageFile._seek.<locals>._rgb]  s    ""19q=3t':':'B'B#CCE#sC-($--55eai%!)a-PQ 
 e,,r(   rK   r   )r   rJ   gif)rw   r|   )r   r   returnztuple[int, int, int])8
isinstancerS   r   ex_GifImageFile__offsetdisposerj   r`   rU   disposal_methodrM   tileload
ValueErrorr3   r7   r4   r_   rN   rT   r+   r<   sizemaxrO   r   _decompression_bomb_checkr?   r   rP   impastedispose_extentrQ   r   _frame_transparencyLOADING_STRATEGYr   r&   _moderR   r   moder%   putpalettealphaconvertDitherFLOYDSTEINBERGgetcorefillrk   _cropAttributeErrorr   _Tile)r5   rl   update_imagerX   r6   rR   rM   frame_transparency	interlaceframe_dispose_extentblockrY   dispose_bitsrs   x0y0x1y1rZ   r=   r   r   dispose_sizedispose_moder   r   ks   `                          r)   rW   GifImageFile._seek   s1   dhh..((++A:DM8<DLDLHHMM$--(#$D DII%IIi( yy\		DLL1$$)%1CS/!((==GGLL'))++ ))++DMGGLLOAI.C3-EI!!	#GGLLOT	d GGLLO		Q43;5#4 "!HEqy-21X*'*5!}r'9D$ $.#5L#/1#4L#
 0<,qTS[ "G  ( $		  % !D(Y57?:*1YAqTS[UaZE4E ).tww||~(=D%''77 $		 SZ1_qQ03E1DIIf-iikk iikk d GGLLO QC1IBc!Qic!QiB1%diil):!$R1!6B		!8M!MDJ33DJJ?')r2~$!"RZA-	3;!AI?DQ$Y/A..q11"."2"25!"<"' ww||Aq) $As v 0C3-	<<GGMM$,,(;(;<)0)<g$BUBU#5 A:""#'A'AA+=+IuDJ!$DJ 
&$$%#D$7$78#yyC$(X(XX%2//		.0I1M"&''//&%,,:U:U"V%+
 IIn5%*
"&''//%9T9T"U		- @T4#7#71#<*''1, &*%8%8NBB$&GR"W#5L33LA $'L IIMM.:LME(997+1L$(K$$6E $		lA >997+0L$(KE#(::??<u#UDL xx+'+zz$''4;N;N'O+7)-)<)<B(*Rb'977E'* 2997+1L$();$<t$CE',zz(,(  L!-A:'?+E+EE4F		.1YYo5#5LR$MM9l3	DI 88I#'	?DIIi *ADy#Aw		!diiIIaL	 +- " s    2Cf$ 8f$ A:f$ $
f10f1c                p  > U R                   (       a  SOSnS U l        U R                  S:X  aG  U R                  b9  [        R
                  R                  XR                  U R                  5      U l        OU R                  S;   a  U R                  U l        U R                   (       ay  [        R
                  R                  SU R                  U R                  =(       d    S5      U l        U R                  R                  " S/U R                   R                  5       Q76   OS U l        U R                  (       d  U R                  b  U R                  U R                  R                  :w  a  [        R
                  R                  U R                  R                  U R                  5      nU R                   (       a+  UR                  " S/U R                   R                  5       Q76   UR                  U R                  SU R                  R                  -   5        X l        Xl        S U l         [        TU ]A  5         g )Nr   r   r   r   rK   r   r   )r   _prev_imrj   r   r   r   r   r   r   r   
putpalettegetdatark   r   r   superload_prepare)r5   	temp_modeexpanded_im	__class__s      r)   r   GifImageFile.load_prepare  sx   ..CC	<<1''3**//yy$*B*B YY/) GGDM""**//#tyy$:R:R:WVWX""5I4+>+>+F+F+HI}}!5$))tww||:S**//$'',,		BK""&&uMt/B/B/J/J/LMdggv'<=!G
"r(   c                ^   U R                   S:X  a  U R                  S:X  a  [        [        R                  :X  a  U R
                  b.  U R                  R                  U R
                  S5        SU l        OSU l        U R                  R                  U R                  [        R                  R                  5      U l        g U R                  (       d  g U R                  U R                  R                  :w  a  U R
                  b+  [        R                  R!                  SU R                  5      nOf[        R                  R!                  SU R                  5      nUR#                  SSU R                  R%                  5       5        UR                  S5      nUR'                  U R                  SU R                  R                  -   5        Xl        U R                  c   eU R
                  by  U R                  S:X  a'  U R                  R)                  SU R
                  5      nO]U R                  R                  U R
                  S5        U R                  R                  S5      nOU R                  R                  S5      nU R*                  c   eU R-                  X R*                  5      nU R                  U l        U R                  R                  U l        UR                  S;   a'  U R                  R'                  X R*                  U5        g U R                  R'                  X R*                  5        g )	Nr   r   r   rK   r   r   LA)r   r   )rj   r   r   r   r&   r   r   r   r   r   r   r   r   r   r   r   r   r   
getpaletter   convert_transparentr   r   )r5   r   frame_ims      r)   load_endGifImageFile.load_end  s2   <<1yyC$48R8R$R++7GG++D,D,DaH!'DJ!&DJ''//$))U\\5P5PQ}}99***''3#jjoofdii@#jjooc499=&&ueTWW5G5G5IJ)11%8dmmVdmm6H6H-HI'M==,,,##/yyC7766tT=U=UV''(@(@!D77??62wwu-H""...::h(;(;<--WW\\
==N*GGMM($7$7BGGMM($7$78r(   c                    U R                   $ N)rj   )r5   s    r)   rT   GifImageFile.tell  s    ||r(   )__frame__offset__rewindrS   r   r   rk   r   rV   r   rO   r   r   r   r3   rQ   r   rR   r   )r   zbytes | None)r=   bytesr   bool)r   None)r   r   )r   r   )rl   r   r   r   )T)rl   r   r   r   r   r   )r   r    r!   r"   formatformat_description!_close_exclusive_fp_after_loadingrQ   r7   r?   r[   propertyrb   r   re   r`   rW   r   r   rT   r'   __classcell__)r   s   @r)   r/   r/   P   sq    F)(-%N4 	 	  "+ C!J6(9T r(   r/   r   r   )1r   r   c                   U R                   [        ;   a  U R                  5         U $ [        R                  " U R                   5      S:X  a  U R                  S[        R                  R                  S9n U R                  c   eU R                  R                   S:X  aO  U R                  R                   H5  nUS   S:X  d  M  U R                  R                  U   U R                  S'     U $    U $ U R                  S5      $ )	z
Takes an image (or frame), returns an image in a mode that is appropriate
for saving in a Gif.

It may return the original image, or it may return an image converted to
palette or 'L' mode.

:param im: Image object
:returns: Image object
rK   r   rR   r   r:   r   r   r   )r   RAWMODEr   r   getmodebaser   PaletteADAPTIVErR   colorsrM   )r   rgbas     r)   _normalize_moder      s     
ww'
		!U*ZZU]]%;%;Z<zz%%%::??f$

))7a<.0jj.?.?.EBGGN+		 * 	::c?r(   c                   SnU(       ab  [        U[        [        [        45      (       a  [        USS 5      n[        U[        R                  5      (       a  [        UR
                  5      nU R                  S:X  a)  U(       d!  U R                  S5      nUc   e[        U5      nO<U(       d  [        S [        S5       5       5      n[        R                  " SUS9U l        Uc   eU(       a  / nU R
                  c   e[        S[        U5      S5       HP  n[        X6US-    5      nU R
                  R                  R                  U5      nX;   a  SnUR                  U5        MR     [        U5       H1  u  phUb  M
  [        [        U5      5       H  n	X;  d  M
  XU'     M/     M3     / n
U H  nUc   eU
R                  U5        M     U R                  U
5      n OA[!        X5      nUb3  U R                  X5      n S	U;   a   UR#                  US	   5      US	'   U $ U $ U R
                  c   eX0R
                  l        U $ ! [$         a    US		  U $ f = f)
aP  
Normalizes the palette for image.
  - Sets the palette to the incoming palette, if provided.
  - Ensures that there's a palette for L mode images
  - Optimizes the palette if necessary/desired.

:param im: Image object
:param palette: bytes object containing the source palette, or ....
:param info: encoderinfo
:returns: Image object
Ni   r   c              3  *   #    U  H	  oS -  v   M     g7f)r:   Nr   ).0r>   s     r)   	<genexpr>%_normalize_palette.<locals>.<genexpr>:  s     &Bz!Avzs   rK   r   r   r:   r   )r   r   	bytearraylistr   rR   r   r   r;   r<   r   r   r   append	enumerateremap_palette_get_optimizeindexr   )r   rR   rM   source_palette
im_paletteused_palette_colorsr>   source_colorr   jdest_mapoptimized_palette_colorss               r)   _normalize_paletter     s@    Ngy$788&wt}5Ng|8899&w7N	ww#~t,J)))&z2N&&BuSz&BBN!..unM
%%%02zz%%%q#n-q1A AE!:;LJJ%%)),7E+&&u- 2 ""56HA}s#678A312A. 9 7 !(E$$$OOE" ) h'#0#: #/!!":KB%-+C+I+I^,,D(
 I2I::!!!'JJI " -^,I-s   H= =IIc                r   [        U 5      nUR                  R                  5        H7  u  pE[        U[        5      (       d  M  U R
                  R                  XE5        M9     [        X2U R
                  5      n[        X0R
                  5       H  nUR                  U5        M     Sn[        U 5      (       a  US-  n[        XSU5        S[        U 5      4Ul        [        R                  " X1[        R                  " SSU R                   -   S["        UR$                     5      /5        UR                  S5        g )Nr   r   r   rE   r       )r   rM   itemsr   strencoderinfo
setdefaultr   _get_global_headerwriteget_interlace_write_local_headerencoderconfigr   _saver   r   r   r   )r   r3   rR   im_outr   vr6   rY   s           r)   _write_single_framer  d  s    
 R F!!#aNN%%a+ $  @F7
 8 ER
.}R01FOOY__UFRWW,<aAUVW HHUOr(   c                8   X4 Vs/ s H4  o"R                   (       a  [        UR                   R                   5      OSPM6     nnUS   US   :w  a"  UR                  S5      nU R                  S5      n [        R                  " X5      nXDR                  SS94$ s  snf )Nr(   r   r   r   F)
alpha_only)rR   r   r   r   subtract_modulogetbbox)base_imim_framer   palette_bytesdeltas        r)   _getbboxr    s     ELCVCVRZZbjj  !S8CV   Q=++##F+//&)&&x9E--5-111s   ;Bc                  4    \ rS rSr% S\S'   S\S'   S\S'   Srg	)
_Framei  Image.Imager   z tuple[int, int, int, int] | Nonebboxdict[str, Any]r   r   N)r   r    r!   r"   __annotations__r'   r   r(   r)   r  r    s    O
**r(   r  c           
        U R                   R                  S5      nU R                   R                  SU R                  R                  S5      5      n/ nS nSnS n[        R                  " U /U R                   R                  S/ 5      5       GH3  n	[
        R                  " U	5       GH  n
[        U
R                  5       5      n
US:X  a]  U
R                  R                  5        H?  u  pUS:X  a  M  [        U[        5      (       d  M$  U R                   R                  X5        MA     U R                   R                  5       nSU
R                  ;   a  UR                  SU
R                  S   5        [        XU5      n
[        U[        [        45      (       a  X7   US'   O%Uc"  SU
R                  ;   a  U
R                  S   US'   [        U[        [        45      (       a  XG   US'   US-  nS nU(       Ga  U(       Ga  [!        Xj5      u  nnU(       d6  UR                  S5      (       a  US   R                   S==   US   -  ss'   GM  US   R                   R                  S5      S:X  a  U R                   R                  SU R                  R                  S5      5      nUb{  Uch  [#        U
U5      n[$        R&                  " S	U
R(                  U5      nUS   R*                  R,                  nUc   eUR/                  UUR0                  5        [!        X5      S   nGOwS
U
R(                  -   nGOfUR                  S5      (       GaL  U
R0                  S:w  Ga;  SU;  a.  U
R,                  c   e U
R,                  R3                  U
5      US'   SU;   Ga   U
R                  5       n[$        R&                  " S	UR(                  US   5      nUR0                  S:X  a/  UR7                  5       u  nnnn[8        R:                  " S UUUUS9nOhUR0                  S	:X  aB  [$        R&                  " SUR(                  5      nUR=                  UR?                  5       5        Un[8        R:                  " S US9nURA                  U[B        RD                  " U5      S9  OS nU
nURG                  [I        U=(       d    U
UU5      5        GM     GM6     [K        U5      S:X  a0  SU R                   ;   a  US   R                   S   U R                   S'   gU H  nUR*                  n
URL                  (       d1  [O        U
UR                   5       H  nURQ                  U5        M     S
nO]U(       d  SUR                   S'   URL                  S
U
R(                  -   :w  a  U
RS                  URL                  5      n
URL                  S S n[U        XUUR                   5        M     g! [4         a     GNSf = f)Nrw   disposalr   append_imagesr   r   rr   r   r   r   optimizer   r   c                t    U S   " U S   " U S   " U S   " U S   U S   5      U S   5      U S   5      S-  S5      $ )	Nr   r   rgbar{   r   r   argss    r)   <lambda>(_write_multiple_frames.<locals>.<lambda>  sZ    T)_$(K(,U,0KS	49,MtTWy)* )-S		%& '*%* %(	."r(   )r  r  r  r   r   c                &    U S   " U S   S-  S5      $ )Nr   r   r{   r   r   r!  s    r)   r#  r$    s    T)_T$Z#=Ms-Sr(   )r   )maskFTinclude_color_table)+r   r   rM   	itertoolschainr   Iteratorr   r   r   r   r   r   r   r   r   r  _get_backgroundr   newr   r   rR   r   r   _new_color_indexr   splitr   lambda_evalputdatar   r   r   invertr   r  r<   r  r   r  crop_write_frame_data)r   r3   rR   rw   r  	im_framesprevious_imframe_countbackground_im
imSequencer  r   r  r   
diff_framer  r  r   rJ   first_paletter   r  r  r  r   r&  delta_l
frame_datar6   offsets                                 r)   _write_multiple_framesr>    s    ~~!!*-H~~!!*bggkk*.EFH I&*KKMoordBNN,>,>PR,ST
%..z:H&x}}7Ha$MM//1DAN* !!S))11!7	 2 ..--/K.&&~x}}^7TU)([IH(T5M22*2*?J'!jHMM&A*2--
*CJ'(T5M22*2*?J'1KJ[&{=t"z22!"11*=ZAXX=R=,,00<A NN..&N(CE ((0)85)IJ,1IIc8==*,UM,5aLOO,C,CM#0#<<#<)44]MDVDVW'@C%5 __Z00X]]c5I%[8'//;;;! ( 0 0 A A( K (7
 &4%-]]_
$yyejj+n:UV ::/).JAq!Q#,#8#8	!" #$"#"#"#$D"  %zzS0*/))C*D ' @(/#,#8#8 S#($D #((HOOD4I(J"KVJ$:(D+NOy ; U~ 9~')21)A)A*)MBNN:&
=='*2H2HI JF @D
&&'<=&8=="88#==9__Ra(F"
0F0FG    }  * ! !s   *W
WWc                    [        XUSS9  g )NT)save_all)r  )r   r3   filenames      r)   	_save_allrB    s    	"(T*r(   c                   SU R                   ;   d  SU R                  ;   a6  U R                   R                  SU R                  R                  S5      5      nOS nU R                   R                  SS5        U(       a  [	        XU5      (       d  [        XU5        UR                  S5        [        US5      (       a  UR                  5         g g )NrR   r  Trt   flush)	r   rM   r   r   r>  r  r  hasattrrD  )r   r3   rA  r@  rR   s        r)   r  r    s     BNN"i277&:..$$YI0FG
!!*d31"'BBBG,HHTNr7

 r(   c                t    U R                   R                  SS5      n[        U R                  5      S:  a  SnU$ )Nr   r      r   )r   r   minr   )r   r   s     r)   r  r  ,  s5    "";2I 277|b	r(   c                    UR                   S   nSUR                   ;   a  [        UR                   S   S-  5      nOSn[        UR                   R                  SS5      5      nUc  US:w  d  U(       ap  Ub  SOSnXvS-  -  nU R	                  S[        S	5      -   [        S
5      -   [        U5      -   [        U5      -   [        U=(       d    S5      -   [        S5      -   5        UR                   R                  S5      nU(       a&  [        U5      n	[        U	5      n
U
(       a	  US-  nX:-  nU R	                  S[        US   5      -   [        US   5      -   [        UR                  S   5      -   [        UR                  S   5      -   [        U5      -   5        U(       a!  W
(       a  U R	                  [        W	5      5        U R	                  [        S5      5        g ! [         a    S n GNf = f)Nr   rw   rF   r   r  r   r   ru   rv   r   r'  rH   r   rE   )r   KeyErrorr   r   r  r   o16_get_palette_bytes_get_color_table_sizer   _get_header_palette)r3   r   r=  rY   r   rw   r  packed_flagr'  r  color_table_sizes              r)   r  r  6  s   ~~n5 R^^#r~~j1B672>>%%j!45H8q=H'3a1}$
ge o (m	
 "#$ e	
 ..,,-BC*2.0?CKE,EHH
fQi.	
fQi.	 bggaj/	 bggaj/		
 U)	 /
$]34HHRUOU  s   G G,+G,c                ^   U R                  5       n [        US5       nU R                  S:w  a'  [        R                  " SU/U[        R
                  S9  OSSU/nS/n[        R                  " U[        R                  [        R
                  S9n[        R                  " UUR                  U[        R
                  S9nUR                  c   eUR                  R                  5         UR                  5       n	U	(       a  [        R                  " X5      eUR                  5       n	U	(       a  [        R                  " X5      eS S S 5         [        R                  " U5        g ! , (       d  f       N&= f! [         a     g f = f!  [        R                  " U5        f ! [         a     f f = f= f)NwbrK   ppmtogif)stdoutstderrppmquant256)stdinrT  rU  )_dumpopenr   
subprocess
check_callDEVNULLPopenPIPErT  closewaitCalledProcessErrorosunlinkOSError)
r   r3   rA  tempfilern   	quant_cmd	togif_cmd
quant_proc
togif_procretcodes
             r)   _save_netpbmrl  h  sj    xxzH$(D!Qww%%%*1Z=O=O (9	'L	'--jooj>P>P
 (--$++%--	
 "((444!!'')$//+$77KK$//+$77KK= "@	IIhC "!D  			IIh 		sY   F D$E"F E3 "
E0,F 3
F ?F F,FF,
F)&F,(F))F,c                   U R                   S;   GaG  U(       Ga?  UR                  S5      (       Ga(  [        =(       d    U R                   S:H  nU(       d  U R                  U R                  -  S:  a  / n[        U R                  5       5       H  u  pEU(       d  M  UR                  U5        M!     U(       d  [        U5      [        U5      :  a  U$ U R                  c   e[        U R                  R                  5      [        R                  " U R                  R                   5      -  nSUS-
  R                  5       -  n[        U5      US-  ::  a  US:  a  U$ g)a0  
Palette optimization is a potentially expensive operation.

This function determines if the palette should be optimized using
some heuristics, then returns the list of palette entries in use.

:param im: Image object
:param info: encoderinfo
:returns: list of indexes of palette entries in use, or None
)r   r   r  r   i   Nr   r   )r   r   _FORCE_OPTIMIZEwidthheightr   	histogramr   r   r<   rR   r   getmodebands
bit_length)r   rM   optimiser   r>   countnum_palette_colorscurrent_palette_sizes           r)   r   r     s    
ww*$((:*>*> #4bggnrxx"))+i7"$%blln55'..q1 6 323s;N7OO**::)))!$RZZ%7%7!8E<N<N

= " $%);a)?(K(K(M#M  '(,@A,EE(1,**r(   c                    U (       d  g[        U 5      S:  a  g[        R                  " [        R                  " [        U 5      S-  S5      5      S-
  $ )Nr   r   r   r:   r   )r<   mathceillog)r  s    r)   rM  rM    sA    	]	a	yy#m"4"91=>BBr(   c                x    [        U 5      nSU-  [        U 5      S-  -
  nUS:  a  U [        S5      S-  U-  -  n U $ )z
Returns the palette, null padded to the next power of 2 (*3) bytes
suitable for direct inclusion in the GIF header

:param palette_bytes: Unpadded palette bytes, in RGBRGB form
:returns: Null padded palette
r   r:   r   )rM  r<   r   )r  rP  actual_target_size_diffs      r)   rN  rN    sR     -];  !$44M8Ja8OO"A%<<<r(   c                   ^ U R                   (       d  g[        U R                   R                   5      mU R                   R                  S:X  a0  SR                  U4S j[	        [        T5      S-  5       5       5      mT$ )z
Gets the palette for inclusion in the gif header

:param im: Image object
:returns: Bytes, len<=768 suitable for inclusion in gif header
r(   r   c              3  @   >#    U  H  nTUS -  US -  S-    v   M     g7f)r   r:   Nr   )r   r>   rR   s     r)   r   %_get_palette_bytes.<locals>.<genexpr>  s&     X?W!71q51q5195?Ws   r:   )rR   r   r   joinr;   r<   )r   rR   s    @r)   rL  rL    s[     ::BJJ&&'G	zz& ((XuS\UVEV?WXXNr(   c                    SnU(       aD  [        U[        5      (       a-  U R                  c   e U R                  R                  X5      nU$ UnU$ ! [         a  n[        U5      S;  a  e  S nAU$ S nAff = f)Nr   )z$cannot allocate more than 256 colorsz/cannot add non-opaque RGBA color to RGB palette)r   r   rR   getcolorr   r   )r   info_backgroundrJ   ro   s       r)   r+  r+    s     Jou-- ::)))
ZZ00E
  )J  q6 "   s   A 
A5A00A5c                D   SnU R                   R                  S5      S:X  dK  U(       aF  SU;   d>  UR                  S5      c,  UR                  S5      (       d  UR                  S5      (       a  Sn[        XR                  S5      5      n[        U 5      n[	        U5      nS	U-   [        U R                  S
   5      -   [        U R                  S   5      -   [        US-   5      [        U5      [        S
5      -   [        U5      /nUR                  S5      b_  UR                  S[        S5      -   [        S5      -   S-   [        S5      -   [        S5      -   [        US   5      -   [        S
5      -   5        UR                  S5      (       a  S[        S5      -   nUS   n[        U[        5      (       a  UR                  5       n[        S
[        U5      S5       H$  n	XU	S-    n
U[        [        U
5      5      U
-   -  nM&     U[        S
5      -  nUR                  U5        U$ )z2Return a list of strings representing a GIF headers   87arD   s   89ar   r~   rw   rs   rJ   s   GIFr   r   rH   ru   r{   rI   r}   r:   ry   )rM   r   r+  rL  rM  rK  r   r   rN  r   r   r   encoder;   r<   )r   rM   rD   rJ   r  rP  headercomment_blockrs   r>   subblocks              r)   r   r     s    G	ww{{9'd"xx+xx
##xx	""  XXl%;<J&r*M,]; 	
	
bggaj/	 bggaj/	 	c!"
:AM*F xx#gf  e	
 e $v,  e		
 xx	r#wy/gs##nn&Gq#g,,A1s7+HRH.99M - 	Am$Mr(   c                     X1l         [        XUS5        [        R                  " UU [        R                  " SSUR
                  -   S[        UR                     5      /5        U R                  S5        U? g ! U? f = f)Nr   r   r   r   )	r   r  r   r  r   r   r   r   r  )r3   r  r=  paramss       r)   r3  r3  R  sn    !% 	B&!4__UFX]]$:Awx}}?UVW	
 	 H s   A2A7 7A;c                    Uc  0 n[        X5      nSU;  a"  SU R                  ;   a  U R                  S   US'   [        XU5      nUR                  U l        UR                  U l        [        X5      nXS4$ )a   
Legacy Method to get Gif data from image.

Warning:: May modify image data.

:param im: Image object
:param palette: bytes object containing the source palette, or ....
:param info: encoderinfo
:returns: tuple of(list of header items, optimized palette)

rJ   )r   rM   r   rR   r   r   )r   rR   rM   r   im_modr  s         r)   	getheaderr  m  st     |'14LBGG$;WW\2\T2FBJIIBE)F&&r(   c                    SSK Jn   " S SU5      nU R                  5         U" 5       n[        XPX5        UR                  $ )a  
Legacy Method

Return a list of strings representing this image.
The first string is a local image header, the rest contains
encoded image data.

To specify duration, add the time in milliseconds,
e.g. ``getdata(im_frame, duration=1000)``

:param im: Image object
:param offset: Tuple of (x, y) pixels. Defaults to (0, 0)
:param \**params: e.g. duration or other encoder info parameters
:returns: List of bytes containing GIF encoded frame data

r   )BytesIOc                  "    \ rS rSr/ rSS jrSrg)getdata.<locals>.Collectori  c                N    U R                   R                  U5        [        U5      $ r   )r7   r   r<   )r5   r7   s     r)   r   getdata.<locals>.Collector.write  s    IIT"t9r(   r   N)r7   r   r   r   )r   r    r!   r"   r7   r  r'   r   r(   r)   	Collectorr    s    	r(   r  )ior  r   r3  r7   )r   r=  r  r  r  r3   s         r)   r   r     s8    & G  GGI	Bbf-77Nr(   z.gifz	image/gif)r,   r   r   r   )r   r  r   r  )r   r  rR   _Palette | NonerM   r  r   r  )r   r  r3   	IO[bytes]rR   r  r   r   )r  r  r  r  r   z4tuple[Image.Image, tuple[int, int, int, int] | None])r   r  r3   r  rR   r  r   r   )r   r  r3   r  rA  str | bytesr   r   )F)
r   r  r3   r  rA  r  r@  r   r   r   )r   r  r   r   )
r3   r  r   r  r=  tuple[int, int]rY   r   r   r   )r   r  rM   r  r   zlist[int] | None)r  r   r   r   )r  r   r   r   )r   r  r   r   )r   r  r  z=int | tuple[int, int, int] | tuple[int, int, int, int] | Noner   r   )r   r  rM   r  r   list[bytes])
r3   r  r  r  r=  r  r  r  r   r   )NN)r   r  rR   r  rM   zdict[str, Any] | Noner   z$tuple[list[bytes], list[int] | None])r   )r   r  r=  r  r  r   r   r  )K
__future__r   r(  ry  rc  r[  enumr   	functoolsr   typingr   r   r   r	   r
   r    r   r   r   r   r   r   r   _binaryr   rN   r   r   rK  _utilr   TYPE_CHECKINGr   _typingr   r   r$   r   r-   r/   r   r   r   r   r   r   _Paletter   r  r  r  r>  rB  r  r  r  rl  rn  r   rM  rN  rL  r+  r   r3  r  r   register_openr   register_saveregister_save_allregister_extensionregister_mimer   r(   r)   <module>r     s  4 #   	   % < <   "  !  g  #22 5f9&& fZ #C
(4 	49l.G.GGHDD-D5CDDN  
	8
2
2$/
29
2 Z  "-<	D+
 MR".9EI	&//"/,;/DG/	/d-d -`C$ R 	6;|!!! ! 	!
 
!8 UY''-'<Q')'> 06"","AD""P   L''w ?   L'' /   ++Y 7   ,,f 5   L'' 5r(   