
    kh(l                     z   d dl mZ d dlmZmZmZmZmZ d dlZd dl	m
c mZ d dlm
Z
mZ ddlmZ ddlmZ dd	lmZmZmZ dd
lmZ ddlmZmZ ddlmZmZ g dZdee   dee   dee   deee   ee   f   fdZ ejB                  jE                  d       dej                  dej                  dee   defdZ#ejB                  jE                  d       deeeef   deeeef   deeeef   fdZ$ejB                  jE                  d       dedeeeef   deeeef   deeeef   def
dZ%ejB                  jE                  d       	 	 	 	 	 dGded ed!ed"edee   d#edee   d$e&d%e&d&ee   d'ee   d(e'defd)Z(ejB                  jE                  d*        G d+ d,e
jR                        Z* G d- d.e
jR                        Z+ G d/ d0e
jR                        Z,dee   d1ed2ee   d#ee   dee   d3e&d4ee   d5e'd6ede,fd7Z-ed8d9d:Z. G d; d<e      Z/ G d= d>e      Z0 G d? d@e      Z1 e        edAe/jd                  fB      dddCd4ee/   d5e'd6ede,fdD              Z3 e        edAe0jd                  fB      dddCd4ee0   d5e'd6ede,fdE              Z4 e        edAe1jd                  fB      dddCd4ee1   d5e'd6ede,fdF              Z5y)H    )partial)AnyCallableListOptionalTupleN)nnTensor   )VideoClassification)_log_api_usage_once   )register_modelWeightsWeightsEnum)_KINETICS400_CATEGORIES)_ovewrite_named_paramhandle_legacy_interface)PatchMergingSwinTransformerBlock)SwinTransformer3dSwin3D_T_WeightsSwin3D_S_WeightsSwin3D_B_Weightsswin3d_tswin3d_sswin3d_b
shift_sizesize_dhwwindow_sizereturnc                 \    t        d      D ]  }||   ||   k  s||   ||<   d| |<    || fS )Nr   r   range)r   r   r    is       e/var/www/teggl/fontify/venv/lib/python3.12/site-packages/torchvision/models/video/swin_transformer.py_get_window_and_shift_sizer'       sJ     1X A;+a.(%a[KNJqM	 
""    r'   relative_position_bias_tablerelative_position_indexc                     |d   |d   z  |d   z  }| |d |d |f   j                            }|j                  ||d      }|j                  ddd      j                         j	                  d      }|S )Nr      r   )flattenviewpermute
contiguous	unsqueeze)r)   r*   r    
window_volrelative_position_biass        r&   _get_relative_position_biasr5   /   s     Q+a.0;q>AJ9[j[ 89AAC 488ZQST3;;Aq!DOOQ[[\]^!!r(   r5   
patch_sizec                     t        d      D cg c]  }||   | |   ||   z  z
  ||   z   }}|d   |d   |d   fS c c}w )Nr   r   r,   r   r#   )r   r6   r%   pad_sizes       r&   _compute_pad_size_3dr9   ?   sZ    W\]^W_`RSA!z!}!<<
1M`H`A;Xa[00 as   <r9   xc           
          | j                   | }|d   |d   z  |d   |d   z  z  |d   |d   z  z  }t        d      D cg c]  }d||    f||    ||    f||    d ff }}d}|d   D ];  }	|d   D ]1  }
