
    g&e              	         U d dl mZ d dlZd dlmZmZ d dlmZ d dl	m
Z
mZ d dlmZmZ d dlmZ d dlmZmZmZmZ d dlZd d	lmZmZ d d
lmZ ddlmZ ddlmZ  ddl!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2 ddlm3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 	 d dl9m:Z:m;Z<m=Z>m?Z@mAZBmCZCmDZEmFZGmHZI d dlJmKZLmMZNmOZPmQZRmSZT d dlUmVZW d dlXmYZZ d dl[m\Z] d dl^m_Z` d dlambZc d dldmeZf d dlgmhZi ed   Zl	 eelemf   Zn	  e
d        G d! d"e5             Zoe
 G d# d$e3             Zpe
 G d% d&e7             Zqe
 G d' d(e6             Zremeseteuevew exd      d)Zyd*ezd+<   d,d-d.d/d0d1d2Z{d6d3Z|d7d4Z}d8d5Z~y# ej$ rZk ejd      ekdZk[kww xY w)9    )annotationsN)AsyncIteratorIterable)asynccontextmanager)	dataclassfield)datetimetimezone)chain)AnyCallableLiteralUnion)AsyncClientTimeout)assert_never   )UnexpectedModelBehavior)now_utc)ArgsJsonModelMessageModelRequestModelResponseModelResponsePartRetryPromptPartSystemPromptPartTextPartToolCallPartToolReturnPartUserPromptPart)Usage)ModelSettings)ToolDefinition   )
AgentModelEitherStreamedResponseModelStreamStructuredResponseStreamTextResponsecached_async_http_client)	UNSETCompletionChunkContentContentChunkFunctionCallMistralOptionalNullable	TextChunkToolChoiceEnum)ChatCompletionResponseCompletionEventMessagesToolToolCall)AssistantMessage)Function)SystemMessage)ToolMessage)UserMessage)Unset)EventStreamAsyncu   Please install `mistral` to use the Mistral model, you can use the `mistral` optional group — `pip install 'pydantic-ai-slim[mistral]'`)zmistral-large-latestzmistral-small-latestzcodestral-latestzmistral-moderation-latestF)initc                  x    e Zd ZU dZded<    ed      Zded<   dddd		 	 	 	 	 	 	 dd
Z	 	 	 	 	 	 	 	 ddZddZ	y)MistralModelzA model that uses Mistral.

    Internally, this uses the [Mistral Python client](https://github.com/mistralai/client-python) to interact with the API.

    [API Documentation](https://docs.mistral.ai/)
    MistralModelName
model_nameF)reprr0   clientN)api_keyrF   http_clientc                   || _         ||J d       |J d       || _        y|t        j                  d      n|}t	        ||xs
 t                     | _        y)a  Initialize a Mistral model.

        Args:
            model_name: The name of the model to use.
            api_key: The API key to use for authentication, if unset uses `MISTRAL_API_KEY` environment variable.
            client: An existing `Mistral` client to use, if provided, `api_key` and `http_client` must be `None`.
            http_client: An existing `httpx.AsyncClient` to use for making HTTP requests.
        Nz6Cannot provide both `mistral_client` and `http_client`z2Cannot provide both `mistral_client` and `api_key`MISTRAL_API_KEY)rG   async_client)rD   rF   osgetenvr0   r*   )selfrD   rG   rF   rH   s        O/var/www/openai/venv/lib/python3.12/site-packages/pydantic_ai/models/mistral.py__init__zMistralModel.__init__d   sf      %&`(``&?X$XX? DK6=obii 127G!'@iOgOijDK    c               P   K   t        | j                  | j                  |||      S w)zZCreate an agent model, this is called for each step of an agent run from Pydantic AI call.)MistralAgentModelrF   rD   )rN   function_toolsallow_text_resultresult_toolss       rO   agent_modelzMistralModel.agent_model~   s,      !KKOO
 	
s   $&c                     d| j                    S )Nzmistral:)rD   rN   s    rO   namezMistralModel.name   s    $//*++rQ   )rD   rC   rG   z%str | Callable[[], str | None] | NonerF   zMistral | NonerH   zAsyncHTTPClient | None)rT   list[ToolDefinition]rU   boolrV   r[   returnr%   )r]   str)
__name__
__module____qualname____doc____annotations__r   rF   rP   rW   rZ    rQ   rO   rB   rB   X   s     ! 'FG' :>!%.2k$k 7	k
 k ,k4
 -
  	

 +
 

 ,rQ   rB   c                  N   e Zd ZU dZded<   ded<   ded<   ded	<   ded
