Ë
    S²jŸ‡  ã                   ój  — d dl Z d dlZd dlZd dlmZ d dlZd dl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 dlmZ d d	lmZ d
dlmZ d
dlmZmZ g d¢Z ej<                  e«      Z de!de"fd„Z#de"de!fd„Z$dejJ                  de&e"   fd„Z'dejJ                  de&e!   fd„Z(dejJ                  de&e   fd„Z)i ejT                  dde'f“ejV                  dde'f“ejX                  dde'f“ejZ                  dde)f“ejB                  dde)f“ej\                  dde)f“ej^                  dde)f“ej`                  dde)f“ejb                  d de)f“ejd                  d de)f“ejf                  d!de)f“ejh                  d!de)f“ejD                  d"de)f“ejj                  d"de)f“ejl                  d"de)f“ejn                  d#d$e)f“ejp                  d%d&e(f“ejr                  d%d&e(fejt                  d'd&e(fejv                  d'd&e(fejx                  d(d)e)fejz                  d*d+e(fej|                  d*d+e(fejb                  d d,e)fej~                  d d,e)fej€                  d d,e)fi	¥ZAde"fd-„ZB	 	 	 dDd.„ZCdEd/„ZDdFd0„ZEd1„ ZFd2„ ZGdGd3„ZHdGd4„ZIdHd5„ZJ	 dId6„ZKdGd7„ZLdJd8„ZMdKd9„ZNd:„ ZOdLd;„ZPd<„ ZQd=„ ZR	 dMd>„ZSdMd?„ZTdNd@„ZUdA„ ZVdB„ ZW	 dNdC„ZXy)Oé    N)ÚAny)Ú
struct_pb2)ÚHistogramProtoÚSummaryÚSummaryMetadata)ÚTensorProto)ÚTensorShapeProto)Ú
layout_pb2)ÚPrCurvePluginData)ÚTextPluginDataé   )Úmake_np)Ú_prepare_videoÚconvert_to_HWC)Úhalf_to_intÚint_to_halfÚhparamsÚscalarÚhistogram_rawÚ	histogramÚmake_histogramÚimageÚimage_boxesÚ
draw_boxesÚ
make_imageÚvideoÚ
make_videoÚaudioÚcustom_scalarsÚtextÚtensor_protoÚpr_curve_rawÚpr_curveÚcompute_curveÚmeshÚfÚreturnc                 ó`   — t        j                  d| «      }t        j                  d|«      d   S )aA  Casts a half-precision float value into an integer.

    Converts a half precision floating point value, such as `torch.half` or
    `torch.bfloat16`, into an integer value which can be written into the
    half_val field of a TensorProto for storage.

    To undo the effects of this conversion, use int_to_half().

    r&   Úir   ©ÚstructÚpackÚunpack)r&   Úbufs     ú^/var/www/html/ia-enhanced/venv/lib/python3.12/site-packages/torch/utils/tensorboard/summary.pyr   r   6   s*   € ô �+‰+�c˜1Ó
€CÜ�=‰=˜˜cÓ" 1Ñ%Ð%ó    r)   c                 ó`   — t        j                  d| «      }t        j                  d|«      d   S )z–Casts an integer value to a half-precision float.

    Converts an integer value obtained from half_to_int back into a floating
    point value.

    r)   r&   r   r*   )r)   r.   s     r/   r   r   C   s*   € ô �+‰+�c˜1Ó
€CÜ�=‰=˜˜cÓ" 1Ñ%Ð%r0   Útc                 óv   — | j                  «       j                  «       D �cg c]  }t        |«      ‘Œ c}S c c}w ©N)ÚflattenÚtolistr   )r2   Úxs     r/   Ú_tensor_to_half_valr8   M   s)   € Ø$%§I¡I£K×$6Ñ$6Ó$8Ö9˜qŒK˜�NÒ9Ð9ùÒ9s   ¡6c                 ód   — t        j                  | «      j                  «       j                  «       S r4   )ÚtorchÚview_as_realr5   r6   ©r2   s    r/   Ú_tensor_to_complex_valr=   P   s%   € Ü×Ñ˜aÓ ×(Ñ(Ó*×1Ñ1Ó3Ð3r0   c                 ó>   — | j                  «       j                  «       S r4   )r5   r6   r<   s    r/   Ú_tensor_to_listr?   S   s   € Ø�9‰9‹;×ÑÓÐr0   ÚDT_HALFÚhalf_valÚDT_BFLOAT16ÚDT_FLOATÚ	float_valÚ	DT_DOUBLEÚ
double_valÚDT_INT8Úint_valÚDT_UINT8ÚDT_INT16ÚDT_INT32ÚDT_INT64Ú	int64_valÚDT_COMPLEX32Úscomplex_valÚDT_COMPLEX64ÚDT_BOOLÚbool_valÚDT_COMPLEX128Údcomplex_valÚ
uint32_valc                 óœ   — t        | t        j                  «      s| j                  «       n| }|j                  t        j
                  k(  rdS dS )Nr   éÿ   )Ú
