
    ^j,                      U d dl mZ d dlZd dlZd dlZd dlmZmZ d dlm	Z	 d dl
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ d dl m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' d dl(Z(d dl)m*Z*m+Z+m,Z,m-Z- d dl.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZI d d	lJmKZKmLZL e!rd d
lMmNZN d dlOmPZPmQZQ d dlRmSZSmTZT e(jU        d         ZV G d deW          ZXe&e         ZYeZZe$d         Z[e'e&e,j\                 e&e,j]                 e&e,j^                 e_f         Z`e#Zae,jb        ee,jc        ee,jd        ee,je        ee,jf        ee,jg        ee,jh        ee,ji        eiZjdekd<   e,jl        e,jm        e,jn        e,jo        e,jp        e,jq        dZrdekd<   e,j\        e,js        e,j]        e,jt        e,j^        e,js        iZudekd<   i e,jv        e,j\        e,jw        e,jx        dfe,jy        e,j\        e,jw        e,jx        dfe,jz        e,j\        e,jw        e,jx        dfe,j{        e,j\        e,jw        e,jx        dfe,jf        e,j\        e,jw        e,jx        dfe,j|        e,j\        e,j}        e,j~        dfe,j        e,j\        e,j        e,j        dfe,j        e,j\        e,j        e,j        dfe,jg        e,j        e,j        e,j        dfe,j        e,j        e,j        e,j        dfe,j        e,j        e,j        e,j        dfe,j        e,j        e,j        e,j        dfe,jh        e,j]        e,j        e,j        dfe,j        e,j]        e,j        e,j        dfe,j        e,j]        e,j        e,j        dfe,j        e,j]        e,j        e,j        dfe,j        e,j\        e,jw        e,jx        dfi e,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfi e,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j]        e,j        e,j        dfe,j        e,j]        e,j        e,j        dfe,j        e,j]        e,j        e,j        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfi e,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfe,j        e,j\        e,jw        e,jx        dfiZdekd<   i e,jv        d e,jy        d!e,jz        d"e,j{        d#e,jf        d$e,j|        d%e,j        d&e,j        d'e,jg        d(e,j        d)e,j        d*e,j        d+e,jh        d,e,j        d-e,j        d.e,j        d/e,ji        d0e,j        d1e,j        d2e,j        d3iZd4ekd5<    G d6 d7          Z G d8 d9          Ze,j        e,j        e,j        e,j        e,j        e,j        e,j        e,j        e,j        f	Zd:ekd;<    G d< d=          Zdfd@Z G dA dB          Z ej        dC          Z G dD dE          Z G dF dG          ZdgdJZdhdMZdidOZdjdRZdkdTZdhdUZdldYZdmdZZdnd^Z G d_ d`          Z G da dQ          Z G db dc          Z G dd de          ZdS )o    )annotationsN)_Pointer_SimpleCData)defaultdict)POINTERArray	Structure	addressofbyrefc_bufferc_bytec_charc_char_pc_doublec_floatc_intc_shortc_ubytec_uintc_ushortcastcreate_string_bufferpointersizeof	string_at)TYPE_CHECKINGAnyCallableLiteralSequenceTypeUnion)ContextGLExceptionglgl_info)GL_ARRAY_BUFFERGL_FALSEGL_INFO_LOG_LENGTHGL_LINK_STATUSGL_MAP_READ_BITGL_TRUEGL_UNIFORM_BUFFERglAttachShaderglBindBufferglBindBufferBaseglCreateProgramglDeleteProgramglDeleteShaderglDetachShaderglDispatchComputeglEnableVertexAttribArrayglGetActiveAttribglGetProgramInfoLogglGetProgramivglLinkProgramglMapBufferRangeglMemoryBarrierglUnmapBufferglUseProgramglVertexAttribDivisorglVertexAttribIPointerglVertexAttribPointer)AttributeBufferObjectBufferObject)CallableProxyType)BatchGroup)IndexedVertexList
VertexListdebug_gl_shadersc                      e Zd ZdS )ShaderExceptionN)__name__
__module____qualname__     Q/home/agentuser/manim-venv/lib/python3.11/site-packages/pyglet/graphics/shader.pyrK   rK   K   s        DrP   rK   )vertexfragmentgeometrycomputetesscontroltessevaluationzdict[int, CTypesDataType]_c_types)rU   rS   rT   rV   rW   rR   zdict[ShaderType, int]_shader_typeszdict[GLDataType, Callable]_uniform_getters            	      z1dict[int, tuple[GLDataType, GLFunc, GLFunc, int]]_uniform_setters)r[   ?)r\   rb   )r]   rb   )r^   rb   )r[   i)r\   rc   )r]   rc   )r^   rc   )r[   I)r\   rd   )r]   rd   )r^   rd   )r[   f)r\   re   )r]   re   )r^   re   )r[   d)r\   rf   )r]   rf   )r^   rf   zdict[int, tuple[int, str]]_attribute_typesc                      e Zd ZU dZded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   ded<   d dZd!dZd"dZd!dZd#dZ	d$dZ
d%dZdS )&	Attributez6Abstract accessor for an attribute in a mapped buffer.intstrideelement_sizeCTypesDataTypec_typeboolinstance	normalizegl_typecountlocationstrnamereturnNonec                v   || _         || _        || _        || _        || _        || _        t          |         | _        t          | j                  | _	        || j	        z  | _
        |t          j        t          j        t          j        t          j        t          j        t          j        fv o| j        du | _        dS )a  Create the attribute accessor.

        Args:
            name:
                Name of the vertex attribute.
            location:
                Location (index) of the vertex attribute.
            count:
                Number of components in the attribute.
            gl_type:
                OpenGL type enumerant; for example, ``GL_FLOAT``
            normalize:
                True if OpenGL should normalize the values
            instance:
                True if OpenGL should treat this as an instanced attribute.

        FN)rv   rt   rs   rr   rq   rp   rX   rn   r   rl   rk   r%   GL_INTGL_SHORTGL_BYTEGL_UNSIGNED_INTGL_UNSIGNED_SHORTGL_UNSIGNED_BYTE_is_int)selfrv   rt   rs   rr   rq   rp   s          rQ   __init__zAttribute.__init__  s    $ 	 
" w'"4;//d//29bk2:rGY#%#79L#N N jRVR`diRi 	rP   c                .    t          | j                   dS )zEnable the attribute.N)r6   rt   r   s    rQ   enablezAttribute.enable"  s    !$-00000rP   ptrc                    | j         r)t          | j        | j        | j        | j        |           dS t          | j        | j        | j        | j        | j        |           dS )a  Setup this attribute to point to the currently bound buffer at the given offset.

        ``offset`` should be based on the currently bound buffer's ``ptr`` member.

        Args:
            ptr:
                Pointer offset to the currently bound buffer for this attribute.

        N)r   r@   rt   rs   rr   rk   rA   rq   )r   r   s     rQ   set_pointerzAttribute.set_pointer&  s_     < 	m"4=$*dlDKY\]]]]]!$-T\4>[_[fhklllllrP   c                0    t          | j        d           d S Nr[   )r?   rt   r   s    rQ   set_divisorzAttribute.set_divisor5  s    dmQ/////rP   bufferrB   startArray[CTypesDataType]c                .    |                     ||          S )a  Map a buffer region using this attribute as an accessor.

        The returned region consists of a contiguous array of component
        data elements.  For example, if this attribute uses 3 floats per
        vertex, and the `count` parameter is 4, the number of floats mapped
        will be ``3 * 4 = 12``.

        Args:
            buffer:
                The buffer to map.
            start:
                Offset of the first vertex to map.
            count:
                Number of vertices to map
        )
get_region)r   r   r   rs   s       rQ   r   zAttribute.get_region8  s        ...rP   dataSequence[float]c                4    |                     |||           dS )a=  Set the data over a region of the buffer.

        Args:
            buffer:
                The buffer to map.
            start:
                Offset of the first vertex to map.
            count:
                Number of vertices to map
            data:
                A sequence of data components.

        N)
set_region)r   r   r   rs   r   s        rQ   r   zAttribute.set_regionJ  s"     	%-----rP   c                8    d| j          d| j         d| j         dS )NzAttribute(name='z', location=z, count=))rv   rt   rs   r   s    rQ   __repr__zAttribute.__repr__Z  s+    ]$)]]]]PTPZ]]]]rP   N)rv   ru   rt   rj   rs   rj   rr   rj   rq   ro   rp   ro   rw   rx   rw   rx   )r   rj   rw   rx   )r   rB   r   rj   rs   rj   rw   r   )
r   rB   r   rj   rs   rj   r   r   rw   rx   rw   ru   )rL   rM   rN   __doc____annotations__r   r   r   r   r   r   r   rO   rP   rQ   ri   ri      s        @@KKKNNNOOOLLLJJJMMMIIIj j j jB1 1 1 1m m m m0 0 0 0/ / / /$. . . . ^ ^ ^ ^ ^ ^rP   ri   c                      e Zd ZU dZded<   ded<   ded<   ded<   d	ed
<   d	ed<   ded<   ded<   ded<   dZd3dZd4dZd4dZd5d Z	d6d"Z
d7d%Zd8d(Zd9d)Zd:d+Zd;d<d/Zd=d1Zd2S )>_UniformArraya?  Wrapper of the GLSL array data inside a Uniform.

    Allows access to get and set items for a more Pythonic implementation.
    Types with a length longer than 1 will be returned as tuples as an inner list would not support individual value
    reassignment. Array data must either be set in full, or by indexing.
    _Uniform_uniform
