§
    ‚Štj±G  ã                   óh  — d dl Z ddlmZmZmZmZmZ  e¦   «         rd dlZ e¦   «         rd dlZ	 e¦   «         rd dl
mZ ddlmZmZmZ ddlmZ ddlmZmZmZmZ ddlmZmZ dd	lmZ  ej        e¦  «        Z G d
„ ded¬¦  «        Z G d„ ded¬¦  «        Z e G d„ de¦  «        ¦   «         Z!dgZ"dS )é    Né   )Úauto_docstringÚis_mistral_common_availableÚis_soundfile_availableÚis_torch_availableÚlogging)ÚTranscriptionRequest)Ú
AudioInputÚload_audio_asÚmake_list_of_audio)ÚBatchFeature)ÚAudioKwargsÚProcessingKwargsÚProcessorMixinÚUnpack)ÚPreTokenizedInputÚ	TextInput)Ú_get_template_variablesc                   ó$   — e Zd ZU dZedz  ed<   dS )ÚVoxtralAudioKwargsz·
    max_source_positions (`int`, *optional*, defaults to `3000`):
        Maximum number of positions per chunk when splitting mel spectrogram features along the time dimension.
    NÚmax_source_positions)Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚintÚ__annotations__© ó    úl/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/transformers/models/voxtral/processing_voxtral.pyr   r   '   s.   € € € € € € ðð ð
  ™*Ð$Ð$Ñ$Ð$Ð$r   r   F)Útotalc                   ó>   — e Zd ZU eed<   ddiddddddœd	ddd
