§
    ŒŸjm6  ã                   ó
  — d dl m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mZ dZe
d	                     ¦   «         z   Zd
„ Zd„ Zd„ Z	 dd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z d„ Z!d„ Z"d„ Z#d„ Z$d„ Z%dS )é    )Údedent)Úsplit_lines)Údebug)ÚRefactoringError)ÚRefactoringÚEXPRESSION_PARTS)Úindent_block)Úfunction_is_classmethodÚfunction_is_staticmethod©ÚsuiteÚ
file_inputz_atom testlist_star_expr testlist test lambdef lambdef_nocond keyword name number string fstringc                 ó  — t          |||¦  «        }t          j        d|¦  «         t          |¦  «        \  }}|st	          |¦  «        ‚|dz   t          |¦  «        z   }	|t          |||	|¦  «        i}
t          | |
¦  «        S )NzExtracting nodes: %sú = )Ú_find_nodesr   ÚdbgÚ_is_expression_with_errorr   Ú_expression_nodes_to_stringÚ_replacer   )Úinference_stateÚpathÚmodule_nodeÚnameÚposÚ	until_posÚnodesÚis_expressionÚmessageÚgenerated_codeÚfile_to_node_changess              úi/var/www/finuniver-perm.ru/html/student/venv/lib/python3.11/site-packages/jedi/api/refactoring/extract.pyÚextract_variabler"      s�   € Ý˜ S¨)Ñ4Ô4€EÝ	„IÐ$ eÑ,Ô,Ð,å6°uÑ=Ô=Ñ€M�7Øð (Ý˜wÑ'Ô'Ð'à˜E‘\Õ$?ÀÑ$FÔ$FÑF€NØ ¥(¨5°$¸ÈÑ"LÔ"LÐMÐÝ�Ð(<Ñ=Ô=Ð=ó    c                 óˆ   — t          d„ | D ¦   «         ¦  «        rdS | d         j        t          vrdd| d         j        z  fS dS )z8
    Returns a tuple (is_expression, error_string).
    c              3   óT   K  — | ]#}|j         d k    o|                     ¦   «         V — Œ$dS )r   N)ÚtypeÚis_definition)Ú.0Únodes     r!   ú	<genexpr>z,_is_expression_with_error.<locals>.<genexpr>#   s:   è è € Ð
JÐ
J¸Dˆ4Œ9˜ÒÐ7 4×#5Ò#5Ñ#7Ô#7Ð
JÐ
JÐ
JÐ
JÐ
JÐ
Jr#   )Fz,Cannot extract a name that defines somethingr   FzCannot extract a "%s")TÚ )Úanyr&   Ú_VARIABLE_EXCTRACTABLE©r   s    r!   r   r      sX   € õ Ð
JÐ
JÀEÐ
JÑ
JÔ
JÑJÔJð EØDÐDàˆQ„x„}Õ2Ð2Ð2ØÐ-°°a´´Ñ=Ð=Ð=Øˆ8r#   c                 ó.  — |                       |d¬¦  «        }|€‘|j        dk    r#|                     ¦   «         }|�|j        |k    r|}t	          |¦  «        r|j        }|j        j        dk    r|j        j        }|j        j        t          v r|j        }|j        j        t          v °|g}nº|j        |k    r|                     ¦   «         }|�|}t	          |¦  «        r|j        }|                       |d¬¦  «        }|j        |k    r%|                     ¦   «         }|€t          d¦  «        ‚|}|j        |j        k     r|j        }|j        |j        k     °t          |||¦  «        }t          |¦  «        dk    r|j        dv r|d	         j        d         gS |S )
zd
    Looks up a module and tries to find the appropriate amount of nodes that
    are in there.
    T)Úinclude_prefixesNÚoperatorÚtrailerz!Cannot extract anything from thaté   )Úreturn_stmtÚ