GLDataType_gl_typeGLFunc
_gl_getter
_gl_setterro   
_is_matrix_dsaArray[GLDataType]_c_arrayCTypesPointer[GLDataType]_ptrzdict[int, int]_idx_to_loc)	r   r   r   r   r   r   r   r   r   uniform	gl_getter	gl_setterrr   	is_matrixdsarw   rx   c                b   || _         || _        || _        || _        || _        i | _        || _        | j         j        dk    r* || j         j        z  | j         j        z              | _	        n || j         j        z              | _	        t          | j	        t          |                    | _        d S r   )r   r   r   r   r   r   r   lengthsizer   r   r   r   )r   r   r   r   rr   r   r   s          rQ   r   z_UniformArray.__init__{  s    ###	=!##PWt}';;dm>PPSSDMM9Wt}'99<<DM(8(899			rP   indexrj   c           	         t          j        | j        j        t	          | j        j         d| d                                                    }|S )a  Get the location for the array name.

        It is not guaranteed that the location ID's of the uniform in the shader program will be a contiguous offset.

        On MacOS, the location ID of index 0 may be 1, and then index 2 might be 5. Whereas on Windows it may be a 1:1
        offset from 0 to index. Here, we store the location ID's of each index to ensure we are setting data on the
        right location.
        [])r%   glGetUniformLocationr   programr   rv   encode)r   r   locs      rQ   _get_location_for_indexz%_UniformArray._get_location_for_index  sQ     %dm&; 48J5U5UU5U5U5U5\5\5^5^ _ _a a
