§
    1�ÅjjE  ã                  ó¦  — d dl mZ d dlZd dlZ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mc mZ d dlmZmZmZmZmZ erd dlmZmZ dKd„Z eh d£¦  «        Z ee¦  «        ZdZ dZ!dZ" G d„ d¦  «        Z#dLd„Z$dMd„Z%dNd„Z&dOd"„Z'	 	 	 	 dPdQd)„Z(	 	 	 	 dRdSd0„Z)dTd1„Z*dUd3„Z+dVd6„Z,dWd;„Z-dXd>„Z.dVd?„Z/dYdB„Z0dVdC„Z1dZdE„Z2d[dF„Z3d\dH„Z4d]dJ„Z5dS )^é    )ÚannotationsN)Úchain)ÚIOÚTYPE_CHECKING)ÚAttributeProtoÚFunctionProtoÚ
GraphProtoÚ
ModelProtoÚTensorProto)ÚCallableÚIterableÚbase_dirÚstrÚlocationÚtensor_nameÚ	read_onlyÚboolÚreturnÚintc                ó0   — t          j        | |||¦  «        S )z<Open external data via C++ and return a CRT file descriptor.)Ú	c_checkerÚ_open_external_data)r   r   r   r   s       úJC:\Projects\Historical\venv\Lib\site-packages\onnx/external_data_helper.pyÚ_open_external_data_fdr      s   € õ Ô(¨°8¸[È)ÑTÔTÐTó    >   ÚlengthÚoffsetÚbasepathÚchecksumr   é
   éd   i   c                  ó   — e Zd Zdd„ZdS )ÚExternalDataInfoÚtensorr   r   ÚNonec                ó¤  — d| _         d | _        d | _        d | _        d| _        t          ¦   «         }d}|j        D ]”}|j        t          v rt          | |j        |j
        ¦  «         Œ,|dz  }t          |¦  «        t          k     rK|j        d t          …         }t          |j        ¦  «        t          k    r|dz  }|                     |¦  «         Œ•|rht          |¦  «        }|t          |¦  «        z
  }t!          |¦  «        }|dk    r	|d|› d�z  }t#          j        d|› d|j        ›d	t(          › �d
¬¦  «         | j        �Ct+          | j        ¦  «        | _        | j        dk     rt-          d| j        › d|j        ›�¦  «        ‚| j        �Ct+          | j        ¦  «        | _        | j        dk     r!t-          d| j        › d|j        ›�¦  «        ‚d S d S )NÚ r   é   z...z and z morez&Ignoring unknown external data key(s) z for tensor z. Allowed keys: é   )Ú
stacklevelz/External data offset must be non-negative, got z/External data length must be non-negative, got )r   r   r   r   r   ÚsetÚexternal_dataÚkeyÚ_ALLOWED_EXTERNAL_DATA_KEYSÚsetattrÚvalueÚlenÚ_MAX_UNKNOWN_KEYS_IN_WARNINGÚ_MAX_KEY_DISPLAY_LENGTHÚaddÚsortedÚreprÚwarningsÚwarnÚnameÚ_SORTED_ALLOWED_KEYSr   Ú
ValueError)	Úselfr$   Úunknown_keysÚunknown_key_countÚentryÚ	truncatedÚshownÚextraÚkey_lists	            r   Ú__init__zExternalDataInfo.__init__=   s-  € ØˆŒØˆŒØˆŒØˆŒØˆŒå!$¡¤ˆØÐØÔ)ð 
	0ð 
	0ˆEàŒyÕ7Ð7Ð7Ý˜˜eœi¨¬Ñ5Ô5Ð5Ð5à! QÑ&Ð!Ý�|Ñ$Ô$Õ'CÒCÐCØ %¤	Ð*BÕ+BÐ*BÔ C�IÝ˜5œ9‘~”~Õ(?Ò?Ð?Ø! UÑ*˜	Ø ×$Ò$ YÑ/Ô/Ð/øàð 	Ý˜<Ñ(Ô(ˆEØ%­¨E©