yield_exprr   )Úget_leaf_for_positionr&   Úget_next_leafÚ	start_posÚ_is_not_extractable_syntaxÚparentr   Úend_posÚget_previous_leafr   Ú!_remove_unwanted_expression_nodesÚlenÚchildren)r   r   r   Ú
start_nodeÚ	next_leafr   Úend_leafÚparent_nodes           r!   r   r   +   sÖ  € ð
 ×2Ò2°3ÈÐ2ÑNÔN€JàÐØŒ?˜jÒ(Ð(Ø"×0Ò0Ñ2Ô2ˆIØÐ$¨Ô)<ÀÒ)CÐ)CØ&�
å% jÑ1Ô1ð 	+Ø#Ô*ˆJàÔÔ! YÒ.Ð.Ø#Ô*Ô1ˆJØÔÔ$Õ(8Ð8Ð8Ø#Ô*ˆJð ÔÔ$Õ(8Ð8Ð8ð �ˆˆð Ô Ò$Ð$Ø"×0Ò0Ñ2Ô2ˆIØÐ$Ø&�
õ & jÑ1Ô1ð 	+Ø#Ô*ˆJð ×4Ò4°YÐQUÐ4ÑVÔVˆØÔ 	Ò)Ð)Ø×1Ò1Ñ3Ô3ˆHØÐÝ&Ð'JÑKÔKÐKà ˆØÔ! HÔ$4Ò4Ð4Ø%Ô,ˆKð Ô! HÔ$4Ò4Ð4õ 2°+¸sÀIÑNÔNˆõ
 ˆ5�z„z�Q‚€˜:œ?Ð.KÐKÐKØ�a”Ô! !Ô$Ð%Ð%Ø€Lr#   Nc                 ó  — t          | d         ¦  «        }|€|                     ¦   «         }| d                              ¦   «         }t          |j        d¬¦  «        }||u r	|�||d d…<   t	          ||d         ¦  «        dz   g|dd…<   d                     |¦  «        }	i }
||u r|	|z   |
| d         <   n=|€|j        }n|t          | d         ¦  «        z   }||z   |
| d         <   |	|j        z   |
|<   | dd …         D ]}d|
|<   Œ|
S )Nr   T©Úkeependséÿÿÿÿú
r+   r3   )Ú_get_parent_definitionÚget_first_leafr   Úprefixr	   ÚjoinÚ_get_indentationÚvalue)r   Úexpression_replacementÚ	extractedr   Úinsert_before_leafÚremaining_prefixÚ
definitionÚfirst_node_leafÚlinesÚextracted_prefixÚreplacement_dctÚpr)   s                r!   r   r   a   sK  € õ (¨¨a¬Ñ1Ô1€JØÐ!Ø'×6Ò6Ñ8Ô8ÐØ˜A”h×-Ò-Ñ/Ô/€OåÐ*Ô1¸DÐAÑAÔA€EØÐ,Ð,Ð,ØÐ'à)ˆE�#�2�#‰JÝ  ¨E°"¬IÑ6Ô6¸Ñ=Ð>€Eˆ"ˆRˆ%�LØ—w’w˜u‘~”~Ðà€OØÐ,Ð,Ð,Ø$4Ð7MÑ$Mˆ˜˜aœÑ!Ð!àÐ#ØÔ&ˆAˆAà Õ#3°E¸!´HÑ#=Ô#=Ñ=ˆAØ$%Ð(>Ñ$>ˆ˜˜aœÑ!Ø.>ÐASÔAYÑ.YˆÐ*Ñ+à�a�b�b”	ð #ð #ˆØ "ˆ˜ÑÐØÐr#   c                 óZ   — d                      d„ t          | ¦  «        D ¦   «         ¦  «        S )Nr+   c              3   óP   K  — | ]!\  }}|                      |d k    ¬¦  «        V — Œ"dS )r   ©Úinclude_prefixN©Úget_code)r(   ÚiÚns      r!   r*   z._expression_nodes_to_string.<locals>.<genexpr>ƒ   s8   è è € ÐRÐR¹¸¸A�1—:’:¨Q°!ªV�:Ñ4Ô4ÐRÐRÐRÐRÐRÐRr#   )rL   Ú	enumerater.   s    r!   r   r   ‚   s+   € Ø�7Š7ÐRÐRÅÈ5ÑAQÔAQÐRÑRÔRÑRÔRÐRr#   c                 óø   — | d         }t          |                     ¦   «         |d         dz
  ¦  «        \  }}||                     d¬¦  «        z   d                     d„ | dd …         D ¦   «         ¦  «        z   }||fS )Nr   r3   Fr[   r+   c              3   ó>   K  — | ]}|                      ¦   «         V — Œd S )Nr]   )r(   r`   s     r!   r*   z)_suite_nodes_to_string.<locals>.<genexpr>Š   s*   è è € Ð2Ð2 1�!—*’*‘,”,Ð2Ð2Ð2Ð2Ð2Ð2r#   )Ú_split_prefix_atrJ   r^   rL   )r   r   r`   rK   Úpart_of_codeÚcodes         r!   Ú_suite_nodes_to_stringrg   †   s€   € ØˆaŒ€AÝ+¨A×,<Ò,<Ñ,>Ô,>ÀÀAÄÈÁ
ÑKÔKÑ€FˆLØ˜!Ÿ*š*°E˜*Ñ:Ô:Ñ:Ø
�'Š'Ð2Ð2¨¨a¨b¨b¬	Ð2Ñ2Ô2Ñ
2Ô
2ñ3€Dà�4ˆ<Ðr#   c                 óÆ   — | j         d         |z
  }t          | j        d¬¦  «        }d                     |d| …         ¦  «        d                     || d…         ¦  «        fS )zU
    Returns a tuple of the leaf's prefix, split at the until_line
    position.
    r   TrE   r+   N)r8   r   rK   rL   )ÚleafÚ