isinstanceÚnpÚndarrayÚnumpyÚdtypeÚuint8)ÚtensorÚ	converteds     r/   Ú_calc_scale_factorr`   u   s6   € Ü&0°¼¿¹Ô&D�—‘”È&€IØ—‘¤2§8¡8Ò+ˆ1Ð4°Ð4r0   c	                 ó¶  — ddl m}	m}
 |
j                  «       }|	j	                  | «      }||||f\  }}}}|j                  ||f||f||f||f||fg||¬«       |r|}|j                  |«      \  }}}}||z
  ||z
  }}t        j                  d|z  «      }|j                  |||z
  d|z  z
  f||z   |fg|¬«       |j                  ||z   ||z
  |z
  f|||¬«       | S )Nr   )Ú	ImageDrawÚ	ImageFont)ÚwidthÚfillgš™™™™™©?é   )re   )re   Úfont)ÚPILrb   rc   Úload_defaultÚDrawÚlineÚgetbboxrY   ÚceilÚ	rectangler    )r   ÚxminÚyminÚxmaxÚymaxÚdisplay_strÚcolorÚ
color_textÚ	thicknessrb   rc   rg   ÚdrawÚleftÚrightÚtopÚbottomÚtext_bottomÚ_leftÚ_topÚ_rightÚ_bottomÚ
text_widthÚtext_heightÚmargins                            r/   Ú_draw_single_boxr„   z   s/  € ÷ )à×!Ñ!Ó#€DØ�>‰>˜%Ó €DØ"&¨¨d°DÐ!9Ñ€Tˆ5�#�vØ‡I�IØ
�ˆ�t˜V�n u¨f o¸¸s°|ÀdÈCÀ[ÐQØØð ô ñ
 Øˆà'+§|¡|°KÓ'@Ñ$ˆˆt�V˜WØ"(¨5¡.°'¸D±.�Kˆ
Ü—‘˜ Ñ+Ó,ˆØ�‰à�{ [Ñ0°1°v±:Ñ=Ð>Ø˜
Ñ" KÐ0ðð ð 	ô 	
ð 	�	‰	Ø�F‰]˜K¨+Ñ5¸Ñ>Ð?ØØØð	 	ô 	
ð €Lr0   c           	      ój	  ‡ ‡— ddl }ddlm}m}m}m}m}m}	 ddlm	}
m
}m}m}m} ddlm}m}m} t%        ‰ t&        «      s t(        j+                  d«       t-        d«      ‚t%        |t&        «      s t(        j+                  d«       t-        d«      ‚|xs i }t%        |t&        «      st-        d«      ‚|j/                  «       D ]@  \  Š}‰‰ vs&t%        |t0        «      rt3        ˆ ˆfd	„|D «       «      rŒ0t-        d
‰› d‰› d�«      ‚ g } |«       }‰ j/                  «       D �],  \  Š}|€Œ
t%        |t4        t6        f«      r€||j8                  ‰   _        ‰|v r<t=        j>                  |‰   D �cg c]  }t=        j@                  |¬«      ‘Œ c}¬«      }nd}|jC                   |‰|jA                  d«      |¬«      «       Œ t%        |tD        «      r�||j8                  ‰   _#        ‰|v r<t=        j>                  |‰   D �cg c]  }t=        j@                  |¬«      ‘Œ c}¬«      }nd}|jC                   |‰|jA                  d«      |¬«      «       �Œ1t%        |tH        «      r�||j8                  ‰   _%        ‰|v r<t=        j>                  |‰   D �cg c]  }t=        j@                  |¬«      ‘Œ c}¬«      }nd}|jC                   |‰|jA                  d«      |¬«      «       �ŒÂt%        ||jL                  «      rLtO        |«      d   }||j8                  ‰   _        |jC                   |‰|jA                  d«      ¬«      «       �Œ$tQ        d«      ‚  |||¬«      }tS        tS        jT                  ||jW                  «       ¬«      ¬«      }tY        tY        j@                  ||¬«      g¬«      }|D �cg c]  } | ||¬«      ¬«      ‘Œ }} |||¬«      } |||¬«      }tS        tS        jT                  ||jW                  «       ¬«      ¬«      }tY        tY        j@                  |
|¬«      g¬«      } ||	jA                  d «      ¬!«      } |||¬"«      }tS        tS        jT                  ||jW                  «       ¬«      ¬«      }tY        tY        j@                  ||¬«      g¬«      }|||fS c c}w c c}w c c}w c c}w )#a2  Output three `Summary` protocol buffers needed by hparams plugin.

    `Experiment` keeps the metadata of an experiment, such as the name of the
      hyperparameters and the name of the metrics.
    `SessionStartInfo` keeps key-value pairs of the hyperparameters
    `SessionEndInfo` describes status of the experiment e.g. STATUS_SUCCESS

    Args:
      hparam_dict: A dictionary that contains names of the hyperparameters
        and their values.
      metric_dict: A dictionary that contains names of the metrics
        and their values.
      hparam_domain_discrete: (Optional[Dict[str, List[Any]]]) A dictionary that
        contains names of the hyperparameters and all discrete values they can hold

    Returns:
      The `Summary` protobufs for Experiment, SessionStartInfo and
        SessionEndInfo
    r   N)ÚDataTypeÚ
ExperimentÚ
HParamInfoÚ
MetricInfoÚ
MetricNameÚStatus)ÚEXPERIMENT_TAGÚPLUGIN_DATA_VERSIONÚPLUGIN_NAMEÚSESSION_END_INFO_TAGÚSESSION_START_INFO_TAG)ÚHParamsPluginDataÚSessionEndInfoÚSessionStartInfoz>parameter: hparam_dict should be a dictionary, nothing logged.z>parameter: metric_dict should be a dictionary, nothing logged.zIparameter: hparam_domain_discrete should be a dictionary, nothing logged.c              3   óN   •K  — | ]  }t        |t        ‰‰   «      «      –— Œ y ­wr4   )rX   Útype)Ú.0ÚdÚhparam_dictÚks     €€r/   ú	<genexpr>zhparams.<locals>.<genexpr>ì   s!   øè ø€ ÒF¸q”z !¤T¨+°a©.Ó%9×:ÑFùs   ƒ"%z"parameter: hparam_domain_discrete[z/] should be a list of same type as hparam_dict[z].)Únumber_value)ÚvaluesÚDATA_TYPE_FLOAT64)Únamer•   Údomain_discrete)Ústring_valueÚDATA_TYPE_STRING)Ú
bool_valueÚDATA_TYPE_BOOL)rž   r•   z=value should be one of int, float, str, bool, or torch.Tensor)Úsession_start_infoÚversion©Úplugin_nameÚcontent©Úplugin_data)ÚtagÚmetadata©Úvalue©r«   )rž   )Úhparam_infosÚmetric_infos)Ú
experimentr¥   ÚSTATUS_SUCCESS)Ústatus)Úsession_end_infor¥   )-r:   Ú#tensorboard.plugins.hparams.api_pb2r†   r‡   rˆ   r‰   rŠ   r‹   Ú$tensorboard.plugins.hparams.metadatarŒ   r�   rŽ   r�   r�   Ú+tensorboard.plugins.hparams.plugin_data_pb2r‘   r’   r“   rX   ÚdictÚloggerÚwarningÚ	TypeErrorÚitemsÚlistÚallÚintÚfloatr   r›   r   Ú	ListValueÚValueÚappendÚstrr    Úboolr¢   ÚTensorr   Ú
ValueErrorr   Ú
PluginDataÚSerializeToStringr   )r˜   Úmetric_dictÚhparam_domain_discreter:   r†   r‡   rˆ   r‰   rŠ   r‹   rŒ   r�   rŽ   r�   r�   r‘   r’   r“   ÚvÚhpsÚssir—   rŸ   r¨   Úsmdr™   ÚmtsÚexpÚseis   `                        `   r/   r   r   ¥   s�  ù€ ó( ÷÷ ÷õ ÷ñ ô �k¤4Ô(Ü�‰ÐWÔXÜØLó
ð 	
ô �k¤4Ô(Ü�‰ÐWÔXÜØLó
ð 	
ð 4Ò9°rÐÜÐ,¬dÔ3ÜØWó
ð 	
ð '×,Ñ,Ó.ò ‰ˆˆ1à�[Ñ Ü˜a¤Ô&ÜÔFÀAÔFÕFäØ4°Q°CÐ7fÐghÐfiÐikÐlóð ðð €Cá
Ó
€CØ×!Ñ!Ó#ó L
‰ˆˆ1Øˆ9ØÜ�aœ#œu˜Ô&Ø*+ˆC�K‰K˜‰NÔ'àÐ*Ñ*Ü?I×?SÑ?Sð "8¸Ñ!:öàô #×(Ñ(°aÖ8òô@‘ð #'�à�J‰JÙØØ!Ÿ™Ð(;Ó<Ø$3ôôð ä�aœÔØ*+ˆC�K‰K˜‰NÔ'àÐ*Ñ*Ü",×"6Ñ"6ð "8¸Ñ!:öàô #×(Ñ(°aÖ8òô#‘ð #'�à�J‰JÙØØ!Ÿ™Ð(:Ó;Ø$3ôôñ ä�aœÔØ()ˆC�K‰K˜‰NÔ%àÐ*Ñ*Ü",×"6Ñ"6ð "8¸Ñ!:öàô #×(Ñ(°AÖ6òô#‘ð #'�à�J‰JÙØØ!Ÿ™Ð(8Ó9Ø$3ôôñ ä�a˜Ÿ™Ô&Ü˜“
˜1‘ˆAØ*+ˆC�K‰K˜‰NÔ'Ø�J‰J‘z q¨x¯~©~Ð>QÓ/RÔSÔTÙÜØKó
ð 	
ðUL
ñ\  °3Ð@SÔT€GÜ
Ü#×.Ñ.Ø#¨W×-FÑ-FÓ-Hô
ô€Cô
 œŸ™Ð+AÈCÔPÐQÔ
R€Cà7BÖ
C°!‰:™:¨!Ô,Ö-Ð
C€CÐ
Cá
 #°CÔ
8€Cá¨3Ð8KÔL€GÜ
Ü#×.Ñ.Ø#¨W×-FÑ-FÓ-Hô
ô€Cô
 œŸ™¨>ÀCÔHÐIÔ
J€Cá
 §¡Ð-=Ó >Ô
?€CÙ°Ð>QÔR€GÜ
Ü#×.Ñ.Ø#¨W×-FÑ-FÓ-Hô
ô€Cô
 œŸ™Ð+?È#ÔNÐOÔ
P€Cà��Sˆ=ÐùòGùò,ùò,ùòD Ds   Å*R!
Ç:R&
ÊR+
Î+R0c                 óÂ  — t        |«      j                  «       }|j                  dk7  r&t        d|j                  › d|j                  › d�«      ‚t        |«      }|rct        |gd¬«      }|rt        |gd¬«      }t        j                  d	¬
«      }t        |¬«      }t        t        j                  | ||¬«      g¬«      S t        t        j                  | |¬«      g¬«      S )a  Output a `Summary` protocol buffer containing a single scalar value.

    The generated Summary has a Tensor.proto containing the input Tensor.
    Args:
      name: A name for the generated node. Will also serve as the series name in
        TensorBoard.
      tensor: A real numeric Tensor containing a single value.
      collections: Optional list of graph collections keys. The new summary op is
        added to these collections. Defaults to `[GraphKeys.SUMMARIES]`.
      new_style: Whether to use new style (tensor field) or old style (simple_value
        field). New style could lead to faster data loading.
    Returns:
      A scalar `Tensor` of type `string`. Which contains a `Summary` protobuf.
    Raises:
      ValueError: If tensor has the wrong shape or type.
    r   zNTensor should contain one element (0 dimensions).             Was given size: z and z dimensions.rC   )rD   r\   rE   )rF   r\   Úscalars©r§   r©   ©r«   r^   r¬   r­   )r«   Úsimple_value)r   ÚsqueezeÚndimÚAssertionErrorÚsizerÁ   r   r   rÉ   r   rÃ   )	rž   r^   ÚcollectionsÚ	new_styleÚdouble_precisionr   r!   rª   rÐ   s	            r/   r   r   b  sÚ   € ô" �V‹_×$Ñ$Ó&€FØ‡{�{�aÒÜð  Ø#Ÿ[™[˜M¨¨v¯{©{¨m¸<ðIó Jð 	Jô �6‹]€FÙÜ"¨f¨X¸ZÔHˆÙÜ&°6°(À+ÔNˆLä%×0Ñ0¸YÔGˆÜ¨+Ô6ˆÜä—‘ØØ'Ø ôðô
ð 	
ô œgŸm™m°À6ÔJÐKÔLÐLr0   c                 ó  — |j                  «       |j                  z  dk\  rt        d«      ‚|j                  t        v ret        |j                     \  }}}t        di d|dt        |j                  D �cg c]  }t        j                  |¬«      ‘Œ c}¬«      | ||«      i¤Ž}nt        | › d|j                  › �«      ‚t        j                  d¬	«      }t        |¬
«      }t        t        j                  | ||¬«      g¬«      S c c}w )aö  Outputs a `Summary` protocol buffer containing the full tensor.
    The generated Summary has a Tensor.proto containing the input Tensor.
    Args:
      tag: A name for the generated node. Will also serve as the series name in
        TensorBoard.
      tensor: Tensor to be converted to protobuf
    Returns:
      A tensor protobuf in a `Summary` protobuf.
    Raises:
      ValueError: If tensor is too big to be converted to protobuf, or
                     tensor data type is not supported
    l        zAtensor is bigger than protocol buffer's hard limit of 2GB in sizer\   Útensor_shape©rÜ   ©Údimz has unsupported tensor dtype r^   rÖ   r©   ©r«   r¬   r^   r­   © )ÚnumelÚitemsizerÈ   r\   Ú_TENSOR_TYPE_MAPr   r	   ÚshapeÚDimr   rÉ   r   rÃ   )	r«   r^   r\   Ú
field_nameÚconversion_fnr7   r!   rª   rÐ   s	            r/   r!   r!   �  sõ   € ð ‡|�|ƒ~˜Ÿ™Ñ'¨GÒ4ÜØOó
ð 	
ð ‡|�|Ô'Ñ'Ü+;¸F¿L¹LÑ+IÑ(ˆˆz˜=Ü"ñ 
à˜ØÔ 0Ø?E¿|¹|ÖL¸!Ô)×-Ñ-°1Ö5ÒLô!ð ™M¨&Ó1ðñ
‰ô ˜C˜5Ð >¸v¿|¹|¸nÐMÓNÐNä!×,Ñ,¸ÔB€KÜ
 kÔ
2€CÜœ'Ÿ-™-¨C¸#ÀlÔSÐTÔUÐUùò Ms   Á2Dc           	      ój   — t        |||||||¬«      }t        t        j                  | |¬«      g¬«      S )a  Output a `Summary` protocol buffer with a histogram.

    The generated
    [`Summary`](https://www.tensorflow.org/code/tensorflow/core/framework/summary.proto)
    has one summary value containing a histogram for `values`.
    Args:
      name: A name for the generated node. Will also serve as a series name in
        TensorBoard.
      min: A float or int min value
      max: A float or int max value
      num: Int number of values
      sum: Float or int sum of all values
      sum_squares: Float or int sum of squares for all values
      bucket_limits: A numeric `Tensor` with upper value per bucket
      bucket_counts: A numeric `Tensor` with number of values per bucket
    Returns:
      A scalar `Tensor` of type `string`. The serialized `Summary` protocol
      buffer.
    ©ÚminÚmaxÚnumÚsumÚsum_squaresÚbucket_limitÚbucket©r«   Úhistor­   )r   r   rÃ   )	rž   rð   rñ   rò   ró   rô   Úbucket_limitsÚbucket_countsÚhists	            r/   r   r   ²  s>   € ô* ØØØØØØ"Øô€Dô œ'Ÿ-™-¨D¸Ô=Ð>Ô?Ð?r0   c                 óœ   — t        |«      }t        |j                  t        «      ||«      }t	        t	        j
                  | |¬«      g¬«      S )ad  Output a `Summary` protocol buffer with a histogram.

    The generated
    [`Summary`](https://www.tensorflow.org/code/tensorflow/core/framework/summary.proto)
    has one summary value containing a histogram for `values`.
    This op reports an `InvalidArgument` error if any value is not finite.
    Args:
      name: A name for the generated node. Will also serve as a series name in
        TensorBoard.
      values: A real numeric `Tensor`. Any shape. Values to use to
        build the histogram.
    Returns:
      A scalar `Tensor` of type `string`. The serialized `Summary` protocol
      buffer.
    r÷   r­   )r   r   ÚastyperÁ   r   rÃ   )rž   rœ   ÚbinsÚmax_binsrû   s        r/   r   r   Ó  s=   € ô" �V‹_€FÜ˜&Ÿ-™-¬Ó.°°hÓ?€DÜœ'Ÿ-™-¨D¸Ô=Ð>Ô?Ð?r0   c           
      ó8  — | j                   dk(  rt        d«      ‚| j                  d«      } t        j                  | |¬«      \  }}t        |«      }|�˜||kD  r“||z  }||z  }|dk7  rt        j                  |d||z
  ggdd¬«      }|j                  d|«      j                  d¬«      }t        j                  |j                   d	z   f|j                  «      }|dd|…   |dd |d   |d<   |}t        j                  t        j                  |d«      «      }	t        j                  |	d|	d   d	z
  gd
¬«      \  }
}t        |
«      }
t        |«      d	z   }~	|
dkD  r||
d	z
  | nt        j                  dg|d| g«      }||
|d	z    }|j                   dk(  s|j                   dk(  rt        d«      ‚| j                  | «      }t!        | j#                  «       | j%                  «       t        | «      | j                  «       ||j'                  «       |j'                  «       ¬«      S )zDConvert values into a histogram proto using logic from histogram.cc.r   zThe input has no element.éÿÿÿÿ)rþ   NÚconstant)Ú	pad_widthÚmodeÚconstant_values)Úaxisr   ry   )Úsidez1The histogram is empty, please file a bug report.rï   )rÜ   rÈ   ÚreshaperY   r   ÚlenÚpadró   Úemptyr\   ÚcumsumÚgreaterÚsearchsortedrÀ   ÚconcatenateÚdotr   rð   rñ   r6   )rœ   rþ   rÿ   ÚcountsÚlimitsÚnum_binsÚsubsamplingÚsubsampling_remainderÚ
new_limitsÚ
cum_countsÚstartÚendÚsum_sqs                r/   r   r   é  s  € à‡{�{�aÒÜÐ4Ó5Ð5Ø�^‰^˜BÓ€FÜ—\‘\ &¨tÔ4�N€FˆFÜ�6‹{€HØÐ ¨8Ò 3Ø (Ñ*ˆØ (¨;Ñ 6ÐØ  AÒ%ä—V‘VØØ˜{Ð-BÑBÐCÐDØØ !ô	ˆFð —‘  KÓ0×4Ñ4¸"Ð4Ó=ˆÜ—X‘X˜vŸ{™{¨Q™Ð0°&·,±,Ó?ˆ
Ø   " [ Ñ1ˆ
�3�BˆØ ™ˆ
�2‰Øˆô —‘œ2Ÿ:™: f¨aÓ0Ó1€JÜ—‘ ¨a°¸B±À!Ñ1CÐ-DÈ7ÔS�J€Eˆ3Ü�‹J€EÜ
ˆc‹(�Q‰,€CØð $)¨1¢9ˆˆu�q‰y˜3Ñ´"·.±.À1À#ÀvÈdÈsÀ|ÐATÓ2Uð ð �E˜C !™GÐ$€Fà‡{�{�aÒ˜6Ÿ;™;¨!Ò+ÜÐLÓMÐMà�Z‰Z˜Ó€FÜØ�J‰J‹LØ�J‰J‹LÜ�‹KØ�J‰J‹LØØ—]‘]“_Ø�}‰}‹ôð r0   c                 óF  — t        |«      }t        ||«      }t        |«      }|j                  t        j
                  «      }||z  j                  dd«      j                  t        j                  «      }t        ||¬«      }t        t        j                  | |¬«      g¬«      S )aJ  Output a `Summary` protocol buffer with images.

    The summary has up to `max_images` summary values containing images. The
    images are built from `tensor` which must be 3-D with shape `[height, width,
    channels]` and where `channels` can be:
    *  1: `tensor` is interpreted as Grayscale.
    *  3: `tensor` is interpreted as RGB.
    *  4: `tensor` is interpreted as RGBA.
    The `name` in the outputted Summary.Value protobufs is generated based on the
    name, with a suffix depending on the max_outputs setting:
    *  If `max_outputs` is 1, the summary value tag is '*name*/image'.
    *  If `max_outputs` is greater than 1, the summary value tags are
       generated sequentially as '*name*/image/0', '*name*/image/1', etc.
    Args:
      tag: A name for the generated node. Will also serve as a series name in
        TensorBoard.
      tensor: A 3-D `uint8` or `float32` `Tensor` of shape `[height, width,
        channels]` where `channels` is 1, 3, or 4.
        'tensor' can either have values in [0, 1] (float32) or [0, 255] (uint8).
        The image() function will scale the image values to [0, 255] by applying
        a scale factor of either 1 (uint8) or 255 (float32). Out-of-range values
        will be clipped.
    Returns:
      A scalar `Tensor` of type `string`. The serialized `Summary` protocol
      buffer.
    r   rW   )Úrescale©r«   r   r­   )r   r   r`   rý   rY   Úfloat32Úclipr]   r   r   rÃ   )r«   r^   r  ÚdataformatsÚscale_factorr   s         r/   r   r   !  s€   € ô6 �V‹_€FÜ˜F KÓ0€Fä% fÓ-€LØ�]‰]œ2Ÿ:™:Ó&€FØ�|Ñ#×)Ñ)¨!¨SÓ1×8Ñ8¼¿¹ÓB€FÜ�v wÔ/€EÜœ'Ÿ-™-¨C°uÔ=Ð>Ô?Ð?r0   c                 óX  — t        |«      }t        ||«      }t        |«      }|j                  t        j                  «      t        |«      z  }t        |j                  dd«      j                  t        j                  «      |||¬«      }t        t        j                  | |¬«      g¬«      S )z/Output a `Summary` protocol buffer with images.r   rW   )r  ÚroisÚlabelsr  r­   )r   r   rý   rY   r  r`   r   r  r]   r   rÃ   )r«   Útensor_imageÚtensor_boxesr  r   r$  r   s          r/   r   r   F  s�   € ô ˜<Ó(€LÜ! ,°Ó<€LÜ˜<Ó(€LØ×&Ñ&¤r§z¡zÓ2Ô5GÈÓ5UÑU€LÜØ×Ñ˜!˜SÓ!×(Ñ(¬¯©Ó2ØØØô	€Eô œ'Ÿ-™-¨C°uÔ=Ð>Ô?Ð?r0   c           
      ó¢   — |j                   d   }t        |«      }|D ]/  }t        | ||df   ||df   ||df   ||df   |€d n||   d¬«      } Œ1 | S )Nr   r   rf   é   ÚRed)rs   rt   )rê   Úranger„   )Ú
