Ë
    ÄÓ^jàF  ã                   ó   — d dl Z d dlZd dlZd dlmZ d dlmZmZ d dlm	Z	 d dl
Z
d dlmZmZ d dlmZ ddgZd	ej"                  fd
„Z e«       Z ed¬«      e G d„ d«      «       «       Z ed¬«       G d„ d«      «       Zy)é    N)Údefaultdict)Ú	dataclassÚfield)ÚAny)ÚGraphÚNode)ÚcompatibilityÚSubgraphMatcherÚInternalMatchÚreturnc                  ó|  — t        j                  t        «      } t        j                  j                  dd«      j                  «       }| j                  |«       t        j                  «       }t        j                  d«      }|j                  |«       |j                  |«       | j                  |«       d| _        | S )NÚPYTORCH_MATCHER_LOGLEVELÚWARNINGz%(filename)s > %(message)sF)ÚloggingÚ	getLoggerÚ__name__ÚosÚenvironÚgetÚupperÚsetLevelÚStreamHandlerÚ	FormatterÚsetFormatterÚ
addHandlerÚ	propagate)ÚloggerÚlevelÚconsoleÚ	formatters       ún/var/www/ramen.bs-engineer-server.com/venv/lib/python3.12/site-packages/torch/fx/passes/utils/matcher_utils.pyÚ_init_loggerr"      s’   € Ü×ÑœxÓ(€Fä�J‰J�N‰NÐ5°yÓA×GÑGÓI€EØ
‡O�O�EÔÜ×#Ñ#Ó%€GÜ×!Ñ!Ð">Ó?€IØ×Ñ˜Ô#Ø×Ñ�UÔà
×Ñ�gÔØ€FÔØ€Mó    F)Úis_backward_compatiblec                   ó¶   — e Zd ZU ee   ed<    ee¬«      Zeeef   ed<    ee¬«      Z	ee   ed<    ee¬«      Z
ee   ed<    ee¬«      Zeeef   ed<   d	d„Zy)
r   Úanchors)Údefault_factoryÚ	nodes_mapÚplaceholder_nodesÚreturning_nodesÚname_node_mapc                 óÄ   — t        | j                  | j                  j                  «       | j                  j                  «       | j
                  j                  «       ¬«      S )N)r&   r(   r)   r*   )r   r&   r(   Úcopyr)   r*   )Úselfs    r!   Ú__copy__zInternalMatch.__copy__5   sJ   € ÜØ—L‘LØ—n‘n×)Ñ)Ó+Ø"×4Ñ4×9Ñ9Ó;Ø ×0Ñ0×5Ñ5Ó7ô	
ð 	
r#   N)r   r   )r   Ú
__module__Ú__qualname__Úlistr   Ú__annotations__r   Údictr(   r)   r*   r+   Ústrr/   © r#   r!   r   r   #   so   … ð �$‰ZÓá"'¸Ô"=€Iˆt�D˜$�JÑÓ=ñ %*¸$Ô$?Ð�t˜D‘zÓ?ñ #(¸Ô"=€O�T˜$‘ZÓ=ñ &+¸4Ô%@€M�4˜˜T˜	‘?Ó@ô
r#   c                   óî   — e Zd Z	 	 	 	 ddedededededdfd„Zd	ed
edefd„Zdd	ed
ededefd„Z	de
eef   defd„Zdee   dee   fd„Zd	ed
ededefd„Z	 dd	ed
edededef
d„Zddededee   fd„Zy)r
   ÚpatternÚmatch_outputÚmatch_placeholderÚremove_overlapping_matchesÚignore_literalsr   Nc                 ó°  — || _         || _        || _        || _        || _        t        |j                  «      dk(  rt        d«      ‚|j                  D ]F  }|j                  dk7  sŒ|j                  «       rŒ$t        |j                  «      dk(  sŒ=t        d«      ‚ |j                  D �cg c]  }|j                  dk(  sŒ|‘Œ c}| _        t        t        t        |j                  «      «      «      }|j                   | _        g | _        |r	|g| _        y|j                   D �cg c]  }t        |j                  «      dk(  sŒ|‘Œ c}| _        yc c}w c c}w )añ  
        Args:
            pattern: the targeted matching pattern, represented in fx.Graph.
            match_output: If True, output node in the pattern graph will be treated as a part of the targeted pattern.
                If False, output node is ignored during match.
            match_placeholder: If True, placeholder node in the pattern graph will be treated as a part of
                the targeted pattern. If False, placeholder nodes will be used a wildcard.
            remove_overlapping_matches: If True, in the case of overlapping matches, only the first match
                will be returned.
            ignore_literals: If True, will not check if literals are equal and
                will instead treat them as wildcards.
        r   z;SubgraphMatcher cannot be initialized with an empty patternÚoutputzDSubgraphMatcher cannot be initialized with an pattern with dead codeÚplaceholderé   N)r8   r9   r:   r;   r<   ÚlenÚnodesÚ
