§
    �Ÿj‰4  ã                   ó  — d dl Z d dlZd dlmZ d dlmZmZmZmZm	Z	m
Z
 d dlZd dlmZ d dlmZ d dlm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 d dl m!Z! d dl"m#Z# ddl$m%Z% defd„Z& G d„ de¦  «        Z' G d„ de¦  «        Z(defd„Z)defd„Z*defd„Z+defd„Z,defd„Z-defd„Z.defd„Z/defd„Z0defd „Z1defd!„Z2defd"„Z3defd#„Z4defd$„Z5defd%„Z6eee(df         Z7ded&e(d'efd(„Z8defd)„Z9defd*„Z:d+„ Z;dS ),é    N)ÚStringIO)ÚCallableÚListÚOptionalÚUnionÚ	GeneratorÚTuple)ÚBuffer)ÚKeyPressEvent)Únamed_commands)ÚAutoSuggestFromHistoryÚ
Suggestion)ÚDocument)ÚHistory)ÚPromptSession)Ú	ProcessorÚTransformationÚTransformationInput)Úget_ipython)Úgenerate_tokensé   )Úpass_throughÚdocumentc                 ó&   — | j         | j                 S ©N)ÚlinesÚcursor_position_row)r   s    út/var/www/finuniver-perm.ru/html/student/venv/lib/python3.11/site-packages/IPython/terminal/shortcuts/auto_suggest.pyÚ
_get_queryr      s   € ØŒ>˜(Ô6Ô7Ð7ó    c                   ó4   — e Zd ZdZd	deddfd„Zdedefd„ZdS )
ÚAppendAutoSuggestionInAnyLinez�
    Append the auto suggestion to lines other than the last (appending to the
    last line is natively supported by the prompt toolkit).
    úclass:auto-suggestionÚstyleÚreturnNc                 ó   — || _         d S r   )r$   )Úselfr$   s     r   Ú__init__z&AppendAutoSuggestionInAnyLine.__init__$   s   € ØˆŒ
ˆ
ˆ
r    Útic                 ó*  — |j         |j        j        dz
  k    }|j         |j        j        k    }|sP|rN|j        j        }|j        r|j        j        r|j        j        }nd}t          |j
        | j        |fgz   ¬¦  «        S t          |j
        ¬¦  «        S )Nr   Ú )Ú	fragments)Úlinenor   Ú
line_countr   Úbuffer_controlÚbufferÚ
suggestionÚis_cursor_at_the_end_of_lineÚtextr   r,   r$   )r'   r)   Úis_last_lineÚis_active_liner0   r1   s         r   Úapply_transformationz2AppendAutoSuggestionInAnyLine.apply_transformation'   s¡   € Ø”y B¤KÔ$:¸QÑ$>Ò>ˆØœ b¤kÔ&EÒEˆàð 
	: ð 
	:ØÔ&Ô-ˆFàÔ ð   R¤[Ô%Mð  Ø#Ô.Ô3�
�
à�
å!¨B¬L¸T¼ZÈÐ<TÐ;UÑ,UÐVÑVÔVÐVå!¨B¬LÐ9Ñ9Ô9Ð9r    )r#   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ústrr(   r   r   r6   © r    r   r"   r"      sh   € € € € € ðð ð
ð ˜cð Àð ð ð ð ð:Ð':ð :¸~ð :ð :ð :ð :ð :ð :r    r"   c                   ó  — e Zd ZdZd„ Zdefd„Zd„ Zdefd„Z	ded	e
d
ee         fd„Zd„ Zdedededed
eeeef         ddf         f
d„Zdededed
eeeef         ddf         fd„Zdededefd„Zdededed
dfd„Zdededed
dfd„ZdS )ÚNavigableAutoSuggestFromHistoryzá
    A subclass of AutoSuggestFromHistory that allow navigation to next/previous
    suggestion from history. To do so it remembers the current position, but it
    state need to carefully be cleared on the right events.
    c                 ó"   — d| _         g | _        d S ©Nr   )Ú