œdœZdS )ÚVoxtralProcessorKwargsÚaudio_kwargsÚpaddingTi€>  Fi S i¸  )Úsampling_rater%   Ú
truncationÚpad_to_multiple_ofr   Úpt)Úreturn_tensorsÚreturn_dictÚtokenize)Útext_kwargsr$   Úcommon_kwargsN)r   r   r   r   r   Ú	_defaultsr   r   r    r#   r#   0   sd   € € € € € € Ø$Ð$Ð$Ñ$ð �tð
ð #ØØØ"(Ø$(ð
ð 
ð #ØØð
ð 
ðð €I€I€Ir   r#   c                   ó   ‡ — e Zd Zˆ fd„Zd„ Z	 	 	 	 	 	 	 	 	 	 	 ddeeeef                  eeeeef                           z  dedz  dee         dz  deeeef                  dz  d	ed
ededededz  dedededz  defd„Z	 e
d¬¦  «        deez  ee         z  ee         z  dz  dee         fd„¦   «         Z	 	 	 ddeee         z  ez  dedeeedz           z  dz  dedz  deee         z  dz  dee         fd„Zˆ xZS ) ÚVoxtralProcessorc                 ó˜   •— d| _         |                     | j         ¦  «        | _        t          ¦   «                              ||¦  «         d S )Né   )Úaudio_token_idÚconvert_ids_to_tokensÚaudio_tokenÚsuperÚ__init__)ÚselfÚfeature_extractorÚ	tokenizerÚ	__class__s      €r    r8   zVoxtralProcessor.__init__G   sG   ø€ ð
 !ˆÔØ$×:Ò:¸4Ô;NÑOÔOˆÔå‰Œ×ÒÐ*¨IÑ6Ô6Ð6Ð6Ð6r   c                 óô   — g }|D ]`} | j         |fi |¤Ž}|d                              | j         j        d|¦  «        }|                     |                     dd¦  «        ¦  «         Œat          j        |¦  «        S )aX  
        Handles specific logic of Voxtral expected input features: audio arrays should be padded to next multiple of 480000 (duration is a multiple of 30s), see VoxtralProcessorKwargs' default audio_kwargs.
        Then mel input features are extracted and stacked along batch dimension, splitting into chunks of max_source_positions.
        Úinput_featureséÿÿÿÿr   é   )r:   ÚreshapeÚfeature_sizeÚappendÚ	transposeÚtorchÚcat)r9   Úaudior   ÚkwargsÚinput_features_listÚaudio_arrayÚaudio_inputsr>   s           r    Ú_retrieve_input_featuresz)VoxtralProcessor._retrieve_input_featuresQ   sš   € ð
 !ÐØ ð 	Gð 	GˆKØ1˜4Ô1°+ÐHÐHÀÐHÐHˆLð *Ð*:Ô;×CÒCØÔ&Ô3°RÐ9Mñô ˆNð  ×&Ò& ~×'?Ò'?ÀÀ1Ñ'EÔ'EÑFÔFÐFÐFåŒyÐ,Ñ-Ô-Ð-r   NFÚconversationÚchat_templateÚtoolsÚ	documentsÚadd_generation_promptÚcontinue_final_messageÚreturn_assistant_tokens_maskr,   r*   r+   Úload_audio_from_videoÚprocessor_kwargsÚreturnc                 óÜ  ‡— |r"|rt          d¦  «        ‚|rt          d¦  «        ‚t          |t          t          f¦  «        r=t          |d         t          t          f¦  «        st	          |d         d¦  «        rd}|}nd}|g}|pi }t          |¦  «        Šˆfd„|                     ¦   «         D ¦   «         }|rt                               d¦  «         |}|	r|	|d	<    | j	        t          fi |¤Ž}|d
         }|d         }|                     d	d¦  «        }	|	dk    rt          | j        j        › d�¦  «        ‚|d
         }d|d	<    | j        j        |fi |¤Ž}|                     dd¦  «        ru|                     dd¦  «        r_|                     dd¦  «        }t#          |¦  «        }|�'|                     d¦  «        } | j        ||fi |¤Ž|d<   t'          ||	¬¦  «        S |s|d         S |S )a›  
        This method applies the model's chat completion template given a conversation. It relies on MistralCommonBackend's
        [`~MistralCommonBackend.apply_chat_template`] to prepare input ids to the model and on WhisperFeatureExtractor's
        [`~WhisperFeatureExtractor.__call__`] to prepare input features to the model.

        Note that audio is padded to the nearest 30-second multiple prior to mel feature extraction.

        A `conversation` is a list of messages, where each message is a dictionary with a `role` and a `content` field.
        For Voxtral, `role` can be `"user"` or `"assistant"`.
        The `content` field can be a string or a list of dictionaries with a `type` field. See example below.

        ```python
        from huggingface_hub import hf_hub_download
        from transformers.audio_utils import load_audio_as

        audio_url = "https://huggingface.co/datasets/hf-internal-testing/dummy-audio-samples/resolve/main/bcn_weather.mp3"
        audio_path = hf_hub_download(repo_id="hf-internal-testing/dummy-audio-samples", filename="bcn_weather.mp3", repo_type="dataset")
        audio_base64 = load_audio_as(audio_path, return_format="base64", force_mono=True)

        # audio + text
        conversation = [
            {
                "role": "user",
                "content": [
                    {"type": "audio", "url": audio_url},
                    {"type": "audio", "path": audio_path},
                    {"type": "audio", "base64": audio_base64},
                    {"type": "text", "text": "How many audio do you hear?"},
                ],
            },
        ]

        processor = VoxtralProcessor.from_pretrained("mistralai/Voxtral-Mini-3B-2507")
        inputs = processor.apply_chat_template(conversation)
        ```

        Args:
            conversation (`Union[list[Dict, [str, str]], list[list[dict[str, str]]]]`):
                The conversation to format.
        a  continue_final_message and add_generation_prompt are not compatible. Use continue_final_message when you want the model to continue the final message, and add_generation_prompt when you want to add a header that will prompt it to start a new assistant message instead.zKcontinue_final_message is not compatible with return_assistant_tokens_mask.r   ÚcontentTFc                 ó$   •— i | ]\  }}|‰v¯	||“ŒS r   r   )Ú.0ÚkÚvÚtemplate_kwargss      €r    ú
<dictcomp>z8VoxtralProcessor.apply_chat_template.<locals>.<dictcomp>°   s*   ø€ Ð'dÐ'dÐ'd±°°AÈ1ÐTcÐKcÐKc¨¨1ÐKcÐKcÐKcr   z^Kwargs passed to `processor.__call__` have to be in `processor_kwargs` dict, not in `**kwargs`r*   r-   r$   Nr)   ú% only supports `return_tensors='pt'`.r,   r+   rG   r   r>   ©ÚdataÚtensor_type)Ú
ValueErrorÚ
isinstanceÚlistÚtupleÚhasattrr   ÚitemsÚloggerÚwarningÚ_merge_kwargsr#   Úgetr<   r   r;   Úapply_chat_templateÚpopÚdictrL   r   )r9   rM   rN   rO   rP   rQ   rR   rS   r,   r*   r+   rT   rU   rH   Ú
is_batchedÚconversationsÚprocessor_kwargs_from_kwargsÚoutput_kwargsr-   r$   Útokenizer_kwargsÚencoded_instruct_inputsrG   ra   r   r]   s                            @r    rm   z$VoxtralProcessor.apply_chat_templateb   sŠ  ø€ ðp "ð 	pØ$ð Ý ð cñô ð ð ,ð pÝ Ð!nÑoÔoÐoå�l¥T­5 MÑ2Ô2ð 	+Ý�| A”­­u¨Ñ6Ô6ð	+Ý:AÀ,ÈqÄ/ÐS\Ñ:]Ô:]ð	+ð ˆJØ(ˆMˆMàˆJØ)˜NˆMð
 ,Ð1¨rÐÝ1°-Ñ@Ô@ˆØ'dÐ'dÐ'dÐ'd¸¿º¹¼Ð'dÑ'dÔ'dÐ$Ø'ð 	<Ý�NŠNØpñô ð ð  <Ðàð 	@Ø1?ÐÐ-Ñ.Ø*˜Ô*Ý"ð
ð 
àð
ð 
ˆð $ MÔ2ˆØ$ ^Ô4ˆØ$ŸšÐ)9¸4Ñ@Ô@ˆà˜TÒ!Ð!Ý ¤Ô 7Ð^Ð^Ð^Ñ_Ô_Ð_à(¨Ô7ÐØ-1ÐÐ)Ñ*Ø"D $¤.Ô"DÀ]Ð"gÐ"gÐVfÐ"gÐ"gÐà�?Š?˜: uÑ-Ô-ð 	KØ�Š˜}¨eÑ4Ô4ð KØ/×3Ò3°G¸TÑBÔB�ÝÐ3Ñ4Ô4�ØÐ$Ø+7×+;Ò+;Ð<RÑ+SÔ+SÐ(Ø-J¨TÔ-JÈ5ÐRfÐ-wÐ-wÐjvÐ-wÐ-w�DÐ)Ñ*å#¨¸>ÐJÑJÔJÐJàð 	.Ø*¨1Ô-Ð-à&Ð&r   a  
    Method to prepare text to be fed as input to the model. This method forwards the `text`
    arguments to MistralCommonBackend's [`~MistralCommonBackend.__call__`] to encode
    the text. Please refer to the docstring of the above methods for more information.
    This method does not support audio. To prepare the audio, please use:
    1. `apply_chat_template` [`~VoxtralProcessor.apply_chat_template`] method.
    2. `apply_transcription_request` [`~VoxtralProcessor.apply_transcription_request`] method.
    )Úcustom_introÚtextrH   c                 ó<  ‡ — t          |t          ¦  «        r|g}t          ˆ fd„|D ¦   «         ¦  «        rt          ‰ j        › d�¦  «        ‚ ‰ j        t          fi |¤Ž} ‰ j        |fi |d         ¤Ž}t          ||d          	                    dd ¦  «        ¬¦  «        S )Nc              3   ó*   •K  — | ]}‰j         |v V — Œd S ©N)r6   )rZ   Útr9   s     €r    ú	<genexpr>z,VoxtralProcessor.__call__.<locals>.<genexpr>é   s+   øè è € Ð3Ð3¨ˆtÔ 1Ð$Ð3Ð3Ð3Ð3Ð3Ð3r   z� is present in the provided text which is not supported by VoxtralProcessor. Please use the `apply_chat_template` method instead.r-   r*   r`   )
