o
    tVÆgõ  ã                   @   s  d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 zd dlm
Z
 W n	 ey5   Y nw d dlZde ¡ kZG dd„ dƒZe ed¡G d	d
„ d
ejeƒƒZe ed¡G dd„ dejeƒƒZe ej d¡e ed¡G dd„ dejeƒƒƒZedkr‰e ¡  dS dS )é    N)Úreduce)ÚSurfaceSubclass)ÚarrinterÚPyPyc                   @   s    e Zd Zddd„Zddd„ZdS )Ú	TestMixinNc                 C   s¢   |  ¡ \}}|  ||f|  ¡ |¡ |du rdn|› d}|d|› d|› d7 }t|ƒD ]#}t|ƒD ]}|  | ||f¡| ||f¡|› d|› d|› d¡ q1q+dS )z3Checks if two surfaces are equal in size and color.NÚ z, zsize: (ú)z, position: ()Úget_sizeÚassertTupleEqualÚrangeÚassertEqualÚget_at)ÚselfÚs1Ús2ÚmsgÚwÚhÚxÚy© r   úP/home/ubuntu/.local/lib/python3.10/site-packages/pygame/tests/pixelarray_test.pyÚassert_surfaces_equal   s   ýÿÿzTestMixin.assert_surfaces_equalc                    sP   |  ¡ \‰ }| ¡  ‡ fdd„t|ƒD ƒD ]}|  | |¡||¡ q| ¡  dS )z5Checks if the surface is filled with the given color.c                 3   s&    | ]}t ˆ ƒD ]}||fV  qqd S ©N)r   )Ú.0r   r   ©Úwidthr   r   Ú	<genexpr>-   s   €$ z2TestMixin.assert_surface_filled.<locals>.<genexpr>N)r	   Úlockr   r   r   Úunlock)r   ÚsurfaceÚexpected_colorr   ÚheightÚposr   r   r   Úassert_surface_filled(   s
   zTestMixin.assert_surface_filledr   )Ú__name__Ú
__module__Ú__qualname__r   r$   r   r   r   r   r      s    
r   zpypy having issuesc                   @   sL  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Ze ed¡dd„ ƒZdd„ Zdd„ Zdd„ Ze ed ¡d!d"„ ƒZd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Z d9d:„ Z!d;d<„ Z"d=d>„ Z#d?d@„ Z$dAdB„ Z%dCdD„ Z&dEdF„ Z'dGdH„ Z(dIdJ„ Z)dKdL„ Z*dMS )NÚPixelArrayTypeTestc           
      C   s  d}d}||f}t  |dd¡}t  |¡}t  |dd¡}|  t|j|¡ t  |¡}| |¡}|  t|t jƒ¡ |  |j	|¡ | 
t  d¡¡ |  ||j¡ ~t  dddd	¡}	| 
t  d
¡|	¡ | 
t  d¡¡ | 
t  d
¡|	¡ | |¡}| 
t  d¡|	¡ |  ||j¡ d S )Né
   é   r   é    Úwhiteé   é   é   é   ÚblueÚred)ÚpygameÚSurfaceÚ
PixelArrayÚassertRaisesÚ	TypeErrorÚcompareÚ
assertTrueÚ
isinstancer   ÚshapeÚfillÚColorr   r    ÚRect)
r   r   r   ÚsizeÚsfÚarÚsf2Úar2Úar3Úrr   r   r   Útest_compare4   s*   



zPixelArrayTypeTest.test_comparec                 C   sØ   d}t  d¡}d}dD ]^}t j||d}| |¡ | ¡ }| |¡ | d¡}t  |¡}t  | ¡ ¡}	dD ]'}
|j|	|
d}|  |j	|||
f¡ |  
|j	|||
f¡ |  
|	j	|||
f¡ q5| ¡  |	 ¡  | ¡  qd	S )
z;Ensures compare works correctly with same colored surfaces.©é   r.   r,   ©é   rJ   rJ   éÿ   ©é   é   é   r+   ©Údepth©r   r   )ç        g{®Gáz„?çš™™™™™¹?ç      ð?©ÚdistanceN©r3   r=   r4   r<   Úcopyr   r5   r8   r   r    r$   Úclose)r   r?   Úpixelarray_result_colorÚsurface_colorrQ   Úexpected_pixelarray_surfaceÚsurf_aÚexpected_surface_colorÚpixelarray_aÚpixelarray_brW   Úpixelarray_resultr   r   r   Ú)test_compare__same_colors_within_distanceS   s<   




ÿýÿÿ
Ýz<PixelArrayTypeTest.test_compare__same_colors_within_distancec                 C   óô   d}t  d¡}d}d}dD ]j}t j||d}| |¡ | ¡ }| |¡ | d¡}t  |¡}	| ¡ }
|
 |¡ |
 d¡}t  |