rP   c                    	 | j         |         S # t          $ r" |                     |          x}| j         |<   Y nw xY w|dk    r!| j        j         d| d}t          |          |S )Nr   zM] not found.
This may have been optimized out by the OpenGL driver if unused.)r   KeyErrorr   r   rv   rK   )r   r   r   msgs       rQ   _get_array_locz_UniformArray._get_array_loc  s    	P#E** 	P 	P 	P,0,H,H,O,OOC$"5)))	P "99]'%C!#&&&
s    );;c                    | j         j        S N)r   r   r   s    rQ   __len__z_UniformArray.__len__  s    }!!rP   keyc                $    d}t          |          )Nz0Deleting items is not support for UniformArrays.rK   )r   r   r   s      rQ   __delitem__z_UniformArray.__delitem__  s    @c"""rP   slice | intlist[tuple] | tuplec                l   t          |t                    rB| j        |         }| j        j        dk    rd |D             S t          d |D                       S 	 | j        |         }| j        j        dk    rt          |          n|S # t          $ r" | j        j         d| d}t          |          w xY w)Nr[   c                ,    g | ]}t          |          S rO   )tuple.0r   s     rQ   
<listcomp>z-_UniformArray.__getitem__.<locals>.<listcomp>  s    <<<d<<<rP   c                    g | ]}|S rO   rO   r   s     rQ   r   z-_UniformArray.__getitem__.<locals>.<listcomp>  s    7774$777rP   r   zM] not found. This may have been optimized out by the OpenGL driver if unused.)	
isinstanceslicer   r   r   r   
IndexErrorrv   rK   )r   r   sliced_datavaluer   s        rQ   __getitem__z_UniformArray.__getitem__  s    c5!! 	9-,K}#a''<<<<<<77;777888	'M#&E#'=#7!#;#;5<<<F 	' 	' 	']'||#|||C!#&&&	's   -B ,B3r   r    c                   t          |t                    r&|| j        |<   |                     | j                   d S || j        |<   | j        j        dk    r]t          |          | j        j        k    s(J d| j        j         dt          |           d             | j        | j        j        z  | }n|                     |          }|                     ||           d S )Nr[   zSetting this key requires z values, received .)offset)	r   r   r   _update_uniformr   r   r   lenr   )r   r   r   r   s       rQ   __setitem__z_UniformArray.__setitem__  s   c5!! 	!&DM#  +++F"c=!## -./ / /2KdmNb 2K 2K=@ZZ2K 2K 2K/ / / 9DMDM$885ADD==''DT#.....rP   c                f    |                      | j        j        | j        j        | j                   | S r   )r   r   r   rt   r   r   s    rQ   getz_UniformArray.get  s)    -t}/EtyQQQrP   valuesc                    t          | j                  t          |          k    s0J dt          |           dt          | j                   d            || j        d d <   |                     | j                   d S )NzSize of data (z&) does not match size of the uniform: r   )r   r   r   r   )r   r   s     rQ   setz_UniformArray.set  s    4=!!S& &   nc&kknnY\]a]jYkYknnn   "aaaTY'''''rP   r   r   r   c                   |dk    rd}n| j         j        }|                     |          }| j        rU| j        r*|                     | j         j        ||t          |           d S |                     | j         j        |||           d S t          | j         j                   | j        r|                     ||t          |           d S |                     |||           d S Nr   r[   )	r   r   r   r   r   r   r   r(   r>   )r   r   r   r   rt   s        rQ   r   z_UniformArray._update_uniform  s    Q;;DD=%D//779 
	6 M 5xxQUVVVVV 5xtLLLLL./// 6$$?????$55555rP   ru   c                F      fd j         D             }d j         d| dS )Nc                R    g | ]#}j         j        d k    rt          |          n|$S )r[   )r   r   r   )r   r   r   s     rQ   r   z*_UniformArray.__repr__.<locals>.<listcomp>  s2    \\\dt}3a77dT\\\rP   zUniformArray(uniform=z, data=r   )r   r   )r   r   s   ` rQ   r   z_UniformArray.__repr__  s9    \\\\dm\\\Dt}DDTDDDDrP   N)r   r   r   r   r   r   rr   r   r   ro   r   ro   rw   rx   )r   rj   rw   rj   rw   rj   )r   rj   rw   rx   )r   r   rw   r   )r   r   r   r    rw   rx   )rw   r   )r   r    rw   rx   r   )r   r    r   rj   rw   rx   r   )rL   rM   rN   r   r   	__slots__r   r   r   r   r   r   r   r   r   r   r   rO   rP   rQ   r   r   ^  sy          JJJ####
I: : : :"   
 
 
 
" " " "# # # #' ' ' ' / / / /$   ( ( ( (6 6 6 6 6(E E E E E ErP   r   ztuple[int, ...]_gl_matricesc                      e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   d	ed
<   ded<   dZd"dZed#d            Zed$d            Zd%d Z	d!S )&r   rj   typer   rt   r   ru   rv   r   ,Callable[[], Array[GLDataType] | GLDataType]r   z4Callable[[float], None] | Callable[[Sequence], None]r   )	rs   r   r   rt   rv   r   r   r   r   uniform_typer   ro   rw   rx   c           
        || _         || _        || _        || _        || _        t
          |         \  }}}	}
|r|	n|}t          |         }|
| _        |t          v }|dk    r.t          | |||||          }|j
        | _
        |j        | _        d S  ||
z              }t          |t          |                    }|                     |||||
          | _
        |                     |||||
|||          | _        d S r   )rv   r   r   rt   r   ra   rZ   r   r   r   r   r   r   r   _create_getter_func_create_setter_func)r   r   rv   r   r   rt   r   rr   gl_setter_legacygl_setter_dsar   r   r   r   arrayc_arrayr   s                    rQ   r   z_Uniform.__init__  s   	 		 ;KL;Y8!=&%(>MM.>	$W-	  L0	 !88!$	9gyRUVVEyDHyDHHH*:'F*:)=)=Gw 0 011C//9gW]^^DH//9gW]_bdmorssDHHHrP   
program_idr   r   r   r   c                @     |dk    r
d fd}n	d fd}|S )	z9Factory function for creating simplified Uniform getters.r[   rw   r   c                 .                  d         S Nr   rO   r   r   rt   r   s   rQ   getter_funcz1_Uniform._create_getter_func.<locals>.getter_func&  s!    	*h888qz!rP   r   c                 2                  d d          S r   rO   r   s   rQ   r   z1_Uniform._create_getter_func.<locals>.getter_func*  s%    	*h888qqqz!rP   )rw   r   )rw   r   rO   )r   rt   r   r   r   r   s   ````  rQ   r   z_Uniform._create_getter_func!  sx     Q;;" " " " " " " " " "" " " " " " " " " rP   r   r   r   r   Callable[[float], None]c                    |rB|rd fd}n3|dk    rd fd}n"|dk    rd fd	}nd
}	t          |	          |S |rd fd}n3|dk    rd fd}n"|dk    rd fd}nd
}	t          |	          |S )z9Factory function for creating simplified Uniform setters.r   floatrw   rx   c                >    | d d <    dt                      d S r   )r(   r   r   r   rt   r   r   s    rQ   setter_funcz1_Uniform._create_setter_func.<locals>.setter_func7  s.    !&GAAAJIj(AxEEEEErP   r[   c                .    | d<    d           d S r   rO   r  s    rQ   r  z1_Uniform._create_setter_func.<locals>.setter_func;  s(    !&GAJIj(As;;;;;rP   r   c                2    | d d <    d           d S r   rO   r   r   r   rt   r   r   s    rQ   r  z1_Uniform._create_setter_func.<locals>.setter_func?  s,    !'GAAAJIj(As;;;;;rP   zUniform type not yet supported.c                Z    t                     | d d <    dt                     d S r   )r>   r(   r  s    rQ   r  z1_Uniform._create_setter_func.<locals>.setter_funcJ  s:    Z((("
	(Ax55555rP   c                J    t                     | d<    d           d S r   r>   r  s    rQ   r  z1_Uniform._create_setter_func.<locals>.setter_funcO  s4    Z((("
	(As+++++rP   c                N    t                     | d d <    d           d S r   r  r  s    rQ   r  z1_Uniform._create_setter_func.<locals>.setter_funcT  s8    Z(((#
	(As+++++rP   )r   r   rw   rx   )r   r   rw   rx   r   )
r   rt   r   r   r   r   r   r   r  r   s
   ```` `    rQ   r   z_Uniform._create_setter_func0  s     	 +F F F F F F F F F F F 1< < < < < < < < < < < !< < < < < < < < < < <
 8%c*** 	'6 6 6 6 6 6 6 6 6 6 6 q[[, , , , , , , , , , , aZZ, , , , , , , , , , ,
 4C!#&&&rP   c                8    d| j          d| j         d| j         dS )NzUniform(type=, size=, location=r   )r   r   rt   r   s    rQ   r   z_Uniform.__repr__^  s)    WtyWWWWt}WWWWrP   N)r   rj   rv   ru   r   rj   r   rj   rt   rj   r   ro   rw   rx   )r   rj   rt   rj   r   r   r   r   r   rj   rw   r   )r   rj   rt   rj   r   r   r   r   r   rj   r   r   r   ro   r   ro   rw   r   r   )
rL   rM   rN   r   r   r   staticmethodr   r   r   rO   rP   rQ   r   r     s         IIIIIIMMMLLLIIIKKK5555====^It t t t8    \ + + + \+ZX X X X X XrP   r   rw   rj   c                     t          j                    } t          j        t           j        t	          |                      | j        S )z=The maximum binding value that can be used for this hardware.)r%   GLintglGetIntegervGL_MAX_UNIFORM_BUFFER_BINDINGSr   r   )vals    rQ   get_maximum_binding_countr  b  s1    
(**CR6c

CCC9rP   c                      e Zd ZU dZded<   ded<   ded<   ded	<   d
ed<   d dZe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S )'_UBOBindingManagerzKManages the global Uniform Block binding assignments in the OpenGL context.zset[int]_in_usez	list[int]_poolrj   _max_binding_countzdict[str, int]
_ubo_namesz0defaultdict[Any, weakref.WeakSet[ShaderProgram]]_ubo_programsrw   rx   c                    t          t          j                  | _        ddi| _        t                      | _        t          t          d| j                            | _	        dh| _
        d S )NWindowBlockr   r[   )r   weakrefWeakSetr  r  r  r  listranger  r  r   s    rQ   r   z_UBOBindingManager.__init__q  sW    (99(!,";"="=%4#:;;<<
srP   c                    | j         S r   )r  r   s    rQ   	max_valuez_UBOBindingManager.max_valuey  s    &&rP   binding
str | Nonec                X    | j                                         D ]\  }}||k    r|c S dS )z;Return the uniform name associated with the binding number.N)r  items)r   r#  rv   current_bindings       rQ   get_namez_UBOBindingManager.get_name}  sB    %)_%:%:%<%< 	 	!D//)) *trP   ro   c                    || j         v S )z)Check if a binding index value is in use.)r  r   r#  s     rQ   binding_existsz!_UBOBindingManager.binding_exists  s    $,&&rP   shader_programShaderProgramub_nameru   c                    | j         |                             |           || j        |<   || j        v r| j                            |           | j                            |           dS )z8Used when a uniform block has set its own binding point.N)r  addr  r  remover  r   r,  r.  r#  s       rQ   add_explicit_bindingz'_UBOBindingManager.add_explicit_binding  si    7#''777#* dj  Jg&&&!!!!!rP   c                    | j         |                             |           || j        v r| j        |         S |                                  |                                 }|| j        |<   |S )z1Retrieve a global Uniform Block Binding ID value.)r  r0  r  _check_freed_bindings_get_new_bindingr2  s       rQ   get_bindingz_UBOBindingManager.get_binding  sl    7#''777do%%?7++""$$$''))#* rP   c                    t          | j                  D ]E}|dk    r=| j        |         s0| j        |= |                     | j        |                    | j        |= FdS )zLFind and remove any Uniform Block names that no longer have a shader in use.r  N)r  r  return_bindingr  )r   ubo_names     rQ   r5  z(_UBOBindingManager._check_freed_bindings  so    T/00 	. 	.H=((1CH1M(&x0##DOH$=>>>OH-	. 	.rP   c                    | j         sd}t          |          | j                             d          }| j                            |           |S )Nz'All Uniform Buffer Bindings are in use.r   )r  
ValueErrorpopr  r0  )r   r   numbers      rQ   r6  z#_UBOBindingManager._get_new_binding  sK    z 	";CS//!""   rP   r   c                    || j         v r6| j                            |           | j                             |           d S d| d}t	          |          )NzUniform binding point: z is not in use.)r  r  appendr1  r<  )r   r   r   s      rQ   r9  z!_UBOBindingManager.return_binding  s]    DL  Je$$$L&&&&&BEBBBCS//!rP   Nr   r   )r#  rj   rw   r$  )r#  rj   rw   ro   )r,  r-  r.  ru   r#  rj   rw   rx   )r,  r-  r.  ru   rw   rj   )r   rj   rw   rx   )rL   rM   rN   r   r   r   propertyr"  r(  r+  r3  r7  r5  r6  r9  rO   rP   rQ   r  r  i  s        UUCCCC    ' ' ' X'   ' ' ' '" " " "   . . . .   " " " " " "rP   r  z(\w+)\[(\d+)\]c                      e Zd ZU ded<   ded<   ded<   ded<   ded<   d	ed
<   ded<   dZddZddZddZddZddZ	d dZ
dS )!UniformBlockz1CallableProxyType[Callable[..., Any] | Any] | Anyr   ru   rv   rj   r   r   r#  +dict[int, tuple[str, GLDataType, int, int]]uniformsztype[Structure] | Noneview_cls)r#  r   rv   r   r   uniform_countrE  rF  r-  rG  rw   rx   c                    t          j        |          | _        || _        || _        || _        || _        || _        || _        d| _	        dS )z/Initialize a uniform block for a ShaderProgram.N)
r  proxyr   rv   r   r   r#  rE  rG  rF  )r   r   rv   r   r   r#  rE  rG  s           rQ   r   zUniformBlock.__init__  sK     }W--	
	 *rP   UniformBufferObjectc                    | j         |                                 | _         t          | j         | j        | j                  S )z9Create a new UniformBufferObject from this uniform block.)rF  _introspect_uniformsrJ  r   r#  r   s    rQ   
create_ubozUniformBlock.create_ubo  s5    =  5577DM"4=$)T\JJJrP   c                   |dk    s
J d            t           j        j        
J d            t           j        j        j        }||j        k    rd|j         }t          |          |                    |          }|r(|| j        k    rd| d| d}t          j	        |           || _
        t          j        | j        j        | j        | j
                   dS )	a  Rebind the Uniform Block to a new binding index number.

        This only affects the program this Uniform Block is derived from.

        Binding value of 0 is reserved for the Pyglet's internal uniform block named ``WindowBlock``.

        .. warning:: By setting a binding manually, the user is expected to manage all Uniform Block bindings
                     for all shader programs manually. Since the internal global ID's will be unaware of changes set
                     by this function, collisions may occur if you use a lower number.

        .. note:: You must call ``create_ubo`` to get another Uniform Buffer Object after calling this,
                  as the previous buffers are still bound to the old binding point.
        r   z<Binding 0 is reserved for the internal Pyglet 'WindowBlock'.NzNo context available.z3Binding value exceeds maximum allowed by hardware: z	Binding: z was in use by z, and has been overridden.)pygletr%   current_contextubo_managerr"  rK   r(  rv   warningswarnr#  glUniformBlockBindingr   idr   )r   r#  managerr   existing_names        rQ   set_bindingzUniformBlock.set_binding  s     !|||[|||y(446M444&,i&?&Kg'''[HY[[C!#&&&((11 	]di77_g__m___CM#
 $*dlKKKKKrP   type[Structure]c                   | j         j        }| j        }| j        }t	          j        |z              }t	          j        |z              }t          t          |          t          t          j                            }t          t          |          t          t          j                            }t	          j
        ||t          j        |           t	          j        |||t          j        |           t          t          ||          d           }d |D             | j        gz   }t	          j        |z  d |D              }i i }	d}
d dfdt#          |          D ]}| j        ||                  \  }}}}|                    d          }|	}t)          |          D ]S\  }}|}t*                              |          }|r|                                \  }}|}|t1          |          dz
  k    rYt3          |          }t5                              |d          |dz             |<   |         dk    r n||vri ||<   ||         }|t1          |          dz
  k    r|dk    r|dk    r||z  |z  ||<   n||z  ||<   n|dk    r	||z  ||<   n|||<   ||dz            ||         z
  }t9          ||                   }||z
  }|dk    rt:          |z  |d|
 <   |
dz  }
B||vri ||<   ||         }U d|	          S )ziIntrospect the block's structure and return a ctypes struct for manipulating the uniform block's members.c                    | d         S r   rO   )xs    rQ   <lambda>z3UniformBlock._introspect_uniforms.<locals>.<lambda>  s
    !A$ rP   )r   c                    g | ]
}|d          S r   rO   r   r\  s     rQ   r   z5UniformBlock._introspect_uniforms.<locals>.<listcomp>  s    %%%A1Q4%%%rP   c              3  &   K   | ]}|d          V  dS )r[   NrO   r_  s     rQ   	<genexpr>z4UniformBlock._introspect_uniforms.<locals>.<genexpr>  s&      .A.Aqt.A.A.A.A.A.ArP   r   c                D    t          t          | j                            S r   )ru   dict_fields_)ss    rQ   r]  z3UniformBlock._introspect_uniforms.<locals>.<lambda>  s    Saj!1!122 rP   rv   ru   struct_dictrc  rw   r   c                p   g }|                                 D ]s\  }}t          |t                    r* ||          }|}|v r|         dk    r||         z  }n|                    ||f           \|                    ||f           tt	          |                                 t          f|d          S )Nr[   )rd  r   )r&  r   rc  r@  r   titler	   )	rv   rf  fields
field_name
field_typeelement_structarray_sizesbuild_ctypes_structrep_funcs	         rQ   rn  z>UniformBlock._introspect_uniforms.<locals>.build_ctypes_struct  s    F*5*;*;*=*= 8 8&
Jj$// 	%8%8Z%P%PN!/J![00[5Lq5P5P%3k*6M%M
 MM:z":;;;z:67777

ylU]4^4^___rP   r   r[   _paddingView)rv   ru   rf  rc  rw   r   )r   rU  r   rG  r%   GLuintr  r   r
   r   glGetActiveUniformBlockiv'GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICESglGetActiveUniformsivGL_UNIFORM_OFFSETsortedzipr   r   rE  split	enumeratearray_regexmatchgroupsr   rj   maxr   r   r   )r   p_idr   active_countindicesoffsetsindices_ptroffsets_ptr_oidynamic_structsp_countrc   u_namerr   r   u_sizepartscurrent_structurepart_idxpart	part_namer|  arr_nameoffset_sizec_type_sizepaddingrm  rn  ro  s                             @@@rQ   rL  z!UniformBlock._introspect_uniforms  s   |
) 9|+..8l*--9W--wrx/@/@AA9W--wrx/@/@AA
$T5"2\^ijjj
 |Wb>RT_``` S'**???%%%%%39|+.A.AS.A.A.AB 22	` 	` 	` 	` 	` 	` 	` 	`$ |$$ :	E :	EA.2mGAJ.G+FGVVLL%%E /"+E"2"2 4E 4E$ 	#)))44 !&+llnnOHe (I3u::>11 #E

 14KOOHa4P4PRWZ[R[0\0\H-&x0144!E#+<<<:<-h7,=h,G)  s5zzA~--zz!A::<Cf<LPV;V-i88;BV;K-i88!A::;BV;K-i88;B-i8")!a%.71:"=K"():9)E"F"FK)K7G {{BH7BR)*>W*>*>?1 (99979))4(9)(D%% #"6?;;;rP   c                    t          j                    }t          j        | j        j        | j        t           j        |           |j        S )z8Queries OpenGL to find what the bind point currently is.)r%   r  rs  r   rU  r   GL_UNIFORM_BLOCK_BINDINGr   r*  s     rQ   _actual_binding_pointz"UniformBlock._actual_binding_pointe  s6    (**
$T\_dj"B]_fggg}rP   c           
     j    | j         j         d| j        j         d| j         d| j         d| j         d
S )Nz	(program=r  r  
, binding=r   )	__class__rL   r   rU  r   r   r#  r   s    rQ   r   zUniformBlock.__repr__k  s]    >* + +T\_ + +QUQ[ + +dhdm + +<+ + + 	,rP   N)r   r-  rv   ru   r   rj   r   rj   r#  rj   rE  rD  rG  rj   rw   rx   )rw   rJ  )r#  rj   rw   rx   )rw   rY  r   r   )rL   rM   rN   r   r   r   rM  rX  rL  r  r   rO   rP   rQ   rC  rC    s         >>>>IIIJJJIIILLL9999$$$$fI
 
 
 
K K K KL L L L8q< q< q< q<f   , , , , , ,rP   rC  c                      e Zd ZU ded<   ded<   ded<   ded<   ded<   d	ZddZedd            ZddZddZ	ddZ
ddZddZdS )rJ  rC   r   r	   viewzCTypesPointer[Structure]	_view_ptrrj   r#  )r  r#  r   r  
view_classrY  buffer_sizerw   rx   c                    t          |          | _         |            | _        t          | j                  | _        || _        dS )zBInitialize the Uniform Buffer Object with the specified Structure.N)rC   r   r  r   r  r#  )r   r  r  r#  s       rQ   r   zUniformBufferObject.__init__x  s:    ";//JLL	 ++rP   c                    | j         j        S )z'The buffer ID associated with this UBO.)r   rU  r   s    rQ   rU  zUniformBufferObject.id  s     {~rP   c                P    t          t          | j        | j        j                   dS )zKBind this buffer to the bind point established by the UniformBuffer parent.N)r0   r-   r#  r   rU  r   s    rQ   bindzUniformBufferObject.bind  s!    *DL$+.IIIIIrP   bytesc                    t          t          | j        j                   t	          t          d| j        j        t                    }t          || j        j                  }t          t                     |S )z%Read the byte contents of the buffer.r   )r   )	r/   r'   r   rU  r;   r   r+   r   r=   )r   r   r   s      rQ   readzUniformBufferObject.read  sX    _dkn5554;3C_UU4;#3444o&&&rP   c                    | j         S r   )r  r   s    rQ   	__enter__zUniformBufferObject.__enter__  s
    yrP   c                l    |                                   | j                            | j                   d S r   )r  r   set_datar  )r   	_exc_type_exc_val_exc_tbs       rQ   __exit__zUniformBufferObject.__exit__  s-    		T^,,,,,rP   ru   c                J    | j         j         d| j        j         d| j         dS )N(id=r  r   )r  rL   r   rU  r#  r   s    rQ   r   zUniformBufferObject.__repr__  s,    .)XXt{~XXXXXXrP   N)r  rY  r  rj   r#  rj   rw   rx   r   r   )rw   r  )rw   r	   r   )rL   rM   rN   r   r   r   rA  rU  r  r  r  r  r   rO   rP   rQ   rJ  rJ  p  s         OOO''''LLL8I       XJ J J J      - - - -Y Y Y Y Y YrP   rJ  r   variable_typec                t    t          j        d          }t          | |t          |                     |j        S )z9Get the number of active variables of the passed GL type.r   )r%   r  r9   r   r   )r   r  r>  s      rQ   _get_numberr    s/    Xa[[F:}eFmm<<<<rP   r   tuple[str, int, int]c           	        t          j                    }t          j                    }d}t          |          }	 t	          | ||d|||           |j                                        |j        |j        fS # t          $ r}t          |d}~ww xY w)z8Query the name, type, and size of an Attribute by index.   N)	r%   r  GLenumr   r7   r   decoder$   rK   )r   r   asizeatypebuf_sizeanameexcs          rQ   _query_attributer    s    HJJEIKKEH **E'*eXtUE5QQQ{!!##U[%+== ' ' '3&'s   :A4 4
B>BBdict[str, Any]c           	        i }t          t          | t          j                            D ]n}t	          | |          \  }}}t          j        | t          |                    d                              }|dk    rRt          |         \  }}|||||dd||<   ot          r)|
                                D ]}	t          d|	            |S )zBIntrospect a Program's Attributes, and return a dict of accessors.utf-8r   F)r   r   rt   rs   formatrp   z Found attribute: )r   r  r%   GL_ACTIVE_ATTRIBUTESr  glGetAttribLocationr   r   rg   _debug_gl_shadersr   print)
r   
attributesr   a_namea_typea_sizer   rs   fmt	attributes
             rQ   _introspect_attributesr    s    J{:r/FGGHH 	
 	
!1*e!D!D$Z1EfmmT[F\F\1]1]^^"99%f-
sFeWZ
 

6
  4#**,, 	4 	4I2y223333rP   shadersShaderc                    t                      }| D ]}t          ||j                   t          |           t	                      }t          |t          t          |                     |j        st	                      }t          |t          |           t          |j                  }t          |t          |          d|           d|j                                         }t          |          | D ]}t          ||j                   |S )zvLink one or more Shaders into a ShaderProgram.

    Returns:
        The ID assigned to the linked ShaderProgram.
    NzError linking shader program:
)r1   r.   rU  r:   r   r9   r*   r   r   r)   r   r8   r   r  rK   r4   )r  r   shaderstatusr   logr   s          rQ   _link_programr    s    !""J . .z69----* WWF:~uV}}===< #z#5v>>>v|$$JC$<<<D	0@0@0B0BDDc"""  . .z69----rP   ru   c                    t          d          }t          | t          t          |                     t	          |j                  }t          | |d|           |j        r
d|j         S d|  dS )z Query a ShaderProgram link logs.r   NzAOpenGL returned the following message when linking the program: 
z	Program 'z' linked successfully.)r   r9   r)   r   r   r   r8   )r   result
result_strs      rQ   _get_program_logr    sx    1XXF:15==AAA%fl33J
FD*=== gfT^Tdfff9z9999rP   c           	     &   t          j                    }t          j                    }d}t          |          }	 t          j        | ||d|||           |j                                        |j        |j        fS # t          $ r}t          |d}~ww xY w)z5Query the name, type, and size of a Uniform by index.r  N)	r%   r  r  r   glGetActiveUniformr   r  r$   rK   )r   r   usizeutyper  unamer  s          rQ   _query_uniformr    s    HJJEIKKEH **E'
j%4uUUU{!!##U[%+== ' ' '3&'s   ?A9 9
BBBhave_dsaro   dict[str, _Uniform]c           	     n   i }t          t          | t          j                            D ]}t	          | |          \  }}}|                    d          }|dk    r*|                    d          dk    rd}t          |          t          j        | t          |	                    d                              }	|	dk    r|dk    r|
                    d          }||vsJ | d            t          | ||||	|          ||<   t          r)|                                D ]}