|d   D ]'  }|||	d   |	d   |
d   |
d   |d   |d   f<   |dz  }) 3 = |j                  |d   |d   z  |d   |d   |d   z  |d   |d   |d   z  |d         }|j                  dddddd      j	                  ||d   |d   z  |d   z        }|j                  d      |j                  d      z
  }|j                  |dk7  t        d            j                  |dk(  t        d            }|S c c}w )	Nr   r,   r   r         g      Y        )	new_zerosr$   r/   r0   reshaper2   masked_fillfloat)r:   r   r    r   	attn_masknum_windowsr%   slicescountdhws               r&   _compute_attention_mask_3drJ   G   s    X&IA;+a.0Xa[KPQN5RSW_`aWbfqrsftWtuK q 	 Q !n_z!}n-m^T"	
F  EAY  	AAY CH	!A$1+qtad{AaD1Q4K?@
	 {1~%A{1~%A{1~%AI !!!Q1a3;;[^k!n4{1~EI ##A&)<)<Q)??I%%i1neFmDPPQZ^_Q_afgjaklI;s    "E7rJ   Tinput
qkv_weightproj_weightr4   	num_headsattention_dropoutdropoutqkv_bias	proj_biastrainingc                 @   | j                   \  }}}}}t        |||f|d   |d   |d   f      }t        j                  | ddd|d   d|d   d|d   f      }|j                   \  }}}}}|||f}t	        |      dkD  r't        j                  ||d    |d    |d    fd      }|d   |d   z  |d   |d   z  z  |d   |d   z  z  }|j                  ||d   |d   z  |d   |d   |d   z  |d   |d   |d   z  |d   |      }|j                  ddddddd	d
      j                  ||z  |d   |d   z  |d   z  |      }t        j                  |||	      }|j                  |j                  d      |j                  d      d|||z        j                  ddddd      }|d   |d   |d   }}}|||z  dz  z  }|j                  |j                  dd            }||z   }t	        |      dkD  rt        ||d   |d   |d   f|d   |d   |d   f|d   |d   |d   f      }|j                  |j                  d      |z  |||j                  d      |j                  d            }||j                  d      j                  d      z   }|j                  d||j                  d      |j                  d            }t        j                   |d      }t        j"                  |||      }|j                  |      j                  dd      j                  |j                  d      |j                  d      |      }t        j                  |||
      }t        j"                  |||      }|j                  ||d   |d   z  |d   |d   z  |d   |d   z  |d   |d   |d   |      }|j                  ddddddd	d
      j                  |||||      }t	        |      dkD  r$t        j                  ||d   |d   |d   fd      }|ddd|d|d|ddf   j%                         }|S )a  
    Window based multi-head self attention (W-MSA) module with relative position bias.
    It supports both of shifted and non-shifted window.
    Args:
        input (Tensor[B, T, H, W, C]): The input tensor, 5-dimensions.
        qkv_weight (Tensor[in_dim, out_dim]): The weight tensor of query, key, value.
        proj_weight (Tensor[out_dim, out_dim]): The weight tensor of projection.
        relative_position_bias (Tensor): The learned relative position bias added to attention.
        window_size (List[int]): 3-dimensions window size, T, H, W .
        num_heads (int): Number of attention heads.
        shift_size (List[int]): Shift size for shifted window attention (T, H, W).
        attention_dropout (float): Dropout ratio of attention weight. Default: 0.0.
        dropout (float): Dropout ratio of output. Default: 0.0.
        qkv_bias (Tensor[out_dim], optional): The bias tensor of query, key, value. Default: None.
        proj_bias (Tensor[out_dim], optional): The bias tensor of projection. Default: None.
        training (bool, optional): Training flag used by the dropout parameters. Default: True.
    Returns:
        Tensor[B, T, H, W, C]: The output tensor after shifted window attention.
    r   r,   r   )r,   r   r   )shiftsdimsr   r=   r<         g      r-   )dim)prS   N)shaper9   Fpadsumtorchrollr/   r0   r@   linearsizematmul	transposerJ   r2   softmaxrP   r1   )rK   rL   rM   r4   r    rN   r   rO   rP   rQ   rR   rS   btrH   rI   cr8   r:   _tphpwppadded_sizerD   qkvqkvattnrC   s                                  r&   shifted_window_attention_3drt   s   s   B KKMAq!Q#Q1IAAP[\]P^/_`H	eaAx{Ax{Ax{KLAwwAr2r1r2,K :JJq:a=.:a=.:a=.!QXab 
Q;q>	)k!nA.NOS^_`SaepqresSst  	
	A+a.(AA+a.(AA+a.(A			A 	
		!Q1aAq)11	KQ+a.8;q>I1	A
 ((1j(
+C
++affQiAy!y.
I
Q
QRSUVXY[\^_
`C!fc!fc!f!qA	Q)^$$A88AKKB'(D((D
:.^[^[^<^[^[^<]JqM:a=9	
	 yyk1;	166RS9VWV\V\]^V_`i))!,66q99yyYq	166!9=99Tr"D99T.BDA  A&..qvvay!&&)QGA	K+A			!w2A 	
	A+a.(A+a.(A+a.(AAA			A 	
		!Q1aAq)11!RRCA :JJq*Q-A
1!NU^_ 	
!RaR!RaR
&&(AHr(   rt   c                        e Zd ZdZ	 	 	 	 ddedee   dee   dedededed	ed
df fdZddZ	ddZ
dee   d
ej                  fdZded
efdZ xZS )ShiftedWindowAttention3dz2
    See :func:`shifted_window_attention_3d`.
    rZ   r    r   rN   rQ   rR   rO   rP   r!   Nc	                 p   t         	|           t        |      dk7  st        |      dk7  rt        d      || _        || _        || _        || _        || _        t        j                  ||dz  |      | _        t        j                  |||      | _        | j                          | j                          y )Nr   z.window_size and shift_size must be of length 2)bias)super__init__len
ValueErrorr    r   rN   rO   rP   r	   Linearro   proj#define_relative_position_bias_tabledefine_relative_position_index)
selfrZ   r    r   rN   rQ   rR   rO   rP   	__class__s
            r&   rz   z!ShiftedWindowAttention3d.__init__   s     	{q C
Oq$8MNN&$"!299S#'9IIc3Y7	002++-r(   c                 H   t        j                  t        j                  d| j                  d   z  dz
  d| j                  d   z  dz
  z  d| j                  d   z  dz
  z  | j
                              | _        t         j                  j                  | j                  d       y )Nr   r   r,   {Gz?std)	r	   	Parameterr`   zerosr    rN   r)   inittrunc_normal_)r   s    r&   r   z<ShiftedWindowAttention3d.define_relative_position_bias_table  s    ,.LLKKT%%a((1,T5E5Ea5H1H11LMQRUYUeUefgUhQhklQlm-
) 	d??TJr(   c                 n   t        d      D cg c]$  }t        j                  | j                  |         & }}t        j                  t        j
                  |d   |d   |d   d            }t        j                  |d      }|d d d d d f   |d d d d d f   z
  }|j                  ddd      j                         }|d d d d dfxx   | j                  d   dz
  z  cc<   |d d d d dfxx   | j                  d   dz
  z  cc<   |d d d d dfxx   | j                  d   dz
  z  cc<   |d d d d dfxx   d| j                  d   z  dz
  d| j                  d   z  dz
  z  z  cc<   |d d d d dfxx   d| j                  d   z  dz
  z  cc<   |j                  d      }| j                  d|       y c c}w )	Nr   r   r,   r   ij)indexingr-   r*   )r$   r`   aranger    stackmeshgridr.   r0   r1   r_   register_buffer)r   r%   
coords_dhwcoordscoords_flattenrelative_coordsr*   s          r&   r   z7ShiftedWindowAttention3d.define_relative_position_index  s   AFqJAell4#3#3A#67J
JNN:a=*Q-AQUV
 vq1(At4~aqj7QQ)11!Q:EEG1a D$4$4Q$7!$;; 1a D$4$4Q$7!$;; 1a D$4$4Q$7!$;; 1a Q)9)9!)<%<q%@QIYIYZ[I\E\_`E`$aa 1a A(8(8(;$;a$?? "1"5"5b"968OP Ks   )F2c                 D    t        | j                  | j                  |      S )N)r5   r)   r*   )r   r    s     r&   get_relative_position_biasz3ShiftedWindowAttention3d.get_relative_position_bias#  s    *4+L+LdNjNjlwxxr(   r:   c                    |j                   \  }}}}}|||g}| j                  j                         | j                  j                         }}t	        |||      \  }}| j                  |      }	t        || j                  j                  | j                  j                  |	|| j                  || j                  | j                  | j                  j                  | j                  j                  | j                        S )N)r   rO   rP   rQ   rR   rS   )r\   r    copyr   r'   r   rt   ro   weightr~   rN   rO   rP   rx   rS   )
r   r:   rj   rh   rH   rI   r   r    r   r4   s
             r&   forwardz ShiftedWindowAttention3d.forward&  s    1aAq!9"&"2"2"7"7"94??;O;O;QZ"<ZS^"_Z!%!@!@!M*HHOOII"NN!"44LLXX]]iinn]]
 	
r(   )TTr>   r>   )r!   N)__name__
__module____qualname____doc__intr   boolrB   rz   r   r   r`   r
   r   r   __classcell__r   s   @r&   rv   rv      s     #&.. #Y. I	.
 . . . !. . 
