
    Z jT                        S r SSKJr  SSKJr  SSKrSSKJr  SSKJr	  SSK
Jr  SS	K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SKJrJr  SSKJr  SSKJrJrJ r   SSK!J"r"  SSK#J$r$  SSK%J&r&J'r'J(r(  SSK)J*r*  SSK+J,r,   " S S\&5      r- " S S\R\                  5      r/ " S S\R\                  5      r0 " S S\R\                  5      r1 " S  S!\R\                  5      r2 " S" S#\R\                  5      r3 " S$ S%\R\                  5      r4 " S& S'\5      r5 " S( S)\5      r6\ " S* S+\65      5       r7 " S, S-\6\5      r8/ S.Qr9g)/z"Modular components for DBRX model.    )Callable)AnyN)nn   )initialization)ACT2FN)CacheDynamicCache)GenerationMixin)create_causal_mask)GradientCheckpointingLayer)MoeCausalLMOutputWithPastMoeModelOutputWithPast)ALL_ATTENTION_FUNCTIONSPreTrainedModel)Unpack)TransformersKwargsauto_docstringcan_return_tuple)merge_with_config_defaults)capture_outputs   )LlamaRotaryEmbeddingapply_rotary_pos_embeager_attention_forward)load_balancing_loss_func   )
DbrxConfigc                       \ rS rSrSrg)DbrxRotaryEmbedding-    N)__name__
__module____qualname____firstlineno____static_attributes__r"       v/root/GenerationalWealth/GenerationalWealth/venv/lib/python3.13/site-packages/transformers/models/dbrx/modular_dbrx.pyr    r    -   s    r(   r    c                      ^  \ rS rSrSr SS\S-  4U 4S jjjr   SS\R                  S\R                  S-  S\R                  S-  S	\
S-  S
\\R                  \R                  4   4
S jjrSrU =r$ )DbrxAttention1   zYModular DBRX attention component that can be reused across different model architectures.N	layer_idxc                   > [         TU ]  5         Xl        UR                  U l        UR
                  U l        U R                  U R                  -  U l        UR                  U l	        X l
        UR                  nUR                  U l        UR                  U l        UR                  U l        U R                  U R                   -  U l        U R                  S-  U l        UR&                  U l        SU l        [*        R,                  " U R                  U R                  SU R                   -  U R                  -  -   SS9U l        [*        R,                  " U R                  U R                  SS9U l        g )Ng      Tr   Fbias)super__init__configd_modelhidden_sizen_heads	num_headshead_dimmax_seq_lenmax_position_embeddingsr-   attn_config