rd   ÚstrÚanyrc   r6   rk   r#   r;   r   rl   )r9   rw   rH   rs   Úouts   `    r    Ú__call__zVoxtralProcessor.__call__×   sÒ   ø€ õ �d�CÑ Ô ð 	Ø�6ˆDåÐ3Ð3Ð3Ð3¨dÐ3Ñ3Ô3Ñ3Ô3ð 	ÝØÔ#ð  gð  gð  gñô ð ð +˜Ô*Õ+AÐLÐLÀVÐLÐLˆØˆdŒn˜TÐBÐB ]°=Ô%AÐBÐBˆå °-ÀÔ2N×2RÒ2RÐScÐeiÑ2jÔ2jÐkÑkÔkÐkr   rG   Úmodel_idÚlanguager&   Úformatc                 óR  ‡—  | j         t          fi |¤Ž}|d         }|d         }	t          |t          ¦  «        }
t	          d„ |D ¦   «         ¦  «        }|
p| }|rO‰€%t
                               d|	d         › d�¦  «         n(‰|	d         k    rt          d‰› d	|	d         › d
�¦  «        ‚|	d         Š|                     dd¦  «        }|                     dd¦  «        }|	                     dd¦  «        }|	                     dd¦  «        }|                     dd¦  «        }|dk    rt          | j	        j
        › d�¦  «        ‚|