¬
Ñ2ˆEÝ˜E‘{”{ˆHØ�qŠyˆyØÐ0 EÐ0Ð0Ð0Ñ0�ÝŒMð8¸ð 8ð 8Ø$œkð8ð 8å!5ð8ð 8ð ð	ñ ô ð ð Œ;Ð"Ý˜dœkÑ*Ô*ˆDŒKØŒ{˜QŠˆÝ ð2ÀdÄkð 2ð 2Ø"(¤+ð2ð 2ñô ð ð
 Œ;Ð"Ý˜dœkÑ*Ô*ˆDŒKØŒ{˜QŠˆÝ ð2ÀdÄkð 2ð 2Ø"(¤+ð2ð 2ñô ð ð #Ð"àˆr   N)r$   r   r   r%   )Ú__name__Ú
__module__Ú__qualname__rD   © r   r   r#   r#   <   s(   € € € € € ð0ð 0ð 0ð 0ð 0ð 0r   r#   Ú	data_fileú	IO[bytes]ÚinfoÚbytesc           
     óÔ  — t          j        |                      ¦   «         ¦  «        j        }|j        �B|j        |k    rt          d|j        › d|› d|›�¦  «        ‚|                      |j        ¦  «         |j        �Z|j        �|j        nd}||z
  }|j        |k    r t          d|j        › d|› d|› d|›�¦  «        ‚|                      |j        ¦  «        S |                      ¦   «         S )	a  Validate offset/length against actual file size and read data.

    Layer 3 defense-in-depth (CWE-400): prevents memory exhaustion even if the
    model was crafted via direct protobuf APIs that bypass Python parsing.

    Returns the raw bytes read from the file.
    NúExternal data offset (z) exceeds file size (ú) for tensor r   zExternal data length (z) exceeds available data (z bytes from offset )	ÚosÚfstatÚfilenoÚst_sizer   r;   Úseekr   Úread)rI   rK   r   Ú	file_sizeÚ
read_startÚ	availables         r   Ú#_validate_external_data_file_boundsrY   p   s/  € õ ”˜×)Ò)Ñ+Ô+Ñ,Ô,Ô4€Ià„{ÐØŒ;˜Ò"Ð"Ýð<¨¬ð <ð <Øð<ð <Ø,7ð<ð <ñô ð ð 	�Š�t”{Ñ#Ô#Ð#à„{ÐØ$(¤KÐ$;�T”[�[Àˆ
Ø 
Ñ*ˆ	ØŒ;˜Ò"Ð"Ýð.¨¬ð .ð .Øð.ð .Ø2<ð.ð .à)ð.ð .ñô ð ð
 �~Š~˜dœkÑ*Ô*Ð*Ø�>Š>ÑÔÐr   r$   r   c                óâ   — t          | ¦  «        }t          ||j        | j        d¦  «        }t	          j        |d¦  «        5 }t          ||| j        ¦  «        cddd¦  «         S # 1 swxY w Y   dS )aä  Reads and returns the raw bytes stored in the external file for tensor.

    Unlike load_external_data_for_tensor, this does not mutate tensor: the
    tensor's data_location and external_data fields are left untouched, so
    the tensor still faithfully describes where its data lives on disk.

    Arguments:
        tensor: a TensorProto object.
        base_dir: directory that contains the external data.

    Returns:
        The raw bytes read from the external data file.
    TÚrbN)r#   r   r   r9   rP   ÚfdopenrY   )r$   r   rK   ÚfdrI   s        r   Ú_read_external_data_bytesr^   “   s¿   € õ ˜FÑ#Ô#€DÝ	 ¨$¬-¸¼ÀdÑ	KÔ	K€BÝ	Œ�2�tÑ	Ô	ð Q 	Ý2°9¸dÀFÄKÑPÔPðQð Qð Qð Qñ Qô Qð Qð Qð Qð Qð Qð Qøøøð Qð Qð Qð Qð Qð Qs   ÁA$Á$A(Á+A(r%   c                óf   — t          | |¦  «        | _        t          j        | _        | j        dd…= dS )aÖ  Loads data from an external file for tensor and converts it to an in-memory tensor.
    Ideally TensorProto should not hold any raw data but if it does it will be ignored.

    After this call, tensor.raw_data holds the loaded bytes and tensor no longer
    describes external data: data_location is reset to DEFAULT and external_data is
    cleared.

    Arguments:
        tensor: a TensorProto object.
        base_dir: directory that contains the external data.
    N)r^   Úraw_datar   ÚDEFAULTÚdata_locationr,   )r$   r   s     r   Úload_external_data_for_tensorrc   §   s5   € õ 0°¸ÑAÔA€F„OÝ&Ô.€FÔØÔ˜Q˜Q˜QÐÐÐr   Úmodelr
   c                óh   — t          | ¦  «        D ]!}t          |¦  «        rt          ||¦  «         Œ"dS )z¡Loads external tensors into model

    Arguments:
        model: ModelProto to load external data to
        base_dir: directory that contains external data
    N)Ú_get_all_tensorsÚuses_external_datarc   )rd   r   r$   s      r   Úload_external_data_for_modelrh   ¸   sF   € õ # 5Ñ)Ô)ð <ð <ˆÝ˜fÑ%Ô%ð 	<Ý)¨&°(Ñ;Ô;Ð;øð<ð <r   r   ú
