ó
    Eñi­H  ã                   óÚ  • S SK r S SKJr  S SKrS SKJr  S SKJs  J	r
  S SKJs  Jr  S SKJr  S SKJr  S SKJrJrJr  S SKJrJr  S SKJr  S SKJrJrJr  S S	KJr  S S
K J!r!  \RD                  RF                  r#S/r$\ RJ                  S 5       r&S\'\!S4   S\(S\(4S jr)S\'\!S4   S\S\4S jr*S\RV                  RX                  S\'\-S4   S\.\/\-4   S\4S jr0S r1S\RV                  RX                  S\'\-S4   S\.\/\-4   S\-4S jr2S\RV                  RX                  S\'\-S4   S\.\/\-4   S\-4S jr3S\S\S\S-  S\S-  S\(S \(S!\Rh                  S"\(S\S#\(S\'\\4   4S$ jr5S\RV                  RX                  S\'\-S4   S\.\/\-4   S\-4S% jr6S&\S\S\S\S-  S\(S \(S'\S!\Rh                  S"\(S\S#\(S\4S( jr7S\RV                  RX                  S\'\-S4   S\.\/\-4   S\-4S) jr8\#Rb                  Rr                  \2\#Rt                  Rr                  \3\#Rv                  Rr                  \6\#Rx                  Rr                  \6\#Rz                  Rr                  \8\#R|                  Rr                  \80r?S* r@S+ rAg),é    N)Úcast)ÚTensor)Ú
DeviceMesh)ÚDTensorÚ	ReplicateÚShard)ÚDTensorSpecÚ
TensorMeta)Ú_MaskPartial)Ú	_skip_dimÚ	ReductionÚreplicate_reduction_dims)Únormalize_dim)Ú	PlacementÚloss_parallelc               #   ó<   #   • [        5         Sv •  [        5         g7f)aü  
A context manager that enables loss parallelism, where efficient parallelized loss computation
can be performed when the input is sharded on the class dimension. Currently only the cross-entropy
loss is supported.

Within this context manager, one can use :func:`~torch.nn.functional.cross_entropy` or
:class:`~torch.nn.CrossEntropyLoss` as usual, with the following assumptions on the input parameters.
The corresponding ``backward()`` call, if any, also needs to happen under this context manager.

Args:
    input (:class:`DTensor`):
        Input logits. Assumed to be sharded on the class dimension.
    target (Union[:class:`torch.Tensor`, :class:`DTensor`]):
        Must be ground truth class indices (class probabilities currently not supported).
        Assumed to be replicated across the ``DeviceMesh``.
    weight (Union[:class:`torch.Tensor`, :class:`DTensor`], optional):
        If given, assumed to be replicated across the ``DeviceMesh``.
    label_smoothing:
        Currently not supported.

Returns:
    A replicated :class:`DTensor`.

Example:
    A sharded DTensor is manually created here to showcase the usage.
    In practice, it is usually the output of a TP module.

    >>> # xdoctest: +SKIP("distributed")
    >>> from torch.distributed.tensor.parallel import loss_parallel
    >>> from torch.distributed.device_mesh import init_device_mesh
    >>> ...
    >>> device_mesh = init_device_mesh("cuda", (8,))
    >>> input = torch.randn(4, 16, device="cuda", requires_grad=True)
    >>> dist_input = distribute_tensor(input, device_mesh, placements=[Shard(1)])
    >>> target = torch.randint(16, (4,), device="cuda")
    >>> with loss_parallel():
    >>>     loss = F.cross_entropy(dist_input, target, reduction="mean")
    >>>     loss.backward()
    >>> ...