¡}dD ]'}|	j||d	}|  |j	|||f¡ |  
|	j	|||f¡ |  
|j	|||f¡ qC|	 ¡  | ¡  | ¡  qd
S )z‡Ensures compare works correctly with different colored surfaces
        and the color difference is within the given distance.
        rG   r,   rI   ©é€   rJ   rJ   rK   rL   rP   rR   )gš™™™™™É?g333333Ó?g      à?rU   rV   NrX   ©r   r?   r[   Úsurface_a_colorÚsurface_b_colorrQ   r]   r^   Úexpected_surface_a_colorr`   Úsurf_bÚexpected_surface_b_colorra   rW   rb   r   r   r   Ú.test_compare__different_colors_within_distance~   óD   







ÿýÿÿ
ØzAPixelArrayTypeTest.test_compare__different_colors_within_distancec                 C   rd   )z‹Ensures compare works correctly with different colored surfaces
        and the color difference is not within the given distance.
        rG   ÚblackrI   re   rL   rP   rR   )rS   gñhãˆµøä>g-Cëâ6?gü©ñÒMbP?rV   NrX   rg   r   r   r   Ú2test_compare__different_colors_not_within_distance±   rn   zEPixelArrayTypeTest.test_compare__different_colors_not_within_distancec                 C   s"   t  d¡}t  |¡}| ¡  ~dS )z"does not crash when it is deleted.©r)   r)   N)r3   r4   r5   rZ   ©r   ÚsÚar   r   r   Ú
test_closeä   s   

zPixelArrayTypeTest.test_closec           
         sà   t  d¡}t  |¡‰ ˆ  ¡  ‡ fdd„}|  t|¡ ‡ fdd„}|  t|¡ ‡ fdd„}|  t|¡ ‡ fdd	„}|  t|¡ ‡ fd
d„}|  t|¡ ‡ fdd„}|  t|¡ ‡ fdd„}|  t|¡ ‡ fdd„}	|  t|	¡ dS )z3when you try to do an operation after it is closed.rq   c                      s   ˆ d d …  d S r   r   r   ©rt   r   r   Úaccess_afterñ   ó   z:PixelArrayTypeTest.test_close_raises.<locals>.access_afterc                      s   dˆ d d …< d S ©Né   r   r   rv   r   r   Úassign_all_afterö   rx   z>PixelArrayTypeTest.test_close_raises.<locals>.assign_all_afterc                      ó   ˆ   ¡  d S r   )Úmake_surfacer   rv   r   r   Úmake_surface_afterû   ó   z@PixelArrayTypeTest.test_close_raises.<locals>.make_surface_afterc                     s   ˆ D ]} qd S r   r   )r   rv   r   r   Ú
iter_after   s   ÿz8PixelArrayTypeTest.test_close_raises.<locals>.iter_afterc                      r|   r   )rZ   r   rv   r   r   Úclose_after  r   z9PixelArrayTypeTest.test_close_raises.<locals>.close_afterc                      ó
   ˆ j  d S r   )r    r   rv   r   r   Úsurface_after  ó   
z;PixelArrayTypeTest.test_close_raises.<locals>.surface_afterc                      r‚   r   )Úitemsizer   rv   r   r   Úitemsize_after  r„   z<PixelArrayTypeTest.test_close_raises.<locals>.itemsize_afterc                      r|   r   )Ú	transposer   rv   r   r   Útranspose_after  r   z=PixelArrayTypeTest.test_close_raises.<locals>.transpose_afterN)r3   r4   r5   rZ   r6   Ú
ValueError)
r   rs   rw   r{   r~   r€   r   rƒ   r†   rˆ   r   rv   r   Útest_close_raisesë   s&   

z$PixelArrayTypeTest.test_close_raisesc                 C   s‚   t  d¡}t  |¡}|dd…  W d  ƒ n1 sw   Y  t  |¡}t  d¡|dd…< W d  ƒ dS 1 s:w   Y  dS )zcloses properly.rq   NÚdeepskyblue)r3   r4   r5   r=   rr   r   r   r   Útest_context_manager  s   
ÿ"ÿz'PixelArrayTypeTest.test_context_managerc                 C   s~   dD ]:}t  dd|¡}| d¡ t  |¡}|  |j|j¡ | ¡ r(|  | ¡ ¡ |  t	|ƒd¡ ~| ¡ r<|  
| ¡ ¡ qd S )NrL   ©r)   r*   r   ©r   r   r   r)   )r3   r4   r<   r5   r   Ú_pixels_addressÚmustlockr9   Ú
get_lockedÚlenÚassertFalse©r   Úbppr@   rA   r   r   r   Útest_pixel_array%  s   

€òz#PixelArrayTypeTest.test_pixel_arrayc                 C   sÒ   t  ddd¡}t  |¡}|  tt|d¡ d|_|  |jd¡ t 	|¡}|  
|ƒ |u ¡ ~t ¡  |  
|ƒ d u ¡ G dd„ dt jƒ}||ƒ}|  t|ƒd¡ t 	|¡}|  
|ƒ |u ¡ ~t ¡  |  
|ƒ d u ¡ d S )	N©r-   rH   r   r+   Ú	nonnativeÚvaluec                   @   s   e Zd Zdd„ ZdS )z+PixelArrayTypeTest.test_as_class.<locals>.Cc                 S   s
   d| j  S )Nzstring (%i, %i)©r;   )r   r   r   r   Ú__str__D  r„   z3PixelArrayTypeTest.test_as_class.<locals>.C.__str__N)r%   r&   r'   r›   r   r   r   r   ÚCC  s    rœ   zstring (2, 3))r3   r4   r5   r6   ÚAttributeErrorÚgetattrr˜   r   ÚweakrefÚrefr9   ÚgcÚcollectÚstr)r   r@   rA   rE   rœ   r   r   r   Útest_as_class6  s$   


z PixelArrayTypeTest.test_as_classc                 C   s(   t dddƒ}t |¡}|  |tj¡ dS )z>Ensure the PixelArray constructor accepts subclassed surfaces.rG   r   r+   N)r   r3   r5   ÚassertIsInstance)r   r    Ú
pixelarrayr   r   r   Ú#test_pixelarray__subclassed_surfaceO  s   
z6PixelArrayTypeTest.test_pixelarray__subclassed_surfacec                 C   sÚ   dD ]h}t  dd|¡}| d¡ | d¡}t  |¡}| d¡}|  t|ƒd¡ |  | d¡|¡ |  | d¡|¡ |  | d¡|¡ | d¡}|  t|ƒd¡ |  | d¡|¡ |  | d¡|¡ |  | d¡|¡ qd S )	NrL   ©r/   rM   r   ©r   r   rK   rz   rM   r-   éÿÿÿÿ)r3   r4   r<   Úmap_rgbr5   Ú__getitem__r   r’   )r   r•   r@   ÚvalrA   rC   r   r   r   Útest_get_columnW  s    




ðz"PixelArrayTypeTest.test_get_columnzpypy malloc abortc              
   C   sV  d}d}||f}d}d}d}dD ]—}t  |d|¡}| |¡}	| |¡}
| |¡}|  |
|	d|f ¡ |  ||	d|f ¡ |  |
|d|f ¡ | |¡ t  |¡}| d	¡}t|ƒD ],}| |¡}|  ||	d
|||	f ¡ | 	d	|f|¡ | |¡}|  ||
d|||
f ¡ qZ| 	d|¡ t|ƒD ]2}| |¡ d	¡}|  ||	d|||	f ¡ | 	|d	f|¡ | |¡ d	¡}|  ||d|||f ¡ q‘| d¡ d¡}|  ||	d|f ¡ | d	¡ d¡}|  ||
d|f ¡ | d¡ d	¡}|  ||d|f ¡ | d¡ d¡}|  ||	d|f ¡ | d¡ d¡}|  ||	d|f ¡ | | d	 ¡ d¡}|  ||
d|f ¡ | | ¡ d¡}|  ||	d|f ¡ | d¡ d¡}|  ||	d|f ¡ | d¡ | d	 ¡}|  ||d|f ¡ | d¡ | ¡}|  ||	d|f ¡ | d¡ | d	 ¡}|  ||d|f ¡ | d¡ | ¡}|  ||	d|f ¡ qd S )Nr)   r*   r©   )r   r   rf   )r   r   é   rL   r   zUnusable test colors for bpp %irz   z&ar[1][%i] == %i, mapped_bg_color == %iz(ar[1][%i] == %i, mapped_fg_color_y == %i©rz   rz   z$ar[%i][1] = %i, mapped_bg_color = %iz&ar[%i][1] = %i, mapped_fg_color_x = %izbpp = %iéüÿÿÿr.   )
r3   r4   r«   ÚassertNotEqualr<   r5   r¬   r   r   Úset_at)r   r   r   r?   Úbg_colorÚ
fg_color_yÚ
fg_color_xr•   r@   Úmapped_bg_colorÚmapped_fg_color_yÚmapped_fg_color_xrA   Úar_yr   rC   r   r   r   r   Útest_get_pixelj  s²   



ýýý



ÿý
ÿýýÿý¢z!PixelArrayTypeTest.test_get_pixelc                 C   sà   dD ]k}t  dd|¡}| d¡ t  |¡}| d¡ dd¡ |  |d d | d¡¡ | d¡ dd¡ |  |d d | d¡¡ | d¡ dd¡ |  |d	 d
 | d¡¡ | d¡ dd¡ |  |d d | d¡¡ qd S )NrL   r   r   rŽ   ©r   rK   r   rz   ©rf   rf   rf   rª   é	   é   éþÿÿÿrM   )r3   r4   r<   r5   r¬   Ú__setitem__r   r«   r”   r   r   r   Útest_set_pixelÒ  s   

ñz!PixelArrayTypeTest.test_set_pixelc                 C   s°  dD ]Ó}t  dd|¡}| d¡ t  |¡}t  dd|¡}| d¡ t  |¡}| dd¡ |  |d d | d¡¡ |  |d d | d¡¡ | d	d¡ |  |d
 d | d¡¡ |  |d	 d | d¡¡ | dd¡ |  |d d | d¡¡ |  |d d | d¡¡ | ddgd ¡ |  |d d | d¡¡ |  |d d | d¡¡ |  t|jdd¡ | d| 	d¡¡ |  |d d | d¡¡ |  |d d | d¡¡ qd S )NrL   r¨   r   rŽ   ©r   rK   rK   r-   r½   rz   rª   r.   rÀ   ©rK   rK   r   é   ©rK   rK   rK   rM   )©éÌ   r   rÈ   ©é   rÊ   rÊ   rÇ   rÉ   rÇ   rÉ   rÇ   rÉ   rH   )
r3   r4   r<   r5   rÁ   r   r«   r6   r‰   r¬   )r   r•   r@   rA   rB   rC   r   r   r   Útest_set_columnä  s:   



üÐz"PixelArrayTypeTest.test_set_columnc                 C   s$  dD ]}t  dd|¡}| d¡ t  |¡}|  t|dd… ƒd¡ |  t|dd… d ƒd¡ |  |dd… d ¡ |  |d	d	… d ¡ |  |d
d
… d ¡ |  t|dd… ƒd¡ |  t|dd… d ƒd¡ d|dd	…< d|d dd…< |  |d d	 | d¡¡ |  |d d | d¡¡ qd S )NrL   r   r   rŽ   r-   rH   é   r*   r.   r¾   éýÿÿÿrÀ   rz   rÆ   )r)   r)   r)   r/   )r3   r4   r<   r5   r   r’   r«   r”   r   r   r   Útest_get_slice  s    

èz!PixelArrayTypeTest.test_get_slicez0skipping for PyPy (segfaults on mac pypy3 6.0.0)c                 C   s¼   dD ]Y}t  dd|¡}| d¡ | dd¡ t  |¡}|  d|v ¡ |  d|v ¡ |  d|v ¡ |  d|v ¡ |  d|d	 v ¡ |  d|d	 v ¡ |  d|d	 v ¡ |  d|d	 v ¡ qd S )
NrL   r   r   rŽ   )rM   rM   rÆ   rÄ   rK   rM   )r3   r4   r<   r³   r5   r9   r“   r”   r   r   r   Útest_contains2  s   

ñz PixelArrayTypeTest.test_containsc                 C   s@   dD ]}t  dd|¡}| d¡ t  |¡}|  |j|u ¡ qd S )NrL   r   r   rŽ   )r3   r4   r<   r5   r9   r    r”   r   r   r   Útest_get_surfaceE  s   

üz#PixelArrayTypeTest.test_get_surfacec                 C   sF   t dddƒ}t |¡}|j}|  ||¡ |  |tj¡ |  |t ¡ dS )z<Ensure the surface attribute can handle subclassed surfaces.)r.   rH   r   r+   N)r   r3   r5   r    ÚassertIsr¥   r4   )r   Úexpected_surfacer¦   r    r   r   r   Ú$test_get_surface__subclassed_surfaceL  s   
z7PixelArrayTypeTest.test_get_surface__subclassed_surfacec                    sü  dD ]x}t  dd|¡}| d¡ t  |¡}| d¡}||dd…< |  |d d |¡ |  |d d |¡ |  |d d |¡ |  |d d |¡ | d¡}||d	d
…< |  |d d |¡ |  |d d |¡ | d¡}d|d	d …< |  |d d |¡ |  |d
 d |¡ | d¡}|  t|jt	ddƒ|gd ¡ | d¡}| d¡}||g|dd…< |  |d d |¡ |  |d d |¡ |  |d d |¡ |  |d d |¡ |  |d d |¡ |  |d d |¡ |  |d d |¡ |  |d d |¡ d|d d …< t  dd|¡}| d¡ | d¡}t  |¡}|d d … |d d …< |  |d d |¡ |  |d d |¡ t
tdƒr{G dd„ dtƒ‰ t  ddd¡}t  |¡}‡ fdd„t|jd ƒD ƒ}dd„ |D ƒ}	||d< dd„ |D ƒ}
t ¡  |  |
|	¡ qd S ) NrL   r¨   r   rŽ   r½   r-   rz   rÃ   rÍ   rª   rH   rÀ   rÆ   rÅ   r¼   rM   ©rK   r   r   )rf   r   rK   r.   )rK   r   rK   rÌ   Úgetrefcountc                   @   ó   e Zd ZdZdS )z.PixelArrayTypeTest.test_set_slice.<locals>.IntúUnique int instancesN©r%   r&   r'   Ú__doc__r   r   r   r   ÚInt’  ó    rÚ   )r.   r-   r+   c                    s   g | ]}ˆ |ƒ‘qS r   r   ©r   Úi©rÚ   r   r   Ú
<listcomp>™  s    z5PixelArrayTypeTest.test_set_slice.<locals>.<listcomp>c                 S   ó   g | ]}t  |¡‘qS r   ©ÚsysrÕ   rÜ   r   r   r   rß   š  ó    .c                 S   rà   r   rá   rÜ   r   r   r   rß   œ  rã   )r3   r4   r<   r5   r«   r   r6   r‰   rÁ   ÚsliceÚhasattrrâ   Úintr   r;   r¡   r¢   )r   r•   r@   rA   r­   Úval2rB   rC   Ú
pixel_listÚrefcnts_beforeÚrefcnts_afterr   rÞ   r   Útest_set_sliceW  sf   












€ºz!PixelArrayTypeTest.test_set_slicec                 C   sÔ  dD ]d}t  dd|¡}| dd¡ | dd¡ | dd¡ | d¡}t  |¡}|  |d |¡ |  |d |¡ |  |d |¡ |  |d d	 |¡ |  |d d |¡ |  |d
 d
 |¡ |  t|d ƒd¡ |  t|d ƒd¡ |  t|d ƒd¡ |  t|d d …d d …f ƒd¡ |  t|d d …f ƒd¡ |  t|dd d …f ƒd¡ |  t|d d …df ƒd¡ |  |d
d
…f d ¡ |  |d
d
…df d ¡ |  |d
d
…dd…f d ¡ |  |d
d
…dd
…f d ¡ |  |d
d
d…f d ¡ |  |d
d
d…f d ¡ |  |d
d
d…df d ¡ |  |d
d
d…df d ¡ |  |d
d
d…dd…f d ¡ |  |d
d
d…dd
…f d ¡ |  |dd
d
…f d ¡ |  |dd
…d
d
…f d ¡ |  |dd
d
d…f d ¡ |  |dd
d
d…f d ¡ |  |dd…d
d
d…f d ¡ |  |dd
…d
d
d…f d ¡ d|d< d|d< d|d< d	|d	< d
|d
< d|d< |  |d d d…df d d¡ |  |d d d…df d d¡ |  |d d d…df d d
¡ |  |dd d d…f d d¡ |  |dd d d…f d d¡ |  |dd d d…f d d¡ |d d d…d d d…f }|  t|ƒd	¡ |  |d d d¡ |  |d d d¡ |  |d d d¡ |  |d d d
¡ |  |d d d
¡ |  |d d d
¡ |  |d d d¡ |  |d d d
¡ |  |d d d¡ |d	dd… }|  t|ƒd	¡ |  |d d d	¡ |  |d d d	¡ |  |d d d	¡ |  |d d d	¡ |  |d d d¡ |  |d d d¡ |  |d d d¡ |  |d d d¡ |  |d d d¡ |  |d d d¡ |d d d… }|  t|ƒd¡ |  |d d d¡ |  |d d d¡ |  |d d	 d¡ |  |d d d¡ |  |d d d
¡ |  |d d d
¡ |  |d d	 d
¡ |  |d d d
¡ |  |d d d¡ |  |d d d¡ |  |d d d¡ d|d d …< |d d …df }dgt|ƒ |d d …< |  |d d¡ |  |d d¡ |  |d d¡ |  |d d¡ |  |d d¡ |  |d d¡ |  |d d¡ |  |d d¡ |  |d d¡ |dd…d d …f }|  |jd|jd f¡ |d d …dd…f }|  |j|jd df¡ t  ddd¡}t  |¡}|  |j| ¡ ¡ t  ddd¡}t  |¡}|  |j| ¡ ¡ |d }|  	||u ¡ t
td ƒrgG d!d"„ d"tƒ}t  d#dd¡}t  |¡}|dƒ|dƒ}}	t |¡t |	¡}
}|||	f }t |¡t |	¡}}|  ||
¡ |  ||¡ qd S )$NrL   r¨   r   ©rz   rH   r¼   rR   )rÅ   rÅ   rz   rH   rÅ   ©..r/   )rz   .rM   ).rH   r-   .rÀ   rª   r.   rÌ   rÍ   éc   )r   rz   r°   )r-   rz   )rª   rz   )rÀ   rz   ©rz   r.   r+   )rÌ   rz   rÕ   c                   @   rÖ   )z.PixelArrayTypeTest.test_subscript.<locals>.Intr×   NrØ   r   r   r   r   rÚ   9  rÛ   rÚ   ©r-   r-   )r3   r4   r³   r«   r5   r   r’   r;   r	   r9   rå   râ   ræ   rÕ   )r   r•   r@   r­   rA   rC   rB   rÚ   r   r   Ú	rx_beforeÚ	ry_beforeÚpÚrx_afterÚry_afterr   r   r   Útest_subscript   s
  


 þþþþ


€ Þz!PixelArrayTypeTest.test_subscriptc                 C   sâ  dD ]ì}t  dd|¡}| d¡ t  |¡}d|d< |  |d d¡ |  |d d¡ |  |d	 d¡ d
|d< |  |d | d
¡¡ |  |d | d
¡¡ |  |d	 | d
¡¡ d|d d …df< |  |d | d¡¡ |  |d | d¡¡ |  |d	 | d¡¡ d|d< |  |d | d¡¡ |  |d | d¡¡ |  |d	 | d¡¡ ttdƒrîG dd„ dtƒ}t  ddd¡}t  |¡}|dƒ|dƒ}}t 	|¡t 	|¡}}d|||f< t 	|¡t 	|¡}	}
|  |	|¡ |  |
|¡ qd S )NrL   r¨   r   rÆ   rŽ   rí   rR   ©rz   r   )rª   rª   r©   ).rÔ   .r¼   rÕ   c                   @   rÖ   )z2PixelArrayTypeTest.test_ass_subscript.<locals>.Intr×   NrØ   r   r   r   r   rÚ   c  rÛ   rÚ   rð   r+   rz   )
r3   r4   r<   r5   r   r«   rå   râ   ræ   rÕ   )r   r•   r@   rA   rÚ   r   r   rñ   rò   rô   rõ   r   r   r   Útest_ass_subscriptG  s@   



€Ùz%PixelArrayTypeTest.test_ass_subscriptc                 C   s¶  dD ]U}t  dd|d ¡}t  |¡}|dd …d d …f }|  |j|j |j¡ |d d …dd …f }|  |j|j |jd ¡ |d d d…d d …f }|  |j|j |jd d |j ¡ |d d d…d d …f }|  |j|j |jd d |j ¡ |d d …d d d…f }|  |j|j |jd d |jd  ¡ |d d d…d d …f }|  |j|j |jd d |jd  |jd d |jd   ¡ |d d …d d d…f }|  |j|j |jd d |jd  ¡ |dd …d	d …f }|  |j|j |jd d |jd d	  ¡ |dd d…d	d d
…f }|  |j|j |jd d |jd d	  ¡ |ddd…d d …f }|  |j|j |jd d ¡ |d d …ddd…f }|  |j|j |jd d ¡ qd S )N©rz   r-   rH   rÅ   )r¯   rÌ   r   rM   rz   rª   rÀ   r-   rH   rÅ   r¾   r.   )r3   r4   r5   r   r   r…   Ústridesr;   )r   r•   r@   rA   rC   rD   r   r   r   Útest_pixels_fieldq  sf   


þ
þ
þ
.þ
þ
þ
þÿÿÑz$PixelArrayTypeTest.test_pixels_fieldc                 C   sø  t  ddd¡}t  ddd¡}dD ]e}t  dd|¡}| | |¡¡}| | |¡¡}| |¡ | |d¡ t  |¡}|d d d…d d d…f  ¡ }| ¡ }	|  	|	j
d	¡ |  	|	jd
¡ dD ]}
|  	| |
¡|¡ q[dD ]}
|  	| |
¡|¡ qiqd}tt|ƒƒ}t|d d d… ƒ}d}t  ||fdd¡}t  |¡}|d d d…d d …f }| ¡ }| ¡ \}}|  	||¡ |  	||¡ d}tt|ƒƒ}t|d d d… ƒ}d}t  ||fdd¡}t  |¡}|d d …d d d…f }| ¡ }| ¡ \}}|  	||¡ |  	||¡ d S )NrK   rf   éd   r   rL   r   )r-   r.   rÅ   r¯   r-   r.   r)   ))r   r-   )r   rH   )rz   r-   rð   )rH   r-   ©rH   rH   )r   rÌ   )r   rM   )rz   rM   )r-   rM   )rH   rM   ©rH   rÌ   )rì   r—   rï   )r-   r.   )rz   rÌ   )r-   rÌ   rÊ   rH   r+   )r3   r=   r4   Ú	unmap_rgbr«   r<   r5   r}   Úget_rectr   r   r"   r   Úlistr   r’   r	   )r   r´   Úfg_colorr•   r@   Úbg_color_adjÚfg_color_adjrA   ÚnewsfÚrectró   r   ÚlstÚw_slicer   rC   rB   Úw2Úh2Úh_slicer   r   r   Útest_make_surface¦  sP   

ÿ

z$PixelArrayTypeTest.test_make_surfacec                 C   s„   d}d}d}t |||ƒ}t |¡}| ¡ }|  ||¡ |  |tj¡ |  |t ¡ |  | 	¡ |¡ |  | 
¡ |¡ |  | ¡ |¡ dS )z3Ensure make_surface can handle subclassed surfaces.rG   r   r+   N)r   r3   r5   r}   ÚassertIsNotr¥   r4   ÚassertNotIsInstancer   r	   Ú	get_flagsÚget_bitsize)r   Úexpected_sizeÚexpected_flagsÚexpected_depthÚoriginal_surfacer¦   r    r   r   r   Ú%test_make_surface__subclassed_surfaceá  s   ÿ
z8PixelArrayTypeTest.test_make_surface__subclassed_surfacec                 C   sX   dD ]'}t  dd|¡}t  |¡}d}|D ]}|  t|ƒd¡ |d7 }q|  |d¡ qd S )NrL   )r.   r)   r   r)   rz   r.   )r3   r4   r5   r   r’   )r   r•   r@   rA   Ú
iterationsÚcolr   r   r   Ú	test_iterô  s   

ùzPixelArrayTypeTest.test_iterc                 C   sP  dD ]£}t  dd|¡}| d¡ | d¡}| d¡}t  |¡}|d d d…  dd¡ |  |d d |¡ |  |d d |¡ |  |d d |¡ |  |d d	 |¡ |  |d
 d |¡ |  |d d |¡ |d d d… jdddd |  |d d |¡ |  |d d |¡ |  |d d	 |¡ |  |d
 d |¡ |  |d d |¡ qd S )NrL   rq   r   rÔ   r©   r-   rz   rH   r/   rM   r¾   )r)   r*   é2   ©Úweights)r3   r4   r<   r«   r5   Úreplacer   )r   r•   r@   ÚrvalÚovalrA   r   r   r   Útest_replaceþ  s(   



ízPixelArrayTypeTest.test_replacec                 C   sX  dD ]§}t  dd|¡}| d¡ | dd¡ | d¡}| d¡}t  |¡}| d¡}|  |d d |¡ |  |d	 d |¡ |  |d
 d |¡ |  |d d |¡ |  |d d |¡ |  |d d |¡ |jddd}|  |d d |¡ |  |d	 d |¡ |  |d
 d |¡ |  |d d |¡ |  |d d |¡ |  |d d |¡ qd S )NrL   rq   r   r©   rÔ   )r-   r-   r/   r/   rÆ   rŽ   rz   r-   rH   r/   rM   r¾   )r)   rT   r  r  )r3   r4   r<   r«   r5   Úextractr   )r   r•   r@   r,   ro   rA   Únewarr   r   r   Útest_extract  s,   




èzPixelArrayTypeTest.test_extractc           
      C   sÞ   d}d}t  ||fdd¡}t  |¡}||f}d|f}d}|  |||||¡ td d dƒ}td d dƒ}	|  ||||	f||¡\}}}}|  |||||¡ tdd dƒ}tdd dƒ}	|  ||||	f||¡\}}}}|  |||||¡ d S )	NéP   é‡   r   r+   rz   r-   rH   r.   )r3   r4   r5   Ú_test_assignmenträ   Ú_array_slice)
r   r   r   r@   rA   r?   rú   ÚoffsetÚxsliceÚyslicer   r   r   Útest_2dslice_assignment3  s(   
ÿÿz*PixelArrayTypeTest.test_2dslice_assignmentc                 C   s,  |   |j|¡ |\}}|\}}	| ¡ \}
}t d¡}t ddd¡}| |¡}| |¡ dd|d f|d dfd|d f|d df|d |d ffD ]J\}}|||  ||	  }||
 }|||
  }||f}| |¡}|   ||d||||||f ¡ ||||f< | |¡}|   ||d||||||f ¡ qId S )	Nro   r   é   rR   rÅ   rH   rz   z6at pixarr posn (%i, %i) (surf posn (%i, %i)): %s != %s)r   r;   r	   r3   r=   r«   r<   r   )r   r@   rA   Úar_sizeÚ
ar_stridesÚ	ar_offsetÚar_wÚar_hÚ
ar_xstrideÚ
ar_ystrideÚsf_wÚsf_hro   ÚcolorÚpxcolorÚar_xrº   Ú	sf_offsetÚsf_yÚsf_xÚsf_posnÚsf_pixr   r   r   r%  I  sJ   






ú
ÿý
ÿýëz#PixelArrayTypeTest._test_assignmentc                 C   s    || }|\}}|\}}	|  |¡\}
}}|  |	¡\}}}||
 | d | }|| | d | }	|\}}||
| ||  7 }||9 }||9 }|||	f||f|fS ry   )Úindices)r   rA   r?   Úslicesrú   r'  r(  r)  r   r   ÚxstartÚxstopÚxstepÚystartÚystopÚystepÚxstrideÚystrider   r   r   r&  n  s   zPixelArrayTypeTest._array_slicec                 C   sÜ  dD ]}t  dd|d ¡}t  |¡}|  |j|¡ qdD ]Ï}|\}}t  |dd¡}| ¡ }| ¡ }t  |¡}|  |jd¡ |  |j|¡ |  |j	||f¡ |d d d…d d …f }t
dg| d d d… ƒ}	|  |jd¡ |  |j|	|f¡ |  |j	d| |f¡ |d d …d d d…f }t
dg| d d d… ƒ}
|  |jd¡ |  |j||
f¡ |  |j	|d| f¡ |d }|  |jd¡ |  |j|f¡ |  |j	|f¡ |d d …df }|  |jd¡ |  |j|f¡ |  |j	|f¡ qd S )	Nrù   rð   r   rM   ))rÅ   rN   )r.   r0   r+   r-   rz   )r3   r4   r5   r   r…   Úget_bytesizeÚ	get_pitchÚndimr;   rú   r’   )r   r•   r@   rA   r;   r   r   ÚpitchrC   r	  r
  r   r   r   Útest_array_properties|  s@   

æz(PixelArrayTypeTest.test_array_propertiesc           	   	   C   sÚ  d}|d }d}|d }dD ]Ü}t  ||fd|d ¡}t  |¡}t|| ƒD ]}|||| || f< q&|d d d…d d …f |d d …d d …f< t|| ƒD ]}|  ||||  || f |¡ qLt  |¡}t|| ƒD ]}|||| || f< qj|d d …d d d…f |d d …d d …f< t|| ƒD ]}|  ||| |||  f |¡ qt  |¡}t|| ƒD ]}|||| || f< q®|d d d…d d d…f |d d …d d …f< t|| ƒD ]}|  ||||  |||  f |¡ qÕqd S )Nr)   rz   r*   rù   r   rM   rª   ©r3   r4   r5   r   r   )	r   r   Úmax_xr   Úmax_yr•   r@   rA   rÝ   r   r   r   Útest_self_assignŸ  s4   
&"
&"
(&ÿîz#PixelArrayTypeTest.test_self_assignc                 C   sH  t  ddd¡}t  |¡}td d dƒ}| |d¡ |  |d | d¡¡ | |t  ddd	¡¡ |  |d | d
¡¡ |  t	|j|d¡ |  t	|j||fd¡ |  t	|j|g d¢¡ |  t	|j||fg d¢¡ t  ddd¡}t  |¡}d|d d …< |  |d | d¡¡ g d¢|d d …< |  |d d¡ |  |d d¡ |  |d d¡ d S )N)r.   r.   r   r+   rz   )rz   r-   rH   rR   r)   r¯   r+  )r)   r¯   r+  )rz   r-   rH   rÅ   r.   rý   )r*   é   é(   r*   r÷   rP  )r-   r   rQ  )
r3   r4   r5   rä   rÁ   r   r«   r=   r6   r‰   )r   r@   rA   Úindexr   r   r   Útest_color_valueº  s&   

z#PixelArrayTypeTest.test_color_valuec                 C   s`  t  ddd¡}t  |¡}|j\}}|j\}}t|| ƒD ]}|| }|| }	||||	f< q| ¡ }
|  |
j||f¡ |  |
j||f¡ t|| ƒD ]}|| }|| }	|  |
|	|f |||	f ¡ qI|d }| ¡ }|  |jd|f¡ t|ƒD ]}	|  ||	 |d|	f ¡ qw|d d …df }| ¡ }|  |jd|f¡ tdƒD ]}|  || |d|f ¡ qŸd S )Nrþ   r   r+   rz   r-   )r3   r4   r5   r;   rú   r   r‡   r   )r   r@   rA   r   r   ÚdxÚdyrÝ   r   r   Úar_tÚar1DÚar2Dr   r   r   Útest_transposeÓ  s4   