int | Noner   r   ú
str | Noner   c                ó†  — |                       d¦  «        st          d| j        › d�¦  «        ‚| j        d d …= t          j        | _        ||�t          |¦  «        nd |�t          |¦  «        nd ||dœ                     ¦   «         D ];\  }}|�4| j         	                    ¦   «         }||_
        t          |¦  «        |_        Œ<d S )Nr`   zTensor zH does not have raw_data field. Cannot set external data for this tensor.)r   r   r   r   r   )ÚHasFieldr;   r9   r,   r   ÚEXTERNALrb   r   Úitemsr4   r-   r   r0   )	r$   r   r   r   r   r   ÚkÚvr?   s	            r   Úset_external_datarq   Ä   sâ   € ð �?Š?˜:Ñ&Ô&ð 
ÝØk�f”kÐkÐkÐkñ
ô 
ð 	
ð 	Ô˜Q˜Q˜QÐÝ&Ô/€FÔàØ!'Ð!3•#�f‘+”+�+¸Ø!'Ð!3•#�f‘+”+�+¸ØØðð ÷ ‚e�g„gð
!ð 
!‰ˆˆ1ð ˆ=ØÔ(×,Ò,Ñ.Ô.ˆEØˆEŒIÝ˜a™&œ&ˆEŒKøð
!ð 
!r   Té   FÚall_tensors_to_one_fileÚsize_thresholdÚconvert_attributec                óä  — t          | ¦  «        }|rt          | ¦  «        }|rÐt          t          j        ¦   «         ¦  «        dz   }|rbt
          j                             |¦  «        rt          d¦  «        ‚t
          j         	                    |¦  «        rt          d|› d�¦  «        ‚|}|D ]D}|                     d¦  «        r-t          j        |j        ¦  «        |k    rt          ||¦  «         ŒEdS |D ]z}|                     d¦  «        rct          j        |j        ¦  «        |k    rF|j        }t#          |¦  «        s t          t          j        ¦   «         ¦  «        }t          ||¦  «         Œ{dS )aŽ  Call to set all tensors with raw data as external data. This call should precede 'save_model'.
    'save_model' saves all the tensors data as external data after calling this function.

    Arguments:
        model (ModelProto): Model to be converted.
        all_tensors_to_one_file (bool): If true, save all tensors to one external file specified by location.
            If false, save each tensor to a file named with the tensor name.
        location: specify the external file relative to the model that all tensors to save to.
            Path is relative to the model path.
            If not specified, will use the model name.
        size_threshold: Threshold for size of data. Only when tensor's data is >= the size_threshold
            it will be converted to external data. To convert every tensor with raw data to external data set size_threshold=0.
        convert_attribute (bool): If true, convert all tensors to external data
                       If false, convert only non-attribute tensors to external data

    Raise:
        ValueError: If location is not a relative path.
        FileExistsError: If a file already exists in location.
    z.datazDlocation must be a relative path that is relative to the model path.zExternal data file exists in ú.r`   N)Ú_get_initializer_tensorsrf   r   ÚuuidÚuuid1rP   ÚpathÚisabsr;   ÚexistsÚFileExistsErrorrl   ÚsysÚ	getsizeofr`   rq   r9   Ú_is_valid_filename)	rd   rs   r   rt   ru   ÚtensorsÚ	file_namer$   Útensor_locations	            r   Úconvert_model_to_external_datar…   à   s‡  € õ4 ' uÑ-Ô-€GØð *Ý" 5Ñ)Ô)ˆàð ;Ý�œ
™œÑ%Ô%¨Ñ/ˆ	Øð 	!ÝŒw�}Š}˜XÑ&Ô&ð Ý ØZñô ð õ Œw�~Š~˜hÑ'Ô'ð SÝ%Ð&QÀhÐ&QÐ&QÐ&QÑRÔRÐRØ ˆIØð 	5ð 	5ˆFà—’ 
Ñ+Ô+ð5å”M &¤/Ñ2Ô2°nÒDÐDå! &¨)Ñ4Ô4Ð4øð	5ð 	5ð ð 	;ð 	;ˆFà—’ 
Ñ+Ô+ð;å”M &¤/Ñ2Ô2°nÒDÐDà"(¤+�Ý)¨/Ñ:Ô:ð 8Ý&)­$¬*©,¬,Ñ&7Ô&7�OÝ! &¨/Ñ:Ô:Ð:øð	;ð 	;r   c                óÆ   — t          | ¦  «        D ]P}t          |¦  «        r?|                     d¦  «        st          d¦  «        ‚|j        dd…= t
          j        |_        ŒQdS )zåCall to set all tensors which use external data as embedded data.
    save_model saves all the tensors data as embedded data after
    calling this function.

    Arguments:
        model (ModelProto): Model to be converted.
    r`   úraw_data field doesn't exist.N)rf   rg   rl   r;   r,   r   ra   rb   )rd   r$   s     r   Ú convert_model_from_external_datarˆ     st   € õ # 5Ñ)Ô)ð 7ð 7ˆÝ˜fÑ%Ô%ð 	7Ø—?’? :Ñ.Ô.ð BÝ Ð!@ÑAÔAÐAØÔ$ Q Q QÐ'Ý#.Ô#6ˆFÔ øð7ð 7r   Ú	base_pathc                ó2  — t          | ¦  «        }|                      d¦  «        st          j        d¦  «        ‚t	          ||j        | j        d¦  «        }t          j        |d¦  «        5 }| 	                    dd¦  «         |j
        ��|                     ¦   «         }|j
        |z
  }d|cxk    rt          k    s5n t          j        d|j
        › d	| j        ›d
