Ë
    ÄÓ^j˜L  ã                   óþ   — d dl Z d dlZd dl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 d dlmZ  ej                   e«      Zej'                  ej(                  «        G d„ d«      Z G d	„ d
«      Z G d„ d«      Zy)é    N)ÚIterableÚSequence)ÚGraphModule)Ú_get_qualified_nameÚNode)ÚOperatorSupportBase)Úfuse_by_partitionsc            	       óŽ   — e Zd Z	 	 	 ddedz  dee   dz  dee   dz  ddfd„Zdefd„Zdded	edz  ddfd
„Z	deddfd„Z
defd„Zy)Ú	PartitionNÚidÚnodesÚnode_ordersÚreturnc                 ó  — || _         i | _        |�q|€t        j                  |d «      | _        y t	        |«      }t	        |«      }t        |«      t        |«      k7  rt        d«      ‚t        t        ||«      «      | _        y y )Nz/nodes and node_orders must have the same length)r   r   ÚdictÚfromkeysÚlistÚlenÚAssertionErrorÚzip)Úselfr   r   r   Ú
nodes_listÚnode_orders_lists         úl/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/fx/passes/infra/partitioner.pyÚ__init__zPartition.__init__   s�   € ð ˆŒØ-/ˆŒ
ØÐØÐ"Ü!Ÿ]™]¨5°$Ó7�•
ä! %›[�
Ü#'¨Ó#4Ð Ü�z“?¤cÐ*:Ó&;Ò;Ü(ØIóð ô "¤# jÐ2BÓ"CÓD�•
ð ó    c                 ó,   — t        | j                  «      S ©N)Ústrr   ©r   s    r   Ú__repr__zPartition.__repr__&   ó   € Ü�4—:‘:‹Ðr   ÚnodeÚ
node_orderc                 ó>   — | j                   j                  ||i«       y r   )r   Úupdate)r   r#   r$   s      r   Úadd_nodezPartition.add_node)   s   € Ø�
‰
×Ñ˜4 Ð,Õ-r   c                 ó   — | j                   |= y r   )r   ©r   r#   s     r   Úremove_nodezPartition.remove_node,   s   € Ø�J‰J�tÑr   c                 ó,   — t        | j                  «      S r   )r   r   r    s    r   ÚsizezPartition.size/   r"   r   )NNNr   )Ú__name__Ú
__module__Ú__qualname__Úintr   r   r   r   r!   r'   r*   r,   © r   r   r   r      sœ   „ ð Ø'+Ø,0ñ	Eà�$‰JðEð ˜‰~ Ñ$ðEð ˜c‘] TÑ)ð	Eð
 
óEð(˜#ó ñ.˜Tð .¨s°T©zð .ÀTó .ð ð ¨ó ð�cô r   r   c                   ó2   — e Zd Zdeddfd„Zdedee   fd„Zy)Ú_DependencyViewerÚgraph_moduler   Nc                 ó<  — t        j                  t        «      | _        t	        |j
                  j                  «      D ]\  }|j                  D ]K  }| j                  |   j                  |«       | j                  |   j                  | j                  |   «       ŒM Œ^ y r   )