.6KQ&yd3i yELL y
 
F 
r(   rv   c                   z     e Zd ZdZ	 	 	 ddee   dededeedej                  f      ddf
 fd	Z
d
edefdZ xZS )PatchEmbed3da;  Video to Patch Embedding.

    Args:
        patch_size (List[int]): Patch token size.
        in_channels (int): Number of input channels. Default: 3
        embed_dim (int): Number of linear projection output channels. Default: 96.
        norm_layer (nn.Module, optional): Normalization layer. Default: None
    Nr6   in_channels	embed_dim
norm_layer.r!   c                    t         |           t        |        |d   |d   |d   f| _        t	        j
                  ||| j                  | j                        | _        | ||      | _        y t	        j                         | _        y )Nr   r,   r   )kernel_sizestride)	ry   rz   r   tuple_patch_sizer	   Conv3dr~   normIdentity)r   r6   r   r   r   r   s        r&   rz   zPatchEmbed3d.__init__K  s|     	D!!+A
1z!} MII--((	
	 !"9-DIDIr(   r:   c           
      4   |j                         \  }}}}}t        |||f| j                        }t        j                  |d|d   d|d   d|d   f      }| j                  |      }|j                  ddddd      }| j                  | j                  |      }|S )zForward function.r   r   r,   r   r<   )rc   r9   r   r]   r^   r~   r0   r   )r   r:   rj   rh   rH   rI   r8   s          r&   r   zPatchEmbed3d.forwarda  s     1aA'Aq	43H3HIEE!a!a!a!EFIIaLIIaAq!$99 		!Ar(   )r   `   N)r   r   r   r   r   r   r   r   r	   Modulerz   r
   r   r   r   s   @r&   r   r   A  sq     9=&I& & 	&
 Xc299n56& 