skip_linesÚ_connected_apps)r'   s    r   r(   z(NavigableAutoSuggestFromHistory.__init__?   s   € ð ˆŒØ!ˆÔÐÐr    Ú_c                 ó   — d| _         d S r@   )rA   )r'   rC   s     r   Úreset_history_positionz6NavigableAutoSuggestFromHistory.reset_history_positionE   s   € ØˆŒˆˆr    c                 óf   — | j         D ](}|j        j        }|                     | j        ¦  «         Œ)d S r   )rB   Údefault_bufferÚon_text_insertÚremove_handlerrE   )r'   Úpt_appÚtext_insert_events      r   Ú
disconnectz*NavigableAutoSuggestFromHistory.disconnectH   sH   € ØÔ*ð 	Jð 	JˆFØ &Ô 5Ô DÐØ×,Ò,¨TÔ-HÑIÔIÐIÐIð	Jð 	Jr    rJ   c                 óÊ   — | j                              |¦  «         |j        j                             | j        ¦  «         |j        j                             | j        ¦  «         d S r   )rB   ÚappendrG   rH   Úadd_handlerrE   Úon_cursor_position_changedÚ_dismiss)r'   rJ   s     r   Úconnectz'NavigableAutoSuggestFromHistory.connectM   sZ   € ØÔ×#Ò# FÑ+Ô+Ð+ð 	ÔÔ,×8Ò8¸Ô9TÑUÔUÐUØÔÔ8×DÒDÀTÄ]ÑSÔSÐSÐSÐSr    r0   r   r%   c                 óº   — t          |¦  «        }|                     ¦   «         r7|                      || j        |j        ¦  «        D ]\  }}t          |¦  «        c S d S r   )r   ÚstripÚ_find_next_matchrA   Úhistoryr   )r'   r0   r   r3   r1   rC   s         r   Úget_suggestionz.NavigableAutoSuggestFromHistory.get_suggestionT   sj   € õ ˜(Ñ#Ô#ˆà�:Š:‰<Œ<ð 	.Ø!%×!6Ò!6Ø�d”o v¤~ñ"ô "ð .ð .‘�
˜Aõ " *Ñ-Ô-Ð-Ð-Ð-àˆtr    c                 ó   — d |_         d S r   )r1   )r'   r0   ÚargsÚkwargss       r   rQ   z(NavigableAutoSuggestFromHistory._dismissa   s   € Ø ˆÔÐÐr    r3   rA   rV   ÚpreviousNc              #   óŒ  K  — d}t          t          |                     ¦   «         ¦  «        ¦  «        D ]�}t          |                     ¦   «         ¦  «        D ]l}|dz  }|s||k     rŒ|                     |¦  «        r;t          |¦  «        t          |¦  «        k    r|t          |¦  «        d…         |fV — |r
||k    r  dS ŒmŒ‘dS )ac  
        text : str
            Text content to find a match for, the user cursor is most of the
            time at the end of this text.
        skip_lines : float
            number of items to skip in the search, this is used to indicate how
            far in the list the user has navigated by pressing up or down.
            The float type is used as the base value is +inf
        history : History
            prompt_toolkit History instance to fetch previous entries from.
        previous : bool
            Direction of the search, whether we are looking previous match
            (True), or next match (False).

        Yields
        ------
        Tuple with:
        str:
            current suggestion.
        float:
            will actually yield only ints, which is passed back via skip_lines,
            which may be a +inf (float)


        éÿÿÿÿr   N)ÚreversedÚlistÚget_stringsÚ
