o
    ÒèFhX“  ã                   @  sª  d dl mZ d dlZd dlZd dlZd dlZd dlmZ ddlm	Z	m
Z
mZmZmZmZmZ ddlmZ ddlmZ ddlmZ G d	d
„ d
eƒZejZdd„ ZG dd„ dejƒZddddœZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Z dd„ Z!d<dd „Z"d!d"„ Z#d#d$„ Z$d%d&„ Z%dZ&d'd(„ Z'd)d*„ Z(d+d,„ Z)d-d.„ Z*d/d0„ Z+d1d2„ Z,d3d4„ Z-d=d5d6„Z.d>d8d9„Z/e	 0ej1ee¡ e	 2ej1e"¡ e	 3ej1e!¡ e	 4ej1d:¡ e	 5ej1d;¡ dS )?é    )ÚannotationsN)ÚIntEnumé   )ÚImageÚ
ImageChopsÚ	ImageFileÚ	ImageMathÚImageOpsÚImagePaletteÚImageSequence)Úi16le)Úo8)Úo16lec                   @  s   e Zd ZdZdZdZdZdS )ÚLoadingStrategyz.. versionadded:: 9.1.0r   r   é   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚRGB_AFTER_FIRSTÚ RGB_AFTER_DIFFERENT_PALETTE_ONLYÚ
RGB_ALWAYS© r   r   úK/var/www/html/loop/nvenv/lib/python3.10/site-packages/PIL/GifImagePlugin.pyr   0   s
    r   c                 C  s   | d d… dv S )Né   )s   GIF87as   GIF89ar   )Úprefixr   r   r   Ú_accept?   ó   r   c                      s~   e Zd ZdZdZdZdZdd„ Zdd„ Zd	d
„ Z	e
dd„ ƒZe
dd„ ƒZdd„ Zddd„Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚGifImageFileÚGIFzCompuserve GIFFNc                 C  s,   | j  d¡}|r|d r| j  |d ¡S d S )Nr   r   )ÚfpÚread)ÚselfÚsr   r   r   ÚdataO   s   zGifImageFile.datac                 C  s\   t dt|ƒdƒD ]#}|d ||   kr'||d    kr'||d  ks+ dS   dS qdS )Nr   é   r   r   TF)ÚrangeÚlen)r"   ÚpÚir   r   r   Ú_is_palette_neededU   s   4ÿÿzGifImageFile._is_palette_neededc                 C  sØ   | j  d¡}t|ƒsd}t|ƒ‚|d d… | jd< t|dƒt|dƒf| _g | _|d }|d@ d }|d	@ rU|d
 | jd< | j  d|> ¡}|  |¡rUt	 
d|¡}| | _| _| j | _| j  ¡ | _d | _d | _|  d¡ d S )Né   znot a GIF filer   Úversioné   é
   é   r   é€   é   Ú
backgroundr%   ÚRGBr   )r    r!   r   ÚSyntaxErrorÚinfoÚi16Ú_sizeÚtiler*   r
   ÚrawÚglobal_paletteÚpaletteÚ_fpÚtellÚ_GifImageFile__rewindÚ	_n_framesÚ_is_animatedÚ_seek)r"   r#   ÚmsgÚflagsÚbitsr(   r   r   r   Ú_open[   s(   
zGifImageFile._openc                 C  s\   | j d u r+|  ¡ }z	 |  |  ¡ d d¡ q ty%   |  ¡ d | _ Y nw |  |¡ | j S )NTr   F)r?   r=   rA   ÚEOFErrorÚseek©r"   Úcurrentr   r   r   Ún_framesw   s   
ÿÿ
zGifImageFile.n_framesc                 C  s~   | j d u r<| jd ur| jdk| _ | j S |  ¡ }|rd| _ | j S z|  dd¡ d| _ W n ty6   d| _ Y nw |  |¡ | j S )Nr   TF)r@   r?   r=   rA   rF   rG   rH   r   r   r   Úis_animatedƒ   s    

õ	ù

ÿ
zGifImageFile.is_animatedc                 C  sŠ   |   |¡sd S || jk rd | _|  d¡ | j}t| jd |d ƒD ]!}z|  |¡ W q! tyB } z|  |¡ d}t|ƒ|‚d }~ww d S )Nr   r   úno more images in GIF file)Ú_seek_checkÚ_GifImageFile__frameÚimrA   r&   rF   rG   )r"   ÚframeÚ
last_frameÚfÚerB   r   r   r   rG   –   s    