ÿz!PixelArrayTypeTest.test_transposec                 C   sˆ  d}t  ||fdd¡}t  |¡}t  |dfdd¡}t  |¡}t|ƒD ]}|d d ||df< q"||d< t|ƒD ]}t|ƒD ]}|  |||f ||df ¡ q=q7d|d< t  d|fdd¡}	t  |	¡}
t|ƒD ]}|d d |
d|f< qe|
|d< t|ƒD ]}t|ƒD ]}|  |||f |
d|f ¡ q€qzd|d< t  ddd¡}t  |¡}d|d	< ||d< t|ƒD ]}t|ƒD ]}|  |||f d¡ q´q®d S )
Nr.   r   r+   rz   r)   .r°   é*   rR   rL  )r   r   r@   rA   r:  r7  rÝ   r   r   r9  rº   Úsf_1pxÚar_1pxr   r   r   Ú!test_length_1_dimension_broadcastð  s@   

ÿ
ÿ
ÿÿz4PixelArrayTypeTest.test_length_1_dimension_broadcastc              	   C   s`   t  ddd¡}t  |¡}|  t|jt|d d …dd…f ¡ |  t|jt|dd…d d …f ¡ d S )N)rÌ   r¯   r   r+   r-   )r3   r4   r5   r6   r‰   rÁ   ÚEllipsis)r   r@   rA   r   r   r   Útest_assign_size_mismatch  s   
"&z,PixelArrayTypeTest.test_assign_size_mismatchc                 C   sJ   t  dt jd¡}t  |¡}d|d< | d¡}|  t|ƒt|ƒjd ¡ d S )N)rH   rz   rN   rZ  .rR   z([
  [42, 42, 42]]
))	r3   r4   ÚSRCALPHAr5   Úget_at_mappedr   ÚreprÚtyper%   )r   r@   rA   Úpixelr   r   r   Ú	test_repr  s
   

zPixelArrayTypeTest.test_reprN)+r%   r&   r'   rF   rc   rm   rp   ru   rŠ   rŒ   r–   r¤   r§   r®   ÚunittestÚskipIfÚIS_PYPYr»   rÂ   rË   rÎ   rÏ   rÐ   rÓ   rë   rö   rø   rû   r  r  r  r  r"  r*  r%  r&  rK  rO  rS  rY  r]  r_  re  r   r   r   r   r(   2   sR    +33/

g3

I (*5;
%#!r(   c                   @   sd   e Zd Ze ed¡dd„ ƒZe ed¡dd„ ƒZe ed¡dd„ ƒZe ed¡dd	„ ƒZ	d
d„ Z
dS )ÚPixelArrayArrayInterfaceTestzskipping for PyPy (why?)c                 C   s`   t  ddd¡}t  |¡}t |¡}|  |jd¡ |  |jd¡ |  |jd¡ |  |j	|j
¡ d S )Nrð   r   r+   r-   Úu)r3   r4   r5   r   ÚArrayInterfacer   ÚtwoÚtypekindÚndÚdatar   )r   r@   rA   Úair   r   r   Ú
test_basic#  s   

