
    RЦi[N              
          S r SSKJrJrJrJrJrJrJrJ	r	  SSK
r
SSKJr  SSKJs  Jr  SSKJrJr  SSKJrJrJrJrJr  SSKJr  SSKJr  SS	KJr  SS
KJ r J!r!  S/r" " S S\RF                  5      r$ " S S\RJ                  5      r& " S S\RJ                  5      r' " S S\RF                  5      r( " S S\RF                  5      r) " S S\RF                  5      r* " S S\RF                  5      r+ " S S\RF                  5      r, " S S\RF                  5      r-S\\.\
R^                  4   S\RF                  S\\.\
R^                  4   4S  jr0S0S!\.S"\S\\.\4   4S# jjr1\!" \1" S$S%9\1" S$S%9\1" S$S%9\1" S$S&S'9S(.5      r2S1S)\.S*\3S"\S\-4S+ jjr4\ S1S*\3S"\S\-4S, jj5       r5\ S1S*\3S"\S\-4S- jj5       r6\ S1S*\3S"\S\-4S. jj5       r7\ S1S*\3S"\S\-4S/ jj5       r8g)2a  SHViT
SHViT: Single-Head Vision Transformer with Memory Efficient Macro Design
Code: https://github.com/ysj9909/SHViT
Paper: https://arxiv.org/abs/2401.16456

@inproceedings{yun2024shvit,
  author={Yun, Seokju and Ro, Youngmin},
  title={SHViT: Single-Head Vision Transformer with Memory Efficient Macro Design},
  booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
  pages={5756--5767},
  year={2024}
}
    )AnyDictListOptionalSetTupleTypeUnionNIMAGENET_DEFAULT_MEANIMAGENET_DEFAULT_STD)
GroupNorm1SqueezeExciteSelectAdaptivePool2d	LayerTypetrunc_normal_   )build_model_with_cfg)feature_take_indices)checkpoint_seq)register_modelgenerate_default_cfgsSHViTc                      ^  \ rS rSrS\R
                  4U 4S jjrS\R                  S\R                  4S jr	\R                  " 5       S\R
                  4S j5       rSrU =r$ )	Residual   mc                 .   > [         TU ]  5         Xl        g N)super__init__r   )selfr   	__class__s     P/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/timm/models/shvit.pyr!   Residual.__init__   s        xreturnc                 (    XR                  U5      -   $ r   r   r"   r'   s     r$   forwardResidual.forward#   s    66!9}r&   c                    [        U R                  [        5      (       a  U R                  R                  5       nUR                  UR
                  :X  d   e[        R                  " UR                  R                  S   UR                  R                  S   SS5      n[        R                  " U/ SQ5      nU=R                  UR                  UR                  R                  5      -  sl        U$ U $ )Nr   r   )r   r   r   r   )
isinstancer   
Conv2dNormfusegroupsin_channelstorchonesweightshapeFpadtodevice)r"   r   identitys      r$   r1   Residual.fuse&   s    dffj))A88q}},-,zz!((.."3QXX^^A5F1MHuuXy1HHHAHHOO44HHKr&   r*   )__name__
__module____qualname____firstlineno__nnModuler!   r4   Tensorr,   no_gradr1   __static_attributes____classcell__r#   s   @r$   r   r      sS    "))  %,,  ]]_	bii 	 	r&   r   c                      ^  \ rS rSr      SS\S\S\S\S\S\4U 4S jjjr\R                  " 5       S	\R                  4S
 j5       r
SrU =r$ )r0   3   r3   out_channelskernel_sizestridepaddingbn_weight_initc	           
        > XxS.n