€ýýzGifImageFile.seekTc                   sú  |dkr!dˆ _ d ˆ _dˆ _ˆ j ˆ j¡ dˆ _dˆ jv r ˆ jd= n	ˆ jr*|r*ˆ  	¡  |ˆ jd kr:d|› �}t
|ƒ‚ˆ jˆ _ˆ j rTˆ j ˆ j ¡ ˆ  ¡ rQ	 ˆ  ¡ sLdˆ _ ˆ j d¡}|r`|dkrfd}t|ƒ‚d }i }d }d }d }		 |syˆ j d¡}|r|dkr��n9|d	k�r'ˆ j d¡}ˆ  ¡ }
|d d
kr¹|
d }|d@ r¢|
d }t|
dƒd |d< d|@ }|d? }|r¸|ˆ _nb|d dkrãd}|
rÍ||
7 }ˆ  ¡ }
|
sÃd|v rÜ|d  d| 7  < n||d< d }qp|d dk�r|dk�r|
ˆ j ¡ f|d< |
d d… dk�rˆ  ¡ }
t|
ƒdk�r|
d dk�rt|
dƒˆ jd< ˆ  ¡ �r&	 ˆ  ¡ �s n�|dk�r·ˆ j d¡}t|dƒt|dƒ}}|t|dƒ |t|dƒ }}|ˆ jd k�s\|ˆ jd k�rv|�rvt|ˆ jd ƒt|ˆ jd ƒfˆ _t ˆ j¡ ||||f}	|d }|d@ dk}|d@ �r¨|d@ d }ˆ j d|> ¡}ˆ  |¡�r¦t d |¡}nd!}ˆ j d¡d }ˆ j ¡ ˆ _ nd }qq|d u �rÅd"}t|ƒ‚|ˆ _|�sÍd S g ˆ _ˆ j�rÝˆ j ˆ jˆ j¡ |d u�rä|nˆ jˆ _|ˆ _|dk�r"ˆ j�r	t t!j"k�r|d u�rd#nd ˆ _#nd$ˆ _#nd%ˆ _#|�sˆ j�rdd&l$m$} |ˆ jƒ}|ˆ _%nAˆ j&d$k�rct t!j'k�s1|�rcd ˆ _(d'ˆ jv �rVˆ j )ˆ jd' d¡ ˆ j *d#tj+j,¡ˆ _d#ˆ _#ˆ jd'= nd ˆ _#ˆ j *d tj+j,¡ˆ _‡ fd(d)„}|	ˆ _z¤ˆ jdk �rwd ˆ _n˜ˆ jdk�rËˆ j\}}}}|| || f}t |¡ d$}ˆ j -d'|¡}|d u�r®ˆ j&d*v �r­d#}||ƒd+ }nˆ j -d,d¡}ˆ j&d*v �rÁd }||ƒ}tj. /|||¡ˆ _nDˆ jd u�rÛˆ  0ˆ jˆ j¡ˆ _n4|d u�rˆ j\}}}}|| || f}t |¡ d$}|}ˆ j&d*v �rd#}||ƒd+ }tj. /|||¡ˆ _W n
 t1�y   Y nw |d u�rPd}|d u�r@|dk�r8t t!j"k�r7|ˆ jd'< nˆ j&d*v�r@|}d-||||fˆ j |||ffgˆ _| -d¡�r]|d ˆ jd< d.D ]}||v �ro|| ˆ j|< �q_|ˆ jv �ryˆ j|= �q_d S )/Nr   éÿÿÿÿÚcommentr   zcannot seek to frame ó   ;rL   Tó   !éù   r%   r.   Údurationé   r   éþ   ó    ó   
éÿ   Ú	extensionr1   ó   NETSCAPE2.0Úloopó   ,é	   é   r   r-   é@   r0   r/   r3   Fzimage not found in GIF frameÚRGBAÚPÚL)ÚcopyÚtransparencyc                   sT   ˆ j r#| d d tˆ j jƒkrd} tˆ j j| d | d d … ƒ} | S | | | f} | S )Nr%   r   )Ú_frame_paletter'   r;   Útuple)Úcolor©r"   r   r   Ú_rgbT  s    
ÿz GifImageFile._seek.<locals>._rgb©r3   rf   )r   r2   Úgif)rY   r_   )2Ú_GifImageFile__offsetÚdisposerN   r<   rG   r>   Údisposal_methodr5   r8   ÚloadÚ
ValueErrorr    r$   r!   rF   r6   r=   r'   ÚsizeÚmaxr7   r   Ú_decompression_bomb_checkr*   r
   r9   rO   ÚpasteÚdispose_extentr:   rk   Ú_frame_transparencyÚLOADING_STRATEGYr   r   Ú_moderi   r;   Úmoder   ÚpyaccessÚputpalettealphaÚconvertÚDitherÚFLOYDSTEINBERGÚgetÚcoreÚfillÚ_cropÚAttributeError)r"   rP   Úupdate_imagerB   r#   r;   r5   Úframe_transparencyÚ	interlaceÚframe_dispose_extentÚblockrC   Údispose_bitsrU   Úx0Úy0Úx1Úy1rD   r(   ri   ro   Údispose_sizeÚdispose_moderm   rj   Úkr   rn   r   rA   ¦   sp  
€

ÿ
€þ

ÿ€
&"
§
[

ÿ
	

€

€ÿ



€
üÿ	
€üzGifImageFile._seekc                   s¦   | j rdnd}d | _| jdkr | jd urtj || j| j¡| _n&| j	dv rF| j| _| j rCtj d| j| jp6d¡| _| jj
| j  ¡ Ž  nd | _|| _d | _ tƒ  ¡  d S )Nrg   rh   r   rp   )rk   Ú_prev_imrN   r|   r   r†   r‡   rw   rO   r   Ú
putpaletteÚgetdatar~   ÚsuperÚload_prepare)r"   Ú	temp_mode©Ú	__class__r   r   r›   ¤  s"   


ÿ€
zGifImageFile.load_preparec                 C  sò   | j dkr0| jdkr.ttjkr.| jd ur | j | jd¡ d| _nd| _| j 	| jt
jj¡| _d S | js5d S | jd urI| j | jd¡ | j 	d¡}n| j 	d¡}|  || j¡}| j| _| jj| _|jdkro| j || j|¡ d S | j || j¡ d S )Nr   rg   rf   r3   )rN   r   r}   r   r   r|   rO   r�   r~   r‚   r   rƒ   r„   r—   rˆ   r{   rz   )r"   Úframe_imr   r   r   Úload_end¸  s(   




zGifImageFile.load_endc                 C  s   | j S ©N)rN   rn   r   r   r   r=   Ò  s   zGifImageFile.tell)T)r   r   r   ÚformatÚformat_descriptionÚ!_close_exclusive_fp_after_loadingr:   r$   r*   rE   ÚpropertyrJ   rK   rG   rA   r›   r    r=   Ú__classcell__r   r   r�   r   r   H   s$    


 r   rh   rg   )Ú1rh   rg   c                 C  s„   | j tv r|  ¡  | S t | j ¡dkr=| jdtjjd�} | jj dkr;| jj	D ]}|d dkr:| jj	| | j
d<  | S q&| S |  d¡S )	a  
    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
    r3   rg   ©r;   rf   r%   r   rj   rh   )r   ÚRAWMODEru   r   Úgetmodebaser‚   ÚPaletteÚADAPTIVEr;   Úcolorsr5   )rO   Úrgbar   r   r   Ú_normalize_modeÝ  s   
ý
r¯   c           	      C  s˜  d}|rt |tttfƒrt|dd… ƒ}t |tjƒrt|jƒ}| jdkr1|s0| j d¡dd… }n|s>tdd„ t	dƒD ƒƒ}tjd|d�| _|r—g }t	dt
|ƒd	ƒD ]}t|||d	 … ƒ}| jj |¡}||v rkd}| |¡ qRt|ƒD ]\}}|du r�t	t
|ƒƒD ]}||vr�|||<  nqƒqu|  |¡} n/t| |ƒ}|durÆ|  ||¡} d
|v rÄz| |d
 ¡|d
< W | S  tyÃ   |d
= Y | S w | S || j_| S )at  
    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   rg   r3   c                 s  s   � | ]}|d  V  qdS )r%   Nr   )Ú.0r)   r   r   r   Ú	<genexpr>  s   € z%_normalize_palette.<locals>.<genexpr>r¨   r   r%   rj   )Ú
isinstanceÚbytesÚ	bytearrayÚlistr
   r;   r   rO   Ú
getpaletter&   r'   rl   r­   r…   ÚappendÚ	enumerateÚremap_paletteÚ_get_optimizeÚindexrv   )	rO   r;   r5   Úsource_paletteÚused_palette_colorsr)   Úsource_colorr»   Újr   r   r   Ú_normalize_paletteö  s\   

€þ€

ÿþþrÀ   c              	   C  s¶   t | ƒ}|j ¡ D ]\}}| j ||¡ q	t||| jƒ}t|| jƒD ]}| |¡ q"d}t| ƒr4|dB }t	|| d|ƒ dt| ƒf|_
t ||dd| j dt|j fg¡ | d¡ d S )Nr   re   ©r   r   r-   rq   ó    )r¯   r5   ÚitemsÚencoderinfoÚ
setdefaultrÀ   Ú_get_global_headerÚwriteÚget_interlaceÚ_write_local_headerÚencoderconfigr   Ú_saverw   r©   r   )rO   r    r;   Úim_outr–   Úvr#   rC   r   r   r   Ú_write_single_frame2  s   $rÎ   c                 C  s@   t |ƒt | ƒkr| d¡}|  d¡} t || ¡}||jdd�fS )Nrf   F)Ú
alpha_only)Ú_get_palette_bytesr‚   r   Úsubtract_moduloÚgetbbox)Úbase_imÚim_frameÚdeltar   r   r   Ú_getbboxG  s
   

rÖ   c              
   C  sÆ  | j  d¡}| j  d| j d¡¡}g }d }d}d }t | g| j  dg ¡¡D �]]}	t |	¡D �]T}
t|
 ¡ ƒ}
|dkrP|
j 	¡ D ]\}}|dkrHq?| j  
||¡ q?| j  ¡ }d|
jv rc| 
d|
jd ¡ t|
||ƒ}
t|ttfƒrw|| |d< n|d u r‡d|
jv r‡|
jd |d< t|ttfƒr”|| |d< |d7 }d }|�rrt||
ƒ\}}|sº| d¡r¹|d d d  |d 7  < q-|d d  d¡d	krô|d u rì| j  d| j dd
¡¡}t|
|ƒ}t d|
j|¡}| |d d j¡ t||
ƒd }n€| d¡�rq|
jdk�rqd|v�rz
|
j |
¡|d< W n
 t�y   Y nw d|v �rq|
 ¡ }t d|j|d ¡}|jdk�rH| ¡ \}}}}tjdd„ ||||d�}n|jdk�r^t d|j¡}| | ¡ ¡ |}tjdd„ |d�}|j|t  |¡d� nd }|
}| !|�p||
||dœ¡ q-q%t"|ƒdk�ržd| j v �rœ|d d d | j d< d S |D ]@}|d }
|d �s¾t#|
|d ƒD ]}| $|¡ �q²d}n|�sÇd|d d< |
 %|d ¡}
|d d d	… }t&||
||d ƒ �q dS )NrY   Údisposalr   Úappend_imagesrj   r   rT   rÄ   r   )r   r   r   rg   rO   Úoptimizer§   rf   c                 S  s@   | d | d | d | d | d | d ƒ| d ƒ| d ƒd dƒS )	Nr‚   rx   ÚrÚgÚbÚar^   r§   r   ©Úargsr   r   r   Ú<lambda>�  s    ÿüúøz(_write_multiple_frames.<locals>.<lambda>)rÚ   rÛ   rÜ   rÝ   rh   c                 S  s   | d | d d dƒS )Nr‚   rO   r^   r§   r   rÞ   r   r   r   rà   ¦  s    ©rO   )Úmask)rO   ÚbboxrÄ   rã   rÁ   TÚinclude_color_table)'rÄ   r…   r5   Ú	itertoolsÚchainr   ÚIteratorr¯   ri   rÃ   rÅ   rÀ   r²   rµ   rl   rÖ   Ú_get_backgroundr   Únewrw   r˜   r;   r   Ú_new_color_indexrv   Úsplitr   Úlambda_evalÚputdatar™   rz   r	   Úinvertr·   r'   rÆ   rÇ   ÚcropÚ_write_frame_data)rO   r    r;   rY   r×   Ú	im_framesÚprevious_imÚframe_countÚbackground_imÚ
imSequencerÔ   r–   rÍ   rÄ   Ú
diff_framerÕ   rã   rm   r2   r‡   rÚ   rÛ   rÜ   rÝ   râ   Údelta_lÚ
frame_datar#   Úoffsetr   r   r   Ú_write_multiple_framesO  s¾   


ÿÿ



ÿÿ

òþ€ÿ«Y
rú   c                 C  s   t | ||dd� d S )NT)Úsave_all)rË   )rO   r    Úfilenamer   r   r   Ú	_save_allÉ  s   rý   Fc                 C  s~   d| j v s
d| jv r| j  d| j d¡¡}n	d }| j  dd¡ |r't| ||ƒs-t| ||ƒ | d¡ t|dƒr=| ¡  d S d S )Nr;   rÙ   TrV   Úflush)	rÄ   r5   r…   rÅ   rú   rÎ   rÇ   Úhasattrrþ   )rO   r    rü   rû   r;   r   r   r   rË   Í  s   

ÿrË   c                 C  s$   | j  dd¡}t| jƒdk rd}|S )NrŒ   r   é   r   )rÄ   r…   Úminrw   )rO   rŒ   r   r   r   rÈ   Þ  s   rÈ   c                 C  sj  z|j d }W n ty   d }Y nw d|j v r"t|j d d ƒ}nd}t|j  dd¡ƒ}|d us7|dks7|rd|d ur=dnd}||d> O }|  dtd	ƒ td
ƒ t|ƒ t|ƒ t|p\dƒ tdƒ ¡ |j  d¡}|r~t|ƒ}	t|	ƒ}
|
r~|dB }||
B }|  dt|d ƒ t|d ƒ t|j	d ƒ t|j	d ƒ t|ƒ ¡ |r¬|
r¬|  t
|	ƒ¡ |  tdƒ¡ d S )Nrj   rY   r.   r   r×   r   r   rW   rX   rd   rä   r0   rb   r-   )rÄ   ÚKeyErrorÚintr…   rÇ   r   Úo16rÐ   Ú_get_color_table_sizerw   Ú_get_header_palette)r    rO   rù   rC   rj   rY   r×   Úpacked_flagrä   Úpalette_bytesÚcolor_table_sizer   r   r   rÉ   è  sd   ÿ
ÿþýü
ûúÿ

ÿ
þýüûÿrÉ   c           
      C  s  |   ¡ }ztt|dƒ�S}| jdkrtjd|g|tjd� n:dd|g}dg}tj|tjtjd�}tj||j|tjd�}|j 	¡  | 
¡ }	|	rJt |	|¡‚| 
¡ }	|	rVt |	|¡‚W d   ƒ n1 s`w   Y  W zt |¡ W d S  tyx   Y d S w zt |¡ W w  ty‰   Y w w )NÚwbr3   Úppmtogif)ÚstdoutÚstderrÚppmquantÚ256)Ústdinr  r  )Ú_dumpÚopenr   Ú
subprocessÚ
check_callÚDEVNULLÚPopenÚPIPEr  ÚcloseÚwaitÚCalledProcessErrorÚosÚunlinkÚOSError)
rO   r    rü   ÚtempfilerR   Ú	quant_cmdÚ	togif_cmdÚ
quant_procÚ
togif_procÚretcoder   r   r   Ú_save_netpbm  sL   
ÿ