attn_pdropattention_dropoutclip_qkv
kv_n_headsnum_key_value_headsnum_key_value_groupsscaling
rope_theta	is_causalr   LinearWqkvout_proj)selfr3   r-   kwargsr;   	__class__s        r)   r2   DbrxAttention.__init__4   s&    	!>>((DNN:'-'9'9$"((!,!7!7#,,#.#9#9 $(NNd6N6N$N!}}d*%00IId..T5M5M1MPTP]P]1]]di
	 		$"2"2D4D4D5Qr(   hidden_statesattention_maskposition_embeddingspast_key_valuesreturnc                    UR                   S S n/ UQSPU R                  P7nU R                  U5      nU R                  b  U R                  * OS n	UR	                  XR                  S9nUR                  U R                  U R                  U R                  -  U R                  U R                  -  /SS9u  pnU
R                  U5      R                  SS5      n
UR                  U5      R                  SS5      nUR                  U5      R                  SS5      nUu  p[        XX5      u  pUb  UR                  XU R                  5      u  p[        R                  " U R                  R                   ["        5      nU" U U
UUU4U R$                  (       d  SOU R&                  U R(                  S.UD6u  nnUR*                  " / UQSP76 R-                  5       nU R/                  U5      nUU4$ )N)minmaxr   dimr           )dropoutrB   )shaper8   rF   r>   clampsplitr5   r@   view	transposer   updater-   r   get_interfacer3   _attn_implementationr   trainingr=   rB   reshape
contiguousrG   )rH   rL   rM   rN   rO   rI   input_shapehidden_shape
qkv_statesmin_valquery_states
key_statesvalue_statescossinattention_interfaceattn_outputattn_weightss                     r)   forwardDbrxAttention.forwardP   s    $))#2.88b8$--8YY}-
$(MM$=4==.4%%'}}%E
1;1A1A  ((4==8((4==8
  2B 2
., $((6@@AF__\2<<QB
#((6@@AF&#7RU#[ &'6'='=jX\XfXf'g$J(?(M(MKK,,.E)
 %8	%
  $}}C$2H2HLL	%
 	%
!\ "));;;;FFHmmK0L((r(   )rF   r=   r>   r3   r8   r5   rD   r-   r:   r7   rA   r@   rG   rC   rB   NNNN)r#   r$   r%   r&   __doc__intr2   torchTensor
LongTensorr	   tuplerp   r'   __classcell__rJ   s   @r)   r+   r+   1   s    c
 !%R :R R> /37;(,3)||3) t+3) #--4	3)
 3) 
u||U\\)	*3) 3)r(   r+   c            
          ^  \ rS rSrU 4S jrS\R                  S\R                  S\R                  S\R                  S\R                  4
S jrS	rU =r	$ )
DbrxExpertGLU   c                   > [         TU ]  5         UR                  U l        UR                  U l        UR                  U l        [
        R                  " [        R                  " U R                  U R                  -  U R                  5      5      U l	        [
        R                  " [        R                  " U R                  U R                  -  U R                  5      5      U l
        [
        R                  " [        R                  " U R                  U R                  -  U R                  5      5      U l        UR                  R                  SS5      n[        U   U l        g )Nnamesilu)r1   r2   r5   ffn_hidden_sizemoe_num_expertsr   	Parameterrv   emptyw1v1w2
ffn_act_fngetr   activation_fn)rH   r3   act_fn_namerJ   s      r)   r2   DbrxExpertGLU.__init__   s    !--%55%55,,u{{4+?+?$BVBV+VX\XhXhij,,u{{4+?+?$BVBV+VX\XhXhij,,u{{4+?+?$BVBV+VX\XhXhij''++FF;#K0r(   x	expert_w1	expert_v1	expert_w2rP   c                     UR                  U5      nUR                  U5      nU R                  U5      nXV-  nUR                  UR                  5       5      nU$ rr   )matmulr   t)	rH   r   r   r   r   	gate_projup_projintermediate_states	down_projs	            r)   rp   DbrxExpertGLU.forward   sU     HHY'	((9%&&y1	'1'..y{{}=	r(   )r   r   r5   r   r   r   r   
r#   r$   r%   r&   r2   rv   rw   rp   r'   rz   r{   s   @r)   r}   r}      sP    1*/,,CH<<\a\h\h	 r(   r}   c                      ^  \ rS rSrU 4S jrS\R                  S\R                  S\R                  S\R                  4S jrSrU =r	$ )	DbrxExperts   c                    > [         TU ]  5         [        U5      U l        UR                  U l        UR
                  U l        UR                  U l        g rr   )r1   r2   r}   mlpr5   r   r   num_expertsrH   r3   rJ   s     r)   r2   DbrxExperts.__init__   sD     (!--%55!11r(   rL   top_k_indextop_k_weightsrP   c                    UR                   S   nUR                  SU R                  5      n[        R                  " XR
                  UR                  S9n[        R                  " 5          [        R                  R                  R                  X R                  S9nUR                  SSS5      n[        R                  " UR                  SS9S5      R                  5       nS S S 5        SU R                  U R                   4nW GH  n	U	S   n	[        R                  " 5          [        R"                  " WU	   5      u  pS S S 5        U R$                  R&                  R)                  U5      U	   nU R$                  R*                  R)                  U5      U	   nU R$                  R,                  R)                  U5      U	   nU R%                  UW   XU5      nUR)                  SU R                  5      X;W
S 4   -  nUR/                  SX5        GM	     UR)                  USU R                  5      nU$ ! , (       d  f       GNT= f! , (       d  f       GN	= f)	Nr   rR   )dtypedevice)num_classesr   r   )rR   rU   )rY   rb   r   rv   
zeros_liker   r   no_gradr   
functionalone_hotr   permutegreatersumnonzeror5   wherer   r   r\   r   r   
index_add_)rH   rL   r   r   
batch_sizenext_statesexpert_mask
expert_hitsplit_expert_shape
expert_idxidx	token_idxr   r   r   statess                   r)   rp   DbrxExperts.forward   s    #((+
%--b$2F2FG&&}<O<OXeXlXlm]]_((--55kO_O_5`K%--aA6K{8'DaHPPRJ 
 !$"6"68H8HI$J#AJ!&[-D!E !!!"45jAB!!"45jAB!!"45jABXXmI6CF[[T%9%9:]VY[_K_=``F""1i8 % "&&z2t7K7KL% _ !s   *A7H."I .
H= 
I	)r   r5   r   r   r   r{   s   @r)   r   r      sH    2|| \\ ||	
 
 r(   r   c                      ^  \ rS rSrU 4S jrS\R                  S\\R                  \R                  \R                  4   4S jr	Sr
U =r$ )
DbrxRouter   c                    > [         TU ]  5         UR                  U l        UR                  U l        [
        R                  " U R                  UR                  SS9U l        g NFr/   )	r1   r2   r   r5   moe_jitter_epsr   rE   r   layerr   s     r)   r2   DbrxRouter.__init__   sJ    !11$33YYt//1G1GeT
r(   rL   rP   c                 (   U R                   (       aP  U R                  bC  U[        R                  " U5      R	                  SU R                  -
  SU R                  -   5      -  nUR                  SUR                  S   5      nU R                  U5      nU$ )Ng      ?rR   )ra   r   rv   
empty_likeuniform_r\   rY   r   )rH   rL   router_logitss      r)   rp   DbrxRouter.forward   s    ==T00<U--m<EEd)))31D1D+D M &**2}/B/B2/FG

=1r(   )r5   r   r   )r#   r$   r%   r&   r2   rv   rw   ry   rx   rp   r'   rz   r{   s   @r)   r   r      s@    UU\\ eELL%,,X]XhXh<h6i  r(   r   c                      ^  \ rS rSrSrU 4S jrS rS\R                  S\	\R                  \R                  4   4S jr
SrU =r$ )	DbrxFFN   z0Modular DBRX MLP/FFN component with MoE support.c                    > [         TU ]  5         [        UR                  5      U l        [        UR                  5      U l        UR                  R                  U l        UR                  R                  U l	        g rr   )
r1   r2   r   
ffn_configrouterr   expertsmoe_normalize_expert_weights	moe_top_ktop_k)rH   r3   rI   rJ   s      r)   r2   DbrxFFN.__init__   sY     !2!23"6#4#45,2,=,=,Z,Z)&&00
r(   c                    [         R                  R                  R                  USUR                  S9n[         R
                  " XR                  SS9u  p#U R                  b#  U[         R                  " X R                  SSS9-  nX#4$ )Nr   )rV   r   rR   rU   T)prV   keepdim)	rv   r   r   softmaxr   topkr   r   norm)rH   r   router_top_valuerouter_indicess       r)   route_tokens_to_expertsDbrxFFN.route_tokens_to_experts   s~    ++33MqP]PcPc3d+0::mZZUW+X(,,8/%** $E$E2W[3    //r(   rL   rP   c                 r    U R                  U5      nU R                  U5      u  p4U R                  XU5      nU$ rr   )r   r   r   )rH   rL   r   r   r   outputs         r)   rp   DbrxFFN.forward   s8    M2%)%A%A-%P"m-Hr(   )r   r   r   r   )r#   r$   r%   r&   rt   r2   r   rv   rw   ry   rp   r'   rz   r{   s   @r)   r   r      s>    :10U\\ eELL%,,<V6W  r(   r   c                      ^  \ rS rSrSS\S\S-  4U 4S jjjr  SS\R                  S\R                  S\R                  S-  S	\
S-  S
\S\\R                  \R                  4   4S jjrSrU =r$ )DbrxNormAttentionNorm   Nr3   r-   c                    > [         TU ]  5         X l        UR                  U l        [        R
                  " UR                  SS9U l        [        UUS9U l	        [        R
                  " UR                  SS9U l
        g )NFr/   r3   r-   )r1   r2   r-   resid_pdropr   	LayerNormr4   norm_1r+   attnnorm_2rH   r3   r-   rJ   s      r)   r2   DbrxNormAttentionNorm.__init__   sa    "!--ll6>>>!
	 ll6>>>r(   rL   rN   rM   rO   rI   rP   c                 V   UnU R                  U5      R                  UR                  5      nU R                  " SUUUUS.UD6u  p[        R
                  R                  XR                  U R                  S9nX-   nUnU R                  U5      R                  UR                  5      nXa4$ N)rL   rM   rN   rO   )r   ra   r"   )
r   tor   r   r   r   rX   r   ra   r   )rH   rL   rN   rM   rO   rI   residual_states_s           r)   rp   DbrxNormAttentionNorm.forward   s     (M255m6I6IJ99 
') 3+	

 
 --m?O?OZ^ZgZg-h%7'M255m6I6IJ--r(   )r   r-   r   r   r   rr   )NN)r#   r$   r%   r&   r   ru   r2   rv   rw   rx   r	   r   ry   rp   r'   rz   r{   s   @r)   r   r      s    	?z 	?cDj 	? 	? /3(,.||. #--. t+	.
 . . 
u||U\\)	*. .r(   r   c                      ^  \ rS rSrS\S\4U 4S jjr   SS\R                  S\R                  S-  S\R                  S-  S	\
S-  S
\4
S jjrSrU =r$ )	DbrxBlocki  r3   r-   c                    > [         TU ]  5         UR                  U l        UR                  U l        X l        [        UUS9U l        [        US9U l	        g )Nr   r3   )
r1   r2   r4   r5   r   r-   r   norm_attn_normr   ffnr   s      r)   r2   DbrxBlock.__init__  sN    !>>!--"3
 &)r(   NrL   rM   rN   rO   rI   c                     U R                   " SUUUUS.UD6u  paU R                  U5      n[        R                  R	                  XR
                  U R                  S9nXa-   nU$ r   )r   r   r   r   rX   r   ra   )rH   rL   rM   rN   rO   rI   resid_statess          r)   rp   DbrxBlock.forward&  sv     '+&9&9 '
') 3+	'

 '
# /--m?O?OZ^ZgZg-h$4r(   )r   r5   r-   r   r   rs   )r#   r$   r%   r&   r   ru   r2   rv   rw   rx   r	   r   rp   r'   rz   r{   s   @r)   r   r     sw    	*z 	*c 	* /37;(,|| t+ #--4	
   r(   r   c                      ^  \ rS rSr% \\S'   SrSrS/rS/r	Sr
SrSrSrSr\\S.r\R&                  " 5       S	\R*                  4U 4S
 jj5       rSrU =r$ )DbrxPreTrainedModeli<  r3   transformerTr   rO   F)rL   
attentionsmodulec                 <  > [         TU ]  U5        U R                  R                  n[	        U[
        5      (       aa  [        R                  " UR                  SUS9  [        R                  " UR                  SUS9  [        R                  " UR                  SUS9  g g )NrW   )meanstd)r1   _init_weightsr3   initializer_range
isinstancer}   initnormal_r   r   r   )rH   r  r  rJ   s      r)   r  !DbrxPreTrainedModel._init_weightsL  sm    f%kk++fm,,LL#6LL#6LL#6 -r(   r"   )r#   r$   r%   r&   r   __annotations__base_model_prefixsupports_gradient_checkpointing_no_split_modules_skip_keys_device_placement_supports_flex_attn_supports_attention_backend_supports_flash_attn_supports_sdpa_can_compile_fullgraphr   r+   _can_record_outputsrv   r   r   Moduler  r'   rz   r{   s   @r)   r   r   <  sv    %&*#$#4"5"&N""#
 ]]_7BII 7 7r(   r   c                   J  ^  \ rS rSrSrS\4U 4S jjrS\R                  4S jr	S\R                  4S jr
\\\      SS
\R                  S	-  S\R                   S	-  S\R                  S	-  S\S	-  S\R$                  S	-  S\S	-  S\\   S\4S jj5       5       5       rSrU =r$ )	DbrxModeliV  a  Transformer decoder consisting of *config.num_hidden_layers*. Each layer is a [`DbrxBlock`] layer.

Args:
    config ([`DbrxConfig`]): Model configuration class with all parameters of the model.
        Initializing with a config file does not load the weights associated with the model, only the
        configuration. Check out the [`~PreTrainedModel.from_pretrained`] method to load the model weights.
r3   c           	      0  > [         TU ]  U5        UR                  U l        UR                  U l        UR
                  U l        [        U5      U l        [        R                  " UR                  UR                  U R                  5      U l        [        R                  " [        UR                  5       Vs/ s H  n[        X5      PM     sn5      U l        [        R"                  " UR                  SS9U l        SU l        U R)                  5         g s  snf r   )r1   r2   pad_token_idpadding_idx
vocab_size	emb_pdropr    
rotary_embr   	Embeddingr4   wte
ModuleListrangen_layersr   blocksr   norm_fgradient_checkpointing	post_initr   s      r)   r2   DbrxModel.__init__`  s     !.. ++))-f5<< 1 16>>4CSCSTmmSXY_YhYhSi$jSiiYv%ASi$jkll6>>>&+# 	 %ks   6DrP   c                     U R                   $ rr   r"  rH   s    r)   get_input_embeddingsDbrxModel.get_input_embeddingsn  s    xxr(   valuec                     Xl         g rr   r,  rH   r0  s     r)   set_input_embeddingsDbrxModel.set_input_embeddingsq  s    r(   N	input_idsrM   position_idsrO   inputs_embeds	use_cacherI   c           
      B   US L US L-  (       a  [        S5      eU(       a  Uc  [        U R                  S9nUc  U R                  U5      nUcU  Ub  UR	                  5       OSn[
        R                  " UR                  S   UR                  S9U-   nUR                  S5      n[        U R                  UUUUS9n	Un
U R                  X5      nU R                  S U R                  R                    H  nU" U
4UU	UUUS.UD6n
M     U R                  U
5      n
[        U
US9$ )	Nz:You must specify exactly one of input_ids or inputs_embedsr   r   r   )r   )r3   r7  rM   rO   r6  )rN   rM   r6  rO   r8  )last_hidden_staterO   )
ValueErrorr
   r3   r"  get_seq_lengthrv   arangerY   r   	unsqueezer   r   r&  num_hidden_layersr'  r   )rH   r5  rM   r6  rO   r7  r8  rI   past_seen_tokenscausal_maskrL   rN   decoder_layers                r)   rp   DbrxModel.forwardt  sD    -t";<YZZ0*$++>O  HHY/MCRC^==?de <<(;(;A(>}G[G[\_ooL'11!4L(;;')+%
 & #oomJ![[)H4;;+H+HIM)$7*) /# M J M2%++
 	
r(   )r&  r  r(  r'  r  r   r  r"  )NNNNNN)r#   r$   r%   r&   rt   r   r2   r   r!  r.  r3  r   r   r   rv   rx   rw   r	   FloatTensorboolr   r   r   rp   r'   rz   r{   s   @r)   r  r  V  s    z bll ",,    .2.204(,26!%5
##d*5
 t+5
 &&-	5

 5
 ((4/5
 $;5
 +,5
 
 5
    5
r(   r  c                     ^  \ rS rSrSS0rSS0rSS/S/40rS\4U 4S	 jjrS
\	R                  4S jrS\	R                  4S jrS
\	R                  4S jrS\	R                  4S jrS\4S jrS
\4S jr\\         S!S\R,                  S-  S\R.                  S-  S\R,                  S-  S\S-  S\R2                  S-  S\R,                  S-  S\S-  S\S-  S\\R.                  -  S\\   S
\4S jj5       5       rS r U =r!$ )"DbrxForCausalLMi  zlm_head.weightztransformer.wte.weightlm_headcolwise_gather_outputrL   logitsr3   c                   > [         TU ]  U5        [        U5      U l        UR                  U l        [
        R                  " UR                  UR                  SS9U l        UR                  R                  U l        UR                  R                  U l        UR                  R                  U l        U R!                  5         g r   )r1   r2   r  r  r  r   rE   r5   rH  r   moe_loss_weightrouter_aux_loss_coefr   r   r   num_experts_per_tokr)  r   s     r)   r2   DbrxForCausalLM.__init__  s     $V, ++yy!3!3V5F5FUS$*$5$5$E$E!!,,<<#)#4#4#>#> r(   rP   c                 6    U R                   R                  5       $ rr   )r  r.  r-  s    r)   r.  $DbrxForCausalLM.get_input_embeddings  s    4466r(   r0  c                 :    U R                   R                  U5        g rr   )r  r3  r2  s     r)   r3  $DbrxForCausalLM.set_input_embeddings  s    --e4r(   c                     U R                   $ rr   rH  r-  s    r)   get_output_embeddings%DbrxForCausalLM.get_output_embeddings  s    ||r(   new_embeddingsc                     Xl         g rr   rU  )rH   rX  s     r)   set_output_embeddings%DbrxForCausalLM.set_output_embeddings  s    %r(   decoderc                     Xl         g rr   r  )rH   r\  s     r)   set_decoderDbrxForCausalLM.set_decoder  s    "r(   c                     U R                   $ rr   r^  r-  s    r)   get_decoderDbrxForCausalLM.get_decoder  s    r(   Nr5  rM   r6  rO   r7  labelsr8  output_router_logitslogits_to_keeprI   c
                 z   Ub  UOU R                   R                  nU R                  " SUUUUUUUS.U
D6nUR                  n[	        U	[
        5      (       a  [        U	* S5      OU	nU R                  USS2USS24   5      nSnUb  U R                  " XU R                  40 U
D6nSnU(       aY  [        UR                  U R                  U R                  U5      nUb*  XR                  UR                  UR                   5      -  -  n[#        UUUUR$                  UR&                  UR(                  UR                  S9$ )a  
labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
    Labels for computing the masked language modeling loss. Indices should either be in `[0, ...,
    config.vocab_size]` or -100 (see `input_ids` docstring). Tokens with indices set to `-100` are ignored
    (masked), the loss is only computed for the tokens with labels in `[0, ..., config.vocab_size]`.

Example:

```python
>> from transformers import AutoTokenizer, DbrxForCausalLM

>> model = DbrxForCausalLM.from_pretrained("transformers-community/dbrx-instruct")
>> tokenizer = AutoTokenizer.from_pretrained("transformers-community/dbrx-instruct")

>> prompt = "Hey, are you conscious? Can you talk to me?"
>> inputs = tokenizer(prompt, return_tensors="pt")

>> # Generate
>> generate_ids = model.generate(inputs.input_ids, max_length=30)
>> tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
"Hey, are you conscious? Can you talk to me?\nI'm not conscious, but I can talk to you."
```
N)r5  rM   r6  rO   r7  r8  re  )lossaux_lossrJ  rO   rL   r  r   r"   )r3   re  r  r:  r	  ru   slicerH  loss_functionr  r   r   r   rN  rM  r   r   r   rO   rL   r  )rH   r5  rM   r6  rO   r7  rd  r8  re  rf  rI   outputsrL   slice_indicesrJ  rh  ri  s                    r)   rp   DbrxForCausalLM.forward  sR   N %9$D $++JjJj 	
 +/*:*: 	+
)%+'!5	+
 	+
  118B>SV8W8W~ot4]kmA}a,?@A%%fdooPPD/%%  ((	H !11HKK4LLL(#33!//))!//
 	
r(   )rH  r   rN  rM  r  r  )	NNNNNNNNr   )"r#   r$   r%   r&   _tied_weights_keys_tp_plan_pp_planr   r2   r   r!  r.  r3  rE   rV  rZ  r  r_  rb  r   r   rv   rx   rw   r	   rD  rE  ru   r   r   r   rp   r'   rz   r{   s   @r)   rG  rG    s   *,DE23H_-z:;Hz 7bll 75",, 5ryy &BII &#9 # Y    .2.204(,26*.!%,0-.P
##d*P
 t+P
 &&-	P

 P
 ((4/P
   4'P
 $;P
 #TkP
 ell*P
 +,P
 
#P
  P
r(   rG  )rG  r  r   ):rt   collections.abcr   typingr   rv   r    r   r
  activationsr   cache_utilsr	   r
   
generationr   masking_utilsr   modeling_layersr   modeling_outputsr   r   modeling_utilsr   r   processing_utilsr   utilsr   r   r   utils.genericr   utils.output_capturingr   llama.modeling_llamar   r   r   mixtral.modeling_mixtralr   configuration_dbrxr   r    r  r+   r}   r   r   r   r   r   r   r  rG  __all__r"   r(   r)   <module>r     s   ) $    & ! . ) / R F & I I 7 5 
 @ *	. 	R)BII R)jBII 2$")) $N "bii 6%.BII %.P* D7/ 74 U
# U
 U
ps
)? s
l Br(   