[         TU ]  5         U R                  S[        R                  " XX4U4SS0U
DU	D65        U R                  S[        R
                  " U40 U
D65        [        R                  R                  U R                  R                  U5        [        R                  R                  U R                  R                  S5        g )Nr;   dtypecbiasFbnr   )r    r!   
add_modulerB   Conv2dBatchNorm2dinit	constant_rU   r6   rT   )r"   r3   rK   rL   rM   rN   rO   r;   rR   kwargsddr#   s              r$   r!   Conv2dNorm.__init__4   s     /RYY{GaJOaSUaY_a 	bbnn\@R@A
$''...9
$'',,*r&   r(   c                    U R                   R                  5       u  pUR                  UR                  UR                  -   S-  -  nUR                  US S 2S S S 4   -  nUR
                  UR                  UR                  -  UR                  UR                  -   S-  -  -
  n[        R                  " UR                  S5      U R                  R                  -  UR                  S5      UR                  SS  U R                  R                  U R                  R                  U R                  R                  U R                  R                  UR                  R                   UR                  R"                  S9	nUR                  R$                  R'                  U5        UR
                  R$                  R'                  U5        U$ )N      ?r   r      )	r3   rK   rL   rM   rN   dilationr2   r;   rR   )_modulesvaluesr6   running_varepsrT   running_meanrB   rW   sizerS   r2   r7   rM   rN   ra   r;   rR   datacopy_)r"   rS   rU   wbr   s         r$   r1   Conv2dNorm.fuseH   s8   $$&II"&&0S88HHqD$,--GGboo		1R^^bff5LQT4TTTIIq	DFFMM166==FFNNVV__66==88??((..

 	
A	!r&    )r   r   r   r   NN)r>   r?   r@   rA   intr!   r4   rE   rB   rW   r1   rF   rG   rH   s   @r$   r0   r0   3   s    
  !"#++ + 	+
 + +  + +( ]]_bii  r&   r0   c            	          ^  \ rS rSr    S
