
    Z jo                        S SK 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
JrJr  SSKJr  SSKJr  SS	KJr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"J#r#J$r$  SSK%J&r&  SSK'J(r(J)r)  \RT                  " \+5      r,\" SS9\	 " S S\5      5       5       r-\ " S S\5      5       r.\ " S S\5      5       r/ " S S\R`                  5      r1\ " S S\)5      5       r2\" SS9 " S  S!\(5      5       r3 " S" S#\&5      r4\ " S$ S%\25      5       r5\" S&S9 " S' S(\25      5       r6\" S)S9 " S* S+\25      5       r7/ S,Qr8g)-    N)	dataclass)Literal)strict)BCEWithLogitsLossCrossEntropyLossMSELoss   )initialization)PreTrainedConfig)BaseModelOutputMaskedLMOutputSequenceClassifierOutputTokenClassifierOutput)PreTrainedModel)Unpack)TransformersKwargsauto_docstringlogging)can_return_tuple   )CONFIG_MAPPING
AutoConfig	AutoModel)ModernBertPredictionHead)SmolVLMModelSmolVLMPreTrainedModelModernVBERT/modernvbert)
checkpointc                      ^  \ rS rSr% SrSr\\S.rSr\	\
-  S-  \S'   Sr\	\
-  S-  \S'   Sr\\S	'   S
r\\S'   Sr\\S'   Sr\\S'   Sr\S   \S'   Sr\\-  \S'   Sr\\S'   Sr\\S'   U 4S jrSrU =r$ )ModernVBertConfig,   a  
pixel_shuffle_factor (`int | None`, *optional*, defaults to 4):
    Scale factor used by any pixel-shuffle / upsampling operations in the vision head.
initializer_cutoff_factor (`float | None`, *optional*, defaults to 2.0):
    The cutoff factor for the truncated_normal_initializer for initializing all weight matrices.
classifier_pooling (`Literal["cls", "mean"]`, *optional*, defaults to `"cls"`):
    The pooling strategy to use for classification tasks.
classifier_bias (`bool | None`, *optional*, defaults to `False`):
    Whether to add a bias term to the classification head

Example:
```python
>>> from transformers import ModernVBertConfig

>>> # Initializing configuration
>>> configuration = ModernVBertConfig()

>>> # Initializing a model from the configuration (model class is implemented in
>>> # `modernvbert.modeling_modernvbert`)

>>> from transformers import ModernVBertModel
>>> model = ModernVBertModel(configuration)

>>> # Accessing the model configuration
>>> cfg = model.config
```modernvbert)text_configvision_configNr#   r$   i  image_token_id   pixel_shuffle_factorg{Gz?initializer_range       @initializer_cutoff_factorcls)r+   meanclassifier_pooling        classifier_dropoutFclassifier_biastie_word_embeddingsc                   > U R                   c  [        S   " 5       U l         O=[        U R                   [        5      (       a  [        S   " S0 U R                   D6U l         U R                  c  [        S   " 5       U l        O=[        U R                  [        5      (       a  [        S   " S0 U R                  D6U l        [
        TU ]  " S0 UD6  g )N