ValueErrorÚopÚ	is_impureÚusersÚAssertionErrorÚpattern_placeholder_nodesÚnextÚiterÚreversedÚall_input_nodesÚpattern_returning_nodesÚpattern_anchors)	r.   r8   r9   r:   r;   r<   ÚnodeÚnÚoutput_nodes	            r!   Ú__init__zSubgraphMatcher.__init__@   s5  € ð* ˆŒØ(ˆÔØ!2ˆÔØ*DˆÔ'Ø.ˆÔäˆw�}‰}Ó Ò"ÜØMóð ð —M‘Mò 	ˆDØ�w‰w˜(Ó"¨4¯>©>Õ+;Ü�t—z‘z“? aÓ'Ü(Ø^óð ð	ð —}‘}ö*
Ø¨¯©°Ó(=ŠAò*
ˆÔ&ô œ4¤¨¯©Ó 7Ó8Ó9ˆà3>×3NÑ3NˆÔ$à+-ˆÔÙØ$/ =ˆDÕ ð
 '×6Ñ6ö$Ø¼#¸a¿g¹g»,È!Ó:K’ò$ˆDÕ ùò*
ùò$s   Â*EÂ?EÄ#EÅEÚpnÚgnc                 ó&  — t        |j                  t        «      st        d|j                  › d�«      ‚t        |j                  t        «      st        d|j                  › d�«      ‚|j                  j
                  €t        d«      ‚|j                  j
                  €t        d«      ‚t        j                  j                  j                  |j                  j
                  |j                  «      }t        j                  j                  j                  |j                  j
                  |j                  «      }t        |«      t        |«      uryt        |t        j                  «      rt        |t        j                  «      S t        d|› d�«      ‚)	Nz