&,
 
F 
r(   r   c                    &    e Zd ZdZdddddddedf	dee   ded	ee   d
ee   dee   dedededededee	de
j                  f      dee	de
j                  f      de	de
j                  f   dee	de
j                  f      ddf fdZdedefdZ xZS )r   aY  
    Implements 3D Swin Transformer from the `"Video Swin Transformer" <https://arxiv.org/abs/2106.13230>`_ paper.
    Args:
        patch_size (List[int]): Patch size.
        embed_dim (int): Patch embedding dimension.
        depths (List(int)): Depth of each Swin Transformer layer.
        num_heads (List(int)): Number of attention heads in different layers.
        window_size (List[int]): Window size.
        mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. Default: 4.0.
        dropout (float): Dropout rate. Default: 0.0.
        attention_dropout (float): Attention dropout rate. Default: 0.0.
        stochastic_depth_prob (float): Stochastic depth rate. Default: 0.1.
        num_classes (int): Number of classes for classification head. Default: 400.
        norm_layer (nn.Module, optional): Normalization layer. Default: None.
        block (nn.Module, optional): SwinTransformer Block. Default: None.
        downsample_layer (nn.Module): Downsample layer (patch merging). Default: PatchMerging.
        patch_embed (nn.Module, optional): Patch Embedding layer. Default: None.
    g      @r>   皙?i  Nr6   r   depthsrN   r    	mlp_ratiorP   rO   stochastic_depth_probnum_classesr   .blockdownsample_layerpatch_embedr!   c                 $   t         |           t        |        |
