
    (phA                       S SK Jr  S SK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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   \(       a  SSKJ!r!   " S S\5      r"\"RF                  r$S,S jr% " S S\R,                  5      r&SSSS.r'S-S jr(\\)\*\\+   \R2                  4   r,        S.S jr-        S/S jr.      S0S jr/ " S S\5      r0        S1S jr1S2S jr2 S3         S4S jjr3S5S jr4          S6S jr5S2S  jr6Sr7S7S! jr8S8S" jr9S9S# jr:S:S$ jr;      S;S% jr<S<S& jr=          S=S' jr> S>       S?S( jjr? S@       SAS) jjr@\R                  " \&R                  \&\%5        \R                  " \&R                  \35        \R                  " \&R                  \25        \R                  " \&R                  S*5        \R                  " \&R                  S+5        g)B    )annotationsN)IntEnum)cached_property)IOTYPE_CHECKINGAnyListLiteral
NamedTupleUnion   )Image
ImageChops	ImageFile	ImageMathImageOpsImagePaletteImageSequence)i16le)o8)o16le)_imagingc                  $    \ rS rSrSrSrSrSrSrg)LoadingStrategy6   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       E/var/www/html/venv/lib/python3.13/site-packages/PIL/GifImagePlugin.pyr   r   6   s    !O'($Jr'   r   c                    U S S S;   $ )N   )s   GIF87as   GIF89ar   )prefixs    r(   _acceptr,   E   s    "1:///r'   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$ )GifImageFileN   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.dataU   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)r4   pis      r(   _is_palette_neededGifImageFile._is_palette_needed[   sM    q#a&!$AFad:aAh:!E(: ; % r'   c                t   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 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 filer*   version   
      r         
backgroundr9   RGBr   )r2   r3   r,   SyntaxErrorinfoi16_sizetiler>   r   rawglobal_palettepalette_fptell_GifImageFile__rewind	_n_frames_seek)r4   r5   msgflagsbitsr<   s         r(   _openGifImageFile._opena   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rU   rS   rV   EOFErrorseek)r4   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]   )r4   r`   is_animateds      r(   rd   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imrV   r:   r^   r_   )r4   frame
last_frameferW   s         r(   r_   GifImageFile.seek   s    &&<<DGJJqM\\
t||a'3A+

1 4  +		*%2sm*+s   +B
B/B**B/c                  ^  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au  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  ay  US:X  as  U
bp  U
T R                  R!                  5       4US'   U
S S S:X  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        [*        R,                  " T R(                  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 R/                  U5      (       a  [0        R2                  " SU5      nOS nT R                  R                  S5      S   nT R                  R!                  5       T l         OS nGM=  Uc  S!n[        U5      eUT l        U(       d  g / T l        T R                  (       a0  T R4                  R7                  T R                  T R8                  5        Ub  UOT R:                  T l        UT l        US:X  a}  T R<                  (       a-  [@        [B        RD                  :X  a  Ub  S"OST l#        OS#T l#        OS$T l#        U(       d)  T R:                  (       a  SS%K$J$n  U" T R:                  5      nUT l%        OT RL                  S#:X  a  [@        [B        RN                  :w  d  U(       a  S T l(        S&T R                  ;   aw  T R4                  RS                  T R                  S&   S5        T R4                  RU                  S"[*        RV                  RX                  5      T l        S"T l#        T R                  S&	 O@ST l#        T R4                  RU                  S[*        RV                  RX                  5      T l        S-U 4S' jjnS T l        U	T l        T R8                  (       Ga  T R                  S:  Ga   T R                  S:X  a  T R8                  u  pnnUU-
  UU-
  4n[*        R,                  " U5        S#nT R                  R[                  S&U5      nUb  T RL                  S(;   a  S"nU" U5      S)-   nO6T R                  R[                  S*S5      nT RL                  S(;   a
  SnU" U5      n[*        R\                  R_                  UUU5      T l        OT R4                  b,  T Ra                  T R4                  T R8                  5      T l        OzUbw  T R8                  u  pnnUU-
  UU-
  4n[*        R,                  " U5        S#nUnT RL                  S(;   a  S"nU" U5      S)-   n[*        R\                  R_                  UUU5      T l        Ubb  SnUb@  US:X  a(  [@        [B        RD                  :w  a  UT R                  S&'   OT RL                  S(;  a  UnS+WWWW4T R                   WUU44/T l        UR[                  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 ! [b         a     Nf = f).Nr   commentr   zcannot seek to frame    ;rg      !   r9   rD   duration   r      r'      
   	extensionrG      NETSCAPE2.0loop   ,	      r*   rC   @   rF   rE   rI   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 [        TR                   R                  U S-  U S-  S-    5      $ X U 4$ )Nr9   r   )_frame_paletter;   rQ   tuple)colorr4   s    r(   _rgb GifImageFile._seek.<locals>._rgbX  sh    ""19q=3t':':'B'B#CCET0088UQYQR]STTe,,r'   rI   r   )r   rH   gif)rv   r{   )r   intreturnztuple[int, int, int])2_GifImageFile__offsetdisposeri   rR   r_   rT   disposal_methodrK   rN   load
ValueErrorr2   r6   r3   r^   rL   rS   r;   sizemaxrM   r   _decompression_bomb_checkr>   r   rO   rj   pastedispose_extentrP   r   _frame_transparencyLOADING_STRATEGYr   r%   _moder   rQ   moder$   pyaccessputpalettealphaconvertDitherFLOYDSTEINBERGgetcorefill_cropAttributeError)r4   rk   update_imagerW   r5   rQ   rK   frame_transparency	interlaceframe_dispose_extentblockrX   dispose_bitsrr   x0y0x1y1rY   r<   r   r   dispose_sizedispose_moder   r   ks   `                          r(   rV   GifImageFile._seek   s   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%Sbz^3 $		 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 
t22%t223"DLyyC$(X(XX$(DM%2//		.0I1M"&''//&%,,:U:U"V%+
 IIn5%*
"&''//%9T9T"U	- 2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 ww*'+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    (Ce 8e =A:e 
eec                  > 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        Xl        S U l         [        TU ]9  5         g )Nr   r   r   r   rI   )r   _prev_imri   r   r   r   r   r   rj   r   
putpalettegetdatar   superload_prepare)r4   	temp_mode	__class__s     r(   r   GifImageFile.load_prepare  s    ..CC	<<1''3**//yy$*B*B YY/) GGDM""**//#tyy$:R:R:WVWX""5I4+>+>+F+F+HI
"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
                  bB  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:X  a'  U R                  R!                  XR                  U5        g U R                  R!                  XR                  5        g )Nr   r   r   rI   )ri   r   r   r   r%   r   rj   r   r   r   r   r   r   r   r   r   r   )r4   frame_ims     r(   load_endGifImageFile.load_end  sQ   <<1yyC$48R8R$R++7GG++D,D,DaH!'DJ!&DJ''//$))U\\5P5PQ}}##/GG##D$<$<a@wwv.Hwwu-H""...::h(;(;<--WW\\
==F"GGMM($7$7BGGMM($7$78r'   c                    U R                   $ N)ri   )r4   s    r(   rS   GifImageFile.tell  s    ||r'   )__frame__offset__rewindrR   r   r   r   rU   r   rM   r   r   r   r2   rP   rj   rQ   r   rN   )r   zbytes | None)r<   bytesr   bool)r   None)r   r   )r   r   )rk   r   r   r   )T)rk   r   r   r   r   r   )r   r   r    r!   formatformat_description!_close_exclusive_fp_after_loadingrP   r6   r>   rZ   propertyra   r   rd   r_   rV   r   r   rS   r&   __classcell__)r   s   @r(   r.   r.   N   sp    F)(-%N6 	 	  "+ |!|(98 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                  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
rI   r   rQ   r   r9   r   r   r   )r   RAWMODEr   r   getmodebaser   PaletteADAPTIVErQ   colorsrK   )rj   rgbas     r(   _normalize_moder     s     
ww'
		!U*ZZU]]%;%;Z<::??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                  R                  S5      SS nO<U(       d  [        S [        S5       5       5      n[        R                  " SUS9U l        U(       a  / nUc   e[        S[        U5      S5       HP  n[        X5US-    5      nU R
                  R                  R                  U5      nXt;   a  SnUR                  U5        MR     [        U5       H1  u  pWUb  M
  [        [        U5      5       H  nX;  d  M
  XU'     M/     M3     U R!                  U5      n OA[#        X5      nUb3  U R!                  XC5      n S	U;   a   UR%                  US	   5      US	'   U $ U $ 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   rI   c              3  *   #    U  H	  oS -  v   M     g7f)r9   Nr   ).0r=   s     r(   	<genexpr>%_normalize_palette.<locals>.<genexpr>  s     &Bz!Avzs   r   r   r9   r   )
isinstancer   	bytearraylistr   rQ   r   rj   
getpaletter:   r;   r   r   r   append	enumerateremap_palette_get_optimizeindexr   )	rj   rQ   rK   source_paletteused_palette_colorsr=   source_colorr   js	            r(   _normalize_paletter     s    Ngy$788&wt}5Ng|8899&w7N	ww#~UU--e4Tc:N&&BuSz&BBN!..unM
  )))q#n-q1A AE!:;LJJ%%)),7E+&&u- 2 ""56HA}s#678A312A. 9 7 12+B5*!!"5FB%-+>+D+D^,,D(
 I2I'JJI " -^,I-s   G; ;HHc           	        [        U 5      nUR                  R                  5        H   u  pEU R                  R	                  XE5        M"     [        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                  " X1SSU R                  -   S[        UR                     4/5        UR                  S5        g )Nr   r   r   r   rC   r       )r   rK   itemsencoderinfo
setdefaultr   _get_global_headerwriteget_interlace_write_local_headerencoderconfigr   _saver   r   r   )rj   r2   rQ   im_outr   vr5   rX   s           r(   _write_single_framer   ?  s    
 R F!!#
!!!' $@F7
 8 ER
.}R01FOOF%"'')91gfkk>R!S TUHHUOr'   c                    [        U5      [        U 5      :w  a"  UR                  S5      nU R                  S5      n [        R                  " X5      nX"R	                  SS94$ )Nr   F)
alpha_only)_get_palette_bytesr   r   subtract_modulogetbbox)base_imim_framedeltas      r(   _getbboxr  X  sY     (#'9''BB##F+//&)&&x9E--5-111r'   c                  4    \ rS rSr% S\S'   S\S'   S\S'   Srg	)
_Frameib  Image.Imagerj   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  b  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H  n	[
        R                  " U	5       GH  n
[        U
R                  5       5      n
US:X  aF  U
R                  R                  5        H(  u  pUS:X  a  M  U R                   R                  X5        M*     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ai  U(       Gaa  [        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c  U R                   R                  SU R                  R                  SS	5      5      n[!        U
U5      n["        R$                  " S
U
R&                  U5      nUR)                  US   R*                  R,                  5        [        X5      S   nGOWUR                  S5      (       Ga=  U
R.                  S:w  Ga,  SU;  a   U
R,                  R1                  U
5      US'   SU;   Ga   U
R                  5       n["        R$                  " S
UR&                  US   5      nUR.                  S:X  a/  UR5                  5       u  nnnn[6        R8                  " S UUUUS9nOhUR.                  S
:X  aB  ["        R$                  " SUR&                  5      nUR;                  UR=                  5       5        Un[6        R8                  " S US9nUR?                  U[@        RB                  " U5      S9  OS nU
nURE                  [G        U=(       d    U
UU5      5        GM     GM     [I        U5      S:X  a0  SU R                   ;   a  US   R                   S   U R                   S'   gU H  nUR*                  n
URJ                  (       d1  [M        U
UR                   5       H  nURO                  U5        M     SnO@U(       d  SUR                   S'   U
RQ                  URJ                  5      n
URJ                  S S n[S        XUUR                   5        M     g! [2         a     GN6f = f)Nrv   disposalr   append_imagesr   r   rq   r   )r   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arz   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   rj   rz   r   r   r  s    r(   r  r    s    T)_T$Z#=Ms-Sr'   rj   )maskFr   Tinclude_color_table)*r   r   rK   	itertoolschainr   Iteratorr   r   r   r   r   r   r   r   r  _get_backgroundr   newr   r   rj   rQ   r   _new_color_indexr   splitr   lambda_evalputdatar   r   r   invertr   r  r;   r
  r   r   crop_write_frame_data)rj   r2   rQ   rv   r  	im_framesprevious_imframe_countbackground_im
imSequencer  r   r   r   
diff_framer  r
  r   rH   r   r  r  r  r  r  delta_l
frame_datar5   offsets                                r(   _write_multiple_framesr3  h  s    ~~!!*-H~~!!*bggkk*.EFH I&*KKMoordBNN,>,>PR,ST
%..z:H&x}}7Ha$MM//1DAN* NN--a3 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$, " 2 2*BGGKK	,R! &5Xu%E
(-		#x}}j(Q%0011H1HI#M<Q?D __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Og ; Ul 9~')21)A)A*)MBNN:&
=='*2H2HI JF @D
&&'<=}}Z__5H__Ra(F"
0F0FG   {  * ! !s   U&&
U43U4c                    [        XUSS9  g )NT)save_all)r   )rj   r2   filenames      r(   	_save_allr7    s    	"(T*r'   Fc                   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 )NrQ   r  Trs   flush)	r   rK   r   r   r3  r   r   hasattrr9  )rj   r2   r6  r5  rQ   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   )rj   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   rv   rD   r   r  r   r   rt   ru   r   r  rF   r~   rC   )r   KeyErrorr   r   r   r   o16r   _get_color_table_sizer   _get_header_palette)r2   rj   r2  rX   r   rv   r  packed_flagr  palette_bytescolor_table_sizes              r(   r   r     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wbrI   ppmtogif)stdoutstderrppmquant256)stdinrI  rJ  )_dumpopenr   
subprocess
check_callDEVNULLPopenPIPErI  closewaitCalledProcessErrorosunlinkOSError)
rj   r2   r6  tempfilerm   	quant_cmd	togif_cmd
quant_proc
togif_procretcodes
             r(   _save_netpbmra  3  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a8  U(       Ga0  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                  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   r   r   N)r   r   _FORCE_OPTIMIZEwidthheightr   	histogramr   r   r;   rQ   r   getmodebands
bit_length)rj   rK   optimiser   r=   countnum_palette_colorscurrent_palette_sizes           r(   r   r   h  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   r9   r   )r;   mathceillog)rD  s    r(   rA  rA    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   r9   r   )rA  r;   r   )rD  rE  actual_target_size_diffs      r(   rB  rB    sR     -];  !$44M8Ja8OO"A%<<<r'   c                T    U R                   (       a  U R                   R                   $ S$ )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   r  s    r(   r   r     s     "$2::44r'   c                    SnU(       a5  [        U[        5      (       a   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   rQ   getcolorr   str)rj   info_backgroundrH   rn   s       r(   r!  r!    s|     Jou--
ZZ00E
  )J  q6 "   s   A 
A&A!!A&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   87arB   s   89ar   r}   rv   rr   rH   s   GIFr   r   rF   rt   rz   rG   r|   r9   rx   )rK   r   r!  r   rA  r@  r   r   rB  r   r   rv  encoder:   r;   )rj   rK   rB   rH   rD  rE  headercomment_blockrr   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                  " XSSUR                  -   S[
        UR                     4/5        U R                  S5        U? g ! U? f = f)Nr   r   r   r   )r   r   r   r   r   r   r   r   )r2   r  r2  paramss       r(   r)  r)    sd    !% 	B&!4E6HMM#91ghmm>TUV	
 	 H s   AA# #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)

rH   )r   rK   r   rQ   rj   r   )rj   rQ   rK   r   im_modrz  s         r(   	getheaderr  .  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\R                  S:  a  SSKJr  S	S jr	Sr
gS
S jr	Sr
g)getdata.<locals>.Collectoria  )r9      r   )Bufferc                N    U R                   R                  U5        [        U5      $ r   r6   r   r;   r4   r6   s     r(   r    getdata.<locals>.Collector.writeg      		  &4y r'   c                N    U R                   R                  U5        [        U5      $ r   r  r  s     r(   r   r  m  r  r'   r   N)r6   r  r   r   )r6   r   r   r   )r   r   r    r!   r6   sysversion_infocollections.abcr  r   r&   r   r'   r(   	Collectorr  a  s"    w&.!!r'   r  )ior  r   r)  r6   )rj   r2  r~  r  r  r2   s         r(   r   r   L  s8    & !G !  GGI	Bbf-77Nr'   z.gifz	image/gif)r+   r   r   r   )rj   r	  r   r	  )rj   r	  rQ   _Palette | NonerK   r  r   r	  )rj   r	  r2   	IO[bytes]rQ   r  r   r   )r  r	  r  r	  r   z4tuple[Image.Image, tuple[int, int, int, int] | None])rj   r	  r2   r  rQ   r  r   r   )rj   r	  r2   r  r6  str | bytesr   r   )F)
rj   r	  r2   r  r6  r  r5  r   r   r   )rj   r	  r   r   )
r2   r  rj   r	  r2  tuple[int, int]rX   r   r   r   )rj   r	  rK   r  r   zlist[int] | None)rD  r   r   r   )rD  r   r   r   )rj   r	  r   r   )rj   r	  rw  z=int | tuple[int, int, int] | tuple[int, int, int, int] | Noner   r   )rj   r	  rK   r  r   list[bytes])
r2   r  r  r	  r2  r  r~  r  r   r   )NN)rj   r	  rQ   r  rK   zdict[str, Any] | Noner   z$tuple[list[bytes], list[int] | None])r   )rj   r	  r2  r  r~  r   r   r  )G
__future__r   r  rn  rX  rP  r  enumr   	functoolsr   typingr   r   r   r	   r
   r   r    r   r   r   r   r   r   r   _binaryr   rL   r   r   r@  r   r   r#   r   r,   r.   r   r   r   r   r   _Paletter   r   r  r  r3  r7  r   r   r   ra  rc  r   rA  rB  r   r!  r   r)  r  r   register_openr   register_saveregister_save_allregister_extensionregister_mimer   r'   r(   <module>r     s  4 #   	  
  % K K K   "  !g  #22 0K9&& Kd #C
(2 	49l.G.GGH==-=5C==@  
	222$/292 Z  uu"u-<u	up+
 MR".9EI	&//"/,;/DG/	/d-d ,^C$5R 	4;|!!! ! 	!
 
!4 UY''-'<Q')'> 06++,+AD++b   L''w ?   L'' /   ++Y 7   ,,f 5   L'' 5r'   