pn.target z must be a string.z
gn.target z'pn.graph.owning_module must not be Nonez'gn.graph.owning_module must not be NoneFzUnsupported type z when matching attributes)Ú
isinstanceÚtargetr5   rG   ÚgraphÚowning_moduleÚtorchÚfxÚgraph_moduleÚ	_get_attrÚtypeÚTensorÚRuntimeError)r.   rS   rT   Úpn_valueÚgn_values        r!   Ú_match_attributesz!SubgraphMatcher._match_attributesz   s&  € ä˜"Ÿ)™)¤SÔ)Ü  :¨b¯i©i¨[Ð8JÐ!KÓLÐLÜ˜"Ÿ)™)¤SÔ)Ü  :¨b¯i©i¨[Ð8JÐ!KÓLÐLà�8‰8×!Ñ!Ð)Ü Ð!JÓKÐKØ�8‰8×!Ñ!Ð)Ü Ð!JÓKÐKÜ—8‘8×(Ñ(×2Ñ2°2·8±8×3IÑ3IÈ2Ï9É9ÓUˆÜ—8‘8×(Ñ(×2Ñ2°2·8±8×3IÑ3IÈ2Ï9É9ÓUˆä�‹>¤ h£Ñ/Øô �h¤§¡Ô-Ü˜h¬¯©Ó5Ð5äÐ!2°8°*Ð<UÐVÓWÐWr#   Únode_name_matchc                 óB  — | j                   s|j                  dk(  ry|r||j                  v ry|j                  |j                  k(  rY|j                  dk(  s|j                  dk(  ry|j                  dk(  r| j                  ||«      S |j                  |j                  k(  S y)Nr?   Tr>   Úget_attrF)r:   rD   Únamerc   rW   )r.   rS   rT   rd   s       r!   Ú_nodes_are_equalz SubgraphMatcher._nodes_are_equal“   sˆ   € à×%Ò%¨"¯%©%°=Ò*@Øá˜°"·'±'Ñ9Øà�5‰5�B—E‘EŠ>Ø�u‰u˜Ò%¨¯©°(Ò):ØØ—‘˜*Ò$Ø×-Ñ-¨b°"Ó5Ð5Ø—9‘9 §	¡	Ñ)Ð)Ør#   r(   c                 óô   — |j                  «       D ��ci c]  \  }}|j                  dk7  sŒ||“Œ }}}|j                  «       D ],  \  }}|| j                  v rŒ|j                  D ]	  }||vsŒ  y Œ. yc c}}w )Nr?   FT)ÚitemsrD   rM   rF   )r.   r(   rS   rT   ÚlookupÚusers         r!   Ú_is_containedzSubgraphMatcher._is_contained£   sŽ   € ð "+§¡Ó!2÷$
Ù�r˜2°b·e±e¸}Ó6LˆB�‰Fð$
ˆñ $
ð —l‘l“nò 		!‰FˆB�à�T×1Ñ1Ñ1ØàŸ™ò !�ð ˜vÒ%Ú ñ	!ð		!ð ùó$
s
   ”A4¬A4Úmatchesc                 óN  — g }t        «       }|D ]“  }d}|j                  j                  «       D ]  \  }}|j                  dvsŒ||v sŒd} n |rŒA|j	                  |«       |j                  j                  «       D ]%  \  }}|j                  dvsŒ|j                  |«       Œ' Œ• |S )NF>   r>   r?   T)Úsetr(   rj   rD   ÚappendÚadd)r.   rn   Únon_overlapping_matchesÚnodes_matchedÚmatchÚfound_overlaprS   rT   s           r!   Ú_remove_overlapping_matchesz+SubgraphMatcher._remove_overlapping_matches¸   s·   € ð 8:ÐÜ#&£5ˆàò 	.ˆEØ!ˆMØŸ/™/×/Ñ/Ó1ò ‘��BØ—5‘5Ð 9Ò9¸bÀMÒ>QØ$(�MÙðò
 !Ø'×.Ñ.¨uÔ5Ø#Ÿo™o×3Ñ3Ó5ò .‘F�B˜Ø—u‘uÐ$=Ò=Ø%×)Ñ)¨"Õ-ñ.ð	.ð 'Ð&r#   ru   c                 ó”  — t        |t        «      rt        |t        «      rt        d«      ‚t        |t        «      rPt        |t        «      s@|j                  dk(  r0||j                  v r|j                  |   |k(  S ||j                  |<   yyt        |t        «      st        |t        «      ryt        |«      t        |«      u xr ||k(  S )Nzpn and gn cannot both be Noder?   TF)rV   r   rG   rD   r(   r^   )r.   rS   rT   ru   s       r!   Ú_match_literalszSubgraphMatcher._match_literalsÌ   s¨   € Ü�bœ$Ô¤J¨r´4Ô$8Ü Ð!@ÓAÐAä�bœ$Ô¬