rt          |dd‰¬¦  «        g}�n]|rˆfd„|D ¦   «         }�nKt          |¦  «        }|€t          d¦  «        ‚t          |t          ¦  «        r|gt          |¦  «        z  }t          |¦  «        t          |¦  «        k    r0t          dt          |¦  «        › dt          |¦  «        › d�¦  «        ‚t          ¦   «         st          d¦  «        ‚g }t!          ||¦  «        D ]�\  }}t#          j        ¦   «         }|j        dk    r|                     d¬¦  «        }t+          j        |||	d         |¬¦  «         |                     d¦  «         |                     |¦  «         Œ‚|}t          |¦  «        }t          |t          ¦  «        r|g|z  }n|€dg|z  }t          |¦  «        |k    r#t          dt          |¦  «        › d |› d�¦  «        ‚g }g }g }t!          ||¦  «        D ]–\  }}|||d!œ}t3          j        |¦  «        }| j        j                             |¦  «        }|                     |j        ¦  «         |                     |j        ¦  «         |                     d"„ |j         D ¦   «         ¦  «         Œ—|rY|rW | j        |fd#di|¤Ž}tC          |¦  «        }|	                     d$¦  «        }  | j"        || fi |	¤Ž|d%<   tG          ||¬&¦  «        S |S )'a	  
        This method applies the model's transcription request template given a language and audio.
        It relies on MistralCommonBackend and WhisperFeatureExtractor to prepare input ids and input features to the model.

        ```python
        from transformers import VoxtralProcessor

        model_id = "mistralai/Voxtral-Mini-3B-2507"
        processor = VoxtralProcessor.from_pretrained(model_id)

        language = "en"
        audio = "https://huggingface.co/datasets/hf-internal-testing/dummy-audio-samples/resolve/main/obama.mp3"

        # set the language is already know for better accuracy
        inputs = processor.apply_transcription_request(language=language, audio=audio, model_id=model_id)

        # but you can also let the model detect the language automatically
        inputs = processor.apply_transcription_request(audio=audio, model_id=model_id)
        ```

        Args:
            audio (`str`, `list[str]`, `np.ndarray`, `torch.Tensor`, `list[np.ndarray]`, `list[torch.Tensor]`):
                The audio or batch of audio to be prepared. If provided as a string, it should correspond to the path or url of the audio file.
            model_id (`str`:
                The hub model id of the model to use for transcription.
            language (`str`, `list[Union[str, None]]`, *optional*):
                The language or languages of the audio.
                If not provided or None, automatic language detection will be used for all audio.
                If provided as a string (a language code in the [ISO 639-1 alpha-2 format](https://en.wikipedia.org/wiki/ISO_639-1) e.g. `"en"`), it will be applied uniformly to all audio.
                If provided as a list of strings/ None values, e.g. `["en", None, "fr"]`, will be applied to each audio individually with a one-to-one mapping,
                with a None value indicating automatic language detection for that audio.
            sampling_rate (`int`, *optional*):
                The sampling rate of the audio. Necessary if it is provided as `np.ndarray`, `torch.Tensor`, `list[np.ndarray]`, `list[torch.Tensor]`.
                Used to avoid silent errors when passing audio that is not in the expected sampling rate.
            format (`str`, `list[str]`, *optional*):
                The format of the audio, necessary if is provided as `np.ndarray`, `torch.Tensor`, `list[np.ndarray]`, `list[torch.Tensor]`.
        r-   r$   c              3   ó@   K  — | ]}t          |t          ¦  «        V — Œd S rz   )rd   r}   ©rZ   Úels     r    r|   z?VoxtralProcessor.apply_transcription_request.<locals>.<genexpr>*  s,   è è € ÐAÐA°R�Z¨­CÑ0Ô0ÐAÐAÐAÐAÐAÐAr   NzUYou've provided audio without specifying the sampling rate. It will be assumed to be r&   z$, which can result in silent errors.z The sampling rate of the audio (z5) does not match the sampling rate of the processor (zD). Please provide resampled the audio to the expected sampling rate.r+   Fr,   r*   r)   r_   ÚbufferT©Úreturn_formatÚ