z'PixelArrayArrayInterfaceTest.test_basicc           
         s(  ddgddgfD ]‰}|\}}t  |dd¡}t  |¡}t |¡‰ ‡ fdd„tˆ jƒD ƒ}|  ||¡ |d d d	…d d …f }t |¡‰tdg| d d d	… ƒ}‡fd
d„tˆjƒD ƒ}|  |||g¡ |d d …d d d	…f }t |¡‰tdg| d d d	… ƒ}	‡fdd„tˆjƒD ƒ}|  |||	g¡ qd S )NrÅ   rN   r.   r0   r   r+   c                    ó   g | ]}ˆ j | ‘qS r   rš   rÜ   )rp  r   r   rß   6  rã   z;PixelArrayArrayInterfaceTest.test_shape.<locals>.<listcomp>r-   c                    rr  r   rš   rÜ   ©Úai2r   r   rß   ;  rã   c                    rr  r   rš   rÜ   rs  r   r   rß   @  rã   )	r3   r4   r5   r   rk  r   rn  r   r’   )
r   r;   r   r   r@   rA   Úai_shaperC   r	  r
  r   )rp  rt  r   Ú
test_shape/  s$   



ðz'PixelArrayArrayInterfaceTest.test_shapec                 C   sL   t ddƒD ]}d| }t dd|¡}t |¡}t |¡}|  |j|¡ qd S )Nrz   r.   rM   rð   r   )r   r3   r4   r5   r   rk  r   r…   )r   Úbytes_per_pixelÚbits_per_pixelr@   rA   rp  r   r   r   Útest_itemsizeC  s   