°2´tÔ(<Ø�u‰u˜Ò%ð ˜Ÿ™Ñ(Ø Ÿ?™?¨2Ñ.°"Ñ4Ð4à&(�—‘ Ñ#ØàÜ˜B¤Ô%¬*°R¼Ô*>Øä˜“8œt B›xÐ'Ò4¨B°"©HÐ4r#   c                 ó*  ‡ ‡‡
‡— t         j                  d||«       t        |t        «      rt        |t        «      st	        d|› d|› �«      ‚|‰j
                  v r‰j
                  |   |k(  S |‰j
                  j                  «       v ry‰ j                  |||«      syt        j                  ‰«      }|‰j
                  |<   |j                  dk(  ryd}dt        t           t        t        df   z  d	t        t           t        t        df   z  d
t        fˆ
ˆˆ fd„Š
d }d }t        |j                  «      t        |j                  «      k7  sGt        |j                   j#                  «       «      t        |j                   j#                  «       «      k7  rÎ|j                  dk(  r¿t        |j$                  t&        j(                  j*                  «      r‘|j$                  j,                  j.                  Šdt        t        df   dt0        t2        t        f   d
t        t           fˆfd„}	 |	|j                  |j                   «      } |	|j                  |j                   «      }�nt        |j                  «      t        |j                  «      k(  rÖt        |j                   j#                  «       «      t        |j                   j#                  «       «      k(  r�t        |j                  «      }t        |j                  «      }|j5                  t        |j                   j                  «       «      «       |j5                  t        |j                   j                  «       «      «       nd}|xr |d uxr |d uxr	  ‰
||«      }|st        j                  |«      Šyy)Nz  matching %s to %szpn and gn must be Node, pn: z, gn: Fr?   TÚargs1.Úargs2r   c                 ó|  •— t        | «      t        |«      k7  ryt        | |«      D ]”  \  }}t        |t        «      r$t        |t        «      r‰j	                  ||‰«      }nWt        |t
        t        f«      r t        |t
        t        f«      r
 ‰||«      }n!‰j                  ||‰«      xs ‰j                  }|rŒ” y y)NFT)	rA   ÚziprV   r   Ú_match_nodesr2   Útuplery   r<   )r{   r|   Úa1Úa2ÚmatchedÚ_match_argsru   r.   s        €€€r!   r„   z1SubgraphMatcher._match_nodes.<locals>._match_args  s±   ø€ ô �5‹zœS ›ZÒ'Øä˜e UÓ+ò !‘��BÜ˜b¤$Ô'¬J°r¼4Ô,@Ø"×/Ñ/°°B¸Ó>‘GÜ ¤T¬5 MÔ2´zÀ"ÄtÌUÀmÔ7TÙ)¨"¨bÓ1‘Gð ×,Ñ,¨R°°UÓ;ÒS¸t×?SÑ?Sð ò Ù ð!ð r#   Úcall_functionÚ	orig_argsÚorig_kwargsc                 ó   •— g }t        ‰«      D ]|  \  }}|j                  |v r|j                  ||j                     «       Œ3|j                  s#|t	        | «      k  r|j                  | |   «       Œb|j                  |j
                  «       Œ~ |S )N)Ú	enumeraterg   rq   Ú
kwarg_onlyrA   Údefault_value)r†   r‡   Úall_argsÚiÚschemaÚargs_schemas        €r!   Úget_all_argumentsz7SubgraphMatcher._match_nodes.<locals>.get_all_arguments#  s€   ø€ ð �Ü!*¨;Ó!7ò >‘I�A�vØ—{‘{ kÑ1Ø Ÿ™¨°F·K±KÑ(@ÕAØ#×.Ò.°1´s¸9³~Ò3EØ Ÿ™¨	°!©Õ5à Ÿ™¨×(<Ñ(<Õ=ð>ð  �r#   )r   ÚinforV   r   rG   r(   Úvaluesrh   r-   rD   r2   r   r€   ÚboolrA   ÚargsÚkwargsÚkeysrW   rZ   Ú_opsÚ
OpOverloadÚ_schemaÚ	argumentsr4   r5   Úextend)r.   rS   rT   ru   rd   Úsaved_matchÚmatch_foundÚpn_argsÚgn_argsr�   r„   r�   s   `  `      @@r!   r   zSubgraphMatcher._match_nodesà   sÚ  û€ ô 	�‰Ð)¨2¨rÔ2ä˜2œtÔ$¬°B¼Ô)=Ü Ð#?À¸tÀ6È"ÈÐ!NÓOÐOð �—‘Ñ Ø—?‘? 2Ñ&¨"Ñ,Ð,ð �—‘×'Ñ'Ó)Ñ)Øà×$Ñ$ R¨¨_Ô=Øô —i‘i Ó&ˆØ ˆ�‰˜Ñð �5‰5�MÒ!Øð ˆð	Üœ‘9œu¤S¨# X™Ñ.ð	Ü7;¼C±yÄ5ÌÈcÈÁ?Ñ7Rð	ä÷	ð, %)ˆØ$(ˆô �B—G‘G“¤ B§G¡G£Ò,Ü˜Ÿ	™	Ÿ™Ó(Ó)¬T°"·)±)·.±.Ó2BÓ-CÒCà—‘˜Ò(Ü˜2Ÿ9™9¤e§j¡j×&;Ñ&;Ô<àŸ)™)×+Ñ+×5Ñ5ˆKð Ü ¤ c ™?ð Ü9=¼cÄ3¸h¹ð ä”c‘õ ñ (¨¯©°·±Ó;ˆGÙ'¨¯©°·±Ó;ŠGä�—‘‹\œS §¡›\Ò)¬d°2·9±9·>±>Ó3CÓ.DÌØ�I‰I�N‰NÓóI
ò /
ô ˜2Ÿ7™7“mˆGÜ˜2Ÿ7™7“mˆGØ�N‰Nœ4 §	¡	× 0Ñ 0Ó 2Ó3Ô4Ø�N‰Nœ4 §	¡	× 0Ñ 0Ó 2Ó3Õ4àˆKð ò .Ø˜tÐ#ò.à˜tÐ#ò.ñ ˜G WÓ-ð	 	ñ ä—I‘I˜kÓ*ˆEØàr#   rX   c                 ó„  ‡ ‡‡‡‡— ddl m} t        t        «      }‰ j                  D ];  }|j
                  D ]*  }‰ j                  ||‰«      sŒ||   j                  |«       Œ, Œ= t        |j                  «       «      Št        j                  d‰«       g Šdt        dt        ddfˆˆˆˆˆ fd„Št        ‰ j                  ¬	«      }‰r	 ‰d|«       t        ‰«      }‰D �cg c]   }‰ j                  |j                  «      sŒ|‘Œ" c}Št        ‰«      }	||	k7  rt        j                  d