splitlinesÚ
startswithÚlen)r'   r3   rA   rV   r[   Úline_numberÚstringÚlines           r   Ú_find_matchz+NavigableAutoSuggestFromHistory._find_matchd   sñ   è è € ð8 ˆÝ�t G×$7Ò$7Ñ$9Ô$9Ñ:Ô:Ñ;Ô;ð 
	ð 
	ˆFÝ  ×!2Ò!2Ñ!4Ô!4Ñ5Ô5ð 	ð 	�Ø˜qÑ �Øð  K°*Ò$<Ð$<Øð —?’? 4Ñ(Ô(ð 9­S°©Y¬Y½¸T¹¼Ò-BÐ-BØ�s 4™yœy˜{˜{Ô+¨[Ð8Ð8Ð8Ð8Øð  ¨zÒ 9Ð 9Ø�F�F�Føð	ð
	ð 
	r    c                 ó4   — |                       |||d¬¦  «        S )NF©r[   )rg   ©r'   r3   rA   rV   s       r   rU   z0NavigableAutoSuggestFromHistory._find_next_match�   s!   € ð ×Ò  j°'ÀEÐÑJÔJÐJr    c           
      óh   — t          t          |                      |||d¬¦  «        ¦  «        ¦  «        S )NTri   )r^   r_   rg   rj   s       r   Ú_find_previous_matchz4NavigableAutoSuggestFromHistory._find_previous_match’   s6   € ÝÝ�×!Ò! $¨
°GÀdÐ!ÑKÔKÑLÔLñ
ô 
ð 	
r    ÚqueryÚ
other_thanc                 ó~   — |                       || j        |¦  «        D ]\  }}||z   |k    r
|| _         d S Œd| _        d S r@   )rU   rA   ©r'   rm   rn   rV   r1   rd   s         r   Úupz"NavigableAutoSuggestFromHistory.up—   sa   € Ø'+×'<Ò'<Ø�4”? Gñ(
ô (
ð 	 ð 	 Ñ#ˆJ˜ð �zÑ! ZÒ/Ð/Ø"-�”Ø��ð 0ð
  ˆDŒOˆOˆOr    c                 óê   — |                       || j        |¦  «        D ]\  }}||z   |k    r
|| _         d S Œ|                       |t          d¦  «        |¦  «        D ]\  }}||z   |k    r
|| _         d S Œd S )NÚInf)rl   rA   Úfloatrp   s         r   Údownz$NavigableAutoSuggestFromHistory.down§   s¶   € Ø'+×'@Ò'@Ø�4”? Gñ(
ô (
ð 	ð 	Ñ#ˆJ˜ð �zÑ! ZÒ/Ð/Ø"-�”Ø��ð 0ð
 ,0×+DÒ+DØ•u˜U‘|”| Wñ,ô ,ð ð Ñ'�
˜Kð ˜:Ñ%¨Ò3Ð3Ø&1�D”OØ�E�Eð 4ðð r    )r7   r8   r9   r:   r(   r
   rE   rL   r   rR   r   r   r   rW   rQ   r;   rt   r   Úboolr   r	   rg   rU   rl   rq   ru   r<   r    r   r>   r>   8   sæ  € € € € € ðð ð"ð "ð "ð¨ð ð ð ð ðJð Jð Jð
T˜mð Tð Tð Tð TðØðØ(0ðà	�*Ô	ðð ð ð ð!ð !ð !ð'Øð'Ø%*ð'Ø5<ð'ØHLð'à	�5˜˜e˜Ô$ d¨DÐ0Ô	1ð'ð 'ð 'ð 'ðRKØðKØ%*ðKØ5<ðKà	�5˜˜e˜Ô$ d¨DÐ0Ô	1ðKð Kð Kð Kð

¨ð 
¸%ð 
È'ð 
ð 
ð 
ð 
ð
 ˜ð  ¨ð  °wð  À4ð  ð  ð  ð  ð ˜#ð ¨3ð ¸ð ÀTð ð ð ð ð ð r    r>   Úeventc                 ó4  — | j         }|j        }|j        |j        d…         }|                     d¦  «        }|d                              ¦   «         }|j        }|�)|j        r"|dk    r|                     |j        ¦  «         dS t          j	        | ¦  «         dS )z,Apply autosuggestion or jump to end of line.Nú
r   r+   )
Úcurrent_bufferr   r3   Úcursor_positionÚsplitrT   r1   Úinsert_textÚncÚend_of_line)rw   r0   ÚdÚafter_cursorr   Úend_of_current_liner1   s          r   Úaccept_or_jump_to_endrƒ   ¸   s    € àÔ!€FØŒ€AØ”6˜!Ô+Ð-Ð-Ô.€LØ×Ò˜tÑ$Ô$€EØ œ(Ÿ.š.Ñ*Ô*ÐØÔ"€JØÐ Z¤_ÐÐ;NÐRTÒ;TÐ;TØ×Ò˜:œ?Ñ+Ô+Ð+Ð+Ð+å
Œ�uÑÔÐÐÐr    c                 ó    — t          | ¦  «        S )zyAccept autosuggestion or jump to end of line.

    .. deprecated:: 8.12
        Use `accept_or_jump_to_end` instead.
    )rƒ   ©rw   s    r   Ú#_deprected_accept_in_vi_insert_moder†   Æ   s   € õ ! Ñ'Ô'Ð'r    c                 ó†   — | j         }|j        }|r|                     |j        ¦  «         dS t	          j        | ¦  «         dS )zAccept autosuggestionN)rz   r1   r}   r3   r~   Úforward_char)rw   r0   r1   s      r   Úacceptr‰   Ï   sL   € àÔ!€FØÔ"€JØð Ø×Ò˜:œ?Ñ+Ô+Ð+Ð+Ð+å