ûz*PixelArrayArrayInterfaceTest.test_itemsizec                 C   sä   t }|j|jB |jB }t ddd¡}t |¡}| |¡}|  |j	||j
B ¡ |d d d…d d …f }| |¡}|  |j	|¡ t ddd¡}t |¡}| |¡}|  |j	||j
B ¡ t ddd¡}t |¡}| |¡}|  |j	|¡ d S )N©r)   r-   r   r+   r-   )rM   r-   rO   )rÌ   r-   )r   ÚPAI_NOTSWAPPEDÚPAI_WRITEABLEÚPAI_ALIGNEDr3   r4   r5   rk  r   ÚflagsÚPAI_FORTRAN)r   ÚaimÚcommon_flagsrs   rA   rp  rC   r   r   r   Ú
test_flagsL  s"   






z'PixelArrayArrayInterfaceTest.test_flagsc                 C   sŽ  g d¢}t tj|dƒ}d}t ||fdd¡}| d¡}t |¡}|d d… D ]9}|| }| d¡ |||| …d d …f }||d d< ||d d	< ||d d
< | ¡ }tj	 |¡}	|  
|	|¡ q&t tj|dƒ}d}t ||fdd¡}| d¡}t |¡}|d d… D ]9}|| }| d¡ |d d …||| …f }||d d< ||d d	< ||d d
< | ¡ }tj	 |¡}	|  
|	|¡ q‚d}d}t ||fdd¡}| d¡}t |¡}t|ƒt|ƒftd|dƒt|ƒftd|dƒt|ƒft|ƒtd|dƒft|ƒtd|dƒftd|dƒtd|dƒftd|dƒtd|dƒffD ].}
| d¡ ||
 }||d d< ||d d	< ||d d