||	z
  «       g }
‰D ]V  }|j                  j                  «       D ��cg c]  \  }}|j                   dvr|‘Œ }}} ||«      sŒF|
j                  |«       ŒX t        |
«      t        ‰«      k7  r+t        j                  dt        ‰«      t        |
«      z
  «       ‰ j"                  rEt        |
«      }‰ j%                  |
«      Št        ‰«      }	||	k7  rt        j                  d||	z
  «       t        j                  d‰«       ‰S c c}w c c}}w )aß  
        Returns:
            The matched subgraphs.
            The returned subgraph would be fully self-contained, meaning the nodes (except placeholder
            and nodes returned by output) can only be consumed by nodes within the matched subgraph.

        Subgraph pattern matcher is implemented with the backtracking style in the following steps:

        1. We first identify all the anchor nodes in the pattern graph. The anchor nodes
        are the "sinks" (nodes with no user other than the output node) of the pattern graph.
        One pattern graph could have multiple anchors if it has multiple return values.

        2. In the target graph, we identify the potential candidate nodes that can be matched
        with each anchor. These anchor-candidate pairs are the starting points for
        pairwise per-node matching.

        3. For each anchor-candidate pair, we simultaneously traverse backwards (DFS) in both
        pattern and target graphs. For every pattern nodes along traversal path, we compare it
        against the target nodes. In case any comparison failed, the match for this anchor-candidate
        pair fails. A match is found when DFS completes traversing the graph. See `self._match_nodes`
        for more details.

        4. In the case of multiple anchors, every anchor will need to find a match using step 3.
        In addition, the matches found between anchors need to have a common intersection node
        in order for the match to be valid. This is implemented with backtracking. See `backtracking`
        for more details.

        Notice: graph traversal must be done in the reverse order because a tensor can have multiple
        consumers, but can only have a single producer. Only with reverse order can we jointly
        traverse the pattern and target graph in a deterministic path.

        Warning: In theory, this backtracking algorithm have an **exponential** time complexity. However,
        in practice, it's unlikely to blow up.

        r   )Úvalidate_partitionz"Initial match_candidates_list: %s
Úanchor_indexru   r   Nc                 óJ  •— | t        ‰	«      k(  r€‰j                  D �cg c]  }|j                  |   ‘Œ c}|_        ‰j                  D �cg c]  }|j                  |   ‘Œ c}|_        ‰
j                  |«       t        j                  d|«       y ‰	|    \  }}t        j                  |«      }|D ]h  }t        j                  d||«       ‰j                  |||‰«      }|r ‰| dz   |«       nt        j                  d||«       t        j                  |«      }Œj y c c}w c c}w )NzFound a match: %s
zTrying to match anchor %s to %sr@   z Failed to match anchor %s to %s
)rA   rH   r(   r)   rM   r*   rq   r   r‘   r-   r   )r¢   ru   rS   Úpattern_anchorÚcandidate_nodesrœ   rO   r�   ÚbacktrackingÚmatch_candidates_listrn   rd   r.   s           €€€€€r!   r¦   z+SubgraphMatcher.match.<locals>.backtracking}  s  ø€ ØœsÐ#8Ó9Ò9à26×2PÑ2Pö+Ø,.�E—O‘O BÓ'ò+�Ô'ð 37×2NÑ2Nö)Ø,.�E—O‘O BÓ'ò)�Ô%ð —‘˜uÔ%ä—‘Ð1°5Ô9Øà.CÀLÑ.QÑ+ˆN˜OÜŸ)™) EÓ*ˆKà'ò /�Ü—‘Ð=¸~ÈtÔTà"×/Ñ/Ø" D¨%°ó�ñ á  °Ñ!1°5Õ9ä—K‘KØ;¸^ÈTôô
 Ÿ	™	 +Ó.‘ñ/ùò+ùò)s   žDÁ