t          d	|
            |S )
z@Introspect a Program's uniforms, and return a dict of accessors.z[0]r[   [0][0]r   4Multidimensional arrays are not currently supported.r  r   z? exists twice in the shader. Possible name clash with an array.z Found uniform: )r   r  r%   GL_ACTIVE_UNIFORMSr  rs   rK   r   r   r   stripr   r  r   r  )r   r  rE  r   r  u_typer  array_countr   r   r   s              rQ   rL  rL     s[   H{:r/DEEFF W W!/
E!B!B ll5))??v||H55::HC!#&&&%j2Fv}}U\G]G]2^2^__"99 !\\%((FX%%%&'q'q'q%%%#JXVV 0(( 	0 	0G.W..////OrP   c                    d}t          d          }t          |          }	 t          j        | ||||           |j                                        S # t          $ r d| }t          |          w xY w)z,Query the name of a Uniform Block, by index.   r   z,Unable to query UniformBlock name at index: )r   r   r%   glGetActiveUniformBlockNamer   r  r$   rK   )r   r   r  r   name_bufr   s         rQ   _get_uniform_block_namer    s    H88D#H--H#
&z5(D(SSS~$$&&& # # #DUDDc"""#s   0A A2r   $ShaderProgram | ComputeShaderProgramdict[str, UniformBlock]c                   i }| j         }t          t          |t          j                            D ]}t          ||          }t          j                    }t          j                    }t          j                    }t          j        ||t          j        |           t          j        ||t          j	        |           t          j        ||t          j
        |           t          j        |j        z              }t          t          |          t          t          j                            }	t          j        ||t          j        |	           i }