disp_imageÚboxesr$  Ú	num_boxesÚlist_gtr)   s         r/   r   r   W  sy   € à—‘˜A‘€IÜ�IÓ€GØò 	
ˆÜ%ØØ�!�Q�$‰KØ�!�Q�$‰KØ�!�Q�$‰KØ�!�Q�$‰KØ & ™°F¸1±IØô
‰
ð	
ð Ðr0   c                 ó¼  — ddl m} | j                  \  }}}t        ||z  «      }t        ||z  «      }	|j	                  | «      }
|�t        |
||¬«      }
|j                  j                  }|
j                  |	|f|«      }
ddl	}|j                  «       }|
j                  |d¬«       |j                  «       }|j                  «        t        j                  ||||¬«      S )z=Convert a numpy representation of an image to Image protobuf.r   )ÚImageN)r$  ÚPNG)Úformat©Úheightrd   Ú
colorspaceÚencoded_image_string)rh   r0  rê   rÀ   Ú	fromarrayr   Ú
ResamplingÚLANCZOSÚresizeÚioÚBytesIOÚsaveÚgetvalueÚcloser   )r^   r  r#  r$  r0  r4  rd   ÚchannelÚscaled_heightÚscaled_widthr   Ú	ANTIALIASr;  ÚoutputÚimage_strings                  r/   r   r   h  sÊ   € åà#Ÿ\™\Ñ€FˆE�7Ü˜ Ñ(Ó)€MÜ�u˜w‘Ó'€LØ�O‰O˜FÓ#€EØÐÜ˜5 $¨vÔ6ˆØ× Ñ ×(Ñ(€IØ�L‰L˜,¨Ð6¸	ÓB€EÛà�Z‰Z‹\€FØ	‡J�Jˆv˜e€JÔ$Ø—?‘?Ó$€LØ
‡L�L„NÜ�=‰=ØØØØ)ô	ð r0   c                 óB  — t        |«      }t        |«      }t        |«      }|j                  t        j
                  «      }||z  j                  dd«      j                  t        j                  «      }t        ||«      }t        t        j                  | |¬«      g¬«      S )Nr   rW   r  r­   )r   r   r`   rý   rY   r  r  r]   r   r   rÃ   )r«   r^   Úfpsr!  r   s        r/   r   r   ‚  s|   € Ü�V‹_€FÜ˜FÓ#€Fä% fÓ-€LØ�]‰]œ2Ÿ:™:Ó&€FØ�|Ñ#×)Ñ)¨!¨SÓ1×8Ñ8¼¿¹ÓB€FÜ�v˜sÓ#€EÜœ'Ÿ-™-¨C°uÔ=Ð>Ô?Ð?r0   c                 óz  — 	 dd l }	 ddl m} dd l}| j
                  \  }}}}|j                  t        | «      |¬«      }	|j                  d¬«      5 }
|
j                  }	 |	j                  |d	d ¬
«       |
j                  d«       |
j                  «       }t        j                  ||||¬«      cd d d «       S # t        $ r t        d«       Y y w xY w# t        $ r t        dd«       Y y w xY w# t        $ r; 	 |	j                  |d	d	¬«       n"# t        $ r |	j                  |d	¬«       Y nw xY wY Œ»w xY w# 1 sw Y   y xY w)Nr   zadd_video needs package moviepy)Úeditorz6moviepy is installed, but can't import moviepy.editor.z2Some packages could be missing [imageio, requests])rG  z.gif)ÚsuffixF)Úverboserº   )rK  Úprogress_bar)rK  r3  )ÚmoviepyÚImportErrorÚprintrI  Útempfilerê   ÚImageSequenceClipr¾   ÚNamedTemporaryFilerž   Ú	write_gifr¼   ÚseekÚreadr   r0  )r^   rG  rM  ÚmpyrP  Ú_tÚhÚwÚcr  r&   ÚfilenameÚtensor_strings                r/   r   r   �  sC  € ðÛðÝ)ó à—,‘,�K€Bˆˆ1ˆað × Ñ ¤ f£°3Ð Ó7€Dà	×	$Ñ	$¨FÐ	$Ó	3ð 
°qØ—6‘6ˆð	8Ø�N‰N˜8¨U¸4ˆNÔ@ð 	
�‰ˆqŒ	ØŸ™›ˆä�}‰}Ø˜A¨!À-ô
÷
ñ 
øô% ò ÜÐ/Ô0Ùðûô
 ò ÜØDØ@ô	
ñ 	ðûô" ò 	8ð8Ø—‘˜x°ÀU�ÕKøÜò 8Ø—‘˜x°�Ö7ð8üð	8ú÷	
ð 
úsv   ‚B5 ‡C ÁD1ÁC*Á29D1Â5CÃCÃC'Ã&C'Ã*	D.Ã4D	ÄD.Ä	D(Ä%D.Ä'D(Ä(D.Ä+D1Ä-D.Ä.D1Ä1D:c                 óH  — t        |«      }|j                  «       }t        |«      j                  «       dkD  rt	        d«       |j                  dd«      }|j                  dk7  rt        d«      ‚|t        j                  t        j                  «      j                  z  j                  d«      }dd l}dd l}|j                  «       }|j                  |d«      5 }|j!                  d«       |j#                  d«       |j%                  |«       |j'                  |j(                  «       d d d «       |j+                  «       }|j-                  «        t/        j0                  |d|j2                  d   |d	¬
«      }	t/        t/        j4                  | |	¬«      g¬«      S # 1 sw Y   ŒrxY w)Nr   z4warning: audio amplitude out of range, auto clipped.r  z%input tensor should be 1 dimensional.z<i2r   Úwbrf   z	audio/wav)Úsample_rateÚnum_channelsÚlength_framesÚencoded_audio_stringÚcontent_type)r«   r   r­   )r   rÙ   Úabsrñ   rO  r  rÚ   rÛ   rY   ÚiinfoÚint16rý   r;  Úwaver<  ÚopenÚsetnchannelsÚsetsampwidthÚsetframerateÚwriteframesÚdatar>  r?  r   ÚAudiorê   rÃ   )
r«   r^   r_  Úarrayr;  rg  ÚfioÚ
wave_writeÚaudio_stringr   s
             r/   r   r   ´  sI  € Ü�F‹O€EØ�M‰M‹O€EÜ
ˆ5ƒz‡~�~Ó˜!ÒÜÐDÔEØ—
‘
˜2˜qÓ!ˆØ‡z�z�Q‚ÜÐDÓEÐEà”R—X‘XœbŸh™hÓ'×+Ñ+Ñ+×3Ñ3°EÓ:€EãÛà
�*‰*‹,€CØ	�‰�3˜Ó	ð + Ø×Ñ Ô"Ø×Ñ Ô"Ø×Ñ Ô,Ø×Ñ˜uŸz™zÔ*÷	+ð
 —<‘<“>€LØ‡I�I„KÜ�M‰MØØØ—k‘k "‘oØ)Ø ô€Eô œ'Ÿ-™-¨C°uÔ=Ð>Ô?Ð?÷+ð +ús   ÃAFÆF!c           
      ó2  — g }| j                  «       D �]  \  }}g }|j                  «       D ]Á  \  }}|d   }|d   dk(  rqt        |«      dk7  rt        d«      ‚t        j                  t        j                  j                  |d   |d   |d   ¬«      g¬«      }t        j                  ||¬	«      }	n-t        j                  |¬
«      }
t        j                  ||
¬«      }	|j                  |	«       ŒÃ |j                  t        j                  ||¬«      «       �Œ t        j                  |¬«      } t        j                  d¬«      }t        |¬«      }t        d| j                  «       gt        «       ¬«      }t!        t!        j"                  d||¬«      g¬«      S )Nr   r   ÚMarginr(  zlen(tags) != 3rf   )r®   ÚlowerÚupper)Úseries)Útitlerƒ   r¯   )rx  Ú	multiline)rx  Úchart)Úcategoryr   rÖ   r©   Ú	DT_STRING©r\   Ú
string_valrá   Úcustom_scalars__config__r×   r­   )r½   r	  rÛ   r
   ÚMarginChartContentÚSeriesÚChartÚMultilineChartContentrÄ   ÚCategoryÚLayoutr   rÉ   r   rÊ   r	   r   rÃ   )ÚlayoutÚ
categoriesr™   rÍ   ÚchartsÚ
chart_nameÚchart_metadataÚtagsÚmgccrz  Úmlccrª   rÐ   r^   s                 r/   r   r   Ô  s„  € Ø€JØ—‘“ó F‰ˆˆ1ØˆØ*+¯'©'«)ò 	!Ñ&ˆJ˜Ø! !Ñ$ˆDØ˜aÑ  HÒ,Ü�t“9 ’>Ü(Ð)9Ó:Ð:Ü!×4Ñ4ä"×5Ñ5×<Ñ<Ø"& q¡'°°a±ÀÀQÁð =ó ðô�ô #×(Ñ(¨zÀ$ÔG‘ä!×7Ñ7¸DÔA�Ü"×(Ñ(¨zÀTÔJ�Ø�M‰M˜%Õ ð!	!ð" 	×Ñœ*×-Ñ-°A¸VÔDÖEð'Fô* ×Ñ¨
Ô3€FÜ!×,Ñ,Ð9IÔJ€KÜ
 kÔ
2€CÜØØ×,Ñ,Ó.Ð/Ü%Ó'ô€Fô
 ä�M‰MÐ8ÀÐRUÔVð
ôð r0   c           	      ó@  — t        j                  dt        d¬«      j                  «       ¬«      }t        |¬«      }t	        d|j                  d¬«      gt        t        j                  d	¬
«      g¬«      ¬«      }t        t        j                  | dz   ||¬«      g¬«      S )Nr    r   )r¥   r¦   r©   r|  Úutf_8)Úencodingr   râ   rã   r}  z/text_summaryrå   r­   )
r   rÉ   r   rÊ   r   Úencoder	   rë   r   rÃ   )r«   r    rª   rÐ   r^   s        r/   r    r    ú  s�   € Ü!×,Ñ,Ø¤N¸1Ô$=×$OÑ$OÓ$Qô€Kô  kÔ
2€CÜØØ—K‘K¨�KÓ1Ð2Ü%Ô+;×+?Ñ+?ÀQÔ+GÐ*HÔIô€Fô
 Ü�}‰}  Ñ!6ÀÈVÔTÐUôð r0   c	                 óú  — |dkD  rd}t        j                  ||||||f«      }	t        d|¬«      j                  «       }
t	        j
                  d|
¬«      }t	        |¬«      }t        d|	j                  d«      j                  «       t        t        j                  |	j                  d   ¬	«      t        j                  |	j                  d
   ¬	«      g¬«      ¬«      }t        t        j                  | ||¬«      g¬«      S )Né   r   ©r¥   Únum_thresholdsÚ	pr_curvesr¦   r©   rC   r  râ   r   rã   ©r\   rD   rá   rå   r­   )rY   Ústackr   rÊ   r   rÉ   r   r  r6   r	   rë   rê   r   rÃ   )r«   ÚtpÚfpÚtnÚfnÚ	precisionÚrecallr•  Úweightsrm  Úpr_curve_plugin_datarª   rÐ   r^   s                 r/   r"   r"   	  sã   € ð ˜ÒØˆÜ�8‰8�R˜˜R  Y°Ð7Ó8€DÜ,Ø .ôçÑÓð ô "×,Ñ,ØÐ)=ô€Kô  kÔ
2€CÜØØ—,‘,˜rÓ"×)Ñ)Ó+Ü%ä ×$Ñ$¨$¯*©*°Q©-Ô8Ü ×$Ñ$¨$¯*©*°Q©-Ô8ðô
ô	€Fô œ'Ÿ-™-¨C¸#ÀfÔMÐNÔOÐOr0   c                 óì  — t        |d«      }t        ||||¬«      }t        d|¬«      j                  «       }t	        j
                  d|¬«      }t	        |¬«      }t        d|j                  d	«      j                  «       t        t        j                  |j                  d   ¬
«      t        j                  |j                  d   ¬
«      g¬«      ¬«      }	t        t        j                  | ||	¬«      g¬«      S )Nr“  )r•  rŸ  r   r”  r–  r¦   r©   rC   r  râ   r   rã   r—  rå   r­   )rð   r$   r   rÊ   r   rÉ   r   r  r6   r	   rë   rê   r   rÃ   )
r«   r$  Úpredictionsr•  rŸ  rm  r   rª   rÐ   r^   s
             r/   r#   r#   #  sÚ   € ä˜¨Ó-€NÜØ�¨NÀGô€Dô -Ø .ôçÑÓð ô "×,Ñ,ØÐ)=ô€Kô  kÔ
2€CÜØØ—,‘,˜rÓ"×)Ñ)Ó+Ü%ä ×$Ñ$¨$¯*©*°Q©-Ô8Ü ×$Ñ$¨$¯*©*°Q©-Ô8ðô
ô	€Fô œ'Ÿ-™-¨C¸#ÀfÔMÐNÔOÐOr0   c                 ó‚  — d}|€d}t        j                  t        j                  ||dz
  z  «      «      }| j                  t         j                  «      }d|dz
  f}t        j
                  |||||z  ¬«      \  }}	t        j
                  |||d|z
  |z  ¬«      \  }
}	t        j                  |d d d…   «      d d d…   }t        j                  |
d d d…   «      d d d…   }|d   |z
  }|d   |z
  }|t        j                  |||z   «      z  }|t        j                  |||z   «      z  }t        j                  ||||||f«      S )NgH¯¼šò×z>g      ð?r   r   )rþ   r*  rŸ  r  )	rY   Úint32Úfloorrý   Úfloat64r   r  Úmaximumr˜  )r$  r¢  r•  rŸ  Ú_MINIMUM_COUNTÚbucket_indicesÚfloat_labelsÚhistogram_rangeÚ
tp_bucketsÚ_Ú
fp_bucketsr™  rš  r›  rœ  r�  rž  s                    r/   r$   r$   >  sL  € Ø€Nà€Øˆô —X‘XœbŸh™h {°nÀqÑ6HÑ'IÓJÓK€NØ—=‘=¤§¡Ó,€Là˜.¨1Ñ,Ð-€OÜ—L‘LØàØØ˜wÑ&ô�M€J�ô —L‘LØàØØ�|Ñ# wÑ.ô�M€J�ô 
�‰�:™d ˜dÑ#Ó	$¡T r TÑ	*€BÜ	�‰�:™d ˜dÑ#Ó	$¡T r TÑ	*€BØ	ˆA‰�‰€BØ	ˆA‰�‰€BØ”R—Z‘Z °°R±Ó8Ñ8€IØ”"—*‘*˜^¨R°"©WÓ5Ñ5€FÜ�8‰8�R˜˜R  Y°Ð7Ó8Ð8r0   c                 ó  — ddl }ddlm}  |j                  |«      }|j	                  | ||||j
                  ||¬«      }	t        d|j                  d«      j                  «       t        t        j                  |j
                  d   ¬«      t        j                  |j
                  d   ¬«      t        j                  |j
                  d	   ¬«      g¬
«      ¬«      }t        j                  |j                  | |«      ||	¬«      }
|
S )a  Create a tensor summary with summary metadata.

    Args:
      name: Uniquely identifiable name of the summary op. Could be replaced by
        combination of name and type to make it unique even outside of this
        summary.
      display_name: Will be used as the display name in TensorBoard.
        Defaults to `name`.
      description: A longform readable description of the summary data. Markdown
        is supported.
      tensor: Tensor to display in summary.
      content_type: Type of content inside the Tensor.
      components: Bitmask representing present parts (vertices, colors, etc.) that
        belong to the summary.
      json_config: A string, JSON-serialized dictionary of ThreeJS classes
        configuration.

    Returns:
      Tensor summary with metadata.
    r   N©r¬   )Újson_configrC   r  râ   r   rf   rã   r—  r×   )r:   Útensorboard.plugins.meshr¬   Ú	as_tensorÚcreate_summary_metadatarê   r   r  r6   r	   rë   r   rÃ   Úget_instance_name)rž   Údisplay_nameÚdescriptionr^   rc  Ú
componentsr±  r:   r¬   Útensor_metadataÚtensor_summarys              r/   Ú_get_tensor_summaryr»  c  sé   € ó. Ý1àˆU�_‰_˜VÓ$€Fà×6Ñ6ØØØØØ�‰ØØð 7ó €Oô ØØ—.‘. Ó$×+Ñ+Ó-Ü%ä ×$Ñ$¨&¯,©,°q©/Ô:Ü ×$Ñ$¨&¯,©,°q©/Ô:Ü ×$Ñ$¨&¯,©,°q©/Ô:ðô
ô
€Fô —]‘]Ø×&Ñ& t¨\Ó:ØØ ô€Nð Ðr0   c                 ó<   — d}| �t        j                  | d¬«      }|S )z5Parse and returns JSON string from python dictionary.z{}T)Ú	sort_keys)ÚjsonÚdumps)Úconfig_dictr±  s     r/   Ú_get_json_configrÁ  ž  s#   € à€KØÐÜ—j‘j ¸Ô=ˆØÐr0   c                 óz  — ddl m} ddlm} t	        |«      }	g }
||j
                  f||j                  f||j                  fg}|D �cg c]
  }|d   €Œ	|‘Œ }}|j                  |D ��cg c]  \  }}|‘Œ	 c}}«      }|D ]%  \  }}|
j                  t        | ||||||	«      «       Œ' t        |
¬«      S c c}w c c}}w )a'  Output a merged `Summary` protocol buffer with a mesh/point cloud.

    Args:
      tag: A name for this summary operation.
      vertices: Tensor of shape `[dim_1, ..., dim_n, 3]` representing the 3D
        coordinates of vertices.
      faces: Tensor of shape `[dim_1, ..., dim_n, 3]` containing indices of
        vertices within each triangle.
      colors: Tensor of shape `[dim_1, ..., dim_n, 3]` containing colors for each
        vertex.
      display_name: If set, will be used as the display name in TensorBoard.
        Defaults to `name`.
      description: A longform readable description of the summary data. Markdown
        is supported.
      config_dict: Dictionary with ThreeJS classes names and configuration.

    Returns:
      Merged summary for mesh/point cloud representation.
    r   r°  )ÚMeshPluginDatar­   )r²  r¬   Ú(tensorboard.plugins.mesh.plugin_data_pb2rÃ  rÁ  ÚVERTEXÚFACEÚCOLORÚget_components_bitmaskrÄ   r»  r   )r«   ÚverticesÚcolorsÚfacesrÀ  r¶  r·  r¬   rÃ  r±  Ú	summariesÚtensorsr^   rc  r¸  s                  r/   r%   r%   §  sâ   € õ, 2ÝGä" ;Ó/€Kà€Ià	�>×(Ñ(Ð)Ø	�×#Ñ#Ð$Ø	�×%Ñ%Ð&ð€Gð
 %,ÖE˜&¨v°a©yÑ/DŠvÐE€GÐEØ×0Ñ0Ø4;×<Ñ0˜6 <ŠÓ<ó€Jð !(ò 
Ñˆ�Ø×ÑÜØØØØØØØóõ
	
ð
ô ˜Ô#Ð#ùò% Fùã<s   Á
B2ÁB2Á(B7
)ÚblackrÎ  rf   )NNN)NFFr4   )r   ÚNCHW)r   ÚCHWN)r   NN)é   )iD¬  )r“  N)NN)Yr¾  Úloggingr+   Útypingr   r:   r[   rY   Úgoogle.protobufr   Ú$tensorboard.compat.proto.summary_pb2r   r   r   Ú#tensorboard.compat.proto.tensor_pb2r   Ú)tensorboard.compat.proto.tensor_shape_pb2r	   Ú!tensorboard.plugins.custom_scalarr
   Ú,tensorboard.plugins.pr_curve.plugin_data_pb2r   Ú(tensorboard.plugins.text.plugin_data_pb2r   Ú_convert_npr   Ú_utilsr   r   Ú__all__Ú	getLoggerÚ__name__rº   rÁ   rÀ   r   r   rÇ   r¾   r8   r=   r?   ÚhalfÚfloat16Úbfloat16r  r¦  ÚdoubleÚint8r]   Úqint8rf  Úshortr¤  Úqint32Úint64Ú	complex32ÚchalfÚ	complex64ÚcfloatrÆ   Ú
complex128ÚcdoubleÚquint8Úquint4x2ré   r`   r„   r   r   r!   r   r   r   r   r   r   r   r   r   r   r   r    r"   r#   r$   r»  rÁ  r%   ræ   r0   r/   ú<module>rñ     s­  ðã Û Û å ã Û õ '÷ñ õ
 <Ý FÝ 8Ý JÝ Cå  ß 2ò€ð0 