<   dZded<   	 	 	 	 	 	 ddZe	 	 	 	 	 	 dd       Z	 	 	 	 	 	 ddZ		 	 	 	 	 	 ddZ
d dZd!dZed"d       Ze	 	 	 	 	 	 d#d       Zed$d       Zd%dZed&d       Zed'd       Zed(d       Zed)d       Zy)*rS   z2Implementation of `AgentModel` for Mistral models.r0   rF   r^   rD   r\   rU   r[   rT   rV   z<Answer in JSON Object, respect the format:
```
{schema}
```
json_mode_schema_promptc                z   K   | j                  ||       d{   }| j                  |      t        |      fS 7  w)z@Make a non-streaming request to the model from Pydantic AI call.N)_completions_create_process_response
_map_usagerN   messagesmodel_settingsresponses       rO   requestzMistralAgentModel.request   s>      11(NKK%%h/H1EEE Ls   ;9!;c                  K   | j                  ||       d{   }|4 d{    | j                  | j                  |       d{    ddd      d{    y7 G7 >7 7 # 1 d{  7  sw Y   yxY ww)z<Make a streaming request to the model from Pydantic AI call.N)_stream_completions_create_process_streamed_responserV   rk   s       rO   request_streamz MistralAgentModel.request_stream   sb     
 88>RR8778I8I8TTT 88 ST 888sf   A=A 
A=A"A= A(A$A(A=A&A="A=$A(&A=(A:.A1/A:6A=c                   K   |xs i } j                   j                  j                  t         j                        t        t         fd|D               d j                         xs t         j                         d|j                  dt              |j                  dt              |j                  dd       j                  |j                  d            
       d	{   }|sJ d
       |S 7 w)z*Make a non-streaming request to the model.c              3  @   K   | ]  }j                  |        y wN_map_message.0mrN   s     rO   	<genexpr>z8MistralAgentModel._completions_create.<locals>.<genexpr>   s     !I1$"3"3A"6   r$   F
max_tokenstemperaturetop_ptimeout)
modelrl   ntoolstool_choicestreamr~   r   r   
timeout_msN)A unexpected empty response from Mistral.)rF   chatcomplete_asyncr^   rD   listr   )_map_function_and_result_tools_definitionr+   _get_tool_choiceget_get_timeout_msrk   s   `   rO   rh   z%MistralAgentModel._completions_create   s      (-2))88doo&%!I!IJK@@BKe--/%)),>&**=%@ $$Wa0++N,>,>y,IJ 9 
 
 DDDx
s   CC3!C1"C3c                   K   t        t         fd|D               }|xs i } j                  r j                  s j                  rĉ j                  j
                  j                  t         j                        |d j                         xs t         j                         |j                  dt              |j                  dd      |j                  dt               j                  |j                  d            	       d{   }nۉ j                  r j                  D cg c]  }|j                   }} j                  |      }|j!                  |        j                  j
                  j                  t         j                        |d	d
id       d{   }nC j                  j
                  j                  t         j                        |d       d{   }|sJ d       |S 7 c c}w 7 Z7 w)z;Create a streaming completion request to the Mistral model.c              3  @   K   | ]  }j                  |        y wrv   rw   ry   s     rO   r|   z?MistralAgentModel._stream_completions_create.<locals>.<genexpr>   s     'Oh(9(9!(<hr}   r$   r   r   r~   r   )	r   rl   r   r   r   r   r   r~   r   Ntypejson_objectT)r   rl   response_formatr   )r   rl   r   r   )r   r   rV   rT   rF   r   stream_asyncr^   rD   r   r+   r   r   r   parameters_json_schema_generate_user_output_formatappend)rN   rl   rm   mistral_messagesrn   toolparameters_json_schemasuser_output_format_messages   `       rO   rq   z,MistralAgentModel._stream_completions_create   s      'Oh'O PQ'-2!4!48K8K![[--::$//*)DDFO% 113*..}eD$((!4)--lEB//0B0B90MN ; 
 