| _        |t	        t
        t              }|t	        t        j                  d      }|t        } ||||      | _
        t        j                  |      | _        g }t        |      }d}t        t        |            D ]  }g }|d|z  z  }t        ||         D ]^  }|	t!        |      z  |dz
  z  }|j#                   ||||   ||D cg c]  }|dz  dk(  rdn|dz   c}|||||t        	
             |dz  }` |j#                  t        j$                  |        |t        |      dz
  k  s|j#                   |||              t        j$                  | | _        |dt        |      dz
  z  z  | _         || j(                        | _        t        j,                  d      | _        t        j0                  | j(                  |
      | _        | j5                         D ]~  }t7        |t        j0                        st        j8                  j;                  |j<                  d
       |j>                  Vt        j8                  jA                  |j>                          y c c}w )N)
attn_layergh㈵>)eps)r6   r   r   )r[   r   r   r,   )r    r   r   rP   rO   r   r   r   r   r   )!ry   rz   r   r   r   r   rv   r	   	LayerNormr   r   Dropoutpos_dropr_   r$   r{   rB   append
Sequentialfeaturesnum_featuresr   AdaptiveAvgPool3davgpoolr}   headmodules
isinstancer   r   r   rx   zeros_)r   r6   r   r   rN   r    r   rP   rO   r   r   r   r   r   r   layerstotal_stage_blocksstage_block_idi_stagestagerZ   i_layersd_probrI   mr   s                            r&   rz   zSwinTransformer3d.__init__  sS   " 	D!&=0=UVE 48J&K '*	^hi

W-"$ [S[) 	AG%'Eaj(C 1 $/%2GGK]`aKab!'*$/OZ#[!1)9AqAv$E#["+ '*;.5#-#; !##$$ MM"--/0#f+/*.sJ?@1	A2 v.%c&kAo(>>t001	++A.IId//=	 	+A!RYY'%%ahhD%966%GGNN166*		++ $\s   5Jr:   c                 (   | j                  |      }| j                  |      }| j                  |      }| j                  |      }|j	                  ddddd      }| j                  |      }t        j                  |d      }| j                  |      }|S )Nr   r<   r,   r   r   )	r   r   r   r   r0   r   r`   r.   r   )r   r:   s     r&   r   zSwinTransformer3d.forward  s    QMM!MM!IIaLIIaAq!$LLOMM!QIIaLr(   )r   r   r   r   r   r   r   rB   r   r   r	   r   rz   r
   r   r   r   s   @r&   r   r   n  s5   4 #&'*9=485A:>J+IJ+ J+ S		J+
 9J+ #YJ+ J+ J+ !J+  %J+ J+ Xc299n56J+ bii01J+ #3		>2J+ hsBII~67J+  
!J+X
 
F 
r(   r   r   r   r   weightsprogresskwargsc           
          |#t        |dt        |j                  d                t        d| |||||d|}	|"|	j	                  |j                  |d             |	S )Nr   
categories)r6   r   r   rN   r    r   T)r   
check_hash )r   r{   metar   load_state_dictget_state_dict)
r6   r   r   rN   r    r   r   r   r   models
             r&   _swin_transformer3dr     s{     fmSl9S5TU 3 E g44hSW4XYLr(   )r,   r,   r,   )r   min_sizemin_temporal_sizec                   \    e Zd Z ed eedddd      i eddd	d
dddiddd      ZeZy)r   z9https://download.pytorch.org/models/swin3d_t-7615ae03.pth   r      g
ףp=
?gv/?gCl?gZd;O?gy&1?g?	crop_sizeresize_sizemeanr   Fhttps://github.com/SwinTransformer/Video-Swin-Transformer#kinetics-400The weights were ported from the paper. The accuracies are estimated on video-level with parameters `frame_rate=15`, `clips_per_video=12`, and `clip_len=32`ivKinetics-400g(\mS@gK7aW@zacc@1zacc@5g7A`E@gnb^@recipe_docs
num_params_metrics_ops
_file_sizeurl
transformsr   N	r   r   r   r   r   r   _COMMON_METAKINETICS400_V1DEFAULTr   r(   r&   r   r      h    G )(


^[ ###! !
N6 Gr(   r   c                   \    e Zd Z ed eedddd      i eddd	d
dddiddd      ZeZy)r   z9https://download.pytorch.org/models/swin3d_s-da41c237.pthr   r   r   r   r   r   r   if$r   gMbXS@g'1W@r   gҵT@gK7Ik@r   r   Nr   r   r(   r&   r   r     r   r(   r   c                       e Zd Z ed eedddd      i eddd	d
dddiddd      Z ed eedddd      i eddd	d
dddiddd      ZeZ	y)r   z<https://download.pytorch.org/models/swin3d_b_1k-24f7c7c6.pthr   r   r   r   r   r   r   iX?r   gSS@gbX9W@r   gMbXa@g/$v@r   r   z=https://download.pytorch.org/models/swin3d_b_22k-7c6ae6fa.pthgx&iT@g~jW@N)
r   r   r   r   r   r   r   r   KINETICS400_IMAGENET22K_V1r   r   r(   r&   r   r   >  s    J )(


^[ ###! !
N6 ")K )(


^[ ###! !
"6 Gr(   r   
pretrained)r   )r   r   c                 d    t         j                  |       } t        dg ddg dg dg dd| |d|S )	a  
    Constructs a swin_tiny architecture from
    `Video Swin Transformer <https://arxiv.org/abs/2106.13230>`_.

    Args:
        weights (:class:`~torchvision.models.video.Swin3D_T_Weights`, optional): The
            pretrained weights to use. See
            :class:`~torchvision.models.video.Swin3D_T_Weights` below for
            more details, and possible values. By default, no pre-trained
            weights are used.
        progress (bool, optional): If True, displays a progress bar of the
            download to stderr. Default is True.
        **kwargs: parameters passed to the ``torchvision.models.video.swin_transformer.SwinTransformer``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/video/swin_transformer.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.video.Swin3D_T_Weights
        :members:
    r   r<   r<   r   )r   r   rW   r   r   rW            rX   rX   r   r6   r   r   rN   r    r   r   r   r   )r   verifyr   r   r   r   s      r&   r   r   x  sH    . %%g.G 
 !
 
 