ÚcollectionsÚdefaultdictÚsetÚdownstreamsÚreversedÚgraphr   ÚusersÚaddr&   )r   r4   r#   Úoutput_nodes       r   r   z_DependencyViewer.__init__4   s‰   € Ü&×2Ñ2´3Ó7ˆÔä˜\×/Ñ/×5Ñ5Ó6ò 	MˆDØ#Ÿz™zò M�à× Ñ  Ñ&×*Ñ*¨;Ô7Ø× Ñ  Ñ&×-Ñ-¨d×.>Ñ.>¸{Ñ.KÕLñMñ	Mr   r#   c                 ó    — | j                   |   S r   )r9   r)   s     r   Údownstreams_ofz _DependencyViewer.downstreams_of=   s   € Ø×Ñ Ñ%Ð%r   )r-   r.   r/   r   r   r   r8   r@   r1   r   r   r3   r3   3   s/   „ ðM [ð M°Tó Mð& 4ð &¨C°©Iô &r   r3   c                   óº   — e Zd Z	 	 	 	 ddedededee   dz  dee   dz  deddfd	„Zd
e	defd„Z
dee   fd„Z	 ddee   dedefd„Zdee   ddfd„Zddedefd„Zy)ÚCapabilityBasedPartitionerNr4   Úoperator_supportÚallows_single_node_partitionÚnon_compute_opsÚ!allowed_single_node_partition_opsÚskip_horizontal_fusionr   c                 óˆ   — || _         || _        || _        |�|ng | _        |�|ng | _        || _        t        |«      | _        y r   )r4   rC   rD   rE   rF   rG   r3   Údependency_viewer)r   r4   rC   rD   rE   rF   rG   s          r   r   z#CapabilityBasedPartitioner.__init__B   s[   € ð )ˆÔØ 0ˆÔØ,HˆÔ)Ø2AÐ2M™ÐSUˆÔð 1Ð<ñ .àð 	Ô.ð
 '=ˆÔ#Ü!2°<Ó!@ˆÕr   r#   c                 ó|   — | j                   j                  t        | j                  j	                  «       «      |«      S r   )rC   Úis_node_supportedr   r4   Únamed_modulesr)   s     r   Ú_is_node_supportedz-CapabilityBasedPartitioner._is_node_supportedW   s4   € Ø×$Ñ$×6Ñ6Ü�×"Ñ"×0Ñ0Ó2Ó3°Tó
ð 	
r   c           	      óê	  ‡ ‡‡‡‡‡‡— t        j                  t        «      Ši Ši Ši }i Ši Št        j                  «       }dt
        t           dt
        t           dt        t           fˆˆˆ fd„Šdt        dt        dt        t        t        f   fˆˆˆˆˆˆˆ fd„}dt        d	t        d z  d
t        d z  dd fˆˆˆˆˆfd„}t        j                  d«       t        t        ‰ j                  j                  j                   «      «      D ]ï  \  }}i }d}‰ j#                  |«      r*|‰vr&t%        |«      }	|	||<   |	‰|	<    ||||	«       d ||	<   d}‰ j&                  r!|rZ|j(                  D ]  }
|
‰v sŒd |‰|
   <   Œ n;t+        ‰j-                  «       t/        j0                  d«      ¬«      D ]
  \  }	}d ||	<   Œ t3        |j5                  «       «      }t7        |«      dkD  sŒÕ|d   }|dd  D ]  } |||«      \  }}Œ Œñ ‰j9                  «       D ]I  }t;        t+        |j                   j-                  «       t/        j0                  d«      d¬«      «      |_        ŒK t        j                  d«       	 i }‰ j                  j                  j                   D ]  }d}|j(                  D ]-  }
|
j<                  dk7  st?        |
j@                  «      dk7  sŒ+d} n |sŒD‰jC                  |«      }|j(                  D ]  }
‰jC                  |
«      |k7  sŒ|||
<   Œ Œ� |sn#|j-                  «       D ]  \  }} ||d |«       Œ ŒÊ‰ jD                  �st        j                  d«       ddh}|jG                  t        ‰ jH                  «      «      }g }‰j-                  «       D ]¸  \  }}d}|j                   D ]‹  }|j<                  dk(  sŒtK        |j@                  «      s!tM        dtO        |j@                  «      › �«      ‚t?        |j@                  «      |vr|dz  }t?        |j@                  «      ‰ jP                  v sŒ‡|dz  }Œ� |dk  sŒ¨|jS                  |«       Œº |D ]  }‰|= Œ t        j                  d«       ‰j-                  «       D ]>  \  }}t        j                  d||j                   D �cg c]  }|jT                  ‘Œ c}«       Œ@ ‰j9                  «       D �cg c]  }|jW                  «       dkD  sŒ|‘Œ c}S c c}w c c}w )NÚ
user_nodesÚ
source_idsr   c                 ó>  •— t        |«      }t        «       }| D ]p  }t        j                  |f‰	j                  j	                  |«      «      D ];  }‰j                  |«      }|€Œ|j                  |«       |j                  ‰|   «       Œ= Œr |j                  |«       |S r   )	r8   Ú	itertoolsÚchainrI   r@   Úgetr=   r&   Údifference_update)
rO   rP   Úsource_ids_setÚdownstream_partition_idsÚ	user_nodeÚ	path_nodeÚ	target_idÚ
assignmentÚpartition_mapr   s
          €€€r   Údownstream_partitionszLCapabilityBasedPartitioner.propose_partitions.<locals>.downstream_partitionsr   s©   ø€ ô ! ›_ˆNÜ14³Ð$Ø'ò N�	Ü!*§¡Ø�L $×"8Ñ"8×"GÑ"GÈ	Ó"Ró"ò N�Ið !+§¡¨yÓ 9�IØ Ð(Ø Ø,×0Ñ0°Ô;Ø,×3Ñ3°MÀ)Ñ4LÕMñNðNð %×6Ñ6°~ÔFØ+Ð+r   Úself_idÚother_idc                 ó°  •‡ ‡‡‡— ‰‰    j                   Š‰‰   j                   Šdt        t           dt        fˆ	ˆˆˆˆˆ ˆfd„}‰‰    ‰‰   z  }|j	                  ‰‰«        ||«      r‰ dfS ‰ ‰}}t        ‰«      t        ‰«      k  r||}}‰|   j                   j                  ‰|   j                   «       ‰|   j                   D ]  }|‰	|<   Œ	 ‰|= t        ‰|   ‰|   «      ‰|<   ‰|= ‰|   j                  ‰|   «      ‰|<   ‰|= |‰|<   ‰|= ‰|   j                   ‰