Œ˜ÑÔÐÐÐr    c                 ó"   — | j         }d|_        dS )zDiscard autosuggestionN)rz   r1   )rw   r0   s     r   Údiscardr‹   Ù   s   € àÔ!€FØ€FÔÐÐr    c                 óà   — | j         }|j        }|rIt          j        d|j        ¦  «        }|                     t          d„ |D ¦   «         d¦  «        ¦  «         dS t          j        | ¦  «         dS )z#Fill partial autosuggestion by wordz(\S+\s+)c              3   ó   K  — | ]}|¯|V — Œ	d S r   r<   )Ú.0Úxs     r   ú	<genexpr>zaccept_word.<locals>.<genexpr>å   s'   è è € Ð 3Ð 3 q°Ð 3 Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3r    r+   N)	rz   r1   Úrer|   r3   r}   Únextr~   Úforward_word)rw   r0   r1   Úts       r   Úaccept_wordr•   ß   sv   € àÔ!€FØÔ"€JØð ÝŒH�[ *¤/Ñ2Ô2ˆØ×Ò�4Ð 3Ð 3¨AÐ 3Ñ 3Ô 3°RÑ8Ô8Ñ9Ô9Ð9Ð9Ð9å
Œ˜ÑÔÐÐÐr    c                 ó|   — | j         }|j        }|r)|j        r$|                     |j        d         ¦  «         dS dS dS )z(Fill partial autosuggestion by characterr   N)rz   r1   r3   r}   )rw   Úbr1   s      r   Úaccept_characterr˜   ê   sU   € àÔ€AØ”€JØð *�j”oð *Ø	�Š�j”o aÔ(Ñ)Ô)Ð)Ð)Ð)ð*ð *ð *ð *r    c                 óz   — | j         }|j        }|j        }|r#|                     |j        ¦  «         ||_        dS dS )z.Accept autosuggestion and keep cursor in placeN)rz   r{   r1   r}   r3   )rw   r0   Úold_positionr1   s       r   Úaccept_and_keep_cursorr›   ò   sP   € àÔ!€FØÔ)€LØÔ"€JØð .Ø×Ò˜:œ?Ñ+Ô+Ð+Ø!-ˆÔÐÐð.ð .r    c                 óL   — t          | ¦  «         t          j        | ¦  «         dS )z3Accept autosuggestion and move cursor left in placeN)r›   r~   Úbackward_charr…   s    r   Úaccept_and_move_cursor_leftrž   ü   s'   € å˜5Ñ!Ô!Ð!ÝÔ�UÑÔÐÐÐr    r0   c                 óf   — | j         r)| j                              | | j        ¦  «        }|| _        d S d S r   )Úauto_suggestrW   r   r1   )r0   r1   s     r   Ú_update_hintr¡     s?   € ØÔð 'ØÔ(×7Ò7¸ÀÄÑPÔPˆ
Ø&ˆÔÐÐð'ð 'r    c                 óV   — t          j        | ¦  «         t          | j        ¦  «         dS )z4Resume autosuggestions after deleting last characterN)r~   Úbackward_delete_charr¡   rz   r…   s    r   Úbackspace_and_resume_hintr¤     s*   € åÔ˜EÑ"Ô"Ð"Ý�Ô%Ñ&Ô&Ð&Ð&Ð&r    c                 óV   — t          j        | ¦  «         t          | j        ¦  «         dS )zResume autosuggestionsN)r   Úreplyr¡   rz   r…   s    r   Úresume_hintingr§     s,   € åÔ�uÑÔÐõ �Ô%Ñ&Ô&Ð&Ð&Ð&r    c                 óh   — | j         }|                     | j        ¬¦  «         t          |¦  «         dS )zGo up and update hint©ÚcountN)rz   Úauto_upÚargr¡   ©rw   rz   s     r   Úup_and_update_hintr®     s7   € àÔ)€Nà×Ò ¤ÐÑ+Ô+Ð+Ý�Ñ Ô Ð Ð Ð r    c                 óh   — | j         }|                     | j        ¬¦  «         t          |¦  «         dS )zGo down and update hintr©   N)rz   Ú	auto_downr¬   r¡   r­   s     r   Údown_and_update_hintr±     s7   € àÔ)€Nà×Ò 5¤9ÐÑ-Ô-Ð-Ý�Ñ Ô Ð Ð Ð r    c                 ó¸  — | j         }|j        }|�r´t          |j        ¦  «        }||j        z   }g d¢}dg}d}t          t          |¦  «        j        ¦  «        D �]}|j        t          j
        k    rt          |¦  «        }	n/|                     |d         t          |d         ¦  «        ¦  «        }	|                     |d|	…         ¦  «         |d         }