t#          t$          j        j        d          s"t)                      t$          j        j        _        t$          j        j        j        }|D ]}t-          ||          \  }}}|                    | d          r|t1          |          dz   d          }|                    d          dk    rd}t5          |          t6          |         \  }}}}||||f|
|<   |j        }t$          j        j        r|j        dk    r-|                    | |          }t          j        |||           ne|                     |j                  }|r-||k    r'|  d| d|j         d	| d
}tC          j"        |           |#                    | ||j                   tI          | |||j        ||
t1          |                    ||<   tJ          r)|&                                D ]}tO          d|            |S )NrQ  r   r[   r  r   r  z explicitly set 'z' to z in the shader. 'z' has been overridden.z Found uniform block: )(rU  r   r  r%   GL_ACTIVE_UNIFORM_BLOCKSr  r  rs   GL_UNIFORM_BLOCK_ACTIVE_UNIFORMSGL_UNIFORM_BLOCK_DATA_SIZEr  rr  r   r   r
   r   rt  hasattrrO  rP  r  rQ  r  
startswithr   rs   rK   ra   optionsshader_bind_managementr7  rT  r(  rR  rS  r3  rC  r  r   r  )r   uniform_blocksr   r   rv   
num_activeblock_data_sizer#  r  r  rE  rV  block_uniform_indexuniform_namer  r  r   rr   _r   binding_index_block_nameblocks                          rQ   _introspect_uniform_blocksr  ,  sI   NJ{:r/JKKLL ;8 ;8&z599XZZ
(**(**
$Z8[]ghhh
$Z8UWfggg
$Z8SU\]]]9z//229W--wrx/@/@AA
$Z8bdoppp@Bvy0-@@ 	I4F4H4HFI%1)+7#* 	T 	T+9*FY+Z+Z(L&& &&$zzz22 <+CIIMNN;!!(++a//L%c***$4V$<!GQ6-97FF,SH())>0 	K}!! ' 3 3GT B B (UMJJJJ &..w}== ';$#6#6% / / / /7= / /cn / / /CM#&&&,,WdGMJJJ+GT5/BWYfhp,/LL :  :t  	8'..00 8 86u667777rP   c                  @    e Zd ZU dZded<   ded<   ddZddZddZdS )ShaderSourcea  GLSL source container for making source parsing simpler.

    We support locating out attributes and applying #defines values.

    .. note:: We do assume the source is neat enough to be parsed this way and doesn't contain several statements in
              one line.
    	gl.GLenum_typez	list[str]_linessourceru   source_typerw   rx   c                ~   |                                                                 | _        || _        | j        sd}t	          |          |                                 | _        t          j        j	        
                                                                dk    rd| j        d<   | j                            dd           | j        t          j        k    r| j                            dd           | j        t          j        k    r| j                            dd           |                                 | _        d	S d	S )
zCreate a shader source wrapper.zShader source is emptyglesz#version 310 esr   r[   zprecision mediump float;z+#extension GL_EXT_geometry_shader : requirezprecision mediump image2D;N)r  
splitlinesr  r  rK   _find_glsl_version_versionrO  r%   rP  get_infoget_opengl_apiinsertGL_GEOMETRY_SHADERGL_COMPUTE_SHADER)r   r  r  r   s       rQ   r   zShaderSource.__init__}  s   llnn//11 
{ 	'*C!#&&&//119$--//>>@@FJJ.DKNKq"<===zR222""1&STTTzR111""1&BCCC 3355DMMM KJrP   c                6    d                     | j                  S )z#Return the validated shader source.
)joinr  r   s    rQ   validatezShaderSource.validate  s    yy%%%rP   rj   c                   | j         d                                                             d          rJ	 t          | j         d                                         d                   S # t
          t          f$ r Y nw xY wd                    d t          | j                   D                       }d| }t          |          )Nr   z#versionr[   r  c              3  r   K   | ]2\  }}t          |d z                                 d           d| dV  3dS r[   r]   z:  Nru   zfillr   rc   lines      rQ   ra  z2ShaderSource._find_glsl_version.<locals>.<genexpr>  sO      ccDc!a%jj..q11<<T<<<ccccccrP   zCannot find #version flag in shader source. A #version statement is required on the first line.