|||f«      «       ‰|   j                  |«       ‰|   j                  |«       |dfS )NÚall_user_nodesr   c                 ó  •— | D ]|  }t        «       }t        j                  |f‰
j                  j	                  |«      «      D ]=  }|‰v s|‰v r  y|‰v sŒ‰|   }||v rŒ‰	|   }‰|v s‰|v r  y|j                  |«       Œ? Œ~ y)NTF)r8   rR   rS   rI   r@   r=   )ra   rX   Úvisited_partition_idsrY   Úpartition_idÚp_mapr[   r_   Úother_nodesr\   r   r^   Ú
self_nodess         €€€€€€€r   Údfs_iter_find_cycleziCapabilityBasedPartitioner.propose_partitions.<locals>.maybe_merge_partition.<locals>.dfs_iter_find_cycleŒ   s³   ø€ Ø!/ò D�IÜ,/«EÐ)ä%.§_¡_Ø"˜ d×&<Ñ&<×&KÑ&KÈIÓ&Vó&ò D˜	ð
 %¨
Ñ2°iÀ;Ñ6NÚ#'ð %¨
Ò2Ø+5°iÑ+@˜Lð  ,Ð/DÑDØ (Ø$1°,Ñ$?˜EØ&¨%Ñ/°8¸uÑ3DÚ'+à1×5Ñ5°lÕCñ/DðDð8 r   FT)
r   r8   r   ÚboolrU   r   r&   ÚminÚunionÚdiscard)r^   r_   rh   ra   Úmerge_idÚ
removed_idr#   rf   rg   r[   r]   r\   Úpartition_usersÚpartitions_by_idÚpartitions_orderr   s   ``     @@€€€€€€€r   Úmaybe_merge_partitionzLCapabilityBasedPartitioner.propose_partitions.<locals>.maybe_merge_partition‡   s²  ü€ à)¨'Ñ2×8Ñ8ˆJØ*¨8Ñ4×:Ñ:ˆKð´C¼±Ið Ä$÷ ó ð@ -¨WÑ5¸ÈÑ8QÑQˆNØ×,Ñ,¨[¸*ÔEñ # >Ô2ð  �~Ð%ð $+¨H�jˆHÜ�:‹¤ [Ó!1Ò1Ø'1°8˜*�ð ˜XÑ&×,Ñ,×3Ñ3Ð4DÀZÑ4P×4VÑ4VÔWà(¨Ñ4×:Ñ:ò ,�Ø#+�
˜4Ò ð,ð ! Ð,ä),Ø  Ñ*Ð,<¸ZÑ,Hó*Ð˜XÑ&ð ! Ð,à&3°HÑ&=×&CÑ&CØ˜jÑ)ó'ˆM˜(Ñ#ð ˜jÐ)à(6ˆO˜HÑ%Ø 
Ð+à˜(Ñ#×*Ñ*Ù% n°xÀÐ6LÓMôð ˜(Ñ#×+Ñ+¨HÔ5Ø˜(Ñ#×+Ñ+¨JÔ7à˜T�>Ð!r   r#   r$   r   c                 óX  •— dt         dt        dd fˆˆfd„}| ‰v r‰‰|       j                  | «       |€‰j                  | «       y |‰vrG|‰| <   |€t	        d«      ‚t        || g|g¬«      ‰|<   t        | j                  «      ‰|<    || |«       y |‰| <   ‰|   j                  | |«       y )Nr#   r   r   c                 óR   •— ‰|   j                   ‰| j                  |f«      «       y r   )r&   r<   )r#   r   r]   r\   s     €€r   Ú_update_partition_mapzgCapabilityBasedPartitioner.propose_partitions.<locals>.merge_single_node.<locals>._update_partition_mapÚ   s$   ø€ à˜bÑ!×(Ñ(Ñ)>¸t¿z¹zÈBÈ5Ó)QÕRr   z)node_order is required for new partitions)r   r   r   )	r   r0   r*   Úpopr   r   r8   r<   r'   )	r#   r$   r   ru   r[   r]   r\   ro   rp   s	       €€€€€r   Úmerge_single_nodezHCapabilityBasedPartitioner.propose_partitions.<locals>.merge_single_node×   sÑ   ø€ ðS¬Dð S´cð S¸dö Sð �zÑ!Ø  ¨DÑ!1Ñ2×>Ñ>¸tÔDàˆzØ—‘˜tÕ$ØÐ+Ñ+Ø#%�
˜4Ñ ØÐ%Ü(Ð)TÓUÐUÜ'0Ø $ °j°\ô(Ð  Ñ$ô '*¨$¯*©*£o� Ñ#Ù% d¨BÕ/à#%�
˜4Ñ Ø  Ñ$×-Ñ-¨d°JÕ?r   zProposing partitions...FTé   )Úkeyr   )ry   Úreversez=Reassigning getitem nodes to its producer node's partition...Úcall_functionz_operator.getitemz'Filtering out single node partitions...ztorch.ops.aten.viewzExpected callable target, got zPartitions proposed:zpartition #%s: %s),r6   r7   r8   rR   Úcountr   r   r0   Útupleri   ÚloggerÚdebugÚ	enumerater:   r4   r;   r   rM   ÚnextrG   r<   ÚsortedÚitemsÚoperatorÚ
itemgetterr   Úkeysr   Úvaluesr   Úopr   ÚtargetrT   rD   rk   rE   Úcallabler   ÚtyperF   ÚappendÚnamer,   )r   Únodes_orderÚnew_partition_idrr   rw   r$   r#   Úmerge_candidatesÚcreated_partitionrd   ÚuserÚ_Úmerge_candidates_listr^   r_   Ú	partitionÚnodes_reassignmentÚis_tuple_outputr   Údefault_non_compute_opsrE   Úpartitions_to_removeÚcompute_node_countr[   r]   r\   ro   rp   rq   s   `                      @@@@@@r   Úpropose_partitionsz-CapabilityBasedPartitioner.propose_partitions\   sK  þ€ ô .9×-DÑ-DÄSÓ-Iˆð ')ˆ
ð ð 	ð
 ð 	ð
 ð 	ð
 ð 	ô %Ÿ?™?Ó,Ðð	,Ü ¤™ð	,Ü4<¼S±Mð	,ä”‰X÷	,ð*N	"¬3ð N	"¼#ð N	"Ä%ÌÌTÈ	ÑBR÷ N	"ó N	"ð`	@Üð	@Ü$'¨$¡Jð	@Ü47¸$±Jð	@à÷	@ñ 	@ô2 	�‰Ð.Ô/ä )¬(°4×3DÑ3D×3JÑ3J×3PÑ3PÓ*QÓ Rò &	JÑˆJ˜à02ÐØ %Ðð ×&Ñ& tÔ,°¸ZÑ1GÜ#Ð$4Ó5�Ø$0�˜DÑ!Ø1=Ð  Ñ.Ù! $¨