< | ¡ }tj	 |¡}	|  
|	|¡ qd S )N)rÌ   rH   r¯   rz   r0   r   rM   )rz   rÊ   rf   rª   rŽ   rÀ   rÍ   r*   r)   r-   rH   )r   ÚoperatorÚmulr3   r4   r«   r5   r<   r}   Ú	pixelcopyr   rä   )r   Úfactorsr   r   r@   r5  rA   ÚfrB   Úsf3r>  rC   r   r   r   Útest_slicingc  sj   







ù
	ðz)PixelArrayArrayInterfaceTest.test_slicingN)r%   r&   r'   rf  rg  rh  rq  rv  ry  r‚  r‰  r   r   r   r   ri  !  s    







ri  znewbuf not implementedc                   @   s<   e Zd ZejrddlmZ dddddœZdd	„ Zd
d„ Z	dS )ÚPixelArrayNewBufferTestr   )ÚbuftoolsÚBz=HÚ3xz=IrL   c                 C   s  | j }|j}dD ]s}t dd|¡}t |¡}| j| }|j}|j}|\}	}
|j}|	|
 | }|||j	ƒ}|  
|j|¡ |  |j|¡ |  |jd¡ |  |j|¡ |  |j|¡ |  |j¡ |  |j|¡ |  |j|¡ |  
|jd u ¡ |  |j|j¡ qt ddd¡}t |¡}| j| ¡  }|j}|j}|\}	}
|j}|	|
 | }|||jƒ}|  