N)Ú_enable_custom_loss_opsÚ_disable_custom_loss_ops© ó    Úc/home/mande/repo/quber/.venv/lib/python3.13/site-packages/torch/distributed/tensor/parallel/loss.pyr   r      s   é € ôT Ôã	äÕùs   ‚Ú
placements.ÚdimÚreturnc                 óˆ   • [        U 5      S:X  d  [        S5      eU S   R                  U5      (       d  [        SU S35      eg)Né   zLCurrently loss_parallel() only supports input on one-dimensional DeviceMesh.r   zUloss_parallel() should be enabled only when the input tensor is sharded on dimension Ú.)ÚlenÚ
ValueErrorÚis_shard)r   r   s     r   Ú_find_all_reduce_mesh_dimr!   Q   sV   € Üˆz‹?˜aÓÜØZó
ð 	
ð �a‰=×!Ñ! #×&Ñ&ÜØcÐdgÐchÐhiÐjó
ð 	
ð r   Úmeshc                 ó   • [        U [        5      (       a.  U R                  U:X  a  U $ [        SU SU R                   S35      e[        U [        R
                  5      (       a  [        R                  " XUSS9$ [        S[        U 5       35      e)Nz	Expected z	 but got r   F)Údevice_meshr   Ú	run_checkzUnsupported type )	Ú
isinstancer   r   ÚRuntimeErrorÚtorchr   Ú
from_localÚ	TypeErrorÚtype)Útensorr   r"   s      r   Ú_cast_to_dtensorr-   ]   sŠ   € ô �&œ'×"Ñ"Ø×Ñ 
Ó*ØˆMä ¨:¨,°iÀ×@QÑ@QÐ?RÐRSÐTÓUÐUÜ	�FœEŸL™L×	)Ñ	)Ü×!Ò!Ø°Àuñ
ð 	
ô Ð+¬D°«L¨>Ð:Ó;Ð;r   Úop_callÚargsÚkwargsc                 ób  • [         R                  R                  XU5      nUR                  c   S5       e[         R                  R                  R                  UR                  5      n[        U[        5      (       a  U$ [        U[        5      (       a  US   $ [        S[        U5       S35      e)Nz9op_info.schema should not be None after unwrap_to_op_infor   zUnexpected tensor meta type: r   )r   Ú_op_dispatcherÚunwrap_to_op_infoÚschemaÚsharding_propagatorÚ_propagate_tensor_metar&   r
   Útupler'   r+   )r.   r/   r0   Úop_infoÚtensor_metas        r   r6   r6   m   s¢   € ô
 ×$Ñ$×6Ñ6°wÀfÓM€GØ�>‰>Ñ%ð ØCóÐ%ô ×(Ñ(×<Ñ<×SÑSØ�‰ó€Kô �+œz×*Ñ*ØÐÜ	�K¤×	'Ñ	'à˜1‰~ÐäÐ:¼4ÀÓ;LÐ:MÈQÐOÓPÐPr   c                 óê  • U(       a   U R                   [        R                  :X  d   e[        R                  " U [        R
                  R                  S9u  pVU R                  U[        R                  S9n U R                  5       S:X  a  U nOR[        R                  " XSS9n[        R                  " U[        R                  R                  R                   X44S9nX-
  n[        R"                  " [        R$                  " U5      USS9n	[        R                  " U	[        R                  R&                  R                   X44S9n	[        R(                  " U	5      n
Xz-
  nU(       d  UR                  U5      nU$ )N)Útype_promotion_kind)ÚdtypeÚmemory_formatr   T)Úkeepdim)ÚreduceOpÚgroup)r<   r(   ÚhalfÚutilsÚelementwise_dtypesÚELEMENTWISE_TYPE_PROMOTION_KINDÚDEFAULTÚtoÚcontiguous_formatÚnumelÚamaxÚfuncolÚ
all_reduceÚc10dÚReduceOpÚMAXÚnameÚsumÚexpÚSUMÚlog)Úxr   Úhalf_to_floatr"   Úmesh_dimÚcomputation_dtypeÚresult_dtypeÚshiftedÚx_maxÚshifted_sumexpÚshifted_logsumexpÚresults               r   Ú_log_softmaxr^   „   s$  € ÞØ�w‰wœ%Ÿ*™*Ó$Ð$Ð$Ü&+×&>Ò&>Ø	œu×DÑD×LÑLñ'Ñ#Ðð 	
�‰Ð$´E×4KÑ4KˆÐL€AØ‡w�wƒy�Aƒ~Ø‰ä—
’
˜1¨4Ñ0ˆÜ×!Ò!ØœDŸM™M×-Ñ-×2Ñ2¸4Ð:Jñ
ˆð ‘)ˆÜ—Y’YœuŸyšy¨Ó1°3ÀÑE€NÜ×&Ò&Ø¤§¡×!2Ñ!2×!7Ñ!7ÀÐ?Oñ€Nô Ÿ	š	 .Ó1ÐØÑ(€FÞØ—‘˜<Ó(ˆØ€Mr   c                 ó®  • [        [        US   5      n[        [        US   5      n[        [        US   5      nUR                  n[        XCR                  5       5      n[        UR                  U5      n[        XU5      n[        UR                  XEUR                  U5      n	[        UR                  UR                  US9n
[        U	U
U	R                  S9$ )Nr   r   é   ©r9   ©Úrequires_grad)r   r   ÚintÚboolÚ_specr   r   r!   r   r6   r^   Ú_local_tensorr"   r	   rc   )r.   r/   r0   rT   r   rU   ÚspecrV   Úoutput_tensor_metaÚresÚres_specs              r   Ú_log_softmax_handlerrl   ž   s»   € ô
 	ŒW�d˜1‘gÓ€AÜ
Œs�D˜‘GÓ
€CÜœ˜t A™wÓ'€Mà�7‰7€DÜ
˜ŸU™U›WÓ
%€CÜ(¨¯©¸#Ó>€Hä/°¸vÓFÐä
�q—‘¨¸D¿I¹IÀxÓ
P€CäØ�	‰	Ø�‰Ø&ñ€Hô àØà×'Ñ'ñð r   c                 ó„   • [        [        US   5      n[        [        R                  US   5      nUR	                  U5      $ )Nr   é   )r   r   r(   r<   rF   )r.   r/   r0   Úgrad_outputÚinput_dtypes        r   Ú_log_softmax_backward_handlerrq   Á   s7   € ô
 ”w  Q¡Ó(€KÜ”u—{‘{ D¨¡GÓ,€KØ�>‰>˜+Ó&Ð&r   rT   ÚtargetÚweightÚlocal_weightÚ	reductionÚignore_indexÚinput_shapeÚchannel_dimrV   c
                 óZ  ^^• U R                  5       mSmTS:  a  SmS[        S[        4UU4S jjn
Ub  U
" U5      nUc   eU
" U5      nX-  n [        R                  " X:g  US5      nUR	                  T5      n[        UTS9nUR                  XèU	5      n[        R                  " U TU5      nUR                  UX‰5      nUR                  T5      * n[        R                  " X:g  US5      nU[        R                  R                  :X  a  TS:”  a  U R                  SS	5      nUU4$ Ub}  [        U R                  5      nS
UT'   WR!                  U5      n[        R                  " UTU5      R                  T5      n[        R                  " X:g  US5      nUR#                  5       nO!X:g  R#                  5       R%                  U 5      nU[        R&                  R                  :X  a  UR#                  5       nUU4$ U[        R(                  R                  :X  a  UR#                  5       U-  nUU4$ )Nr   r`   r   rs   r   c                 ón   >• TS:”  a+  S/T-  nU R                   S   UT'   U R                  U5      nU$ U nU$ )Nr   r   )ÚshapeÚview)rs   r{   Úwrx   Ún_dimss      €€r   Ú_weight_viewÚ'_nll_loss_forward.<locals>._weight_viewÞ   sQ   ø€ Ø�A‹:àðàñˆEð "(§¡¨a¡ˆE�+ÑØ—‘˜EÓ"ˆAð ˆð ˆAØˆr   ©Úoffset_shapeÚ
offset_dimr   g        éÿÿÿÿ)r   r   r(   ÚwhereÚ	unsqueezer   Ú_partition_valueÚgatherÚ_reduce_valueÚsqueezer   ÚNONEÚvalueÚnew_fullÚlistr{   ÚexpandrP   rF   rR   ÚMEAN)rT   rr   rs   rt   ru   rv   rw   rx   r"   rV   r   r}   Úlocal_wÚsafe_targetÚsafe_target_Úpartial_placementÚsafe_target_partial_Úresult_partialÚresult_reducedr]   Útotal_weightÚ	new_shapeÚwsumr~   s          `               @r   Ú_nll_loss_forwardr›   Í   s  ù€ ð �U‰U‹W€FØ€KØ�ƒzØˆð	œVð 	¬÷ 	ð 	ð ÑÙ˜Ó ˆØÑ'Ð'Ð'Ù˜|Ó,ˆØ‰KˆÜ—+’+˜fÑ4°f¸aÓ@€KØ×(Ñ(¨Ó5€Lô %°+È+ÑVÐØ,×=Ñ=Ø˜HóÐô —\’\ ! [Ð2FÓG€Nà&×4Ñ4°^ÀTÓT€NØ×$Ñ$ [Ó1Ð1€Fä�[Š[˜Ñ/°¸Ó;€Fà”I—N‘N×(Ñ(Ó(¨V°a«ZØ—z‘z " cÓ*ˆØ�|Ð#Ð#àÑÜ˜Ÿ™“Mˆ	Ø!#ˆ	�+Ñà�H‰H�YÓˆÜ�|Š|˜A˜{¨LÓ9×AÑAÀ+ÓNˆÜ�{Š{˜6Ñ1°4¸Ó;ˆØ—x‘x“z‰àÑ.×3Ñ3Ó5×8Ñ8¸Ó;ˆð ”I—M‘M×'Ñ'Ó'Ø—‘“ˆð �<ÐÐð 
”i—n‘n×*Ñ*Ó	*Ø—‘“ Ñ,ˆà�<ÐÐr   c                 ó°  • [        [        US   5      nUS   nUS   n[        [        US   5      n[        [        US   5      nUR                  5       S:¼  a  SOSnUR                  n	[        U	R                  U5      n
[        [        U	R                  U/5      U5      n[        5       4U	R                  R                  -  n[        XKU	R                  5      nS nUb¯  [        X\U	R                  5      n[        U	R                  R                  5       Vs/ s H  oîU
:X  a  [        S5      O	[        5       PM     nnUR                  U	R                  U5      R                   nUR"                  S   UR                   R"                  U   :X  d   eU[$        R&                  R(                  :X  a  UnOUn[+        U5      nXEsUS'   US'   [-        U [/        U5      U5      n[1        UR                   UR                   Ub  UR                   OS UUUUR"                  UU	R                  U
5
      u  nn[3        U	R                  UUS9n[        UUUR4                  S9U4$ s  snf )Nr   r   r`   rn   é   ra   rb   )r   r   rd   r   rf   r!   r   r   r   r   r"   Úndimr-   Úranger   Úredistributerg   r{   r   r‹   rŒ   rŽ   r6   r7   r›   r	   rc   )r.   r/   r0   rT   rr   rs   ru   rv   rx   rh   rV   Útarget_placementsÚall_replicate_placementsrt   ÚiÚsharded_placementsÚoutput_placementsri   r]   r˜   Úout_specs                        r   Ú_nll_loss_forward_handlerr§     s7  € ô
 	ŒW�d˜1‘gÓ€AØ�!‰W€FØ�!‰W€FÜ”S˜$˜q™'Ó"€IÜœ˜T !™WÓ%€Là—u‘u“w !“|‘!¨€KØ�7‰7€DÜ(¨¯©¸+ÓF€Hô "Ü  §¡°;°-Ó@À+óÐô !*£˜~°·	±	·±Ñ>ÐÜ˜f¸¿¹ÓC€FØ€LØÑÜ! &ÀDÇIÁIÓNˆô
 AFÀdÇiÁiÇnÁnÔ@Uó
Ú@U¸1˜X›ŒE�!ŒH¬9«;Ò6Ñ@Uð 	ð 
ð ×*Ñ*¨4¯9©9Ð6HÓI×WÑWˆØ×!Ñ! !Ñ$¨¯©×(=Ñ(=¸kÑ(JÓJÐJÐJà”I—N‘N×(Ñ(Ó(Ø-Ñà4Ðô �‹:€DàÐ€Dˆ�GˆT�!‰WÜ/°¼¸t»ÀfÓMÐä,Ø	�‰Ø×ÑØ &Ñ 2ˆ×Ò¸ØØØØ	�‰ØØ�	‰	ØóÑ€FˆLô ˜4Ÿ9™9Ð&7ÐEWÑX€Hô 	àØà ×.Ñ.ñ	
ð 	ð
ð 
ùòA
s   Ä$Iro   r˜   c                 ó¨  • UR                  5       S:  a  SOSnU[        R                  R                  :X  a  X-  n UR	                  U5      n[
        R                  " X%:g  US5      n[
        R                  " U5      n[        XxS9nUR                  U5      R                  5       nUR                  X¹U
5      nUR                  R                  c   eUR                  R                  R                  UR                  5      S-
  n[
        R                   " UR"                  S   UR$                  S9nUR                  5       S:X  a  XüU'   O€UR                  5       S:X  a  XüUU4'   OeUR'                  US5      nUR"                  nUR)                  SUR"                  U   5      nUUUU4'   UR+                  U5      R'                  US5      nUR                  5       U R                  5       s=:”  a  S:”  a  O  OU R	                  U5      n Ub“  [-        UR                  5       5       Vs/ s H  nSPM     nnUR"                  S   UU'   UR)                  U5      n[/        UR"                  5      nSUU'   UR1                  U5      n[
        R2                  " UX‚5      nU U-  n [
        R                  " X%:g  U S5      n U[
        R4                  " U5      -   U -  $ s  snf )Nr`   r   r   r�   g      ð?)Údevicer„   )r   r   r�   rŒ   r†   r(   r…   Ú
zeros_liker   rŠ   Úflattenr‡   Úmask_bufferÚdatarF   r<   Úaranger{   r©   Ú	transposeÚreshaper|   rŸ   rŽ   r�   rˆ   rQ   )ro   rT   rr   rs   ru   rv   r˜   rw   rx   r"   rV   r’   Ú
grad_inputr”   Úmasked_safe_targetÚgrad_updateÚ	arange_1dÚgrad_input_tÚintermidate_shapeÚgrad_input_2dÚ_r™   r}   Úw_targets                           r   Ú"_nll_loss_and_log_softmax_backwardrº   g  s‚  € ð —u‘u“w “{‘!¨€KØ”I—N‘N×(Ñ(Ó(Ø!Ñ0ˆà×Ñ˜kÓ*€FÜ—+’+˜fÑ4°f¸aÓ@€KÜ×!Ò! !Ó$€Jô %°+ÑVÐØ×%Ñ% kÓ2×:Ñ:Ó<€KØ*×;Ñ;¸KÈxÓXÐà×(Ñ(×-Ñ-Ñ9Ð9Ð9Ø#×/Ñ/×4Ñ4×7Ñ7¸
×8HÑ8HÓIÈCÑO€KÜ—’Ø× Ñ  Ñ#Ð,>×,EÑ,Eñ€Ið
 	‡u�uƒw�!ƒ|Ø)4Ð%Ò&Ø	
�‰‹�A‹Ø4?�9Ð0Ð0Ò1à!×+Ñ+¨K¸Ó<ˆØ(×.Ñ.ÐØ$×,Ñ,¨R°·±¸Ñ1EÓFˆØ7Bˆ�iÐ!3Ð3Ñ4Ø"×'Ñ'Ð(9Ó:×DÑDÀ[ÐRTÓUˆ
à‡~�~Ó˜+Ÿ/™/Ó+Õ/¨aÖ/Ø!×+Ñ+¨KÓ8ˆàÑÜ % a§e¡e£g¤Ó/¢˜1“Q¡ˆ	Ð/Ø!'§¡¨a¡ˆ	�+ÑØ—‘ 	Ó*ˆô ˜Ÿ™“Mˆ	Ø!#ˆ	�+ÑØ�M‰M˜)Ó$ˆÜ—<’<  ;Ó7ˆØ! HÑ,ˆä—+’+˜fÑ4°kÀ1ÓE€Kð œŸš 1›Ñ%¨Ñ4Ð4ùò# 0s   È!Kc                 óÈ  • [        [        US   5      n[        [        US   5      nUS   nUS   n[        [        US   5      n[        [        US   5      n[        [        US   5      n	UR	                  5       S:¼  a  SOSn
UR
                  n[        UR                  U
5      n[        [        UR                  U
/5      U
5      n[        5       4UR                  R                  -  n[        X]UR                  5      nUb  [        XnUR                  5      n[        U5      nXVsUS'   US'   [        XžUR                  5      US'   [        U [!        U5      U5      n[#        UR$                  UR$                  UR$                  Ub  UR$                  OS UUU	UR&                  U
UR                  U5      n[)        UR                  UR                  US9n[        UUUR*                  S	9$ )
Nr   r   r`   rn   r�   é   é   ra   rb   )r   r   rd   r   r   rf   r!   r   r   r   r   r"   rž   r-   rŽ   r6   r7   rº   rg   r{   r	   rc   )r.   r/   r0   ro   rT   rr   rs   ru   rv   r˜   rx   rh   rV   r¡   r¢   ri   r]   r¦   s                     r   Ú_nll_loss_backward_handlerr¾   ¬  s¿  € ô
 ”w  Q¡Ó(€KÜŒW�d˜1‘gÓ€AØ�!‰W€FØ�!‰W€FÜ”S˜$˜q™'Ó"€IÜœ˜T !™WÓ%€LÜœ  Q¡Ó(€Là—u‘u“w !“|‘!¨€KØ�7‰7€DÜ(¨¯©¸+ÓF€Hô "Ü  §¡°;°-Ó@À+óÐô !*£˜~°·	±	·±Ñ>ÐÜ˜f¸¿¹ÓC€FØÑÜ! &ÀDÇIÁIÓNˆô �‹:€DàÐ€Dˆ�GˆT�!‰Wä˜|ÀtÇyÁyÓQ€Dˆ�GÜ/°¼¸t»ÀfÓMÐä/Ø×!Ñ!Ø	�‰Ø×ÑØ &Ñ 2ˆ×Ò¸ØØØØ	�‰ØØ�	‰	Øó€Fô Ø�	‰	Ø�‰Ø&ñ€Hô àØà×*Ñ*ñð r   c                  ó^   • [         R                  R                  R                  [        5        g ©N)r   r2   Ú_custom_op_handlersÚupdateÚcustomized_loss_opsr   r   r   r   r   ÷  s   € Ü×Ñ×.Ñ.×5Ñ5Ô6IÕJr   c                  óp   • [          H,  n [        R                  R                  R	                  U 5        M.     g rÀ   )rÃ   r   r2   rÁ   Úpop)Ú	custom_ops    r   r   r   û  s&   € ß(ˆ	Ü×Ñ×2Ñ2×6Ñ6°yÖAò )r   )BÚ
contextlibÚtypingr   r(   Útorch._prims_commonÚ_prims_commonrB   Ú)torch.distributed._functional_collectivesÚdistributedÚ_functional_collectivesrJ   Ú"torch.distributed.distributed_c10dÚdistributed_c10drL   r   Útorch.distributed.device_meshr   Útorch.distributed.tensorr   r   r   Ú&torch.distributed.tensor._dtensor_specr	   r
   Ú,torch.distributed.tensor._ops._embedding_opsr   Ú'torch.distributed.tensor._ops._math_opsr   r   r   Ú#torch.distributed.tensor._ops.utilsr   Ú(torch.distributed.tensor.placement_typesr   ÚopsÚatenÚ__all__Úcontextmanagerr   r7   rd   r!   r-   Ú_opsÚ
OpOverloadÚobjectÚdictÚstrr6   r^   rl   rq   ÚSizer›   r§   rº   r¾   ÚdefaultÚ_log_softmax_backward_dataÚnll_loss_forwardÚnll_loss2d_forwardÚnll_loss_backwardÚnll_loss2d_backwardrÃ   r   r   r   r   r   Ú<module>rç      sÍ  ðó Ý ã Ý #ß :Ð :ß 1Ð 1Ý Ý 4ß >Ñ >ß JÝ E÷ñ õ
 >Ý >ð ‡y�y‡~�~€ð Ð
€ð ×Ññ-ó ð-ðd	¨%°	¸3°Ñ*?ð 	Àcð 	Ècô 	ð<Ø˜i¨˜nÑ-ð<Ø5?ð<àô<ð QØ�Z‰Z×"Ñ"ðQà
�˜�Ñ
ðQð ��f�ÑðQð ô	Qò.ð4Ø�Z‰Z×"Ñ"ðà
�˜�Ñ
ðð ��f�Ñðð ô	ðF'Ø�Z‰Z×"Ñ"ð'à
�˜�Ñ
ð'ð ��f�Ñð'ð ô	'ðG ØðG àðG ð �T‰MðG ð ˜4‘-ð	G ð
 ðG ð ðG ð —‘ðG ð ðG ð ðG ð ðG ð ˆ6�6ˆ>ÑôG ðTFØ�Z‰Z×"Ñ"ðFà
�˜�Ñ
ðFð ��f�ÑðFð ô	Fð`B5ØðB5àðB5ð ðB5ð �T‰Mð	B5ð
 ðB5ð ðB5ð ðB5ð —‘ðB5ð ðB5ð ðB5ð ðB5ð ôB5ðJ>Ø�Z‰Z×"Ñ"ð>à
�˜�Ñ
ð>ð ��f�Ñð>ð ô	>ðD 	×Ñ×ÑÐ3Ø×#Ñ#×+Ñ+Ð-JØ×Ñ×!Ñ!Ð#<Ø×Ñ×#Ñ#Ð%>Ø×Ñ×"Ñ"Ð$>Ø×Ñ×$Ñ$Ð&@ðÐ òKóBr   