ÿü
€ã€ÿþÿr$  c                 C  sØ   | j dv r`|rb| d¡rdtp| j dk}|s| j| j dk rfg }t|  ¡ ƒD ]\}}|r0| |¡ q%|s;t|ƒt	|ƒkr=|S t	| j
j
ƒt | j
j ¡ }d|d  ¡ > }t	|ƒ|d krh|dkrj|S dS dS dS dS dS dS )aL  
    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
    )rg   rh   rÙ   rh   i   r   r   N)r   r…   Ú_FORCE_OPTIMIZEÚwidthÚheightr¸   Ú	histogramr·   rx   r'   r;   r   ÚgetmodebandsÚ
bit_length)rO   r5   Úoptimiser½   r)   ÚcountÚnum_palette_colorsÚcurrent_palette_sizer   r   r   rº   L  s*   
€ÿàrº   c                 C  s6   | sdS t | ƒdk rdS t t t | ƒd d¡¡d S )Nr   rc   r   r%   r   )r'   ÚmathÚceilÚlog)r  r   r   r   r  z  s
   r  c                 C  s<   t | ƒ}d|> t| ƒd  }|dkr| tdƒd | 7 } | S )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   )r  r'   r   )r  r	  Úactual_target_size_diffr   r   r   r  „  s
   r  c                 C  s   | j r| j j S d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á   r   r   r   rÐ   –  s   rÐ   c              
   C  sd   d}|r0t |tƒr.z
| j || ¡}W |S  ty- } zt|ƒdvr"‚ W Y d }~|S d }~ww |}|S )Nr   )z$cannot allocate more than 256 colorsz/cannot add non-opaque RGBA color to RGB palette)r²   rl   r;   Úgetcolorrv   Ústr)rO   Úinfo_backgroundr2   rS   r   r   r   rè      s   
õ
ù
€õ
rè   c                 C  s~  d}| j  d¡dks!|r#d|v s!| d¡dus!| d¡s!| d¡r#d}t| | d	¡ƒ}t| ƒ}t|ƒ}d
| t| jd ƒ t| jd ƒ t|d ƒt|ƒtdƒ t|ƒg}| d¡dur}| 	dtdƒ tdƒ d tdƒ tdƒ t|d ƒ tdƒ ¡ | d¡r½dtdƒ }|d }t
|tƒr•| ¡ }tdt|ƒdƒD ]}	||	|	d … }
|tt|
ƒƒ|
 7 }q�|tdƒ7 }| 	|¡ |S )z2Return a list of strings representing a GIF headers   87ar,   s   89arj   ra   NrY   rU   r2   s   GIFr   r   r0   rW   r^   r1   r`   r%   r[   )r5   r…   rè   rÐ   r  r  rw   r   r  r·   r²   r4  Úencoder&   r'   )rO   r5   r,   r2   r  r	  ÚheaderÚcomment_blockrU   r)   Úsubblockr   r   r   rÆ   ·  sl   ÿÿþÿþý