|
                     |¦  «        rr|dk    rTt          |
¦  «        t          |¦  «        k    r4|
t          |¦  «        d…         |d<   |                     |
¦  «         |dz  }|d         ||<   |dk    r n|dz  }�Œ|d         r_|d         }|d         r!t          |d         ¦  «        dk    r|d         }|t          |¦  «        d…         }|                     |¦  «         dS t!          j        | ¦  «         dS )	z$Fill partial autosuggestion by token)NNNr+   r   r   r]   Né   éþÿÿÿ)rz   r1   r   r   r3   r   r   ÚreadlineÚtypeÚtokenizeÚNEWLINErc   ÚindexrN   rb   r}   r~   r“   )rw   r—   r1   Úprefixr3   ÚtokensÚ
substringsÚiÚtokenr¹   Útokenized_so_farr}   Ú	to_inserts                r   Úaccept_tokenrÁ   &  sã  € àÔ€AØ”€Jàñ  Ý˜AœJÑ'Ô'ˆØ˜
œÑ'ˆà&8Ð&8Ð&8ˆØ�Tˆ
Øˆå$¥X¨d¡^¤^Ô%<Ñ=Ô=ð 	ñ 	ˆEØŒz�XÔ-Ò-Ð-Ý˜D™	œ	��àŸ
š
 5¨¤8­S°¸B´Ñ-@Ô-@ÑAÔA�Ø×Ò˜d 6 E 6œlÑ+Ô+Ð+Ø)¨"œ~ÐØ×*Ò*¨6Ñ2Ô2ð Ø˜’6�6�cÐ"2Ñ3Ô3µc¸&±k´kÒAÐAØ 0µ°V±´°°Ô ?�F˜1‘IØ×%Ò%Ð&6Ñ7Ô7Ð7Ø˜‘F�AØ! !œH��q‘	Ø˜’6�6Ø�EØ�Q‘�ùà�!Œ9ð 	à$ Rœ.ˆKØ�aŒyð -�S ¨¤™^œ^¨qÒ0Ð0Ø(¨œn�Ø#¥C¨¡K¤K M MÔ2ˆIØ�MŠM˜)Ñ$Ô$Ð$ØˆFå„O�EÑÔÐÐÐr    ÚproviderÚdirection_methodc                 óÂ   — | j         }|sdS t          | j        ¦  «        }||j        z   } |||| j        ¬¦  «         |                     | | j        ¦  «        }|| _         dS )a  
    We skip most recent history entry (in either direction) if it equals the
    current autosuggestion because if user cycles when auto-suggestion is shown
    they most likely want something else than what was suggested (otherwise
    they would have accepted the suggestion).
    N)rm   rn   rV   )r1   r   r   r3   rV   rW   )r0   rÂ   rÃ   r1   rm   ÚcurrentÚnew_suggestions          r   Ú_swap_autosuggestionrÇ   S  ss   € ð Ô"€JØð Øˆå�v”Ñ'Ô'€EØ�j”oÑ%€GàÐ˜5¨W¸f¼nÐMÑMÔMÐMà×,Ò,¨V°V´_ÑEÔE€NØ&€FÔÐÐr    c                 ó’   — t          ¦   «         }|j        }t          |t          ¦  «        sdS t	          | j        ||j        ¬¦  «        S )z%Get next autosuggestion from history.N©r0   rÂ   rÃ   )r   r    Ú