D )r&   z<Filtered out %s matches because they are not fully contained>   r>   r?   zfFiltered out %s matches because                           matched subgraph would form a cycle if fusedzAFiltered out %s matches because matched subgraphs are overlappingzMatches returned: %s)Ú!torch.fx.passes.utils.fuser_utilsr¡   r   r2   rN   rB   rh   rq   rj   r   r‘   Úintr   rA   rm   r(   rD   r;   rw   )r.   rX   rd   r¡   Úmatch_candidatesr¤   rO   ru   ÚbeforeÚafterÚvalid_matchesrS   rT   Úmatched_compute_nodesr¦   r§   rn   s   ` `           @@@r!   ru   zSubgraphMatcher.matchK  s5  ü€ õH 	Iô 4?¼tÓ3DÐØ"×2Ñ2ò 	BˆNØŸ™ò B�Ø×(Ñ(¨¸¸ÕOØ$ ^Ñ4×;Ñ;¸DÕAñBð	Bô !%Ð%5×%;Ñ%;Ó%=Ó >Ðä�‰Ð9Ð;PÔQà')ˆð	/¤sð 	/´=ð 	/ÀT÷ 	/ñ 	/ôB  d×&:Ñ&:Ô;ˆÙ Ù˜˜EÔ"ô �W“ˆØ&-ÖU˜U°×1CÑ1CÀEÇOÁOÕ1T’5ÒUˆÜ�G“ˆØ�UŠ?Ü�K‰KØNØ˜‘ôð .0ˆØò 	,ˆEð $Ÿo™o×3Ñ3Ó5÷%á�B˜Ø—5‘5Ð 9Ñ9ò ð%Ð!ñ %ñ
 "Ð"7Õ8Ø×$Ñ$ UÕ+ð	,ô ˆ}Ó¤ W£Ò-Ü�K‰KðHä�G“œs =Ó1Ñ1ôð ×*Ò*Ü˜Ó'ˆFØ×6Ñ6°}ÓEˆGÜ˜“LˆEØ˜ŠÜ—‘ØWØ˜U‘Nôô
 	�‰Ð*¨GÔ4àˆùòK Vùó%s   Ã H7Ã?H7ÅH<)FFTF)Ú )r   r0   r1   r   r“   rR   r   rc   r5   rh   r4   rm   r2   r   rw   r   ry   r   ru   r6   r#   r!   r
   r
   >   sF  „ ð
 #Ø"'Ø+/Ø %ñ8àð8ð ð8ð  ð	8ð
 %)ð8ð ð8ð 
ó8ðt Dð ¨dð °tó ñ2 4ð ¨Tð ÀCð ÐQUó ð  t¨D°$¨JÑ'7ð ¸Dó ð*'Ø˜MÑ*ð'à	ˆmÑ	ó'ð(5 #ð 5¨3ð 5°}ð 5Èó 5ð* PRñiØðiØ ðiØ)6ðiØILðià	óiñV~˜5ð ~°3ð ~ÀÀ]Ñ@Sô ~r#   )r-   r   r   Úcollectionsr   Údataclassesr   r   Útypingr   rZ   Útorch.fxr   r   Útorch.fx._compatibilityr	   Ú__all__ÚLoggerr"   r   r   r
   r6   r#   r!   ú<module>r·      sŒ   ðÛ Û Û 	Ý #ß (Ý ã ß  Ý 1ð ˜oÐ
.€ð�g—n‘nó ñ 
‹€ñ  eÔ,Ø
÷
ð 
ó ó -ð
ñ2  eÔ,÷Jð Jó -ñJr#   