force_monor&   c                 ó6   •— g | ]}t          |d d‰¬¦  «        ‘ŒS )rˆ   Tr‰   )r   )rZ   r‡   r&   s     €r    ú
<listcomp>z@VoxtralProcessor.apply_transcription_request.<locals>.<listcomp>G  s8   ø€ ð ð ð Øln•˜b°ÀTÐYfÐgÑgÔgðð ð r   zH`format` must be provided when passing audio arrays to VoxtralProcessor.z,When passed as a list of audio, the length (z#) must match the number of format (ú)zHPlease install `soundfile` to encode audio arrays with VoxtralProcessor.é   r@   )Úaxis)Ú
sampleraterƒ   r   z0When passed as a list of languages, the length (z") must match the number of audio ()ÚmodelÚfiler‚   c                 ó   — g | ]	}|j         ‘Œ
S r   )rJ   r†   s     r    r�   z@VoxtralProcessor.apply_transcription_request.<locals>.<listcomp>�  s   € Ð aÐ aÐ a°B ¤Ð aÐ aÐ ar   Úadd_special_tokensr   r>   r`   )$rk   r#   rd   r}   Úallri   Úwarning_oncerc   rn   r<   r   r   r   Úlenr   ÚImportErrorÚzipÚioÚBytesIOÚndimÚmeanÚsfÚwriteÚseekrC   r	   Úfrom_openair;   Úencode_transcriptionÚtokensrw   ÚextendÚaudiosro   rL   r   )!r9   rG   r�   r‚   r&   rƒ   rH   rs   r-   r$   Úis_strÚis_list_of_strÚis_list_of_audior+   r,   Ú_r*   Úaudio_buffersÚarrayÚfrˆ   Ún_audioÚ	input_idsÚtextsÚaudio_arraysÚaudio_elÚlanguage_elÚopenai_transcription_requestÚtranscription_requestÚtokenized_transcription_requestÚencodingra   r   s!       `                            r    Úapply_transcription_requestz,VoxtralProcessor.apply_transcription_requestô   sp  ø€ ð\ +˜Ô*Ý"ð
ð 
àð
ð 
ˆð $ MÔ2ˆØ$ ^Ô4ˆå˜E¥3Ñ'Ô'ˆÝÐAÐA¸5ÐAÑAÔAÑAÔAˆØ &Ð 8¨.Ð9Ðàð 	ØÐ$Ý×#Ò#ð pÐlxð  zIô  mJð  pð  pð  pñô ð ð ð  ,¨Ô"?Ò?Ð?Ý ð _°}ð  _ð  _ð  |Hð  IXô  |Yð  _ð  _ð  _ñô ð ð % _Ô5ˆð "—o’o m°UÑ;Ô;ˆØ—?’? :¨uÑ5Ô5ˆØ×Ò˜]¨EÑ2Ô2ˆØ×Ò˜Z¨Ñ/Ô/ˆà$ŸšÐ)9¸4Ñ@Ô@ˆØ˜TÒ!Ð!Ý ¤Ô 7Ð^Ð^Ð^Ñ_Ô_Ð_ð ð !	"Ý" 5¸ÈTÐanÐoÑoÔoÐpˆE‰EØð 	"ðð ð ð Ørwðñ ô ˆE‰Eõ ' uÑ-Ô-ˆEØˆ~Ý Ð!kÑlÔlÐlå˜&¥#Ñ&Ô&ð /Ø ˜¥C¨¡J¤JÑ.�å�5‰zŒz�S ™[œ[Ò(Ð(Ý ð AÅ3ÀuÁ:Ä:ð  Að  AÕruÐv|Ñr}Ôr}ð  Að  Að  Añô ð õ *Ñ+Ô+ð nÝ!Ð"lÑmÔmÐmàˆMÝ  vÑ.Ô.ð 	-ð 	-‘��qåœ™œ�à”: ’?�?Ø!ŸJšJ¨A˜JÑ.Ô.�Eå”˜ °<ÀÔ3PÐYZÐ[Ñ[Ô[Ð[Ø—’˜A‘”�Ø×$Ò$ VÑ,Ô,Ð,Ð,Ø!ˆEõ �e‘*”*ˆÝ�h¥Ñ$Ô$ð 	(Ø �z GÑ+ˆHˆHØÐØ�v Ñ'ˆHÝˆx‰=Œ=˜GÒ#Ð#ÝØ~Å3ÀxÁ=Ä=Ð~Ð~Ðt{Ð~Ð~Ð~ñô ð ð ˆ	ØˆØˆÝ%(¨°Ñ%9Ô%9ð 	cð 	cÑ!ˆH�kà!Ø Ø'ð,ð ,Ð(õ %9Ô$DÐEaÑ$bÔ$bÐ!Ø.2¬nÔ.F×.[Ò.[Ð\qÑ.rÔ.rÐ+à×ÒÐ<ÔCÑDÔDÐDØ�LŠLÐ8Ô=Ñ>Ô>Ð>Ø×ÒÐ aÐ aÐ:YÔ:`Ð aÑ aÔ aÑbÔbÐbÐbàð 	KØð Kà)˜4œ>Øðð à',ðð "ðð �õ
 ˜H‘~”~�ð (4×'7Ò'7Ð8NÑ'OÔ'OÐ$Ø)F¨Ô)FØ Ð"6ð*ð *Ø:Fð*ð *�Ð%Ñ&õ $¨¸>ÐJÑJÔJÐJàˆr   )NNNFFFFNFFN)NNN)r   r   r   r8   rL   re   ro   r}   Úboolrm   r   r   r   r   r#   r€   r
   r   r¸   Ú__classcell__)r<   s   @r    r1   r1   E   s|  ø€ € € € € ð7ð 7ð 7ð 7ð 7ð.ð .ð .ð( %)Ø#'Ø15Ø&+Ø',Ø-2ØØ%)Ø!Ø&+Ø(,ðs'ð s'à˜4  S œ>Ô*¨T°$°t¸CÀ¸H´~Ô2FÔ-GÑGðs'ð ˜T‘zðs'ð �DŒz˜DÑ ð	s'ð
 ˜˜S #˜XœÔ'¨$Ñ.ðs'ð  $ðs'ð !%ðs'ð '+ðs'ð ðs'ð ˜d™