ˆ×	Ñ	˜8Ó	$€ð&�5ð &˜Só &ð&�3ð &˜5ó &ð:˜5Ÿ<™<ð :¨D°©Ió :ð4˜eŸl™lð 4¨t°E©{ó 4ð �u—|‘|ð  ¨¨S©	ó  ðØ	‡J�J�˜JÐ(;Ð<ðà	‡M�M�I˜zÐ+>Ð?ðð 
‡N�N�] JÐ0CÐDðð 
‡M�M�J ¨_Ð=ð	ð
 
‡K�K�*˜k¨?Ð;ðð 
‡M�M�K ¨Ð?ðð 
‡L�L�; ¨oÐ>ðð 
‡J�J�˜I Ð7ðð 
‡K�K�*˜i¨Ð9ðð 
‡K�K�*˜i¨Ð9ðð 
‡K�K�*˜i¨Ð9ðð 
‡K�K�*˜i¨Ð9ðð 
‡I�I�
˜I Ð7ðð 
‡K�K�*˜i¨Ð9ðð 
‡L�L�:˜y¨/Ð:ðð  
‡K�K�*˜k¨?Ð;ð!ð" 
‡O�O�n nÐ6LÐMð#ð$ 
‡K�K�. .Ð2HÐIØ	‡O�O�n nÐ6LÐMØ	‡L�L�> >Ð3IÐJØ	‡J�J�˜J¨Ð8Ø	×Ñ�¨Ð8NÐOØ	‡M�M�O ^Ð5KÐLØ	‡K�K�*˜l¨OÐ<Ø	‡L�L�:˜|¨_Ð=Ø	‡N�N�Z ¨Ð?ñ5Ð ð<5 #ó 5ð ØØó(óVzóz(MòV"VòJ@óB@ó,5óp"@ðL KOó@ó"ó"ó4@ò$
óN@ò@#òLð  IMóPó4Pó6"9òJ8òvð OSô3$r0   