S\S\S\S\4U 4S jjjr\R                  " 5       S\
R                  4S j5       rS	rU =r$ )
NormLinear^   in_featuresout_featuresrT   stdc                 ~  > XVS.n[         TU ]  5         U R                  S[        R                  " U40 UD65        U R                  S[        R
                  " X4SU0UD65        [        U R                  R                  US9  U(       a5  [        R                  R                  U R                  R                  S5        g g )NrQ   rU   lrT   )rt   r   )r    r!   rV   rB   BatchNorm1dLinearr   rv   r6   rY   rZ   rT   )	r"   rr   rs   rT   rt   r;   rR   r\   r#   s	           r$   r!   NormLinear.__init___   s     /bnn[?B?@RYY{RtRrRSdffmm-GGdffkk1- r&   r(   c                    U R                   R                  5       u  pUR                  UR                  UR                  -   S-  -  nUR
                  U R                  R                  U R                  R                  -  UR                  UR                  -   S-  -  -
  nUR                  US S S 24   -  nUR
                  c#  X@R                  R                  R                  -  nO<UR                  US S 2S 4   -  R                  S5      U R                  R
                  -   n[        R                  " UR                  S5      UR                  S5      UR                  R                  UR                  R                  S9nUR                  R                   R#                  U5        UR
                  R                   R#                  U5        U$ )Nr_   r   r   rQ   )rb   rc   r6   rd   re   rT   rU   rf   rv   TviewrB   rx   rg   r;   rR   rh   ri   )r"   rU   rv   rj   rk   r   s         r$   r1   NormLinear.fusep   s<   $$&II"&&0S88GGdgg**TWW^^;r~~PRPVPV?V[^>^^^HHqqz!66>FFMMOO#AAagJ&,,R0466;;>AIIaffQi188??!((..Y	A	!r&   rm   )Tg{Gz?NN)r>   r?   r@   rA   rn   boolfloatr!   r4   rE   rB   rx   r1   rF   rG   rH   s   @r$   rp   rp   ^   sf    
 .. . 	.
 . ." ]]_bii  r&   rp   c                      ^  \ rS rSr\R
                  SS4S\S\S\\R                     4U 4S jjjr	S\
R                  S\
R                  4S	 jrS
rU =r$ )PatchMerging   Ndimout_dim	act_layerc                 
  > XES.n[         TU ]  5         [        US-  5      n[        X40 UD6U l        U" 5       U l        [        XwSSS4SU0UD6U l        U" 5       U l        [        US40 UD6U l	        [        Xr40 UD6U l
        g )NrQ         r`   r   r2   g      ?)r    r!   rn   r0   conv1act1conv2act2r   seconv3)	r"   r   r   r   r;   rR   r\   hid_dimr#   s	           r$   r!   PatchMerging.__init__   s     /cAg,33
K	!QP'PRP
K	447B7
r&   r'   r(   c                     U R                  U5      nU R                  U5      nU R                  U5      nU R                  U5      nU R	                  U5      nU R                  U5      nU$ r   )r   r   r   r   r   r   r+   s     r$   r,   PatchMerging.forward   sU    JJqMIIaLJJqMIIaLGGAJJJqMr&   )r   r   r   r   r   r   r>   r?   r@   rA   rB   ReLUrn   r	   rC   r!   r4   rD   r,   rF   rG   rH   s   @r$   r   r      s`    
 *,88 8 BII	8 8$ %,,  r&   r   c                      ^  \ rS rSr\R
                  SS4S\S\S\\R                     4U 4S jjjr	S\
R                  S\
R                  4S	 jrS
rU =r$ )FFN   Nr   	embed_dimr   c                    > XES.n[         TU ]  5         [        X40 UD6U l        U" 5       U l        [        X!4SS0UD6U l        g )NrQ   rO   r   )r    r!   r0   pw1actpw2)r"   r   r   r   r;   rR   r\   r#   s          r$   r!   FFN.__init__   sH     /c33;iEQE"Er&   r'   r(   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ r   )r   r   r   r+   s     r$   r,   FFN.forward   s.    HHQKHHQKHHQKr&   )r   r   r   r   rH   s   @r$   r   r      se    
 *,FF F BII	F F %,,  r&   r   c                      ^  \ rS rSrSr\\R                  SS4S\S\S\S\	\R                     S\	\R                     4
U 4S	 jjjrS
\R                  S\R                  4S jrSrU =r$ )SHSA   zSingle-Head Self-AttentionNr   qk_dimpdim
norm_layerr   c                   > XgS.n[         T	U ]  5         US-  U l        X l        Xl        X0l        U" U40 UD6U l        [        X2S-  U-   40 UD6U l        [        R                  " U" 5       [        X4SS0UD65      U l        g )NrQ   g      r`   rO   r   )r    r!   scaler   r   r   pre_normr0   qkvrB   
Sequentialproj)
r"   r   r   r   r   r   r;   rR   r\   r#   s
            r$   r!   SHSA.__init__   s     /t^
	"4.2.dQJ$5<<MM)+z#/[ST/[XZ/[\	r&   r'   r(   c                    UR                   u  p#pE[        R                  " XR                  U R                  U R                  -
  /SS9u  pgU R                  U5      nU R                  U5      n[        R                  " XR                  U R                  U R                  /SS9u  pnU	R                  S5      U
R                  S5      UR                  S5      pn	U	R                  SS5      U
-  U R                  -  nUR                  SS9nXR                  SS5      -  R                  X R                  XE5      nU R                  [        R                  " Xg/SS95      nU$ )Nr   )r   r`   r{   )r7   r4   splitr   r   r   r   r   flatten	transposer   softmaxreshaper   cat)r"   r'   B_HWx1x2r   qkvattns                r$   r,   SHSA.forward   s   WW
aQDHHtyy,@ AK]]2hhrl++cKKdii#HaPa))A,		!aiilaB#a'4::5|||#..R((11!YYEIIeii23r&   )r   r   r   r   r   r   r   )r>   r?   r@   rA   __doc__r   rB   r   rn   r	   rC   r!   r4   rD   r,   rF   rG   rH   s   @r$   r   r      s    $ +5)+]] ] 	]
 RYY] BII] ], %,,  r&   r   c                      ^  \ rS rSr\\R                  SS4S\S\S\S\S\	\R                     S\	\R                     4U 4S	 jjjrS