õÿþýüû
úùÿ



rÆ   c              	   C  sT   z&||_ t| ||dƒ t || dd|j dt|j fg¡ |  d¡ W |` d S |` w )Nr   rq   rÁ   rÂ   )rÄ   rÉ   r   rË   rw   r©   r   rÇ   )r    rÔ   rù   Úparamsr   r   r   rð   õ  s   ÿrð   c                 C  sd   t | |ƒ}|du ri }d|vrd| jv r| jd |d< t| ||ƒ}|j| _|j| _t| |ƒ}||fS )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)

    Nr2   )rº   r5   rÀ   r;   rO   rÆ   )rO   r;   r5   r½   Úim_modr7  r   r   r   Ú	getheader	  s   

r<  rÁ   c                 K  s0   G dd„ dƒ}|   ¡  |ƒ }t|| ||ƒ |jS )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

    c                   @  s   e Zd Zg Zdd„ ZdS )zgetdata.<locals>.Collectorc                 S  s   | j  |¡ d S r¡   )r$   r·   )r"   r$   r   r   r   rÇ   :  r   z getdata.<locals>.Collector.writeN)r   r   r   r$   rÇ   r   r   r   r   Ú	Collector7  s    r=  )ru   rð   r$   )rO   rù   r:  r=  r    r   r   r   r™   %  s
   r™   z.gifz	image/gif)F)NN)rÁ   )6Ú
__future__r   rå   r/  r  r  Úenumr   Ú r   r   r   r   r	   r
   r   Ú_binaryr   r6   r   r   r  r   r   r}   r   r   r©   r¯   rÀ   rÎ   rÖ   rú   rý   rË   rÈ   rÉ   r$  r%  rº   r  r  rÐ   rè   rÆ   rð   r<  r™   Úregister_openr¢   Úregister_saveÚregister_save_allÚregister_extensionÚregister_mimer   r   r   r   Ú<module>   sV   $			   <z

01.

>

$