until_lineÚsecond_line_countrU   s       r!   rd   rd   Ž   sk   € ð œ qÔ)¨JÑ6ÐÝ˜œ¨dÐ3Ñ3Ô3€EØ�7Š7�5Ð,Ð,Ð,Ð,Ô-Ñ.Ô.°·²¸Ð?PÐ>PÐ>QÐ>QÔ8RÑ0SÔ0SÐSÐSr#   c                 óZ   — t          |                      ¦   «         j        ¦  «        d         S )NrG   )r   rJ   rK   ©r)   s    r!   rM   rM   ™   s$   € Ý�t×*Ò*Ñ,Ô,Ô3Ñ4Ô4°RÔ8Ð8r#   c                 ó`   — | �| j         j        t          v r| S | j         } | ­t          d¦  «        ‚)z8
    Returns the statement where a node is defined.
    NzWe should never even get here)r:   r&   Ú_DEFINITION_SCOPESÚNotImplementedErrorrm   s    r!   rI   rI   �   s@   € ð Ð
ØŒ;ÔÕ1Ð1Ð1ØˆKØŒ{ˆð Ð
õ Ð=Ñ
>Ô
>Ð>r#   c                 ó  — | j         }|dv }|t          v s|rô| j        }t          |¦  «        D ]$\  }}|j        |k    r|}|j         dk    r|dz  } nŒ%t          t          t          |¦  «        ¦  «        ¦  «        D ]F\  }}|j        |k     r6|}	|j         dk    r|	dz  }	||d…         D ]}
t          |
¦  «        r|	dz  }	Œ  nŒG|||	dz   …         }|s8t          |d         ||¦  «        |dd…<   t          |d         ||¦  «        |dd…<   |S | gS )z~
    This function makes it so for `1 * 2 + 3` you can extract `2 + 3`, even
    though it is not part of the expression.
    r   r1   r3   Nr   rG   )