\R                  S\R                  4S jrSrU =r$ )
BasicBlock   Nr   r   r   typer   r   c	           	      2  > XxS.n	[         T
U ]  5         [        [        XSSS4USS.U	D65      U l        US:X  a  [        [        XX5U40 U	D65      U l        O[        R                  " 5       U l        [        [        U[        US-  5      40 U	D65      U l        g )NrQ   r   r   r   )r2   rO   sr`   )r    r!   r   r0   convr   mixerrB   Identityr   rn   ffn)r"   r   r   r   r   r   r   r;   rR   r\   r#   s             r$   r!   BasicBlock.__init__   s     /Z!Q^#VW^[]^_	3;!$sDi"VSU"VWDJDJCSq\8R89r&   r'   r(   c                 l    U R                  U5      nU R                  U5      nU R                  U5      nU$ r   )r   r   r   r+   s     r$   r,   BasicBlock.forward   s.    IIaLJJqMHHQKr&   )r   r   r   r>   r?   r@   rA   r   rB   r   rn   strr	   rC   r!   r4   rD   r,   rF   rG   rH   s   @r$   r   r      s     +5)+:: : 	:
 : RYY: BII: :( %,,  r&   r   c                      ^  \ rS rSr\\R                  SS4S\S\S\S\S\S\S	\	\R                     S
\	\R                     4U 4S jjjrS\R                  S\R                  4S jrSrU =r$ )
StageBlock   Nprev_dimr   r   r   r   depthr   r   c                 *  > XS.n[         TU ]  5         SU l        X:w  a  [        R                  " [        [        XSSS4SU0UD65      [        [        U[        US-  5      U40 UD65      [        XU40 UD6[        [        X"SSS4SU0UD65      [        [        U[        US-  5      U40 UD65      5      O[        R                  " 5       U l        [        R                  " [        U5       Vs/ s H  n[        X#XEXx40 UD6PM     sn6 U l        g s  snf )NrQ   Fr   r   r2   r`   )r    r!   grad_checkpointingrB   r   r   r0   r   rn   r   r   
downsampleranger   blocks)r"   r   r   r   r   r   r   r   r   r;   rR   r\   r   r#   s                r$   r!   StageBlock.__init__   s    /"' _ --ZAq!SHSPRSTS3x!|#4iF2FG	8R8Z!QD#DDESc#'lI<<=
 #%++- 	 mmV[\aVb&
VbQRJsD
LLVb&
  &
s   .Dr'   r(   c                     U R                  U5      nU R                  (       a;  [        R                  R	                  5       (       d  [        U R                  U5      nU$ U R                  U5      nU$ r   )r   r   r4   jitis_scriptingr   r   r+   s     r$   r,   StageBlock.forward  sV    OOA""599+A+A+C+Ct{{A.A  AAr&   )r   r   r   r   rH   s   @r$   r   r      s     +5)+  	
    RYY BII 8 %,,  r&   r   c                      ^  \ rS rSrSSSSSSSS	S
\\R                  SS4S\S\S\S\	\\\4   S\	\\\4   S\	\\\4   S\	\\\4   S\	\\\4   S\
S\\R                     S\\R                     4U 4S jjjr\R                  R                   S\4S j5       r\R                  R                   S/S\S\\\4   4S jj5       r\R                  R                   S0S j5       r\R                  R                   S\R                  4S j5       rS1S\S\4S jjr     S2S\R4                  S \\\\\   4      S!\S"\S#\S$\S\\\R4                     \	\R4                  \\R4                     4   4   4S% jjr   S3S \\\\   4   S&\S'\4S( jjrS\R4                  S\R4                  4S) jr S/S\R4                  S*\S\R4                  4S+ jjr!S\R4                  S\R4                  4S, jr"\RF                  " 5       S- 5       r$S.r%U =r&$ )4r   i  r     avg)r      i  )    @   `   )   r   r   )r   r`   r   )r   r   r           Nin_chansnum_classesglobal_poolr   partial_dimr   r   types	drop_rater   r   c                   > [         TU ]  5         XS.nX l        Xl        Xl        / U l        US   n[        R                  " [        XS-  SSS40 UD6U" 5       [        US-  US-  SSS40 UD6U" 5       [        US-  US-  SSS40 UD6U" 5       [        US-  USSS40 UD65      U l	        / nUn[        [        U5      5       Hg  nUR                  [        SUUU   UU   UU   UU   UU   U
US.UD65        UU   nU R
                  R                  [        USUS-   -  S	U 3S
95        Mi     [        R                  " U6 U l        US   =U l        U l        [%        US9U l        U(       a  [        R(                  " S5      O[        R*                  " 5       U l        US:  a  [/        U R"                  U40 UD6U l        g [        R*                  " 5       U l        g )NrQ   r      r   r`   r   r   )r   r   r   r   r   r   r   r   zstages.)num_chs	reductionmoduler{   	pool_typerm   )r    r!   r   r   r   feature_inforB   r   r0   patch_embedr   lenappendr   dictstagesnum_featureshead_hidden_sizer   r   Flattenr   r   rp   head)r"   r   r   r   r   r   r   r   r   r   r   r   r;   rR   r\   stem_chsr   prev_chsir#   s                      r$   r!   SHViT.__init__  s     	/& " Q<==xQ1a>2>Kx1}h!mQ1CCKx1}h!mQ1CCKx1}h1a>2>
 s9~&AMM* 
!aLay ^1XAh%#
 
 
 !|H$$T(a!A#hY`ab`cWd%ef ' mmV, 5>bMAD1/+F(3rzz!}LWZ[OJt44kHRH	acalalan	r&   r(   c                     [        5       $ r   )setr"   s    r$   no_weight_decaySHViT.no_weight_decayY  s	    ur&   coarsec                 0    [        SU(       a  SOSS/S9nU$ )Nz^patch_embedz^stages\.(\d+))z^stages\.(\d+).downsample)r   )z^stages\.(\d+)\.blocks\.(\d+)N)stemr   )r   )r"   r	  matchers      r$   group_matcherSHViT.group_matcher]  s'     (.$485
 r&   c                 6    U R                    H	  nXl        M     g r   )r   r   )r"   enabler   s      r$   set_grad_checkpointingSHViT.set_grad_checkpointingh  s    A#)  r&   c                 .    U R                   R                  $ r   )r   rv   r  s    r$   get_classifierSHViT.get_classifierm  s    yy{{r&   c                    Xl         [        US9U l        U(       a  [        R                  " S5      O[        R
                  " 5       U l        US:  a  [        U R                  U5      U l	        g [        R
                  " 5       U l	        g )Nr   r   r   )
r   r   r   rB   r   r   r   rp   r   r   )r"   r   r   s      r$   reset_classifierSHViT.reset_classifierq  sY    &/+F(3rzz!}FQTUoJt44kB	[][f[f[h	r&   r'   indicesnorm
stop_early
output_fmtintermediates_onlyc                    US;   d   S5       e/ n[        [        U R                  5      U5      u  pU R                  U5      n[        R
                  R                  5       (       d  U(       d  U R                  n
OU R                  SU	S-    n
[        U
5       H%  u  pU" U5      nX;   d  M  UR                  U5        M'     U(       a  U$ X4$ )a  Forward features that returns intermediates.

Args:
    x: Input image tensor
    indices: Take last n blocks if int, all if None, select matching indices if sequence
    norm: Apply norm layer to compatible intermediates
    stop_early: Stop iterating over blocks when last desired intermediate hit
    output_fmt: Shape of intermediate feature outputs
    intermediates_only: Only return intermediate features
Returns:

)NCHWzOutput shape must be NCHW.Nr   )	r   r   r   r   r4   r   r   	enumerater   )r"   r'   r  r  r  r  r  intermediatestake_indices	max_indexr   feat_idxstages                r$   forward_intermediatesSHViT.forward_intermediatesx  s    * Y&D(DD&"6s4;;7G"Q Q99!!##:[[F[[)a-0F(0OHaA'$$Q'  1
   r&   
prune_norm
prune_headc                     [        [        U R                  5      U5      u  pEU R                  SUS-    U l        U(       a  U R                  SS5        U$ )z?Prune layers not required for specified intermediates.
        Nr   r    )r   r   r   r  )r"   r  r(  r)  r"  r#  s         r$   prune_intermediate_layersSHViT.prune_intermediate_layers  sK     #7s4;;7G"Qkk.9q=1!!!R(r&   c                 J    U R                  U5      nU R                  U5      nU$ r   )r   r   r+   s     r$   forward_featuresSHViT.forward_features  s$    QKKNr&   
pre_logitsc                     U R                  U5      nU R                  U5      nU R                  S:  a)  [        R                  " XR                  U R
                  S9nU(       a  U$ U R                  U5      $ )Nr   )ptraining)r   r   r   r8   dropoutr4  r   )r"   r'   r1  s      r$   forward_headSHViT.forward_head  sX    QLLO>>B		!~~FAq0DIIaL0r&   c                 J    U R                  U5      nU R                  U5      nU$ r   )r/  r6  r+   s     r$   r,   SHViT.forward  s'    !!!$a r&   c                 "   ^ U4S jmT" U 5        g )Nc                    > U R                  5        HD  u  p[        US5      (       a&  UR                  5       n[        XU5        T" U5        M<  T" U5        MF     g )Nr1   )named_childrenhasattrr1   setattr)net
child_namechildfusedfuse_childrens       r$   rC  !SHViT.fuse.<locals>.fuse_children  sK    %(%7%7%9!
5&))!JJLECU3!%(!%( &:r&   rm   )r"   rC  s    @r$   r1   
SHViT.fuse  s    	) 	dr&   )r   r   r   r   r   r   r   r   r   r   r   F)T)r   )NFFr  F)r   FT)'r>   r?   r@   rA   r   rB   r   rn   r   r   r   r	   rC   r!   r4   r   ignorer   r  r   r   r   r  r  r  r  rD   r   r
   r   r&  r,  r/  r6  r,   rE   r1   rF   rG   rH   s   @r$   r   r     s    #$.=0<+7*3*9!*4)+:o:o :o 	:o
 S#s]+:o sC}-:o #sC-(:o c3':o c3':o :o RYY:o BII:o :ox YY   YYD T#s(^   YY* * YY		  iC ic i 8<$$',( ||(  eCcN34(  	( 
 (  (  !%(  
tELL!5tELL7I)I#JJ	K( X ./$#	3S	>*  	%,, 5<< 
1ell 1 1 1 %,, 
 ]]_
 
r&   
state_dictmodelr(   c                 *    U R                  SU 5      n U $ )NrI  )get)rH  rI  s     r$   checkpoint_filter_fnrL    s    4J: r&   urlr[   c                 8    U SSSSS[         [        SSSS	S
SS.UE$ )Nr   )r      rO  )r   r   g      ?bicubiczpatch_embed.0.czhead.lmitzarXiv:2401.16456zHSHViT: Single-Head Vision Transformer with Memory Efficient Macro Designz https://github.com/ysj9909/SHViT)rM  r   
input_size	pool_sizecrop_pctinterpolationmeanrt   
first_conv
classifierlicense	paper_ids
paper_name
origin_urlr   )rM  r[   s     r$   _cfgr]    s<    4}SYI%.B'x'`8
 
 
r&   ztimm/)	hf_hub_id)r   r   r   )r^  rR  )zshvit_s1.in1kzshvit_s2.in1kzshvit_s3.in1kzshvit_s4.in1kvariant
pretrainedc           	      F    [        [        X4[        [        SSS9S.UD6nU$ )N)r   r   r`   T)out_indicesflatten_sequential)pretrained_filter_fnfeature_cfg)r   r   rL  r   )r_  r`  r[   rI  s       r$   _create_shvitrf    s4     w1Y4H 	E Lr&   c           	      H    [        SSSSS9n[        SSU 0[        U40 UD6D6$ )N)r   rO  i@  r`   r      )r   0   D   r  r   r   r   r   r   r   r`  )shvit_s1r   rf  r`  r[   
model_argss      r$   rn  rn    5    !TceJY
Yd:>XQW>XYYr&   c           	      H    [        SSSSS9n[        SSU 0[        U40 UD6D6$ )N)r   i4    rh  )r   B   r   rl  rm  r`  )shvit_s2ro  rp  s      r$   rv  rv  $  rr  r&   c           	      H    [        SSSSS9n[        SSU 0[        U40 UD6D6$ )N)   i`  rt  )r   ri  ri  )rj  K   r   rl  rm  r`  )shvit_s3ro  rp  s      r$   rz  rz  +  rr  r&   c           	      H    [        SSSSS9n[        SSU 0[        U40 UD6D6$ )N)rO  iP  rt  )r         )rj  H   r   rl  rm  r`  )shvit_s4ro  rp  s      r$   r  r  2  rr  r&   )r+  rF  )9r   typingr   r   r   r   r   r   r	   r
   r4   torch.nnrB   torch.nn.functional
functionalr8   	timm.datar   r   timm.layersr   r   r   r   r   _builderr   	_featuresr   _manipulater   	_registryr   r   __all__rC   r   r   r0   rp   r   r   r   r   r   r   r   rD   rL  r]  default_cfgsr   rf  rn  rv  rz  r  rm   r&   r$   <module>r     sV   F E E     A a a * + ' <)ryy *( (V D299 :")) ,$299 $N 8# #LpBII pfT#u||*;%< RYY SWX[]b]i]iXiSj Bc # $sCx.  %    & *3 D C E  Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Z Zr&   