|j|¡ |  |j|¡ |  |jd¡ |  |j|¡ |  
|jd u ¡ |  |j¡ |  
|jd u ¡ |  
|jd u ¡ |  
|jd u ¡ |  |j|j¡ |||jƒ}|  |jd¡ |  |j|¡ |||jƒ}|  |jd¡ |  
|jd u ¡ |||jƒ}|  |jd¡ |  
|jd u ¡ |  |j|¡ |  |j|¡ |||jƒ}|  |jd¡ |  
|jd u ¡ |  |j|¡ |  |j|¡ |  t|||j¡ |  t|||j¡ |d d …d d d…f }| j| ¡  }|j}|j}|\}	}
|j}|	|
 | }|||jƒ}|  |j|¡ |  |jd¡ |  |j|¡ |  
|jd u ¡ |  |j¡ |  |j|¡ |  |j|¡ |  |j|j¡ |  t|||j¡ |  t|||j¡ |  t|||j¡ |  t|||j¡ |  t|||j¡ |d d d…d d …f }| j| ¡  }|j}|j}|\}	}
|j}|	|
 | }|||jƒ}|  |j|¡ |  |jd¡ |  |j|¡ |  
|jd u ¡ |  |j¡ |  |j|¡ |  |j|¡ |  |j|j¡ |  t|||j¡ |  t|||j¡ |  t|||j¡ |  t|||j¡ |  t|||j¡ |  d¡}t |¡}| j| ¡  }|j}|j}|\}	}
|j}|	|
 | }|||j!ƒ}|  