isinstancer>   rÇ   rz   rq   ©rw   ÚshellrÂ   s      r   Úswap_autosuggestion_uprÍ   k  sN   € å‰MŒM€EØÔ!€Hå�hÕ ?Ñ@Ô@ð ØˆåØÔ#¨hÈÌðñ ô ð r    c                 ó’   — t          ¦   «         }|j        }t          |t          ¦  «        sdS t	          | j        ||j        ¬¦  «        S )z)Get previous autosuggestion from history.NrÉ   )r   r    rÊ   r>   rÇ   rz   ru   rË   s      r   Úswap_autosuggestion_downrÏ   x  sP   € å‰MŒM€EØÔ!€Hå�hÕ ?Ñ@Ô@ð ØˆåØÔ#ØØ!œðñ ô ð r    c                 ób   — | dk    r#t          j        dt          d¬¦  «         t          S t          ‚)NÚaccept_in_vi_insert_modez�`accept_in_vi_insert_mode` is deprecated since IPython 8.12 and renamed to `accept_or_jump_to_end`. Please update your configuration accordinglyr³   )Ú
stacklevel)ÚwarningsÚwarnÚDeprecationWarningr†   ÚAttributeError)Úkeys    r   Ú__getattr__rØ   ‡  sB   € Ø
Ð(Ò(Ð(ÝŒðõ Øð	
ñ 	
ô 	
ð 	
õ 3Ð2Ý
Ðr    )<r‘   r·   Úior   Útypingr   r   r   r   r   r	   rÓ   Úprompt_toolkit.bufferr
   Úprompt_toolkit.key_bindingr   Ú#prompt_toolkit.key_binding.bindingsr   r~   Úprompt_toolkit.auto_suggestr   r   Úprompt_toolkit.documentr   Úprompt_toolkit.historyr   Úprompt_toolkit.shortcutsr   Ú prompt_toolkit.layout.processorsr   r   r   ÚIPython.core.getipythonr   ÚIPython.utils.tokenutilr   Úfiltersr   r   r"   r>   rƒ   r†   r‰   r‹   r•   r˜   r›   rž   r¡   r¤   r§   r®   r±   rÁ   ÚProviderrÇ   rÍ   rÏ   rØ   r<   r    r   ú<module>rç      sÖ  ðØ 	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð Ø DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DÐ DØ €€€à (Ð (Ð (Ð (Ð (Ð (Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø DÐ DÐ DÐ DÐ DÐ DØ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JØ ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø *Ð *Ð *Ð *Ð *Ð *Ø 2Ð 2Ð 2Ð 2Ð 2Ð 2ðð ð ð ð ð ð ð ð ð ð 0Ð /Ð /Ð /Ð /Ð /Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3à !Ð !Ð !Ð !Ð !Ð !ð8˜ð 8ð 8ð 8ð 8ð:ð :ð :ð :ð : Iñ :ô :ð :ð4}ð }ð }ð }ð }Ð&<ñ }ô }ð }ð@ ð ð ð ð ð(¨}ð (ð (ð (ð (ð�-ð ð ð ð ð�=ð ð ð ð ð�}ð ð ð ð ð*˜Mð *ð *ð *ð *ð. -ð .ð .ð .ð .ð }ð ð ð ð ð'˜ð 'ð 'ð 'ð 'ð' ]ð 'ð 'ð 'ð 'ð'˜-ð 'ð 'ð 'ð 'ð!˜mð !ð !ð !ð !ð! ð !ð !ð !ð !ð'˜ð 'ð 'ð 'ð 'ðT Ð'Ð)HÈ$ÐNÔO€ð'Øð'à-ð'ð ð'ð 'ð 'ð 'ð0
 -ð 
ð 
ð 
ð 
ð Mð ð ð ð ð
ð 
ð 
ð 
ð 
r    