------------------------------------
)
r  r  r  rj   ry  r<  r   r  rz  rK   r   r  r   s      rQ   r	  zShaderSource._find_glsl_version  s    ;q>!!,,Z88 	4;q>//11!4555
+    ccIVZVaLbLbccccc   	 c"""s   1A& &A:9A:N)r  ru   r  r  rw   rx   r   r   )rL   rM   rN   r   r   r   r  r	  rO   rP   rQ   r   r   r  sv           6 6 6 6.& & & &# # # # # #rP   r   c                      e Zd ZU dZded<   ded<   ded<   ddZedd            ZddZe	dd            Z
ddZddZddZdS )r  zOpenGL shader.

    Shader objects are compiled on instantiation.
    You can reuse a Shader object in multiple ShaderPrograms.
    Context | None_context
int | None_id
ShaderTyper   source_stringru   shader_typerw   rx   c           
        t           j        j        | _        d| _        || _        	 t          |         }n<# t          $ r/}d| dt          t                     }t          |          |d}~ww xY wt          ||                                          }|                    d          }t          t          |          t          t                               }t#          t%          |                    }t          j        |          }|| _        t          j        |dt+          |          |           t          j        |           t#          d          }	t          j        |t          j        t+          |	                     |	j        t4          k    r|                     |          }
d                    d                    d	 t=          |
                    d                    D                                 }d
| d|                      |           }t          |          tB          r$tE          |                      |                     dS dS )a  Initialize a shader type.

        Args:
            source_string:
                A string containing the source of your shader program.

            shader_type:
                A string containing the type of shader program:

                * ``'vertex'``
                * ``'fragment'``
                * ``'geometry'``
                * ``'compute'``
                * ``'tesscontrol'``
                * ``'tessevaluation'``
        Nzshader_type 'z' is invalid.Valid types are: utf8r[   r   z{0}r  c              3  r   K   | ]2\  }}t          |d z                                 d           d| dV  3dS r  r  r  s      rQ   ra  z"Shader.__init__.<locals>.<genexpr>  sk       2` 2`6=a 69QZZ5E5Ea5H5H2S2SD2S2S2S 2` 2` 2` 2` 2` 2`rP   z>
------------------------------------------------------------
z
------------------------------------------------------------
Shader compilation failed. Please review the error on the specified line.
)#rO  r%   rP  r  r!  r   rY   r   r  rK   r   r  r   r   r   r   r   r   r   glCreateShaderglShaderSourcer   glCompileShaderglGetShaderivGL_COMPILE_STATUSr   r,   _get_shader_sourcer  r  rz  ry  _get_shader_logr  r  )r   r#  r$  errr   shader_source_utf8source_buffer_pointersource_length	shader_idr  r  source_liness               rQ   r   zShader.__init__  sT   " 	1		0'4KK 	0 	0 	0: : :$($7$7: :  "#&&C/	0 %]K@@IIKK*11&99 $X.@%A%A76?? S Sc"45566%k22	
)Q.C(D(DmTTT
9%%%q
B$8%--HHH<7"",,Y77F <<		 2` 2`AJ6<<X\K]K]A^A^2` 2` 2` )` )` a aL8"8 8 **955	8 8C "#&&& 	3$&&y1122222	3 	3s   4 
A-*A((A-rj   c                    | j         S r   r!  r   s    rQ   rU  z	Shader.id  	    xrP   r3  c                \   t          d          }t          j        |t          t	          |                     t          |j                  }t          j        ||d |           |j        r%d| j         d|j        	                    d           S | j        
                                 d| dS )Nr   z:OpenGL returned the following message when compiling the 'z' shader: 
r&  	 Shader 'z' compiled successfully.)r   r%   r+  r)   r   r   r   glGetShaderInfoLogr   r  
capitalize)r   r3  
log_lengthr  s       rQ   r.  zShader._get_shader_log  s    1XX

$6j8I8IJJJ)**:;;

iT:FFF 	RQ	Q Q/9/?/F/Fv/N/NQ Q R )&&((VV9VVVVrP   c                    t          d          }t          j        | t          j        |           t	          |j                  }t          j        | |d|           |j                            d          S )z-Get the shader source from the shader object.r   Nr&  )r   r%   r+  GL_SHADER_SOURCE_LENGTHr   r   glGetShaderSourcer  )r3  r2  
source_strs      rQ   r-  zShader._get_shader_source  se     a
B$>NNN)-*=>>

YtZHHH&&v...rP   c                <    t          | j                   d| _        dS )z<Deletes the shader.

        This cannot be undone.
        N)r3   r!  r   s    rQ   deletezShader.delete  s    
 	tx   rP   c                    | j         h	 | j                            | j                    t          r t	          d| j         d| j          d           d | _         d S # t          t          f$ r Y d S w xY wd S )Nz
Destroyed r9  ')r!  r  delete_shaderr  r  r   AttributeErrorImportErrorr   s    rQ   __del__zShader.__del__  s    8++DH555$ HFtyFF48FFFGGG"K0     s   AA A-,A-c                @    | j         j         d| j         d| j         dS )Nr  z, type=r   )r  rL   rU  r   r   s    rQ   r   zShader.__repr__  s*    .)KKtwKKtyKKKKrP   N)r#  ru   r$  r"  rw   rx   r   )r3  rj   rw   ru   r   r   )rL   rM   rN   r   r   r   rA  rU  r.  r  r-  rB  rH  r   rO   rP   rQ   r  r    s          
 OOO93 93 93 93v    X	W 	W 	W 	W / / / \/      L L L L L LrP   c                  N   e Zd ZU dZded<   ded<   ded<   ded	<   d
ed<   dZd;dZed<d            Zed=d            Z	ed=d            Z
ed>d            Zd?dZed?d            ZeZeZeZd?dZd?dZd?dZd@d ZdAd"Z	 	 dBdCd0ZdDdEd2Z	 	 dDdFd5Z	 	 dDdGd8Z	 dDdHd9ZdId:Zd#S )Jr-  zOpenGL shader program.r   r!  r  r  r  _attributesr  	_uniformsr  _uniform_blocks)__weakref__rK  r  r!  rM  rL  r  r  rw   rx   c                   d| _         |s
J d            t          | | _         t          j        j        | _        t          r!t          t          | j                              t          j
        dd          pt          j        d          }t          | j                   | _        t          | j         |          | _        t!          |           | _        dS )zAInitialize the ShaderProgram using at least two Shader instances.Nz'At least one Shader object is required.r^   r[   GL_ARB_separate_shader_objects)r!  r  rO  r%   rP  r  r  r  r  r&   have_versionhave_extensionr  rK  rL  rL  r  rM  )r   r  r  s      rQ   r   zShaderProgram.__init__'  s    AAAAAw '*	1 	."48,,--- '1--i1GHh1i1i1$(;;-dhAA9$??rP   rj   c                    | j         S r   r6  r   s    rQ   rU  zShaderProgram.id8  r7  rP   c                4    | j                                         S )zAttribute metadata dictionary.

        This property returns a dictionary containing metadata of all
        Attributes that were introspected in this ShaderProgram. Modifying
        this dictionary has no effect.
        )rK  copyr   s    rQ   r  zShaderProgram.attributes<  s     $$&&&rP   c                H    d | j                                         D             S )a  Uniform metadata dictionary.

        This property returns a dictionary containing metadata of all
        Uniforms that were introspected in this ShaderProgram. Modifying
        this dictionary has no effect. To set or get a uniform, the uniform
        name is used as a key on the ShaderProgram instance. For example::

            my_shader_program[uniform_name] = 123
            value = my_shader_program[uniform_name]

        c                @    i | ]\  }}||j         |j        |j        d S rt   r   r   rY  r   nus      rQ   
<dictcomp>z*ShaderProgram.uniforms.<locals>.<dictcomp>S  1    sssTXTUWX
ahOOsssrP   rL  r&  r   s    rQ   rE  zShaderProgram.uniformsF  s)     ts\`\j\p\p\r\rssssrP   c                    | j         S )aF  A dictionary of introspected UniformBlocks.

        This property returns a dictionary of
        :py:class:`~pyglet.graphics.shader.UniformBlock` instances.
        They can be accessed by name. For example::

            block = my_shader_program.uniform_blocks['WindowBlock']
            ubo = block.create_ubo()

        rM  r   s    rQ   r  zShaderProgram.uniform_blocksU  s     ##rP   c                .    t          | j                   d S r   r>   r!  r   s    rQ   usezShaderProgram.usec      TXrP   c                 $    t          d           d S r   r  rO   rP   rQ   stopzShaderProgram.stopf      QrP   c                $    t          d           d S r   r  r   r  s     rQ   r  zShaderProgram.__exit__n      QrP   c                <    t          | j                   d | _        d S r   r2   r!  r   s    rQ   rB  zShaderProgram.deleteq      !!!rP   c                    | j         A	 | j                            | j                    d | _         d S # t          t          f$ r Y d S w xY wd S r   r!  r  delete_shader_programrF  rG  r   s    rQ   rH  zShaderProgram.__del__u  a    833DH==="K0   	     &1 AAr   ru   r   r   c                   	 | j         |         }nI# t          $ r<}d| d}t          rt          j        |           Y d }~d S t          |          |d }~ww xY w	 |                    |           d S # t          $ r}t
          |d }~ww xY wNA Uniform with the name `zv` was not found.
The spelling may be incorrect or, if not in use, it may have been optimized out by the OpenGL driver.rL  r   r  rR  rS  rK   r   r$   r   r   r   r   r/  r   s         rQ   r   zShaderProgram.__setitem__}  s    		0nS)GG 	0 	0 	0Hs H H HC ! c"""!#&&C/	0	+KK 	+ 	+ 	+!s*	+s2    
A!AAAA1 1
B;BBitemc                    	 | j         |         }nA# t          $ r4}d| d}t          rt          j        |           Y d }~d S t
          |d }~ww xY w	 |                                S # t          $ r}t
          |d }~ww xY wru  rL  r   r  rR  rS  rK   r   r$   r   ry  r   r/  r   s        rQ   r   zShaderProgram.__getitem__  s    
	+nT*GG 	+ 	+ 	+Ht H H HC ! c"""ttttt!s*	+	+;;==  	+ 	+ 	+!s*	+s2    
A!A	A		AA& &
A=0A88A=Nrs   moder  Sequence[int] | None	instancesSequence[str] | NonebatchrE   grouprF   r   VertexList | IndexedVertexListc                   | j                                         }g }	|d u}
|d u}                                D ]\  }}	 t          |t                    r|\  }}|	                    ||f           i ||         ||r||v ndd||<   P# t          $ r3 t          r)d| dt          |           }t          j
        |           Y w xY wt          r*fd|D             x}rd| d}t          j
        |           |pt          j                                        }|pt          j                            |           }|                    ||
|||          }|r+|                    |t#          |                    }||_        n|                    |          }|	D ],\  }}	 |                    ||           # t          $ r Y )w xY w|
rd	|_        |S )
NF)r  rp   zThe attribute `z` was not found in the Shader Program.
Please check the spelling, or it may have been optimized out by the OpenGL driver.
Valid names: c                    g | ]}|v|	S rO   rO   )r   r   r   s     rQ   r   z5ShaderProgram._vertex_list_create.<locals>.<listcomp>  s    MMMS_____rP   z:No data was supplied for the following found attributes: `z`.
)r   T)rK  rU  r&  r   r   r@  r   r  r  rR  rS  rO  graphicsget_default_batchShaderGroup
get_domaincreater   r  set_attribute_data	instanced)r   rs   r}  r  r  r  r  r   r  initial_arraysr  indexedrv   r  r   r   missing_datadomainvlists          `           rQ   _vertex_list_createz!ShaderProgram._vertex_list_create  sc    %**,,
T)	% 	 	ID#c5)) 9!$JC"))4-888#}j&6#}#hqS|SW[dSdSdw|#}#}#}
4     $ '>T > >+/
+;+;> >C M#&&&  	#MMMMzMMMM| #cQ]ccc  c"""<::<<B44T4BB!!'9dE:NN  	)MM%W66E#EMMMM%((E) 	 	KD%((u5555     	#"EOs$   A	B		:CCF66
GGrH   c                *     | j         ||ddf||d|S )a  Create a VertexList.

        Args:
            count:
                The number of vertices in the list.
            mode:
                OpenGL drawing mode enumeration; for example, one of
                ``GL_POINTS``, ``GL_LINES``, ``GL_TRIANGLES``, etc.
                This determines how the list is drawn in the given batch.
            batch:
                Batch to add the VertexList to, or ``None`` if a Batch will not be used.
                Using a Batch is strongly recommended.
            group:
                Group to add the VertexList to, or ``None`` if no group is required.
            data:
                Attribute formats and initial data for the vertex list.

        Nr  r  r  )r   rs   r}  r  r  r   s         rQ   vertex_listzShaderProgram.vertex_list  s.    ( (t'tT4buTYbb]abbbrP   instance_attributesSequence[str]c                d    t          |          dk    s
J d             | j        ||d |f||d|S Nr   z=You must provide at least one attribute name to be instanced.r  r   r  )r   rs   r}  r  r  r  r   s          rQ   vertex_list_instancedz#ShaderProgram.vertex_list_instanced  sQ    &''!+++-l+++'t'tT;NqV[chqqlpqqqrP   Sequence[int]rG   c                *     | j         |||df||d|S )a#  Create a IndexedVertexList.

        Args:
            count:
                The number of vertices in the list.
            mode:
                OpenGL drawing mode enumeration; for example, one of
                ``GL_POINTS``, ``GL_LINES``, ``GL_TRIANGLES``, etc.
                This determines how the list is drawn in the given batch.
            indices:
                Sequence of integers giving indices into the vertex list.
            batch:
                Batch to add the VertexList to, or ``None`` if a Batch will not be used.
                Using a Batch is strongly recommended.
            group:
                Group to add the VertexList to, or ``None`` if no group is required.
            data:
                Attribute formats and initial data for the vertex list.
        Nr  r  )r   rs   r}  r  r  r  r   s          rQ   vertex_list_indexedz!ShaderProgram.vertex_list_indexed  s.    * (t'tWde%W\ee`deeerP   c                d    t          |          dk    s
J d             | j        ||||f||d|S r  r  )r   rs   r}  r  r  r  r  r   s           rQ   vertex_list_instanced_indexedz+ShaderProgram.vertex_list_instanced_indexed  sS     &''!+++-l+++'t'tW>QtY^fkttostttrP   c                0    | j         j         d| j         dS )Nr  r   )r  rL   rU  r   s    rQ   r   zShaderProgram.__repr__
  s     .)99tw9999rP   )r  r  rw   rx   r   )rw   r  rw   r  r   r   ru   r   r   rw   rx   ry  ru   rw   r   )NNNN)rs   rj   r}  rj   r  r~  r  r  r  rE   r  rF   r   r   rw   r  )NN)rs   rj   r}  rj   r  rE   r  rF   r   r   rw   rH   )rs   rj   r}  rj   r  r  r  rE   r  rF   r   r   rw   rH   )rs   rj   r}  rj   r  r  r  rE   r  rF   r   r   rw   rG   )rs   rj   r}  rj   r  r  r  r  r  rE   r  rF   r   r   rw   rG   r   )rL   rM   rN   r   r   r   r   rA  rU  r  rE  r  rd  r  rg  r  r  unbindr  rB  rH  r   r   r  r  r  r  r  r   rO   rP   rQ   r-  r-    sj          OOO"""",,,,_I@ @ @ @"    X ' ' ' X' t t t Xt $ $ $ X$       \ IDF         + + + + + + + +" Z^hl2 2 2 2 2hc c c c c, os-1r r r r r
 ae+/f f f f f0 osu u u u u: : : : : :rP   r-  c                  n   e Zd ZU dZded<   ded<   ded<   ded	<   d
ed<   ded<   ded<   ded<   ded<   d0dZed1d            Zed2d            Zeddde	j
        fd3d            Zed4d             Zed5d"            Zed6d#            Zd7d$Zed7d%            ZeZeZeZd7d&Zd7d'Zd7d(Zd8d,Zd9d.Zd/S ):ComputeShaderProgramzOpenGL Compute Shader Program.r  r  r   r!  r  _shaderr  rL  r  rM  tuple[int, int, int]max_work_group_sizemax_work_group_countrj   max_shared_memory_sizemax_work_group_invocationsr  ru   rw   rx   c                   d| _         t          j        dd          s%t          j        d          sd}t	          |          t          |d          | _        t          j        j	        | _
        t          | j                  | _         t          r!t          t          | j                              t          | j         d          | _        t#          |           | _        |                     t          j                  | _        |                     t          j                  | _        |                     t          j                  | _        |                     t          j                  | _        dS )z2Create an OpenGL ComputeShaderProgram from source.Nr^   r]   GL_ARB_compute_shaderzCompute Shader not supported. OpenGL Context version must be at least 4.3 or higher, or 4.2 with the 'GL_ARB_compute_shader' extension.rU   T)r!  r&   rQ  rR  rK   r  r  rO  r%   rP  r  r  r  r  r  rL  rL  r  rM  
_get_tupleGL_MAX_COMPUTE_WORK_GROUP_SIZEr  GL_MAX_COMPUTE_WORK_GROUP_COUNTr  
_get_value!GL_MAX_COMPUTE_SHARED_MEMORY_SIZEr  %GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONSr  r  s      rQ   r   zComputeShaderProgram.__init__  s    $Q** 	'g.DE\.].] 	'T  "#&&&fi00	1 .. 	."48,,----dh==9$??#'??23T#U#U $(OOB4V$W$W!&*oob6Z&[&[#*.//":b*c*c'''rP   	parameterc                   t          j                    }t          j                    }t          j                    }t          |||f          D ](\  }}t          j        | |t	          |                     )|j        |j        |j        fS r   )r%   r  rz  glGetIntegeri_vr   r   )r  val_xval_yval_zrc   r   s         rQ   r  zComputeShaderProgram._get_tuple4  sv    





!5%"788 	; 	;HAuy!U5\\::::{EK44rP   c                z    t          j                    }t          j        | t          |                     |j        S r   )r%   r  r  r   r   )r  r  s     rQ   r  zComputeShaderProgram._get_value=  s.    hjj
E#JJ///yrP   r[   r\  yzbarrierc                N    t          | ||           |rt          |           dS dS )a  Launch one or more compute work groups.

        The ComputeShaderProgram should be active (bound) before calling
        this method. The x, y, and z parameters specify the number of local
        work groups that will be  dispatched in the X, Y and Z dimensions.
        N)r5   r<   )r\  r  r  r  s       rQ   dispatchzComputeShaderProgram.dispatchC  s<     	!Q""" 	%G$$$$$	% 	%rP   c                    | j         S r   r6  r   s    rQ   rU  zComputeShaderProgram.idO  r7  rP   dict[str, dict[str, Any]]c                H    d | j                                         D             S )Nc                @    i | ]\  }}||j         |j        |j        d S rX  rY  rZ  s      rQ   r]  z1ComputeShaderProgram.uniforms.<locals>.<dictcomp>U  r^  rP   r_  r   s    rQ   rE  zComputeShaderProgram.uniformsS  s&    ss\`\j\p\p\r\rssssrP   c                    | j         S r   ra  r   s    rQ   r  z#ComputeShaderProgram.uniform_blocksW  s    ##rP   c                .    t          | j                   d S r   rc  r   s    rQ   rd  zComputeShaderProgram.use[  re  rP   c                 $    t          d           d S r   r  rO   rP   rQ   rg  zComputeShaderProgram.stop^  rh  rP   c                $    t          d           d S r   r  rj  s     rQ   r  zComputeShaderProgram.__exit__f  rk  rP   c                <    t          | j                   d | _        d S r   rm  r   s    rQ   rB  zComputeShaderProgram.deletei  rn  rP   c                    | j         A	 | j                            | j                    d | _         d S # t          t          f$ r Y d S w xY wd S r   rp  r   s    rQ   rH  zComputeShaderProgram.__del__m  rr  rs  r   r   r   c                   	 | j         |         }nA# t          $ r4}d| d}t          rt          j        |           Y d }~d S t
          |d }~ww xY w	 |                    |           d S # t          $ r}t
          |d }~ww xY wNrv  zu` was not found.