|› d|t          z   › d�	¦  «        ‚|dk    r|                     d|z  ¦  «         | 	                    |j
        ¦  «         |                     ¦   «         }|                     | j        ¦  «         t          | |j        ||                     ¦   «         |z
  ¦  «         ddd¦  «         dS # 1 swxY w Y   dS )a–  Writes tensor data to an external file according to information in the `external_data` field.
    The function checks the external is a valid name and located in folder `base_path`.

    Arguments:
        tensor (TensorProto): Tensor object to be serialized
        base_path: System path of a folder where tensor data is to be stored

    Raises:
        ValueError: If the external file is invalid.
    r`   r‡   Fzr+br   r)   NrN   rO   z( must be between the current file size (z) and rw   ó    )r#   rl   Úonnx_checkerÚValidationErrorr   r   r9   rP   r\   rT   r   ÚtellÚ_MAX_EXTERNAL_DATA_PADDINGÚwriter`   rq   )r$   r‰   rK   r]   rI   rV   Úpaddingr   s           r   Úsave_external_datar’   *  s  € õ ˜FÑ#Ô#€Dà�?Š?˜:Ñ&Ô&ð LÝÔ*Ð+JÑKÔKÐKå	 	¨4¬=¸&¼+ÀuÑ	MÔ	M€BÝ	Œ�2�uÑ	Ô	ð T Ø�Š�q˜!ÑÔÐØŒ;Ð"ð "ŸšÑ(Ô(ˆIØ”k IÑ-ˆGØ˜Ð=Ð=Ò=Ð=Õ#=Ò=Ð=Ð=Ð=Ý"Ô2ðA¨T¬[ð Að AÀvÄ{ð Að AØ>GðAð Aà Õ#=Ñ=ðAð Að Añô ð ð
 ˜Š{ˆ{Ø—’ ¨¡Ñ0Ô0Ð0à�NŠN˜4œ;Ñ'Ô'Ð'Ø—’Ñ!Ô!ˆØ�Š˜œÑ(Ô(Ð(Ý˜& $¤-°¸¿ºÑ9IÔ9IÈFÑ9RÑSÔSÐSð-Tð Tð Tñ Tô Tð Tð Tð Tð Tð Tð Tð Tøøøð Tð Tð Tð Tð Tð Ts   Á*DFÆFÆFÚonnx_model_protoúIterable[TensorProto]c                óV   — t          t          | ¦  «        t          | ¦  «        ¦  «        S )z=Scan an ONNX model for all tensors and return as an iterator.)r   rx   Ú_get_attribute_tensors©r“   s    r   rf   rf   T  s,   € åÝ Ð!1Ñ2Ô2ÝÐ/Ñ0Ô0ñô ð r   Ú	attributer   Úfuncú-Callable[[GraphProto], Iterable[TensorProto]]c              #  óÄ   K  — | j         t          j        k    r || j        ¦  «        E d{V —† | j         t          j        k    r| j        D ]} ||¦  «        E d{V —† ŒdS dS )zICreate an iterator through processing ONNX model attributes with functor.N)Útyper   ÚGRAPHÚgÚGRAPHSÚgraphs)r˜   r™   Úgraphs      r   Ú_recursive_attribute_processorr¢   \  s“   è è € ð „~�Ô-Ò-Ð-Ø�4˜	œÑ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ø„~�Ô.Ò.Ð.ØÔ%ð 	#ð 	#ˆEØ�t˜E‘{”{Ð"Ð"Ð"Ð"Ð"Ð"Ð"Ð"ð /Ð.ð	#ð 	#r   r¡   r	   c             #  ó‚   K  — | j         E d{V —† | j        D ]'}|j        D ]}t          |t          ¦  «        E d{V —† ŒŒ(dS )z@Create an iterator of initializer tensors from ONNX model graph.N)ÚinitializerÚnoder˜   r¢   Ú#_get_initializer_tensors_from_graph)r¡   r¥   r˜   s      r   r¦   r¦   g  s�   è è € àÔ Ð Ð Ð Ð Ð Ð Ð Ø”