modernbertsiglip_vision_model )r#   r   
isinstancedictr$   super__post_init__)selfkwargs	__class__s     ڄ/root/GenerationalWealth/GenerationalWealth/venv/lib/python3.13/site-packages/transformers/models/modernvbert/modular_modernvbert.pyr9   ModernVBertConfig.__post_init__X   s    #-l;=D(($//-l;Od>N>NOD%!/0E!F!HD**D11!/0E!F!\I[I[!\D''    )__name__
__module____qualname____firstlineno____doc__
model_typer   sub_configsr#   r   r7   __annotations__r$   r%   intr'   r(   floatr*   r-   r   r/   r0   boolr1   r9   __static_attributes____classcell__r<   s   @r=   r    r    ,   s    6 J",zJK26K!D(4/648M#d*T18NC !#!#u#'*u*16.6&))!OT! %%( (r?   r    c                       \ rS rSr% SrSr\R                  \S'   Sr	\
\R                     S-  \S'   Sr\
\R                     S-  \S'   Sr\
\R                     S-  \S'   Srg)	ModernVBertBaseModelOutputf   a	  
Base class for ModernVBERT model's outputs.
Args:
    last_hidden_state (`torch.FloatTensor` of shape `(batch_size, sequence_length, hidden_size)`):
        Sequence of hidden-states at the output of the last layer of the model.
        If `past_key_values` is used only the last hidden-state of the sequences of shape `(batch_size, 1,
        hidden_size)` is output.
    hidden_states (`tuple(torch.FloatTensor)`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`):
        Tuple of `torch.FloatTensor` (one for the output of the embeddings, if the model has an embedding layer, +
        one for the output of each layer) of shape `(batch_size, sequence_length, hidden_size)`.
        Hidden-states of the model at the output of each layer plus the optional initial embedding outputs.
    attentions (`tuple(torch.FloatTensor)`, *optional*, returned when `output_attentions=True` is passed or when `config.output_attentions=True`):
        Tuple of `torch.FloatTensor` (one for each layer) of shape `(batch_size, num_heads, sequence_length,
        sequence_length)`.
        Attentions weights after the attention softmax, used to compute the weighted average in the self-attention
        heads.
    image_hidden_states (`tuple(torch.FloatTensor)`, *optional*):
        Tuple of `torch.FloatTensor` (one for the output of the image embeddings, `(batch_size, num_images,
        sequence_length, hidden_size)`.
        image_hidden_states of the model produced by the vision encoder
Nlast_hidden_statehidden_states
attentionsimage_hidden_statesr5   )r@   rA   rB   rC   rD   rQ   torchFloatTensorrG   rR   tuplerS   rT   rK   r5   r?   r=   rO   rO   f   si    , ,0u((/59M5**+d2926Je''(4/6;?u001D8?r?   rO   c                       \ rS rSr% SrSr\R                  S-  \S'   Sr	\R                  \S'   Sr
\\R                  S4   S-  \S'   Sr\\R                  S4   S-  \S'   Sr\R                  S-  \S	'   S
rg)ModernVBertMaskedLMOutput   a  
Base class for ModernVBERT model's outputs with masked language modeling loss.
Args:
    loss (`torch.FloatTensor`, *optional*, returned when `labels` is provided):
        Masked language modeling (MLM) loss.
    logits (`torch.FloatTensor`):
        Prediction scores of the language modeling head (scores for each vocabulary token before SoftMax).
    hidden_states (`tuple(torch.FloatTensor)`, *optional*, returned when `output_hidden_states=True` is passed or when `config.output_hidden_states=True`):
        Tuple of `torch.FloatTensor` (one for the output of the embeddings, if the model has an embedding layer, +
        one for the output of each layer) of shape `(batch_size, sequence_length, hidden_size)`.
        Hidden-states of the model at the output of each layer plus the optional initial embedding outputs.
    attentions (`tuple(torch.FloatTensor)`, *optional*, returned when `output_attentions=True` is passed or when `config.output_attentions=True`):
        Tuple of `torch.FloatTensor` (one for each layer) of shape `(batch_size, num_heads, sequence_length,
        sequence_length)`.
        Attentions weights after the attention softmax, used to compute the weighted average in the self-attention
        heads.
    image_hidden_states (`tuple(torch.FloatTensor)`, *optional*):
        Tuple of `torch.FloatTensor` (one for the output of the image embeddings, `(batch_size, num_images,
        sequence_length, hidden_size)`.
        image_hidden_states of the model produced by the vision encoder
Nlosslogits.rR   rS   rT   r5   )r@   rA   rB   rC   rD   r[   rU   rV   rG   r\   rR   rW   rS   rT   rK   r5   r?   r=   rY   rY      s    , &*D%

d
") $FE$:>M5**C/047>7;Je'',-4;48**T18r?   rY   c                   8   ^  \ rS rSrSrU 4S jrS rS rSrU =r	$ )ModernVBertConnector   z
Connector module for ModernVBERT. It performs a pixel shuffle operation followed by a linear projection to match the text model's hidden size.
Based on https://pytorch.org/docs/stable/generated/torch.nn.PixelShuffle.html
c                    > [         TU ]  5         UR                  U l        [        R                  " UR
                  R                  UR                  S-  -  UR                  R                  SS9U l        g )Nr   Fbias)	r8   __init__r'   nnLinearr$   hidden_sizer#   modality_projectionr:   configr<   s     r=   rc   ModernVBertConnector.__init__   s^    $*$?$?!#%99  ,,0K0KQ0NO**$
 r?   c                    UR                  5       u  p4n[        US-  5      =pgUR                  X6Xu5      nUR                  X6[        Xr-  5      XR-  5      nUR                  SSSS5      nUR	                  U[        Xr-  5      [        Xb-  5      XRS-  -  5      nUR                  SSSS5      nUR	                  U[        XBS-  -  5      XRS-  -  5      $ )Ng      ?r   r      r	   )sizerH   viewpermutereshape)r:   rT   r'   
batch_size
seq_length	embed_dimheightwidths           r=   pixel_shuffle"ModernVBertConnector.pixel_shuffle   s    ,?,D,D,F)
	Z_--166z5\166E$@ A9Cc
 299!Q1E199,--.q01	
 299!Q1E"**J*ABCYhiRiEj
 	
r?   c                 Z    U R                  XR                  5      nU R                  U5      $ N)rv   r'   rg   )r:   rT   s     r=   forwardModernVBertConnector.forward   s,    "001DF_F_`''(;<<r?   )rg   r'   )
r@   rA   rB   rC   rD   rc   rv   rz   rK   rL   rM   s   @r=   r^   r^      s    


&= =r?   r^   c                   J    \ rS rSr\r/ r\R                  " 5       S 5       r	Sr
g)ModernVBertPreTrainedModel   c                 @  ^  [         R                  " T U5        S[        R                  S[        4U 4S jjn[        U[        5      (       ab  T R                  R                  [        R                  " ST R                  R                  R                  -  5      -  nU" UR                  U5        g [        U[        5      (       ab  T R                  R                  [        R                  " ST R                  R                  R                  -  5      -  nU" UR                  U5        g [        U[         ["        45      (       a_  T R                  R                  [        R                  " T R                  R                  R$                  5      -  nU" UR&                  U5        g g )Nmodulestdc                 @  > [        TR                  SS5      n[        R                  " U R                  SUU* U-  X!-  S9  [        U [        R                  [        R                  45      (       a/  U R                  b!  [        R                  " U R                  5        g g g )Nr*   r)   r.   )r,   r   ab)getattrri   inittrunc_normal_weightr6   rd   re   Conv2drb   zeros_)r   r   cutoff_factorr:   s      r=   init_weight=ModernVBertPreTrainedModel._init_weights.<locals>.init_weight   s    #DKK1LcRM .3&% &299bii"899;;*KK, + :r?   r)   )r   _init_weightsrd   ModulerI   r6   r^   ri   r(   mathsqrtr#   num_hidden_layersrg   ModernVBertForMaskedLMlm_head$ModernVBertForSequenceClassification!ModernVBertForTokenClassificationrf   
classifier)r:   r   r   out_stdfinal_out_stds   `    r=   r   (ModernVBertPreTrainedModel._init_weights   s)   %%dF3	-		 	- 	- f233kk33diidkkF]F]FoFo@o6ppG22G< 677kk33diidkkF]F]FoFo@o6ppG041
 
 !KK99DIIdkkF]F]FiFi<jjM))=9
r?   r5   N)r@   rA   rB   rC   r    config_class_no_split_modulesrU   no_gradr   rK   r5   r?   r=   r}   r}      s%    $L
]]_: :r?   r}   aF  
    ModernVBertModel is a model that combines a vision encoder (SigLIP) and a text encoder (ModernBert).

    ModernVBert is the base model of the visual retriver ColModernVBert, and was introduced in the following paper:
    [*ModernVBERT: Towards Smaller Visual Document Retrievers*](https://arxiv.org/abs/2510.01149).
    )custom_introc                   J  ^  \ rS rSrS\4U 4S jjr\\" SSS9       SS\R                  S	\R                  S-  S
\R                  S-  S\R                  S-  S\R                  S-  S\R                  S-  S\R                  S-  S\\   S\\-  4S jj5       5       rSrU =r$ )ModernVBertModel   ri   c                   > [         TU ]  U5        [        U5      U l        [        R
                  " UR                  5      U l        [        R
                  " UR                  5      U l	        [        UR                  R                  UR                  R                  -  S-  UR                  S-  -  5      U l        U R                  5         g )Nr   )r8   rc   r^   	connectorr   from_configr#   
text_modelr$   vision_modelrH   
image_size
patch_sizer'   image_seq_len	post_initrh   s     r=   rc   ModernVBertModel.__init__   s      .f5#//0B0BC%11&2F2FG ""--1E1E1P1PPUVV**A-/
 	r?     
        Inputs fed to the model can have an arbitrary number of images. To account for this, pixel_values fed to
        the model have image padding -> (batch_size, max_num_images, 3, max_heights, max_widths) where
        max_num_images is the maximum number of images among the batch_size samples in the batch.
        Padding images are not needed beyond padding the pixel_values at the entrance of the model.
        For efficiency, we only pass through the vision_model's forward the real images by
        discarding the padding images i.e. pixel_values of size (image_batch_size, 3, height, width) where
        image_batch_size would be 7 when num_images_per_sample=[1, 3, 1, 2] and max_num_images would be 3.
        r   r   r   N	input_idsattention_maskposition_idsinputs_embedspixel_valuespixel_attention_maskrT   r;   returnc                    Uc9  U R                   R                  5       " U5      R                  UR                  5      nUb  U R	                  XVS9R
                  nUb4  UR                  UR                  UR                  S9nU R                  XUS9nU R                   " SUUUS.UD6n	[        U	R                  U	R                  U	R                  US9$ )aT  
pixel_attention_mask (`torch.Tensor` of shape `(batch_size, image_size, image_size)`, *optional*):
    Mask to avoid performing attention on padding pixel indices.
image_hidden_states (`torch.FloatTensor` of shape `(batch_size, num_channels, image_size, image_size)`):
    The hidden states of the image encoder after modality projection.
)r   r   )dtypedevice)r   r   rT   )r   r   r   )rQ   rR   rS   rT   r5   )r   get_input_embeddingstor   get_image_featurespooler_outputr   inputs_mergerrO   rQ   rR   rS   )
r:   r   r   r   r   r   r   rT   r;   outputss
             r=   rz   ModernVBertModel.forward  s    >   OO@@B9MPPQZQaQabM #"&"9"9) #: #m  
 *"5"8"8}?R?R[h[o[o"8"p ..#Vi / M
 // 
')%
 	
 *%77!//)) 3	
 	
r?   )r   r   r   r   )NNNNNNN)r@   rA   rB   rC   r    rc   r   r   rU   
LongTensorTensorrV   
BoolTensorr   r   rW   rO   rz   rK   rL   rM   s   @r=   r   r      s    0    - '+.20426158<8</
##/
 t+/
 &&-	/

 ((4//
 ''$./
 $..5/
 #..5/
 +,/
 
+	+/
 /
r?   r   c                       \ rS rSrSrg)ModernVBertPredictionHeadiJ  r5   N)r@   rA   rB   rC   rK   r5   r?   r=   r   r   J  s    r?   r   c                   ~  ^  \ rS rSrSS0rS\4U 4S jjrS rS r\	\
" SS	S
9        SS\R                  S\R                  S-  S\R                  S-  S\R                  S-  S\R                  S-  S\R                  S-  S\R                  S-  S\R                  S-  S\\   S\\-  4S jj5       5       rSrU =r$ )r   iN  zlm_head.weightz1model.text_model.embeddings.tok_embeddings.weightri   c                 h  > [         TU ]  U5        UR                  R                  U l        [	        U5      U l        [        UR                  5      U l        [        R                  " UR                  R                  U R                  UR                  R                  S9U l        U R                  5         g )Nra   )r8   rc   r#   
vocab_sizer   modelr   projection_headrd   re   rf   decoder_biasr   r   rh   s     r=   rc   ModernVBertForMaskedLM.__init__R  s      ,,77%f-
89K9KLyy!3!3!?!?W]WiWiWvWvw 	r?   c                     U R                   $ ry   r   )r:   s    r=   get_output_embeddings,ModernVBertForMaskedLM.get_output_embeddings^  s    ||r?   c                     Xl         g ry   r   )r:   new_embeddingss     r=   set_output_embeddings,ModernVBertForMaskedLM.set_output_embeddingsa  s    %r?   r   r   r   Nr   r   r   r   r   r   rT   labelsr;   r   c	                 X   U R                   " SUUUUUUUS.U	D6n
U
S   nU R                  U R                  U5      5      nSnUb<  [        5       nU" UR	                  SU R
                  5      UR	                  S5      5      n[        UUU
R                  U
R                  U
R                  S9$ )  
pixel_attention_mask (`torch.Tensor` of shape `(batch_size, image_size, image_size)`, *optional*):
    Mask to avoid performing attention on padding pixel indices.
image_hidden_states (`torch.FloatTensor` of shape `(batch_size, num_channels, image_size, image_size)`):
    The hidden states of the image encoder after modality projection.
labels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):
    Labels for computing the masked language modeling loss. Indices should either be in `[0, ...,
    text_config.]` or `model.image_token_id`. Tokens with indices set to `model.image_token_id` are
    ignored (masked), the loss is only computed for the tokens with labels in `[0, ..., text_config.]`.
r   r   r   r   r   r   rT   r   N)r[   r\   rR   rS   rT   r5   )
r   r   r   r   rn   r   rY   rR   rS   rT   )r:   r   r   r   r   r   r   rT   r   r;   r   rR   r\   r[   	criterions                  r=   rz   ModernVBertForMaskedLM.forwardd  s    H ** 	
)%'%!5 3	
 	
  
d22=AB(*IV[[T__=v{{2OD(!//)) ' ; ;
 	
r?   )r   r   r   r   NNNNNNNN)r@   rA   rB   rC   _tied_weights_keysr    rc   r   r   r   r   rU   r   r   rV   r   r   r   rW   rY   rz   rK   rL   rM   s   @r=   r   r   N  s*   *,_`
0 
&  - '+.20426158<8<*.0
##0
 t+0
 &&-	0

 ((4/0
 ''$.0
 $..50
 #..50
   4'0
 +,0
 
*	*0
 0
r?   r   za
    The ModernVBert Model with a sequence classification head on top that performs pooling.
    c                   j  ^  \ rS rSrS\4U 4S jjr\\" SSS9        SS\R                  S	\R                  S-  S
\R                  S-  S\R                  S-  S\R                  S-  S\R                  S-  S\R                  S-  S\R                  S-  S\\   S\\-  4S jj5       5       rSrU =r$ )r   i  ri   c                   > [         TU ]  U5        UR                  U l        Xl        [	        U5      U l        [        UR                  5      U l        [        R                  " UR                  5      U l        [        R                  " UR                  R                  UR                  5      U l        U R!                  5         g ry   )r8   rc   
num_labelsri   r   r   r   r#   headrd   Dropoutr/   dropre   rf   r   r   rh   s     r=   rc   -ModernVBertForSequenceClassification.__init__  s      ++%f-
-f.@.@A	JJv889	))F$6$6$B$BFDUDUV 	r?   r   r   r   Nr   r   r   r   r   r   rT   r   r;   r   c	                    U R                   " SUUUUUUUS.U	D6n
U
S   nU R                  R                  S:X  a
  USS2S4   nOU R                  R                  S:X  a  Ub  UR                  SS u  pOUR                  SS u  pUb  UR                  OUR                  nUc%  [
        R                  " X4U[
        R                  S9nXR                  S5      -  R                  S	S
9UR                  S	SS9-  nU R                  U5      nU R                  U5      nU R                  U5      nSnUGb  U R                  R                  c  U R                  S	:X  a  SU R                  l        OoU R                  S	:  aN  UR                  [
        R                   :X  d  UR                  [
        R"                  :X  a  SU R                  l        OSU R                  l        U R                  R                  S:X  aJ  [%        5       nU R                  S	:X  a&  U" UR'                  5       UR'                  5       5      nOU" UU5      nOU R                  R                  S:X  a=  [)        5       nU" UR+                  SU R                  5      UR+                  S5      5      nO-U R                  R                  S:X  a  [-        5       nU" UU5      n[/        UUU
R0                  U
R2                  S9$ )r   r   r   r+   Nr,   r   )r   r   r   rl   )dimT)r   keepdim
regressionsingle_label_classificationmulti_label_classificationr[   r\   rR   rS   r5   )r   ri   r-   shaper   rU   onesrJ   	unsqueezesumr   r   r   problem_typer   r   longrH   r   squeezer   rn   r   r   rR   rS   )r:   r   r   r   r   r   r   rT   r   r;   r   rQ   rq   seq_lenr   pooled_outputr\   r[   loss_fcts                      r=   rz   ,ModernVBertForSequenceClassification.forward  s   F ** 	
)%'%!5 3	
 	
 $AJ;;))U2 1!Q$ 7[[++v5(&3&9&9"1&=#
G&/oobq&9#
)2)>Y%%MDXDXF%!&Z,A&X]XbXb!c!25M5Mb5Q!Q V V[\ V ]`n`r`rt as a ! 		"34		-0/{{''/??a'/;DKK,__q(fllejj.HFLL\a\e\eLe/LDKK,/KDKK,{{''<7"9??a'#FNN$4fnn6FGD#FF3D))-JJ+-B @&++b/R))-II,./'!//))	
 	
r?   )r   ri   r   r   r   r   r   )r@   rA   rB   rC   r    rc   r   r   rU   r   r   rV   r   r   r   rW   r   rz   rK   rL   rM   s   @r=   r   r     s    0   - '+.20426158<8<*.Q
##Q
 t+Q
 &&-	Q

 ((4/Q
 ''$.Q
 $..5Q
 #..5Q
   4'Q
 +,Q
 
)	)Q
 Q
r?   r   zw
    The ModernVBert Model with a token classification head on top, e.g. for Named Entity Recognition (NER) tasks.
    c                   j  ^  \ rS rSrS\4U 4S jjr\\" SSS9        SS\R                  S	\R                  S-  S
\R                  S-  S\R                  S-  S\R                  S-  S\R                  S-  S\R                  S-  S\R                  S-  S\\   S\\-  4S jj5       5       rSrU =r$ )r   i  ri   c                 x  > [         TU ]  U5        UR                  U l        [        U5      U l        [        UR                  5      U l        [        R                  " UR                  5      U l        [        R                  " UR                  R                  UR                  5      U l        U R                  5         g ry   )r8   rc   r   r   r   r   r#   r   rd   r   r/   r   re   rf   r   r   rh   s     r=   rc   *ModernVBertForTokenClassification.__init__  s      ++%f-
-f.@.@A	JJv889	))F$6$6$B$BFDUDUV 	r?   r   r   r   Nr   r   r   r   r   r   rT   r   r;   r   c	                 h   U R                   " SUUUUUUUS.U	D6n
U
S   nU R                  U5      nU R                  U5      nU R                  U5      nSnUb<  [	        5       nU" UR                  SU R                  5      UR                  S5      5      n[        UUU
R                  U
R                  S9$ )r   r   r   Nr   r   r5   )
r   r   r   r   r   rn   r   r   rR   rS   )r:   r   r   r   r   r   r   rT   r   r;   r   rQ   r\   r[   r   s                  r=   rz   )ModernVBertForTokenClassification.forward*  s    H ** 	
)%'%!5 3	
 	
 $AJ II&78 II&78!23')HFKKDOO<fkk"oND$!//))	
 	
r?   )r   r   r   r   r   r   )r@   rA   rB   rC   r    rc   r   r   rU   r   r   rV   r   r   r   rW   r   rz   rK   rL   rM   s   @r=   r   r     s   
0 
  - '+.20426158<8<*.1
##1
 t+1
 &&-	1

 ((4/1
 ''$.1
 $..51
 #..51
   4'1
 +,1
 
&	&1
 1
r?   r   )r    r}   r   r   r   r   )9r   dataclassesr   typingr   rU   torch.nnrd   huggingface_hub.dataclassesr   r   r   r    r
   r   configuration_utilsr   modeling_outputsr   r   r   r   modeling_utilsr   processing_utilsr   utilsr   r   r   utils.genericr   autor   r   r   modernbert.modeling_modernbertr   smolvlm.modeling_smolvlmr   r   
get_loggerr@   loggerr    rO   rY   r   r^   r}   r   r   r   r   r   __all__r5   r?   r=   <module>r     s    !    . A A & 3  . & @ @ - 8 8 E K 
		H	% 455(( 5(  65(p @ @ @: 9 9 9<$=299 $=N $:!7 $: $:N M
| M
M
`	 8 	 R
7 R
 R
j 
l
+E l

l
^ 
K
(B K

K
\r?   