r(   c                 d    t         j                  |       } t        dg ddg dg dg dd| |d|S )	a  
    Constructs a swin_small architecture from
    `Video Swin Transformer <https://arxiv.org/abs/2106.13230>`_.

    Args:
        weights (:class:`~torchvision.models.video.Swin3D_S_Weights`, optional): The
            pretrained weights to use. See
            :class:`~torchvision.models.video.Swin3D_S_Weights` below for
            more details, and possible values. By default, no pre-trained
            weights are used.
        progress (bool, optional): If True, displays a progress bar of the
            download to stderr. Default is True.
        **kwargs: parameters passed to the ``torchvision.models.video.swin_transformer.SwinTransformer``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/video/swin_transformer.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.video.Swin3D_S_Weights
        :members:
    r  r   r   r      r   r  r
  r   r  r   )r   r  r   r  s      r&   r   r     sH    . %%g.G 
 !
 
 
r(   c                 d    t         j                  |       } t        dg ddg dg dg dd| |d|S )	a  
    Constructs a swin_base architecture from
    `Video Swin Transformer <https://arxiv.org/abs/2106.13230>`_.

    Args:
        weights (:class:`~torchvision.models.video.Swin3D_B_Weights`, optional): The
            pretrained weights to use. See
            :class:`~torchvision.models.video.Swin3D_B_Weights` below for
            more details, and possible values. By default, no pre-trained
            weights are used.
        progress (bool, optional): If True, displays a progress bar of the
            download to stderr. Default is True.
        **kwargs: parameters passed to the ``torchvision.models.video.swin_transformer.SwinTransformer``
            base class. Please refer to the `source code
            <https://github.com/pytorch/vision/blob/main/torchvision/models/video/swin_transformer.py>`_
            for more details about this class.

    .. autoclass:: torchvision.models.video.Swin3D_B_Weights
        :members:
    r     r  )r<   r         r
  r   r  r   )r   r  r   r  s      r&   r   r     sH    . %%g.G 
 !
 
 
r(   )r>   r>   NNT)6	functoolsr   typingr   r   r   r   r   r`   torch.nn.functionalr	   
functionalr]   r
   transforms._presetsr   utilsr   _apir   r   r   _metar   _utilsr   r   swin_transformerr   r   __all__r   r'   fxwrapr5   r9   rJ   rB   r   rt   r   rv   r   r   r   r   r   r   r   r   r   r   r   r   r(   r&   <module>r#     sQ    7 7     6 ( 7 7 + C A	#S		#%)#Y	#=A#Y	#
49d3i 	# * +
""',,
"IN
"dhildm
"
" + ,15c3#7 1U3PSUX=EY 1^cdgilnqdq^r 1
 $ %&&CcM"& sC}%& c3m$	&
 &R * +  #!%"&mmm m #	m
 cm m S	m m m vm m m m` + ,V
ryy V
v*299 *Zj		 jZS	 I Cy	
 c ! k"   > *{ >{ >7{ 7t ,0@0O0O!PQ6:T !"23 !d !]` !ev ! R !H ,0@0O0O!PQ6:T !"23 !d !]` !ev ! R !H ,0@0O0O!PQ6:T !"23 !d !]` !ev ! R !r(   