r&   r   r?   ra   r;   ÚreversedÚlistr8   r9   r=   )rC   r   r   ÚtypÚis_suite_partr   r_   r`   Ústart_indexÚ	end_indexÚn2s              r!   r=   r=   ¨   sw  € ð
 Ô
€CØÐ2Ð2€MØ
ÕÐÐ -ÐØÔ$ˆÝ˜eÑ$Ô$ð 	ð 	‰DˆAˆqØŒy˜3ŠˆØ�Ø”6˜ZÒ'Ð'Ø 1Ñ$�KØ�ð	 õ
 �T¥)¨EÑ"2Ô"2Ñ3Ô3Ñ4Ô4ð 	ð 	‰DˆAˆqØŒ{˜YÒ&Ð&Ø�	Ø”6˜ZÒ'Ð'Ø ‘N�Ið     œ)ð ð �BÝ1°"Ñ5Ô5ð Ø! Q™˜	˜	àØ�ð 'ð �k )¨a¡-Ð/Ô0ˆØð 	VÝ:¸5À¼8ÀSÈ)ÑTÔTˆE�!�A�#‰JÝ:¸5À¼9ÀcÈ9ÑUÔUˆE�"�#�#‰JØˆØˆ=Ðr#   c                 ó@   — | j         dk    p| j         dk    o| j        dvS )Nr1   Úkeyword)ÚNoneÚTrueÚFalse)r&   rN   rm   s    r!   r9   r9   Ì   s/   € ØŒ9˜
Ò"ð RØŒ9˜	Ò!ÐQ d¤jÐ8QÐ&QðRr#   c           	      ó  ‡— t          |j        ||¦  «        }t          |¦  «        sJ ‚t          |¦  «        \  }}|                     |d         ¦  «        }	|	                     ¦   «         }
t          t          ||	|¦  «        ¦  «        \  }}|	                     ¦   «         rd }n)t          |	j        |
¦  «        }| 
                    ¦   «         }|rdt          |¦  «        z   dz   }d }d}nÕt          |d         ¦  «        }|sB|r>t          t          |	|d         j        |d         j        |¦  «        ¦  «        p|d         gng }t!          ||¦  «        \  }}|d                              ¦   «         }t%          ||d         ¦  «        \  }}||z  }t'          |¦  «        }|s d                     |¦  «        }|d|z   dz   z  }t+          |r
|d d…         n|¦  «         d}d Š|
r{t-          |	j        ¦  «        sP|	                     ¦   «                              ¦   «         }t          |¦  «        r|d         j        Šˆfd„|D ¦   «         }t5          |	j        ¦  «        rd	}n|dz  }|›d
|›dd                     ‰€|n‰g|z   ¦  «        ›dt7          |¦  «        ›�}‰€dn‰dz   |z   ›dd                     |¦  «        ›d�}|r|}n|r	d|z   dz   }n|dz   |z   dz   }t9          ||||||¦  «        }|s||j        z   ||<   ||i}t=          | |¦  «        S )Nr   zreturn rH   FrG   z, r+   c                 ó    •— g | ]
}|‰k    ¯|‘ŒS © r€   )r(   rX   Ú
self_params     €r!   ú
<listcomp>z$extract_function.<locals>.<listcomp>  s   ø€ Ð?Ð?Ð? ¨q°Jª¨˜!¨¨¨r#   z@classmethod
zdef ú(z):
ú.ú)r   )r   Ú	tree_noder>   r   Úcreate_contextÚis_bound_methodrs   Ú_find_inputs_and_outputsÚ	is_moduleÚ_get_code_insertion_noderJ   r   Ú_is_node_ending_return_stmtÚ_find_needed_output_variablesr:   r;   rg   r7   rd   r   rL   Ú_check_for_non_extractablesr   Ú	get_valueÚget_param_namesÚstring_namer
   r	   r   rN   r   )r   r   Úmodule_contextr   r   r   r   r   Ú_Úcontextrˆ   ÚparamsÚreturn_variablesrQ   r)   Ú
code_blockrR   Úhas_ending_return_stmtÚ
after_leafÚfirstÚsecondÚoutput_var_strÚ	decoratorÚfunction_param_namesÚfunction_codeÚfunction_callÚreplacementrW   r    r�   s                                @r!   Úextract_functionr¢   Ñ   sË  ø€ Ý˜Ô0°#°yÑAÔA€EÝˆu‰:Œ:ÐÐÐå0°Ñ7Ô7Ñ€M�1Ø×+Ò+¨E°!¬HÑ5Ô5€GØ×-Ò-Ñ/Ô/€OÝ#Õ$<¸^ÈWÐV[Ñ$\Ô$\Ñ]Ô]Ñ€FÐð ×ÒÑÔð 3Ø!ÐÐå'¨Ô(9¸?ÑKÔKˆØ!×0Ò0Ñ2Ô2ÐØð <ØÕ!<¸UÑ!CÔ!CÑCÀdÑJˆ
ØÐØ!&ÐÐå!<¸UÀ2¼YÑ!GÔ!GÐØ%ð 		Eð -=ð E�tÕ$AØØ�a””Ø�b”	Ô!Ø ñ	%ô %ñ  ô  ð  )ð
 $ BÔ'Ð(øÀ"ð õ (>¸eÀSÑ'IÔ'IÑ$Ð˜*Ø˜2”Y×,Ò,Ñ.Ô.ˆ
Ý(¨°Y¸q´\ÑBÔB‰ˆˆvØ�eÑˆ
å˜JÑ'Ô'ˆ
Ø%ð 	<Ø!ŸYšYÐ'7Ñ8Ô8ˆNØ˜) nÑ4°tÑ;Ñ;ˆJõ  Ð.DÐ O  c r c¤
 
È%ÑPÔPÐPà€IØ€JØð 
Ý'¨Ô(9Ñ:Ô:ð 	@Ø#*×#4Ò#4Ñ#6Ô#6×#FÒ#FÑ#HÔ#HÐ ÝÐ'Ñ(Ô(ð @Ø1°!Ô4Ô@�
Ø?Ð?Ð?Ð? VÐ?Ñ?Ô?�å" 7Ô#4Ñ5Ô5ð 	)Ø(ˆIøà�dÑˆ
ð 	ˆ	ˆ	ØˆˆØ�	Š	˜JÐ.�&�&°Z°LÀ6Ñ4IÑJÔJÐJÐJÝ�ZÑ Ô Ð ð	€Mð Ð!ˆˆ z°CÑ'7¸4Ñ?Ð?Ð?Ø�	Š	�&ÑÔÐÐð€Mð ð HØ#ˆˆà!ð 	HØ# mÑ3°dÑ:ˆKˆKà(¨5Ñ0°=Ñ@À4ÑGˆKå˜u k°=À#Ø1Ð3CñEô E€Oàð @Ø&,¨zÔ/?Ñ&?ˆ˜
Ñ#Ø  /Ð2ÐÝ�Ð(<Ñ=Ô=Ð=r#   c                 óÆ   — | D ]]}	 |j         }t          |¦  «         Œ# t          $ r7 |j        dk    rt	          d¦  «        ‚|j        dk    rt	          d¦  «        ‚Y ŒZw xY wd S )NÚreturnz:Can only extract return statements if they are at the end.Úyieldz Cannot extract yield statements.)r?   rŽ   ÚAttributeErrorrN   r   )r   r`   r?   s      r!   rŽ   rŽ   (  s¤   € Øð 
2ð 
2ˆð		2Ø”zˆHõ (¨Ñ1Ô1Ð1Ð1øõ ð 	Kð 	Kð 	KØŒw˜(Ò"Ð"Ý&ØPñRô Rð RàŒw˜'Ò!Ð!Ý&Ð'IÑJÔJÐJð "Ð!ð		Køøøð
2ð 
2s   †�>AÁAc                 óÆ   — |D ]]}|j         dk    s|j                             ¦   «         s7|                     ¦   «         | ur dS |j        �||j        cxk    r|k     sn  dS Œ^dS )NÚparamTF)Úapi_typeÚparent_contextrŠ   Úget_root_contextr8   )r’   Únamesrš   Úlastr   s        r!   Ú_is_name_inputr®   6  s…   € Øð ð ˆØŒ=˜GÒ#Ð#¨4Ô+>×+HÒ+HÑ+JÔ+JÐ#Ø×$Ò$Ñ&Ô&¨nÐ<Ð<Ø�t�tØŒ~Ð%¨e°t´~Ð.LÐ.LÒ.LÐ.LÈÒ.LÐ.LÐ.LÐ.LØ�t�tøØˆ5r#   c                 ót  — |d         j         }|d         j        }g }g }t          |¦  «        D ]‡}|                     ¦   «         r||vr|                     |j        ¦  «         Œ5|j        |vrI|                     ||j         ¦  «        }|rt          | |||¦  «        r|                     |j        ¦  «         Œˆ||fS )Nr   rG   )r8   r;   Ú_find_non_global_namesr'   ÚappendrN   Úgotor®   )	r’   r”   r   rš   r­   ÚinputsÚoutputsr   Úname_definitionss	            r!   r‰   r‰   @  sÓ   € Ø�!ŒHÔ€EØ�Œ9Ô€Dà€FØ€GÝ& uÑ-Ô-ð 	.ð 	.ˆØ×ÒÑÔð 	.Ø˜7Ð"Ð"Ø—’˜tœzÑ*Ô*Ð*øàŒz Ð'Ð'Ø#*§<¢<°°d´nÑ#EÔ#EÐ Ø'ð .Ý)¨.Ð:JÈEÐSWÑXÔXð.à—M’M $¤*Ñ-Ô-Ð-øð �7ˆ?Ðr#   c              #   óÆ   K  — | D ][}	 |j         }|j        dk    r|j         d         dk    rŒ't          |¦  «        E d {V —† Œ=# t          $ r |j        dk    r|V — Y ŒXw xY wd S )Nr2   r   r„   r   )r?   r&   r°   r¦   )r   r)   r?   s      r!   r°   r°   U  s¦   è è € Øð 8ð 8ˆð
	8Ø”}ˆHð Œy˜IÒ%Ð%¨$¬-¸Ô*:¸cÒ*AÐ*AØå-¨hÑ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7øõ ð 	ð 	ð 	ØŒy˜FÒ"Ð"Ø�
�
�
øøð	øøøð8ð 8s   ˆAÁAÁAc                 ó¼   — |rt          | ¦  «        r'| j        j        dk    r| j        } | j        j        dk    °| j        j        dv r| j        } | j        j        dv °| S )Nr   )Úasync_funcdefÚ	decoratedÚ
async_stmt)r   r:   r&   )r)   rˆ   s     r!   r‹   r‹   d  su   € Øð Õ6°tÑ<Ô<ð ØŒkÔ ,Ò.Ð.Ø”;ˆDð ŒkÔ ,Ò.Ð.ð Œ+Ô
ÐJÐ
JÐ
JØŒ{ˆð Œ+Ô
ÐJÐ
JÐ
Jà€Kr#   c              #   óú   K  — |j         D ]p}|j        |k     rŒt          |¦  «        }t          |g¦  «        D ]B}|                     ¦   «         s,|j        |v r#|                     |j        ¦  «         |j        V — ŒCŒqdS )z�
    Searches everything after at_least_pos in a node and checks if any of the
    return_variables are used in there and returns those.
    N)r?   r8   Úsetr°   r'   rN   Úremove)r”   Úsearch_nodeÚat_least_posr–   r)   r   s         r!   r�   r�   n  s§   è è € ð
 Ô$ð !ð !ˆØŒ>˜LÒ(Ð(ØåÐ/Ñ0Ô0ÐÝ*¨D¨6Ñ2Ô2ð 	!ð 	!ˆDØ×%Ò%Ñ'Ô'ð !¨D¬JÐ:JÐ,JÐ,JØ ×'Ò'¨¬
Ñ3Ô3Ð3Ø”jÐ Ð Ð øð	!ð!ð !r#   c                 ó\   — | j         }|dk    rt          | j        d         ¦  «        S |dk    S )NÚsimple_stmtr   r4   )r&   rŒ   r?   )r)   Úts     r!   rŒ   rŒ   ~  s4   € ØŒ	€AØˆMÒÐÝ*¨4¬=¸Ô+;Ñ<Ô<Ð<Ø�ÒÐr#   )NN)&Útextwrapr   Úparsor   Újedir   Újedi.api.exceptionsr   Újedi.api.refactoringr   r   Újedi.commonr	   Újedi.parser_utilsr
   r   ro   Úsplitr-   r"   r   r   r   r   rg   rd   rM   rI   r=   r9   r¢   rŽ   r®   r‰   r°   r‹   r�   rŒ   r€   r#   r!   ú<module>rË      sñ  ðØ Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø >Ð >Ð >Ð >Ð >Ð >Ð >Ð >Ø $Ð $Ð $Ð $Ð $Ð $Ø OÐ OÐ OÐ OÐ OÐ OÐ OÐ Oð -Ð Ø)ð*ß+0ª5©7¬7ñ3Ð ð

>ð 
>ð 
>ð	ð 	ð 	ð3ð 3ð 3ðn 8<ðð ð ð ðBSð Sð Sðð ð ðTð Tð Tð9ð 9ð 9ð?ð ?ð ?ð!ð !ð !ðHRð Rð Rð
T>ð T>ð T>ðn2ð 2ð 2ðð ð ðð ð ð*8ð 8ð 8ðð ð ð!ð !ð !ð ð ð ð ð r#   