ð ð ˆØœð 	ð 	ˆIÝ5ØÕ>ñô ð ð ð ð ð ð ð ð ð	ðð r   c              #  ó>   K  — t          | j        ¦  «        E d{V —† dS )z:Create an iterator of initializer tensors from ONNX model.N)r¦   r¡   r—   s    r   rx   rx   q  s0   è è € å2Ð3CÔ3IÑJÔJÐJÐJÐJÐJÐJÐJÐJÐJÐJr   Úgraph_or_functionúGraphProto | FunctionProtoc             #  ó¾   K  — | j         D ]R}|j        D ]H}|                     d¦  «        r	|j        V — |j        E d{V —† t          |t          ¦  «        E d{V —† ŒIŒSdS )zSCreate an iterator of tensors from node attributes of an ONNX model graph/function.ÚtN)r¥   r˜   rl   r«   r‚   r¢   Ú!_get_attribute_tensors_from_graph)r¨   r¥   r˜   s      r   r¬   r¬   v  s´   è è € ð "Ô&ð ð ˆØœð 	ð 	ˆIØ×!Ò! #Ñ&Ô&ð "Ø”kÐ!Ð!Ð!Ø Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ý5ØÕ<ñô ð ð ð ð ð ð ð ð ð		ðð r   c              #  ó|   K  — t          | j        ¦  «        E d{V —† | j        D ]}t          |¦  «        E d{V —† ŒdS )zDCreate an iterator of tensors from node attributes of an ONNX model.N)r¬   r¡   Ú	functions)r“   Úfunctions     r   r–   r–   „  si   è è € å0Ð1AÔ1GÑHÔHÐHÐHÐHÐHÐHÐHÐHØ$Ô.ð ?ð ?ˆÝ4°XÑ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>ð?ð ?r   Úfilenamec                ór   — t          j        d¦  «        }|                     | ¦  «        }t          |¦  «        S )z8Utility to check whether the provided filename is valid.z^[^<>:;,?"*|/]+$)ÚreÚcompileÚmatchr   )r°   Úexpr´   s      r   r�   r�   ‹  s/   € å
Œ*Ð'Ñ
(Ô
(€CØ�IŠI�hÑÔ€EÝ�‰;Œ;Ðr   c                óV   — |                       d¦  «        o| j        t          j        k    S )z?Returns true if the tensor stores data in an external location.rb   )rl   rb   r   rm   )r$   s    r   rg   rg   ’  s+   € ð 	�Š˜Ñ(Ô(ð 	9ØÔ ¥KÔ$8Ò8ðr   Ú	field_keyc                ó`   — t          | j        ¦  «        D ]\  }}|j        |k    r| j        |= ŒdS )a  Removes a field from a Tensor's external_data key-value store.

    Modifies tensor object in place.

    Arguments:
        tensor (TensorProto): Tensor object from which value will be removed
        field_key (string): The key of the field to be removed
    N)Ú	enumerater,   r-   )r$   r·   ÚiÚfields       r   Úremove_external_data_fieldr¼   š  sE   € õ ˜fÔ2Ñ3Ô3ð (ð (‰ˆˆ5ØŒ9˜	Ò!Ð!ØÔ$ QÐ'øð(ð (r   Úfilepathc                ó¼   — t          | ¦  «        D ]K}t          |¦  «        r:|                     d¦  «        r%t          ||¦  «         |                     d¦  «         ŒL| S )aÊ  Serializes data for all the tensors which have data location set to TensorProto.External.

    Note: This function also strips basepath information from all tensors' external_data fields.

    Arguments:
        model (ModelProto): Model object which is the source of tensors to serialize.
        filepath: System path to the directory which should be treated as base path for external data.

    Returns:
        ModelProto: The modified model object.
    r`   )rf   rg   rl   r’   Ú
ClearField)rd   r½   r$   s      r   Úwrite_external_data_tensorsrÀ   ¨  sj   € õ # 5Ñ)Ô)ð *ð *ˆõ
 ˜fÑ%Ô%ð 	*¨&¯/ª/¸*Ñ*EÔ*Eð 	*Ý˜v xÑ0Ô0Ð0Ø×Ò˜jÑ)Ô)Ð)øà€Lr   )