H OSO`O`&aO`tt'B'BO`#&a)-)J)JKb)c&##$>?![[--::$//*)!' 7	 ;  H "[[--::$//*) ;  H
 DDDxC
 'bsD   DG=G2G=&G49A%G=G9AG="G;#G=4G=;G=c                P    | j                   s| j                  sy| j                  syy)zGet tool choice for the model.

        - "auto": Default mode. Model decides if it uses the tool or not.
        - "any": Select any tool.
        - "none": Prevents tool use.
        - "required": Forces tool use.
        Nrequiredauto)rT   rV   rU   rY   s    rO   r   z"MistralAgentModel._get_tool_choice   s'     ""4+<+<''rQ   c           
         | j                   | j                  z   }|D cg c]8  }t        t        |j                  |j
                  |j                              : }}|r|S dS c c}w )zMap function and result tools to MistralTool format.

        Returns None if both function_tools and result_tools are empty.
        )rZ   
parametersdescription)functionN)rT   rV   MistralToolMistralFunctionrZ   r   r   )rN   	all_toolsrr   s       rO   r   z;MistralAgentModel._map_function_and_result_tools_definition   sv    
 +/*=*=@Q@Q*Q	
 	
  (affAYAYghgtgtu 	 	 
 u'4'
s   =A#c                   | j                   sJ d       | j                  r0t        j                  | j                  t        j
                        }n
t               }| j                   d   }|j                  j                  }|j                  j                  }g }t        |      x}r|j                  t        |             t        |t              r#|D ]  }t        |      }|j                  |         t!        ||      S )zAProcess a non-streamed response, and prepare a message to return.z!Unexpected empty response choice.tzr   	timestamp)choicescreatedr	   fromtimestampr
   utc_now_utcmessagecontent
tool_calls_map_contentr   r   
isinstancer   "_map_mistral_to_pydantic_tool_callr   )	rn   r   choicer   r   partstext	tool_callr   s	            rO   ri   z#MistralAgentModel._process_response  s     D!DD ..x/?/?HLLQI 
I!!!$..((^^..
)+((4(LL$(j$''	9)DT" ( Ui88rQ   c                  K   t               }	 	 |j                          d{   }|j                  }|t        |      z  }|j                  r0t        j                  |j                  t        j                        }n
t               }|j                  r|j                  d   j                  }t        |j                        }d}	|j                   r|j                   }	|	s|rV| rTt#        |	xs g D 
ci c]  }
|
j$                  r|
j$                  nd|
 c}
| D 
ci c]  }
|
j&                  |
 c}
||||      S |rt)        ||||      S 97 %# t        $ r}t	        d      |d}~ww xY wc c}
w c c}
w w)zHProcess a streamed response, and prepare a streaming response to return.Nz5Streamed response ended without content or tool callsr   r   null)r!   	__anext__dataStopAsyncIterationr   rj   r   r	   r   r
   r   r   r   deltar   r   r   MistralStreamStructuredResponseidrZ   MistralStreamTextResponse)rV   rn   start_usageeventchunker   r   r   r   cs              rO   rr   z,MistralAgentModel._process_streamed_response&  s_     g n&0022

 :e,,K}}$225==X\\R	$J	}}a(..&u}}5;?
##!&!1!1J\:>H>NB>NO>N614>NO,89LqL9 !#  4Wh	S^__C 2% n-.eflmmn( P9sP   E1E
 EE
 B;E1."E'E1E,
*E1E
 
	E$EE$$E1c                :   t        | j                  t              rAt        | j                  dt        | j                  | j                  j                              S t        | j                  dt        | j                  | j                  j                              S )z1Maps a pydantic-ai ToolCall to a MistralToolCall.r   )rZ   	arguments)r   r   r   )	r   argsr   MistralToolCalltool_call_idMistralFunctionCall	tool_name	args_json	args_dict)ts    rO   _map_to_mistral_tool_callz+MistralAgentModel._map_to_mistral_tool_callR  sr     affh'">>,!++IYIYZ  #>>,!++IYIYZ rQ   c                (   g }|D ]Q  }i }|j                  di       j                         D ]  \  }}| j                  |      ||<    |j                  |       S t	        |      dk(  r|d   n|}t        | j                  j                  |            S )z<Get a message with an example of the expected output format.
propertiesr$   r   )schemar   )r   items_get_python_typer   lenMistralUserMessagerf   format)rN   schemasexamplesr   typed_dict_definitionkeyvalueexample_schemas           rO   r   z.MistralAgentModel._generate_user_output_formatb  s    )+F46!$jjr:@@B
U-1-B-B5-I%c* COO12	  ),H(:!!$*F*F*M*MUc*M*deerQ   c                   |j                  d      x}rd| j                  |d          dS |j                  d      }|sy|t        v r|dk7  r|dk7  r	t        |   S |dk(  r'|j                  d	i       }d
| j                  |       dS |dk(  ru|j                  di       }|j                  d      }|t        v r|dk7  r|dk7  rdt        |    dS |dk(  r'|j                  d	i       }d| j                  |       dS |dk(  ryyy)zReturn a string representation of the Python type for a single JSON schema property.

        This function handles recursion for nested arrays/objects and `anyOf`.
        anyOfz	Optional[r   ]r   r   arrayobjectr   zlist[additionalPropertiesz
dict[str, zdict[str, list[z]]zdict[str, dict[str, Any]]dict[str, Any])r   r   SIMPLE_JSON_TYPE_MAPPING)clsr   any_of
value_typer   additional_propertiesadditional_properties_typearray_itemss           rO   r   z"MistralAgentModel._get_python_typen  sT    YYw''6' s33F1I>?qAA YYv&
 11jG6KPZ^fPf+J77  IIgr*E3//67q99 !$)II.Db$I!)>)B)B6)J&*.FF.'9.(: $$<=W$X#YYZ[[+w6377D()=)=k)J(K2NN+x72 ( rQ   c                Z    | yt        | t              rt        d| z        S t        d      )z"Convert a timeout to milliseconds.Ni  z5Timeout object is not yet supported for MistralModel.)r   floatintNotImplementedError)r   s    rO   r   z!MistralAgentModel._get_timeout_ms  s1     ?gu%tg~&&!"YZZrQ   c              #    K   |j                   D ]  }t        |t              rt        |j                         ,t        |t
              rt        |j                         Ut        |t              r(t        |j                  |j                                t        |t              rQ|j                  t        |j                                t        |j                  |j                                t        |        y w)Nr   )r   r   )r   r   r   MistralSystemMessager   r    r   r   MistralToolMessager   model_response_strr   r   model_responser   )r   r   parts      rO   _map_user_messagez#MistralAgentModel._map_user_message  s     MMD$ 01*4<<@@D.1(>>D.1(!%!2!2 335  D/2>>),T5H5H5JKK,%)%6%6 $ 3 3 5 
 T"' "s   D	Dc              #    K   t        |t              r| j                  |      E d{    yt        |t              rg }g }|j                  D ]t  }t        |t
              r&|j                  t        |j                               9t        |t              r!|j                  | j                  |             jt        |       v t        ||       yt        |       y7 w)z8Just maps a `pydantic_ai.Message` to a `MistralMessage`.N)r   )r   r   )r   r   r   r   r   r   r   MistralTextChunkr   r   r   r   MistralAssistantMessage)r   r   content_chunksr   r   s        rO   rx   zMistralAgentModel._map_message  s      g|,,,W555/8:N02JdH-"))*:*MNl3%%c&C&CD&IJ & & *.ZXX! 6s   %C"C B9C"N)rl   list[ModelMessage]rm   ModelSettings | Noner]   ztuple[ModelResponse, Usage])rl   r  rm   r  r]   z%AsyncIterator[EitherStreamedResponse])rl   r  rm   r  r]   MistralChatCompletionResponse)rl   r  rm   r  r]   /MistralEventStreamAsync[MistralCompletionEvent])r]   zMistralToolChoiceEnum | None)r]   zlist[MistralTool] | None)rn   r  r]   r   )rV   r[   rn   r  r]   r&   )r   r   r]   r   )r   zlist[dict[str, Any]]r]   r   )r   r   r]   r^   )r   zTimeout | float | Noner]   z
int | None)r   r   r]   Iterable[MistralMessages])r   r   r]   r  )r_   r`   ra   rb   rc   rf   ro   r   rs   rh   rq   r   r   staticmethodri   rr   r   r   classmethodr   r   r   rx   rd   rQ   rO   rS   rS      s|   <OO((&&#iSiF*F<PF	$F U*U<PU	.U U*<P	&(-$- -- 
9	-^( 9 90 )`*)`A)` 
 )` )`V  
f 0 0d [ [ # #, " "rQ   rS   c                  ~    e Zd ZU dZded<   ded<   ded<   ded	<    eed
      Zded<   ddZd
dddZ	ddZ
ddZy)r   z:Implementation of `StreamTextResponse` for Mistral models.
str | None_firstr  	_responser	   
_timestampr!   _usageF)default_factoryr@   z	list[str]_bufferc                V  K   | j                   Et        | j                         dkD  r-| j                  j                  | j                          d | _         y | j                  j                          d {   }| xj                  t        |j                        z  c_        	 |j                  j                  d   }|j                  j                  }|j                  |
J d|       t        |      x}r| j                  j                  |       y y 7 # t        $ r t               w xY ww)Nr   z,Expected delta with content, invalid chunk: )r
  r   r  r   r  r   r  rj   r   r   
IndexErrorr   r   r   finish_reasonr   rN   r   r   r   r   s        rO   r   z#MistralStreamTextResponse.__anext__  s    ;;"s4;;'7!';LL,DKnn..00z%**--	'ZZ''*F ,,&&'&`*VW\V_(``&((4(LL% ) 1
  	'$&&	's+   A/D)1D2,D)D 8AD)D&&D)finalc             #  l   K   | j                   E d {    | j                   j                          y 7 wrv   )r  clear)rN   r  s     rO   r   zMistralStreamTextResponse.get  s(     << 	 s   42 4c                    | j                   S rv   r  rY   s    rO   usagezMistralStreamTextResponse.usage      {{rQ   c                    | j                   S rv   r  rY   s    rO   r   z#MistralStreamTextResponse.timestamp      rQ   Nr]   None)r  r\   r]   zIterable[str]r]   r!   r]   r	   )r_   r`   ra   rb   rc   r   r   r  r   r   r  r   rd   rQ   rO   r   r     sF    D>>Mt%@GY@&* $) rQ   r   c                      e Zd ZU dZded<   ded<   ded<   ded	<   d
ed<   ded<   ddZddddZddZddZe	dd       Z
y)r   z@Implementation of `StreamStructuredResponse` for Mistral models.zdict[str, MistralToolCall]_function_toolszdict[str, ToolDefinition]_result_toolsr  r  r	  _delta_contentr	   r  r!   r  c                  K   | j                   j                          d {   }| xj                  t        |j                        z  c_        	 |j                  j
                  d   }|j                  
t               |j                  j                  }| j                  r't        |      x}r| j                  xs d|z   | _        y y y 7 # t        $ r t               w xY ww)Nr    )r  r   r  rj   r   r   r  r   r  r   r   r%  r   r&  r  s        rO   r   z)MistralStreamStructuredResponse.__anext__  s     nn..00z%**--	'ZZ''*F
 +$&&,,&&#G,,t,'+':':'@bD&H# -  1  	'$&&	's(   C C,C C	 'A!C 	CC Fr  c               D   g }| j                   r| j                  s| j                   r<| j                   j                         D ]  }t        |      }|j	                  |         n| j
                  r| j                  rt        j                  | j
                  d      }|rm| j                  j                         D ]P  }| j                  ||j                        s t        j                  |j                  |      }|j	                  |       R t        || j                        S )Nztrailing-strings)allow_partialr   )r$  r%  valuesr   r   r&  pydantic_core	from_json_validate_required_json_schemar   r   from_raw_argsrZ   r   r  )rN   r  callsr   r   output_jsonresult_tools          rO   r   z#MistralStreamStructuredResponse.get  s    )+D$6$6$:N:N!1188:	9)DT" ;   T%7%71>1H1H##3E2K #'#5#5#<#<#>K  >>{KLnLno '55k6F6FTDLL& $? Udoo>>rQ   c                    | j                   S rv   r  rY   s    rO   r  z%MistralStreamStructuredResponse.usage6  r  rQ   c                    | j                   S rv   r  rY   s    rO   r   z)MistralStreamStructuredResponse.timestamp9  r  rQ   c                   |j                  dg       }|j                  di       }|D ]  }|| vr y|j                  |i       }|j                  d      }|j                  di       j                  d      }|dk(  r8|r6t        | |   t              s y| |   D ]  }t        |t        |         r  y n|rt        | |   t        |         s yt        | |   t              sd|v s|}	t
        j                  | |   |	      r y y)z\Validate that all required parameters in the JSON schema are present in the JSON dictionary.r   r   Fr   r   r   T)r   r   r   VALIDE_JSON_TYPE_MAPPINGdictr   r.  )
	json_dictjson_schemarequired_paramsr   paramparam_schema
param_typeparam_items_typeitemnested_schemas
             rO   r.  z>MistralStreamStructuredResponse._validate_required_json_schema<  s    &//*b9 __\26
$EI%%>>%4L%))&1J+//<@@HW$)9!)E"2D9 %e,D%d,DEU,VW$ - Jy/?AYZdAe$f)E*D1ll6R ,6UUV_`eVfhuv ) %, rQ   Nr  )r  r\   r]   r   r!  r"  )r8  r   r9  r   r]   r\   )r_   r`   ra   rb   rc   r   r   r  r   r  r.  rd   rQ   rO   r   r      sV    J//,,>>MI$ $) ?2  rQ   r   )stringintegernumberbooleanr   r   r   r   r6  r^   r   r   r\   r   r   )rA  rB  rC  rD  r   r   c                    | j                   xs d}| j                  }t        j                  |j                  |j
                  |      S )z%Maps a MistralToolCall to a ToolCall.N)r   r   r   r/  rZ   r   )r   r   	func_calls      rO   r   r   o  s:    <<'4L""I%%inni6I6I<XXrQ   c                    | j                   rKt        | j                   j                  | j                   j                  | j                   j                  d      S t               S )zGMaps a Mistral Completion Chunk or Chat Completion Response to a Usage.N)request_tokensresponse_tokenstotal_tokensdetails)r  r!   prompt_tokenscompletion_tokensrJ  )rn   s    rO   rj   rj   w  sI    ~~#>>77$NN<<!44	
 	
 wrQ   c                   d}t        | t              s| sd}n`t        | t              r>| D ]8  }t        |t              r|xs d|j                  z   }'J dt        |               nt        | t              r| }|rt        |      dk(  rd}|S )zKMaps the delta content from a Mistral Completion Chunk to a string or None.Nr(  zEOther data types like (Image, Reference) are not yet supported,  got r   )r   MistralUnsetr   r   r   r   r^   r   )r   resultr   s      rO   r   r     s    F'<(	GT	"E%!1222

?s efjkpfqerssu	 
 
GS	! #f+"MrQ   )r   r   r]   r   )rn   z6MistralChatCompletionResponse | MistralCompletionChunkr]   r!   )r   z'MistralOptionalNullable[MistralContent]r]   r	  )
__future__r   _annotationsrL   collections.abcr   r   
contextlibr   dataclassesr   r   r	   r
   	itertoolsr   typingr   r   r   r   r,  httpxr   AsyncHTTPClientr   typing_extensionsr   r(  r   _utilsr   r   rl   r   r   r   r   r   r   r   r   r   r   r    rP  r!   settingsr"   r   r#   r%   r&   r'   r(   r)   r*   	mistralair+   r,   MistralCompletionChunkr-   MistralContentr.   MistralContentChunkr/   r   r0   r1   MistralOptionalNullabler2   r   r3   MistralToolChoiceEnummistralai.modelsr4   r  r5   MistralCompletionEventr6   MistralMessagesr7   r   r8   r   !mistralai.models.assistantmessager9   r   mistralai.models.functionr:   r   mistralai.models.systemmessager;   r   mistralai.models.toolmessager<   r   mistralai.models.usermessager=   r   mistralai.types.basemodelr>   rO  mistralai.utils.eventstreamingr?   MistralEventStreamAsyncImportErrorr   NamedMistralModelsr^   rC   rB   rS   r   r   r   r   r\   r   r7  r   r6  rc   r   r   rj   r   rd   rQ   rO   <module>rp     s   2 	 3 * ( '  0 0  9 * & (     $ " 
 
 
  ^ETNN?Z c  2+S01  6,5 6, 6,r @"
 @" @"F
 & 2 & &R W&> W Wv J, .   Y
A  
	a s   AE% %E8*	E33E8