ðs'ð ðs'ð  $ðs'ð  ™+ðs'ð 
ðs'ð s'ð s'ð s'ðj €^ðð	ñ 	ô 	ðlàÐ+Ñ+¨d°9¬oÑ=ÀÐEVÔ@WÑWÐZ^Ñ^ðlð Ð/Ô0ðlð lð lñ	ô 	ðlð. 37Ø$(Ø)-ðað aà�T˜#”Y‰ Ñ+ðað ðað ˜˜S 4™ZÔ(Ñ(¨4Ñ/ð	að
 ˜T‘zðað �d˜3”i‘ $Ñ&ðað Ð/Ô0ðað að að að að að að ar   r1   )#r›   Úutilsr   r   r   r   r   rE   Ú	soundfilerŸ   Ú-mistral_common.protocol.transcription.requestr	   Úaudio_utilsr
   r   r   Úfeature_extraction_utilsr   Úprocessing_utilsr   r   r   r   Útokenization_utils_baser   r   Úutils.chat_template_utilsr   Ú
get_loggerr   ri   r   r#   r1   Ú__all__r   r   r    ú<module>rÅ      sÙ  ðð 
€	€	€	à uÐ uÐ uÐ uÐ uÐ uÐ uÐ uÐ uÐ uÐ uÐ uÐ uÐ uð ÐÑÔð Ø€L€L€LàÐÑÔð ØÐÐÐàÐÑ Ô ð SØRÐRÐRÐRÐRÐRà HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HÐ HØ 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø UÐ UÐ UÐ UÐ UÐ UÐ UÐ UÐ UÐ UÐ UÐ UØ CÐ CÐ CÐ CÐ CÐ CÐ CÐ CØ @Ð @Ð @Ð @Ð @Ð @ð 
ˆÔ	˜HÑ	%Ô	%€ð%ð %ð %ð %ð %˜¨Eð %ñ %ô %ð %ðð ð ð ð Ð-°Uð ñ ô ð ð* ðOð Oð Oð Oð O�~ñ Oô Oñ „ðOðd
 Ð
€€€r   