r   r   r   r   r   r   r   r   r   r   )rI   rJ   rK   r#   r   r   r   rL   )r$   r   r   r   r   rL   )r$   r   r   r   r   r%   )rd   r
   r   r   r   r%   )NNNN)r$   r   r   r   r   ri   r   ri   r   rj   r   rj   r   r%   )TNrr   F)rd   r
   rs   r   r   rj   rt   r   ru   r   r   r%   )rd   r
   r   r%   )r$   r   r‰   r   r   r%   )r“   r
   r   r”   )r˜   r   r™   rš   r   r”   )r¡   r	   r   r”   )r¨   r©   r   r”   )r°   r   r   r   )r$   r   r   r   )r$   r   r·   r   r   r%   )rd   r
   r½   r   r   r
   )6Ú
__future__r   rP   r²   r   ry   r7   Ú	itertoolsr   Útypingr   r   Úonnx.checkerÚcheckerrŒ   Úonnx.onnx_cpp2py_export.checkerÚonnx_cpp2py_exportr   Úonnx.onnx_pbr   r   r	   r
   r   Úcollections.abcr   r   r   Ú	frozensetr.   r5   r:   r2   r3   r�   r#   rY   r^   rc   rh   rq   r…   rˆ   r’   rf   r¢   r¦   rx   r¬   r–   r�   rg   r¼   rÀ   rH   r   r   ú<module>rË      s1  ðð #Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø 	€	€	€	Ø 
€
€
€
Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ð $Ð $à #Ð #Ð #Ð #Ð #Ð #Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð 3Ø2Ð2Ð2Ð2Ð2Ð2Ð2Ð2ðUð Uð Uð Uð* (˜iØ<Ð<Ð<ñô Ð ð �vÐ9Ñ:Ô:Ð Ø!Ð ØÐ ð 'Ð ð1ð 1ð 1ð 1ð 1ñ 1ô 1ð 1ðh ð  ð  ð  ðFQð Qð Qð Qð( ð  ð  ð  ð"	<ð 	<ð 	<ð 	<ð ØØØð!ð !ð !ð !ð !ð< %)ØØØ#ð7;ð 7;ð 7;ð 7;ð 7;ðt7ð 7ð 7ð 7ð 'Tð 'Tð 'Tð 'TðTð ð ð ð#ð #ð #ð #ðð ð ð ðKð Kð Kð Kð
ð ð ð ð?ð ?ð ?ð ?ðð ð ð ðð ð ð ð(ð (ð (ð (ðð ð ð ð ð r   