|j|¡ |  |j|¡ |  |jd¡ |  |j|¡ |  
|jd u ¡ |  |j¡ |  |j|¡ |  |j|¡ |  
|jd u ¡ |  |j|j¡ |  t|||j¡ |  t|||j¡ |  t|||j¡ |  t|||j¡ |  t|||j¡ |  t|||j¡ |  t|||j¡ d S )NrL   rz  r   r-   )rM   rN   r+   )r-   rH   r.   rÌ   )"r‹  ÚImporterr3   r4   r5   Úbitsize_to_formatr…   r;   rú   Ú
PyBUF_FULLr9   Úobjr   r’   rI  Úformatr“   ÚreadonlyÚ
suboffsetsÚbufr   r  ÚPyBUF_SIMPLEÚPyBUF_FORMATÚPyBUF_WRITABLEÚPyBUF_F_CONTIGUOUSÚPyBUF_ANY_CONTIGUOUSr6   ÚBufferErrorÚPyBUF_C_CONTIGUOUSÚPyBUF_NDÚPyBUF_STRIDEDÚ
subsurfaceÚPyBUF_STRIDES)r   r‹  rŽ  Úbit_sizers   rA   r’  r…   r;   r   r   rú   ÚlengthÚimpÚ	ar_slicedr   r   r   r   Útest_newbuf_2D«  s  



ÿ
ÿ

z&PixelArrayNewBufferTest.test_newbuf_2Dc                 C   s®  | j }|j}t ddd¡}t |¡}d}|| }| j| ¡  }|j}|j}	|	d }
|j	}|
| }|j
||  }|||jƒ}|  |j|¡ |  |j|¡ |  |jd¡ |  |j|¡ |  |jd u ¡ |  |j¡ |  |j|	¡ |  |j	|¡ |  |jd u ¡ |  |j|¡ |||jƒ}|  |jd¡ |  |j|¡ |  t|||j¡ |  t|||j¡ |  t|||j¡ |  t|||j¡ |  t|||j¡ |  t|||j¡ |  t|||j¡ d}|d d …|f }|j}	|	d }|j	}|| }|j
||  ¡   }|||jƒ}|  |j|¡ |  |jd¡ |  |j|¡ |  |j|¡ |  |j¡ |  |j|	¡ |  |j	|¡ |  |j|¡ |  |jd u ¡ |||jƒ}|  |j|¡ |  |jd¡ |  |j|¡ |  |jd u ¡ |  |j¡ |  |jd u ¡ |  |j	d u ¡ |||jƒ}|  |j|¡ |  |jd¡ |  |j|¡ |  |jd u ¡ |  |j¡ |  |j|	¡ |  |j	d u ¡ |||jƒ}|  |jd¡ |||jƒ}|  |jd¡ |||jƒ}|  |jd¡ d S )N)r-   rN   r   r+   rz   r)   )!r‹  rŽ  r3   r4   r5   r  r  r…   r;   rú   r   r   r9   r‘  r   r’   rI  r’  r“   r“  r”  r•  r  r6   r›  r–  r—  r˜  r  rœ  r™  rš  rH  )r   r‹  rŽ  rs   Úar_2Dr   rA   r’  r…   r;   r   rú   r¢  r•  r£  r   r   r   r   r   Útest_newbuf_1D5  s’   
z&PixelArrayNewBufferTest.test_newbuf_1DN)
r%   r&   r'   r3   ÚHAVE_NEWBUFÚpygame.tests.test_utilsr‹  r  r¥  r§  r   r   r   r   rŠ  £  s     rŠ  Ú__main__)r¡   rƒ  Úplatformrâ   rf  rŸ   Ú	functoolsr   r©  r   r   Ú	NameErrorr3   Úpython_implementationrh  r   rg  ÚTestCaser(   ri  r¨  rŠ  r%   Úmainr   r   r   r   Ú<module>   sJ    ÿ
         
w 
 ^ÿ