The spelling may be incorrect, or if not in use it may have been optimized out by the OpenGL driver.rw  rx  s         rQ   r   z ComputeShaderProgram.__setitem__u  s    
	+nS)GG 	+ 	+ 	+Hs H H HC ! c"""!s*	+	+KK 	+ 	+ 	+!s*	+s2    
A!A	A		AA) )
B 3A;;B ry  c                   	 | j         |         }nI# t          $ r<}d| d}t          rt          j        |           Y d }~d S t          |          |d }~ww xY w	 |                                S # t          $ r}t
          |d }~ww xY wr  r{  r|  s        rQ   r   z ComputeShaderProgram.__getitem__  s    
	0nT*GG 	0 	0 	0Ht H H HC ! c"""ttttt!#&&C/	0	+;;==  	+ 	+ 	+!s*	+s2    
A!AAAA. .
B8B  BN)r  ru   rw   rx   )r  rj   rw   r  )r  rj   rw   rj   )
r\  rj   r  rj   r  rj   r  rj   rw   rx   r   )rw   r  r  r   r  r  )rL   rM   rN   r   r   r   r  r  r  r%   GL_ALL_BARRIER_BITSr  rA  rU  rE  r  rd  rg  r  r  r  r  rB  rH  r   r   rO   rP   rQ   r  r    s        ((OOOOOO,,,,----....####d d d d4 5 5 5 \5    \
 a!BDZ 	% 	% 	% 	% \	%    X t t t Xt $ $ $ X$       \ IDF         + + + +"+ + + + + +rP   r  r   )r   rj   r  rj   rw   rj   )r   rj   r   rj   rw   r  )r   rj   rw   r  )r  r  rw   rj   )r   rj   rw   ru   )r   rj   r  ro   rw   r  )r   rj   r   rj   rw   ru   )r   r  rw   r  (   
__future__r   rerR  r  _ctypesr   r   collectionsr   ctypesr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   typingr   r   r   r   r    r!   r"   rO  	pyglet.glr#   r$   r%   r&   pyglet.gl.glr'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   pyglet.graphics.vertexbufferrB   rC   _weakrefrD   pyglet.graphicsrE   rF   pyglet.graphics.vertexdomainrG   rH   r  r  BaseExceptionrK   rm   CTypesPointerr"  r  GLfloat	GLbooleanrj   r   r   r|   r   r{   r~   rz   r}   GL_FLOAT	GL_DOUBLErX   r   r  GL_FRAGMENT_SHADERr  GL_TESS_CONTROL_SHADERGL_TESS_EVALUATION_SHADERGL_VERTEX_SHADERrY   glGetUniformivglGetUniformfvrZ   GL_BOOLglUniform1ivglProgramUniform1ivGL_BOOL_VEC2GL_BOOL_VEC3GL_BOOL_VEC4GL_INT_VEC2glUniform2ivglProgramUniform2ivGL_INT_VEC3glUniform3ivglProgramUniform3ivGL_INT_VEC4glUniform4ivglProgramUniform4ivrr  glUniform1uivglProgramUniform1uivGL_UNSIGNED_INT_VEC2glUniform2uivglProgramUniform2uivGL_UNSIGNED_INT_VEC3glUniform3uivglProgramUniform3uivGL_UNSIGNED_INT_VEC4glUniform4uivglProgramUniform4uivglUniform1fvglProgramUniform1fvGL_FLOAT_VEC2glUniform2fvglProgramUniform2fvGL_FLOAT_VEC3glUniform3fvglProgramUniform3fvGL_FLOAT_VEC4glUniform4fvglProgramUniform4fvGL_SAMPLER_1DGL_SAMPLER_1D_ARRAYGL_INT_SAMPLER_1DGL_INT_SAMPLER_1D_ARRAYGL_UNSIGNED_INT_SAMPLER_1D GL_UNSIGNED_INT_SAMPLER_1D_ARRAYGL_SAMPLER_2DGL_SAMPLER_2D_ARRAYGL_INT_SAMPLER_2DGL_INT_SAMPLER_2D_ARRAYGL_UNSIGNED_INT_SAMPLER_2D GL_UNSIGNED_INT_SAMPLER_2D_ARRAYGL_SAMPLER_2D_MULTISAMPLEGL_INT_SAMPLER_2D_MULTISAMPLE&GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLEGL_SAMPLER_CUBEGL_INT_SAMPLER_CUBEGL_UNSIGNED_INT_SAMPLER_CUBEGL_SAMPLER_CUBE_MAP_ARRAYGL_INT_SAMPLER_CUBE_MAP_ARRAY&GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAYGL_SAMPLER_3DGL_INT_SAMPLER_3DGL_UNSIGNED_INT_SAMPLER_3DGL_FLOAT_MAT2glUniformMatrix2fvglProgramUniformMatrix2fvGL_FLOAT_MAT3glUniformMatrix3fvglProgramUniformMatrix3fvGL_FLOAT_MAT4glUniformMatrix4fvglProgramUniformMatrix4fvGL_IMAGE_1DGL_IMAGE_2DGL_IMAGE_2D_RECTGL_IMAGE_3DGL_IMAGE_1D_ARRAYGL_IMAGE_2D_ARRAYGL_IMAGE_2D_MULTISAMPLEGL_IMAGE_2D_MULTISAMPLE_ARRAYGL_IMAGE_BUFFERGL_IMAGE_CUBEGL_IMAGE_CUBE_MAP_ARRAYGL_INT_IMAGE_1DGL_INT_IMAGE_2DGL_INT_IMAGE_3DGL_INT_IMAGE_2D_RECTGL_INT_IMAGE_CUBEGL_INT_IMAGE_BUFFERGL_INT_IMAGE_1D_ARRAYGL_INT_IMAGE_2D_ARRAYGL_INT_IMAGE_CUBE_MAP_ARRAYGL_INT_IMAGE_2D_MULTISAMPLE!GL_INT_IMAGE_2D_MULTISAMPLE_ARRAYGL_UNSIGNED_INT_IMAGE_1DGL_UNSIGNED_INT_IMAGE_2DGL_UNSIGNED_INT_IMAGE_3DGL_UNSIGNED_INT_IMAGE_2D_RECTGL_UNSIGNED_INT_IMAGE_CUBEGL_UNSIGNED_INT_IMAGE_BUFFERGL_UNSIGNED_INT_IMAGE_1D_ARRAYGL_UNSIGNED_INT_IMAGE_2D_ARRAY$GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY$GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE*GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAYra   GL_DOUBLE_VEC2GL_DOUBLE_VEC3GL_DOUBLE_VEC4rg   ri   r   GL_FLOAT_MAT2x3GL_FLOAT_MAT2x4GL_FLOAT_MAT3x2GL_FLOAT_MAT3x4GL_FLOAT_MAT4x2GL_FLOAT_MAT4x3r   r   r  r  compiler{  rC  rJ  r  r  r  r  r  r  rL  r  r  r   r  r-  r  rO   rP   rQ   <module>rZ     s\   " " " " " " " 				   * * * * * * * * # # # # # #                                             . P O O O O O O O O O O O O O O O O O  7 7 7 7 7 7 7 7 7 7 7 7                                                         : M L L L L L L L K******,,,,,,,,JJJJJJJJN#56 	 	 	 	 	m 	 	 	 l#ab
4>4
#3T",5GLM
	 JK(IuKL(	' 	 	 	 	 #%%,2!( (     HbJ!L"#0     fGJ2?B,BAFfG Obh1GKfG Obh1GK	fG
 Obh1GKfG I"/2+A1EfG NRXr0FJfG NRXr0FJfG NRXr0FJfG bi)92;RTUVfG bi)92;RTUVfG bi)92;RTUVfG bi)92;RTUVfG" K"*bor/EqI#fG$ rz2?B4JAN%fG& rz2?B4JAN'fG( rz2?B4JAN)fG. rx"2H!L/fG fG0 RXr8NPQR1fG2 28R_b6LaP3fG4 2?B<RTU V5fG6 !BHbor?UWX#Y7fG8 '"(BORE[]^)_9fG> rx"2H!L?fG@ RXr8NPQRAfGB 28R_b6LaPCfGD 2?B<RTU VEfGF !BHbor?UWX#YGfGH '"(BORE[]^)_IfGL  28R_b>TVW"XMfGN $rx"BXZ[&\OfGP -"/2Kacd/eQfGV 2?B4JANWfGX RXr8NPQRYfGZ #bhAWYZ%[[fG fG fG\  28R_b>TVW"X]fG^ $rx"BXZ[&\_fG` -"/2Kacd/eafGf rx"2H!LgfGh 28R_b6LaPifGj !BHbor?UWX#YkfGn rz2#8":VXYZofGp rz2#8":VXYZqfGr rz2#8":VXZ[sfGF NRXr0FJGfGH NRXr0FJIfGJ "(BOR5KQOKfGL NRXr0FJMfGN 28R_b6LaPOfGP 28R_b6LaPQfGR 2?B<RTU VSfGT $rx"BXZ[&\UfG fG fGV 2?B4JANWfGX rx"2H!LYfGZ 2?B<RTU V[fG^ 2?B4JAN_fG` 2?B4JANafGb 2?B4JANcfGd bh9OQRSefGf 28R_b6LaPgfGh RXr8NPQRifGj rx":PRSTkfGl rx":PRSTmfGn "RXr@VXY$ZofGp "RXr@VXY$ZqfGr (28R_bF\^_*`sfGv "(BOR=SUV!WwfGx "(BOR=SUV!WyfGz "(BOR=SUV!W{fG fG| $rx"BXZ[&\!BHbor?UWX#Y#bhAWYZ%[%"/2CY[\']%"/2CY[\']+bhI_ab-c+bhI_ab-c1BHborOegh3iKfG fG  f f f fP0J0OX0 OX0 OX	0 Ix0 NH0 NH0 NH0 0 X0 X0 X0  K!0" h#0$ h%0& h'0* L(+0, xxx10 0     <f^ f^ f^ f^ f^ f^ f^ f^RQE QE QE QE QE QE QE QEj b("*<b("*<b("*<!    fX fX fX fX fX fX fX fXR   L" L" L" L" L" L" L" L"^ bj*++s, s, s, s, s, s, s, s,l)Y )Y )Y )Y )Y )Y )Y )Y\   
' 
' 
' 
'   ,   :
: 
: 
: 
:' ' ' '   >
# 
# 
# 
#A A A AL5# 5# 5# 5# 5# 5# 5# 5#ppL pL pL pL pL pL pL pLfn: n: n: n: n: n: n: n:bG+ G+ G+ G+ G+ G+ G+ G+ G+ G+rP   