°LÔAØ15Ð  Ñ.Ø$(Ð!à×*Ò*Ù$Ø $§
¡
ò F˜Ø :Ò-ØAEÐ,¨Z¸Ñ-=Ò>ñFô
 (.Ø$×*Ñ*Ó,´(×2EÑ2EÀaÓ2Hô(ò :‘O�L !ð 6:Ð$ \Ò2ð:ô
 %)Ð)9×)>Ñ)>Ó)@Ó$AÐ!ÜÐ(Ó)¨AÓ-Ø/°Ñ2�Ø 5°a°bÐ 9ò J�Hñ "7°wÀÓ!I‘J�G™QñJðG&	JðR *×0Ñ0Ó2ò 	ˆIÜ"ÜØ—O‘O×)Ñ)Ó+´×1DÑ1DÀQÓ1GÐQUôóˆI�Oð	ô 	�‰ÐTÔUØØ24ÐØ×)Ñ)×/Ñ/×5Ñ5ò :�Ø"&�Ø ŸJ™Jò �DàŸ™ ?Ò2Ü.¨t¯{©{Ó;Ð?RÓRà*/˜Ùðò #Ø#Ÿ™¨Ó-�BØ $§
¡
ò :˜Ø%Ÿ>™>¨$Ó/°2Ó5Ø79Ð.¨tÒ4ñ:ð:ñ$ &Øà.×4Ñ4Ó6ò 2‘��bÙ! $¨¨bÕ1ð2ð/ ð6 ×0Ó0Ü�L‰LÐBÔCØ'<Ð>QÐ&RÐ#Ø5×;Ñ;¼CÀ×@TÑ@TÓ<UÓVˆOØ.0Ð Ø!1×!7Ñ!7Ó!9ò 4‘��IØ%&Ð"Ø%ŸO™Oò 4�DØ—w‘w /Ó1Ü'¨¯©Ô4Ü"0Ø"@ÄÀdÇkÁkÓARÐ@SÐ Tó#ð ô /¨t¯{©{Ó;À?ÑRØ.°!Ñ3Ð.ä/°·±Ó<Ø#×EÑEòFð /°!Ñ3Ñ.ð4ð &¨Ó*Ø(×/Ñ/°Õ3ð!4ð" +ò )�Ø$ RÑ(ð)ô 	�‰Ð+Ô,Ø-×3Ñ3Ó5ò 	‰MˆB�	Ü�L‰LØ# RÀ	ÇÁÖ)P¸¨$¯)«)Ò)Põð	ð (8×'>Ñ'>Ó'@ö
Ø#ÀIÇNÁNÓDTÐWXÓDXŠIò
ð 	
ùò *Qùò
s   ÒS+ÓS0Ó$S0Ú
partitionsÚprefixc                 ó–   — t         j                  d«       t        | j                  |D �cg c]  }|j                  ‘Œ c}|¬«      S c c}w )NzFusing partitions...©r�   )r~   r   r	   r4   r   )r   rœ   r�   r•   s       r   Úfuse_partitionsz*CapabilityBasedPartitioner.fuse_partitionsd  s?   € ô 	�‰Ð+Ô,ä!Ø×ÑØ.8Ö9 ˆY�_‹_Ò9Øô
ð 	
ùâ9s   ªA
c                 óp  ‡‡‡‡‡	‡
— t        | j                  «      Šdt        dt        fˆfd„Ši Š	i Š
dt        dt         t           dt         t           dt        fˆˆˆ	fd„Šdt        dt         t           dt         t           dt        fˆˆˆ
fd„Š|D ]¤  }t        «       }|j                  D ]W  } ‰|«      sŒ ‰|t        |j                  «      |«      s ‰|t        |j                  «      |«      sŒG|j                  |«       ŒY t        |«      dk7  sŒ‚|D ]  }|j                  j                  |d «       Œ  Œ¦ y )	Nr#   r   c                 óT   •— | j                   dk(  xr t        | j                  «      ‰v S )Nr{   )rˆ   r   r‰   )r#   rE   s    €r   Úis_non_compute_nodezVCapabilityBasedPartitioner.remove_bookend_non_compute_ops.<locals>.is_non_compute_nodes  s+   ø€ à—‘˜?Ñ*ò HÜ'¨¯©Ó4¸ÐGðr   r•   Úremoved_nodesc                 ó²   •— | j                   dk(  s| |vs| |v ry| ‰v r‰|    S  ‰| «      r(| j                  D ]  } ‰|||«      rŒd‰| <    y d‰| <   yd‰| <   y©NÚplaceholderTF)rˆ   Úall_input_nodes)r#   r•   r¤   Úinput_nr£   Úis_transparent_input_nodeÚtransparent_input_nodess       €€€r   rª   z\CapabilityBasedPartitioner.remove_bookend_non_compute_ops.<locals>.is_transparent_input_node}  s�   ø€ ð —‘˜=Ò(Ø 	Ñ)Ø˜MÑ)àØÐ.Ñ.Ø.¨tÑ4Ð4Ù" 4Ô(Ø#×3Ñ3ò %�GÙ4°W¸iÈÕWØ8=Ð/°Ñ5Ù$ð%ð 15Ð'¨Ñ-ØØ,1Ð# DÑ)Ør   c                 ó²   •— | j                   dk(  s| |vs| |v ry| ‰v r‰|    S  ‰| «      r(| j                  D ]  } ‰|||«      rŒd‰| <    y d‰| <   yd‰| <   yr¦   )rˆ   r<   )r#   r•   r¤   Úoutput_nr£   Úis_transparent_output_nodeÚtransparent_output_nodess       €€€r   r®   z]CapabilityBasedPartitioner.remove_bookend_non_compute_ops.<locals>.is_transparent_output_node’  s�   ø€ ð —‘˜=Ò(Ø 	Ñ)Ø˜MÑ)àØÐ/Ñ/Ø/°Ñ5Ð5Ù" 4Ô(Ø $§
¡
ò %�HÙ5Ø  )¨]õð :?Ð0°Ñ6Ù$ð%ð 26Ð(¨Ñ.ØØ-2Ð$ TÑ*Ør   r   )r8   rE   r   ri   r   r=   r   rv   )r   rœ   r•   r*   r#   r£   rª   r®   rE   r«   r¯   s        @@@@@@r   Úremove_bookend_non_compute_opsz9CapabilityBasedPartitioner.remove_bookend_non_compute_opsp  s0  ý€ Ü˜d×2Ñ2Ó3ˆð	¤dð 	¬tõ 	ð 57ÐØ57Ð ð	Üð	Ü#&¤t¡9ð	Ü=@Ä¹Yð	ä÷	ð*	Üð	Ü#&¤t¡9ð	Ü=@Ä¹Yð	ä÷	ð. $ò 	4ˆIô &)£UˆKØ!Ÿ™ò *�Ù& tÕ,Ù-¨d´C¸	¿¹Ó4HÈ+ÔVÙ1Øœc )§/¡/Ó2°Kõð  —O‘O DÕ)ð*ô �;Ó 1Ó$Ø'ò 4�DØ—O‘O×'Ñ'¨¨dÕ3ñ4ñ	4r   c                 óL   — | j                  «       }| j                  ||¬«      }|S )NrŸ   )r›   r    )r   r�   rœ   Úfused_gms       r   Úpartition_and_fusez-CapabilityBasedPartitioner.partition_and_fuse»  s*   € Ø×,Ñ,Ó.ˆ
Ø×'Ñ'¨
¸6Ð'ÓBˆØˆr   )FNNF)Úfused_)r-   r.   r/   r   r   ri   r   r   r   r   rM   r   r   r›   r    r°   r³   r1   r   r   rB   rB   A   sî   „ ð
 .3Ø04ØBFØ',ñAà!ðAð .ðAð '+ð	Að
 " #™¨Ñ-ðAð ,4°C©=¸4Ñ+?ðAð !%ðAð 
óAð*
 tð 
°ó 
ð
F
 D¨¡Oó F
ðR :Bñ	
Ø˜y™/ð	
Ø36ð	
à	ó	
ðI4¸¸i¹ð I4ÈTó I4ñV¨ð ¸Kô r   rB   )r6   rR   Úloggingr„   Úcollections.abcr   r   Útorch.fx.graph_moduler   Útorch.fx.noder   r   Ú torch.fx.passes.operator_supportr   Ú!torch.fx.passes.utils.fuser_utilsr	   Ú	getLoggerr-   r~   ÚsetLevelÚWARNINGr   r3   rB   r1   r   r   ú<module>r¾      se   ðÛ Û Û Û ß .å -ß 3Ý @Ý @ð 
ˆ×	Ñ	˜8Ó	$€Ø ‡��—‘Ô  ÷ñ ÷D&ñ &÷}ò }r   