§
    œŠtjv6  ã                  óî  — U d Z ddlmZ ddlZddlZddlZddlZddlmZm	Z	 ddl
mZ ddlmZ ddlmZ ddlmZ ed	         Z	  G d
„ de¦  «        Z G d„ de¦  «        Zeegee         f         Z	 d3d„Zd3d„Zd3d„Zd3d„Zd3d„ZeeeeedœZded<   	 dZ dZ!d4d„Z"d5d „Z#d!Z$d!Z%d5d"„Z&d5d#„Z'd6d&„Z(d7d+„Z) ed,¬-¦  «         G d.„ d/¦  «        ¦   «         Z* ed,¬-¦  «         G d0„ d1¦  «        ¦   «         Z+g d2¢Z,dS )8z5Shared redaction utilities for middleware components.é    )ÚannotationsN)ÚCallableÚSequence)Ú	dataclass)ÚLiteral)Úurlparse)Ú	TypedDict)ÚblockÚredactÚmaskÚhashc                  ó<   — e Zd ZU dZded<   ded<   ded<   ded<   dS )	ÚPIIMatchz1Represents an individual match of sensitive data.ÚstrÚtypeÚvalueÚintÚstartÚendN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__© ó    úd/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain/agents/middleware/_redaction.pyr   r      s:   € € € € € € Ø;Ð;à€I€I�IØ€J€J�JØ€J€J�JØ€H€H�H€H€Hr   r   c                  ó$   ‡ — e Zd ZdZd	ˆ fd„Zˆ xZS )
ÚPIIDetectionErrorz=Raised when configured to block on detected sensitive values.Úpii_typer   ÚmatchesúSequence[PIIMatch]ÚreturnÚNonec                ó°   •— || _         t          |¦  «        | _        t          |¦  «        }d|› d|› d�}t	          ¦   «                              |¦  «         dS )zÂInitialize the exception with match context.

        Args:
            pii_type: Name of the detected sensitive type.
            matches: All matches that were detected for that type.
        z	Detected z instance(s) of z in text contentN)r    Úlistr!   ÚlenÚsuperÚ__init__)Úselfr    r!   ÚcountÚmsgÚ	__class__s        €r   r)   zPIIDetectionError.__init__    sZ   ø€ ð !ˆŒÝ˜G‘}”}ˆŒÝ�G‘”ˆØK˜%ÐKÐK°ÐKÐKÐKˆÝ‰Œ×Ò˜ÑÔÐÐÐr   )r    r   r!   r"   r#   r$   )r   r   r   r   r)   Ú__classcell__)r-   s   @r   r   r      sC   ø€ € € € € ØGÐGðð ð ð ð ð ð ð ð ð r   r   Úcontentr   r#   úlist[PIIMatch]c                óD   — d}d„ t          j        || ¦  «        D ¦   «         S )z©Detect email addresses in content.

    Args:
        content: The text content to scan for email addresses.

    Returns:
        A list of detected email matches.
    z3\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\bc           	     ó    — g | ]K}t          d |                     ¦   «         |                     ¦   «         |                     ¦   «         ¬¦  «        ‘ŒLS )Úemail©r   r   r   r   ©r   Úgroupr   r   ©Ú.0Úmatchs     r   ú
<listcomp>z detect_email.<locals>.<listcomp><   s]   € ð ð ð ð õ 	ØØ—+’+‘-”-Ø—+’+‘-”-Ø—	’	‘”ð		
ñ 	
ô 	
ðð ð r   ©ÚreÚfinditer©r/   Úpatterns     r   Údetect_emailr@   2   s9   € ð E€Gðð õ ”[ ¨'Ñ2Ô2ðñ ô ð r   c           
     ó  — d}g }t          j        || ¦  «        D ]o}|                     ¦   «         }t          |¦  «        rJ|                     t          d||                     ¦   «         |                     ¦   «         ¬¦  «        ¦  «         Œp|S )zÍDetect credit card numbers in content using Luhn validation.

    Args:
        content: The text content to scan for credit card numbers.

    Returns:
        A list of detected credit card matches.
    z*\b\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}\bÚcredit_cardr4   )r<   r=   r6   Ú_passes_luhnÚappendr   r   r   )r/   r?   r!   r9   Úcard_numbers        r   Údetect_credit_cardrF   G   s’   € ð <€GØ€Gå”˜W gÑ.Ô.ð 
ð 
ˆØ—k’k‘m”mˆÝ˜Ñ$Ô$ð 	Ø�NŠNÝØ&Ø%ØŸ+š+™-œ-ØŸ	š	™œð	ñ ô ñô ð øð €Nr   c           
     óF  — g }d}t          j        || ¦  «        D ]†}|                     ¦   «         }	 t          j        |¦  «         n# t
          $ r Y Œ8w xY w|                     t          d||                     ¦   «         | 	                    ¦   «         ¬¦  «        ¦  «         Œ‡|S )z²Detect IPv4 or IPv6 addresses in content.

    Args:
        content: The text content to scan for IP addresses.

    Returns:
        A list of detected IP address matches.
    z!\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\bÚipr4   )
r<   r=   r6   Ú	ipaddressÚ
ip_addressÚ
ValueErrorrD   r   r   r   )r/   r!   Úipv4_patternr9   Úip_candidates        r   Ú	detect_iprN   b   s¿   € ð !€GØ7€Lå”˜\¨7Ñ3Ô3ð 
ð 
ˆØ—{’{‘}”}ˆð	ÝÔ  Ñ.Ô.Ð.Ð.øÝð 	ð 	ð 	ØˆHð	øøøà�ŠÝØØ"Ø—k’k‘m”mØ—I’I‘K”Kð	ñ ô ñ	
ô 	
ð 	
ð 	
ð €Ns   ±AÁ
AÁAc                óD   — d}d„ t          j        || ¦  «        D ¦   «         S )z«Detect MAC addresses in content.

    Args:
        content: The text content to scan for MAC addresses.

    Returns:
        A list of detected MAC address matches.
    z)\b([0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}\bc           	     ó    — g | ]K}t          d |                     ¦   «         |                     ¦   «         |                     ¦   «         ¬¦  «        ‘ŒLS )Úmac_addressr4   r5   r7   s     r   r:   z&detect_mac_address.<locals>.<listcomp>Š   s]   € ð ð ð ð õ 	ØØ—+’+‘-”-Ø—+’+‘-”-Ø—	’	‘”ð		
ñ 	
ô 	
ðð ð r   r;   r>   s     r   Údetect_mac_addressrR   €   s8   € ð ;€Gðð õ ”[ ¨'Ñ2Ô2ðñ ô ð r   c           
     óê  ‡‡	— g }d}t          j        || ¦  «        D ]}|                     ¦   «         }t          |¦  «        }|j        dv rQ|j        rJ|                     t          d||                     ¦   «         | 	                    ¦   «         ¬¦  «        ¦  «         Œ€d}t          j        || ¦  «        D ]¿}|                     ¦   «         | 	                    ¦   «         cŠ	Št          ˆˆ	fd„|D ¦   «         ¦  «        rŒH|                     ¦   «         }d|v s|                     d¦  «        rJd	|› �}t          |¦  «        }|j        r/d
|j        v r&|                     t          d|‰	‰¬¦  «        ¦  «         ŒÀ|S )z³Detect URLs in content using regex and stdlib validation.

    Args:
        content: The text content to scan for URLs.

    Returns:
        A list of detected URL matches.
    zhttps?://[^\s<>\"{}|\\^`\[\]]+>   ÚhttpÚhttpsÚurlr4   zy\b(?:www\.)?[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?:/[^\s]*)?c              3  óˆ   •K  — | ]<}|d          ‰cxk    o|d         k     nc p|d          ‰cxk     o|d         k    nc V — Œ=dS )r   r   Nr   )r8   Úmr   r   s     €€r   ú	<genexpr>zdetect_url.<locals>.<genexpr>º   sq   øè è € Ð_Ð_ÐRSˆq�Œz˜UÐ-Ð-Ò-Ð- Q u¤XÒ-Ð-Ð-Ð-ÐM°°7´¸cÐ1MÐ1MÒ1MÐ1MÀQÀuÄXÒ1MÐ1MÐ1MÐ1MÐ_Ð_Ð_Ð_Ð_Ð_r   ú/zwww.zhttp://ú.)r<   r=   r6   r   ÚschemeÚnetlocrD   r   r   r   ÚanyÚ
startswith)
r/   r!   Úscheme_patternr9   rV   ÚresultÚbare_patternÚtest_urlr   r   s
           @@r   Ú
detect_urlrd   •   s   øø€ ð !€Gð 7€Nå”˜^¨WÑ5Ô5ð ð ˆØ�kŠk‰mŒmˆÝ˜#‘”ˆØŒ=Ð-Ð-Ð-°&´-Ð-Ø�NŠNÝØØØŸ+š+™-œ-ØŸ	š	™œð	ñ ô ñô ð øð	Lð õ
 ”˜\¨7Ñ3Ô3ð ð ˆØ—[’[‘]”] E§I¢I¡K¤Kˆ
ˆˆsåÐ_Ð_Ð_Ð_Ð_ÐW^Ð_Ñ_Ô_Ñ_Ô_ð 	Øà�kŠk‰mŒmˆð �#ˆ:ˆ:˜Ÿš¨Ñ/Ô/ˆ:à& ��ˆHÝ˜hÑ'Ô'ˆFØŒ}ð  ¨¬Ð!5Ð!5Ø—’ÝØ"Ø!Ø#Øð	ñ ô ñô ð øð €Nr   )r3   rB   rH   rQ   rV   zdict[str, Detector]ÚBUILTIN_DETECTORSé   é   rE   Úboolc                ó  — d„ | D ¦   «         }t           t          |¦  «        cxk    rt          k    sn dS d}t          t	          |¦  «        ¦  «        D ]%\  }}|}|dz  dk    r|dz  }|dk    r|dz  }||z  }Œ&|dz  dk    S )z4Validate credit card number using the Luhn checksum.c                óT   — g | ]%}|                      ¦   «         ¯t          |¦  «        ‘Œ&S r   )Úisdigitr   )r8   Úds     r   r:   z _passes_luhn.<locals>.<listcomp>à   s+   € Ð9Ð9Ð9˜¨Q¯YªY©[¬[Ð9�c�!‰fŒfÐ9Ð9Ð9r   Fr   é   é   é	   é
   )Ú_CARD_NUMBER_MIN_DIGITSr'   Ú_CARD_NUMBER_MAX_DIGITSÚ	enumerateÚreversed)rE   ÚdigitsÚchecksumÚindexÚdigitr   s         r   rC   rC   Þ   s°   € à9Ð9˜kÐ9Ñ9Ô9€FÝ"¥c¨&¡k¤kÐLÐLÒLÐLÕ5LÒLÐLÐLÐLØˆuà€HÝ!¥(¨6Ñ"2Ô"2Ñ3Ô3ð ð ‰ˆˆuØˆØ�1‰9˜Š>ˆ>Ø�Q‰JˆEØ�qŠyˆyØ˜‘
�Ø�EÑˆˆØ�b‰=˜AÒÐr   r!   c                óÜ   — | }t          |t          j        d¦  «        d¬¦  «        D ]D}d|d                              ¦   «         › d�}|d |d         …         |z   ||d         d …         z   }ŒE|S )Nr   T©ÚkeyÚreversez
[REDACTED_r   ú]r   )ÚsortedÚoperatorÚ
itemgetterÚupper)r/   r!   ra   r9   Úreplacements        r   Ú_apply_redact_strategyrƒ   ï   s„   € Ø€FÝ˜¥XÔ%8¸Ñ%AÔ%AÈ4ÐPÑPÔPð Qð QˆØ; 5¨¤=×#6Ò#6Ñ#8Ô#8Ð;Ð;Ð;ˆØÐ(˜% œ.Ð(Ô)¨KÑ7¸&ÀÀuÄÀÀÔ:PÑPˆˆØ€Mr   é   c                óÐ  — | }t          |t          j        d¦  «        d¬¦  «        D �]½}|d         }|d         }|dk    rz|                     d¦  «        }t	          |¦  «        dk    rN|d	                              d
¦  «        }t	          |¦  «        d	k    r|d         › d|d         › �n
|d         › d�}�n
d}�n|dk    r_d                     d„ |D ¦   «         ¦  «        }	d|v rdnd|v rdnd}
|
rd|
› d|
› d|
› |	t           d …         › �}nµd|	t           d …         › �}n¡|dk    r;|                     d
¦  «        }t	          |¦  «        t          k    rd|d         › �nd}n`|dk    r$d|v rdnd}
d|
› d|
› d|
› d|
› d|
› |dd …         › �}n6|dk    rd}n-t	          |¦  «        t          k    rd|t           d …         › �nd}|d |d         …         |z   ||d         d …         z   }�Œ¿|S )Nr   Trz   r   r   r3   ú@rm   rn   r[   r   z@****.éÿÿÿÿz@****z****rB   Ú c              3  óB   K  — | ]}|                      ¦   «         ¯|V — Œd S )N)rk   )r8   Úcs     r   rY   z'_apply_mask_strategy.<locals>.<genexpr>  s/   è è € Ð!BÐ!B¨°a·i²i±k´kÐ!B !Ð!BÐ!BÐ!BÐ!BÐ!BÐ!Br   ú-ú z************rH   z*.*.*.rQ   ú:z**éþÿÿÿrV   z[MASKED_URL]r   )r~   r   r€   Úsplitr'   ÚjoinÚ_UNMASKED_CHAR_NUMBERÚ_IPV4_PARTS_NUMBER)r/   r!   ra   r9   r   r    ÚpartsÚdomain_partsÚmaskedÚdigits_onlyÚ	separatorÚoctetss               r   Ú_apply_mask_strategyr™   û   s»  € Ø€FÝ˜¥XÔ%8¸Ñ%AÔ%AÈ4ÐPÑPÔPð (Lñ (LˆØ�g”ˆØ˜”=ˆØ�wÒÐØ—K’K Ñ$Ô$ˆEÝ�5‰zŒz˜QŠˆØ$ QœxŸ~š~¨cÑ2Ô2�õ ˜<Ñ(Ô(¨1Ò,Ð,ð ˜Q”xÐ9Ð9 |°BÔ'7Ð9Ð9Ð9à! !œHÐ+Ð+Ð+ð ‘ð  �‘Ø˜Ò&Ð&ØŸ'š'Ð!BÐ!B¨UÐ!BÑ!BÔ!BÑBÔBˆKØ" e˜|˜|˜˜¸¸u¸¸°°È"ˆIØð Oð>˜9ð >ð >¨)ð >ð >¸ð >Ø"Õ$9Ð#9Ð#:Ð#:Ô;ð>ð >ð �ð
 O¨Õ5JÐ4JÐ4KÐ4KÔ(LÐNÐN��Ø˜ÒÐØ—[’[ Ñ%Ô%ˆFÝ.1°&©k¬kÕ=OÒ.OÐ.OÐ*˜f RœjÐ*Ð*Ð*ÐU[ˆFˆFØ˜Ò&Ð&Ø" e˜|˜|˜˜°ˆIà`�YÐ`Ð` )Ð`Ð`¨yÐ`Ð`¸IÐ`Ð`ÈÐ`ÐTYÐZ\ÐZ]ÐZ]ÔT^Ð`Ð`ð ˆFð ˜ÒÐØ#ˆFˆFõ �u‘:”:Õ 5Ò5Ð5ð 8�uÕ3Ð3Ð4Ð4Ô5Ð7Ð7Ð7àð ð
 Ð(˜% œ.Ð(Ô)¨FÑ2°V¸EÀ%¼L¸N¸NÔ5KÑKˆ‰Ø€Mr   c                óJ  — | }t          |t          j        d¦  «        d¬¦  «        D ]{}t          j        |d                              ¦   «         ¦  «                             ¦   «         d d…         }d|d         › d|› d	�}|d |d         …         |z   ||d
         d …         z   }Œ||S )Nr   Trz   r   é   ú<r   z_hash:ú>r   )r~   r   r€   ÚhashlibÚsha256ÚencodeÚ	hexdigest)r/   r!   ra   r9   Údigestr‚   s         r   Ú_apply_hash_strategyr£   )  s´   € Ø€FÝ˜¥XÔ%8¸Ñ%AÔ%AÈ4ÐPÑPÔPð Qð QˆÝ”  g¤× 5Ò 5Ñ 7Ô 7Ñ8Ô8×BÒBÑDÔDÀRÀaÀRÔHˆØ8˜% œ-Ð8Ð8¨vÐ8Ð8Ð8ˆØÐ(˜% œ.Ð(Ô)¨KÑ7¸&ÀÀuÄÀÀÔ:PÑPˆˆØ€Mr   ÚstrategyÚRedactionStrategyc                óú   — |s| S |dk    rt          | |¦  «        S |dk    rt          | |¦  «        S |dk    rt          | |¦  «        S |dk    rt          |d         d         |¦  «        ‚d|› �}t	          |¦  «        ‚)a¦  Apply the configured strategy to matches within content.

    Args:
        content: The content to apply strategy to.
        matches: List of detected PII matches.
        strategy: The redaction strategy to apply.

    Returns:
        The content with the strategy applied.

    Raises:
        PIIDetectionError: If the strategy is `'block'` and matches are found.
        ValueError: If the strategy is unknown.
    r   r   r   r
   r   r   zUnknown redaction strategy: )rƒ   r™   r£   r   rK   )r/   r!   r¤   r,   s       r   Úapply_strategyr§   2  sŸ   € ð& ð ØˆØ�8ÒÐÝ% g¨wÑ7Ô7Ð7Ø�6ÒÐÝ# G¨WÑ5Ô5Ð5Ø�6ÒÐÝ# G¨WÑ5Ô5Ð5Ø�7ÒÐÝ ¨¤
¨6Ô 2°GÑ<Ô<Ð<Ø
3¨Ð
3Ð
3€CÝ
�S‰/Œ/Ðr   r    ÚdetectorúDetector | str | NoneÚDetectorc                ó*  ‡ ‡‡— |€R‰ t           vr<d‰ › dt          t                                ¦   «         ¦  «        › d�}t          |¦  «        ‚t           ‰          S t	          |t
          ¦  «        rt          j        |¦  «        Šdˆˆ fd	„}|S |Šdˆ ˆfd
„}|S )a�  Return a callable detector for the given configuration.

    Args:
        pii_type: The PII type name.
        detector: Optional custom detector or regex pattern. If `None`, a built-in detector
            for the given PII type will be used.

    Returns:
        The resolved detector.

    Raises:
        ValueError: If an unknown PII type is specified without a custom detector or regex.
    NzUnknown PII type: z. Must be one of z or provide a custom detector.r/   r   r#   r0   c                óF   •— ˆfd„‰                      | ¦  «        D ¦   «         S )Nc           	     ó¢   •— g | ]K}t          ‰|                     ¦   «         |                     ¦   «         |                     ¦   «         ¬ ¦  «        ‘ŒLS )r4   r5   )r8   r9   r    s     €r   r:   z<resolve_detector.<locals>.regex_detector.<locals>.<listcomp>m  s^   ø€ ð ð ð ð õ Ø!ØŸ+š+™-œ-ØŸ+š+™-œ-ØŸ	š	™œð	ñ ô ðð ð r   )r=   )r/   r?   r    s    €€r   Úregex_detectorz(resolve_detector.<locals>.regex_detectorl  s>   ø€ ðð ð ð ð %×-Ò-¨gÑ6Ô6ðñ ô ð r   c                ó2   •— ˆfd„ ‰| ¦  «        D ¦   «         S )Nc                óÆ   •— g | ]]}t          |                     d ‰¦  «        |                     d|                     dd¦  «        ¦  «        |d         |d         ¬¦  «        ‘Œ^S )r   r   Útextrˆ   r   r   r4   )r   Úget)r8   rX   r    s     €r   r:   zCresolve_detector.<locals>._normalizing_detector.<locals>.<listcomp>€  sx   ø€ ð 
ð 
ð 
ð õ Ø—U’U˜6 8Ñ,Ô,Ø—e’e˜G Q§U¢U¨6°2Ñ%6Ô%6Ñ7Ô7Ø˜”jØ�e”Hð	ñ ô ð
ð 
ð 
r   r   )r/   r    Úraw_detectors    €€r   Ú_normalizing_detectorz/resolve_detector.<locals>._normalizing_detector  s:   ø€ ð
ð 
ð 
ð 
ð "�\ 'Ñ*Ô*ð
ñ 
ô 
ð 	
r   ©r/   r   r#   r0   )re   r&   ÚkeysrK   Ú
isinstancer   r<   Úcompile)r    r¨   r,   r®   r´   r?   r³   s   `    @@r   Úresolve_detectorr¹   S  só   øøø€ ð ÐØÕ,Ð,Ð,ða Xð að aÝ"&Õ'8×'=Ò'=Ñ'?Ô'?Ñ"@Ô"@ðað að að õ ˜S‘/”/Ð!Ý  Ô*Ð*Ý�(�CÑ Ô ð Ý”*˜XÑ&Ô&ˆð		ð 		ð 		ð 		ð 		ð 		ð 		ð Ðð €Lð	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð !Ð r   T)Úfrozenc                  óB   — e Zd ZU dZded<   dZded<   dZded	<   dd„ZdS )ÚRedactionRulez-Configuration for handling a single PII type.r   r    r   r¥   r¤   Nr©   r¨   r#   ÚResolvedRedactionRulec                ón   — t          | j        | j        ¦  «        }t          | j        | j        |¬¦  «        S )zzResolve runtime detector and return an immutable rule.

        Returns:
            The resolved redaction rule.
        )r    r¤   r¨   )r¹   r    r¨   r½   r¤   )r*   Úresolved_detectors     r   ÚresolvezRedactionRule.resolve•  s<   € õ -¨T¬]¸D¼MÑJÔJÐÝ$Ø”]Ø”]Ø&ð
ñ 
ô 
ð 	
r   )r#   r½   )r   r   r   r   r   r¤   r¨   rÀ   r   r   r   r¼   r¼   �  s[   € € € € € € à7Ð7à€M€M�MØ"*€HÐ*Ð*Ð*Ñ*Ø&*€HÐ*Ð*Ð*Ñ*ð
ð 
ð 
ð 
ð 
ð 
r   r¼   c                  ó:   — e Zd ZU dZded<   ded<   ded<   dd„ZdS )r½   z,Resolved redaction rule ready for execution.r   r    r¥   r¤   rª   r¨   r/   r#   útuple[str, list[PIIMatch]]c                ól   — |                       |¦  «        }|s|g fS t          ||| j        ¦  «        }||fS )zæApply this rule to content, returning new content and matches.

        Args:
            content: The text content to scan and redact.

        Returns:
            A tuple of (updated content, list of detected matches).
        )r¨   r§   r¤   )r*   r/   r!   Úupdateds       r   ÚapplyzResolvedRedactionRule.apply«  sE   € ð —-’- Ñ(Ô(ˆØð 	Ø˜B�;ÐÝ  ¨'°4´=ÑAÔAˆØ˜ÐÐr   N)r/   r   r#   rÂ   )r   r   r   r   r   rÅ   r   r   r   r½   r½   £  sQ   € € € € € € à6Ð6à€M€M�MØÐÐÑØÐÐÑð ð  ð  ð  ð  ð  r   r½   )
r   r   r¼   r½   r§   rF   r@   rN   rR   rd   rµ   )rE   r   r#   rh   )r/   r   r!   r0   r#   r   )r/   r   r!   r0   r¤   r¥   r#   r   )r    r   r¨   r©   r#   rª   )-r   Ú
__future__r   rž   rI   r   r<   Úcollections.abcr   r   Údataclassesr   Útypingr   Úurllib.parser   Útyping_extensionsr	   r¥   r   Ú	Exceptionr   r   r&   rª   r@   rF   rN   rR   rd   re   r   rq   rr   rC   rƒ   r‘   r’   r™   r£   r§   r¹   r¼   r½   Ú__all__r   r   r   ú<module>rÎ      sî  ðØ ;Ð ;Ð ;à "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ø €€€Ø 	€	€	€	Ø .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø !Ð !Ð !Ð !Ð !Ð !Ø Ð Ð Ð Ð Ð Ø !Ð !Ð !Ð !Ð !Ð !à 'Ð 'Ð 'Ð 'Ð 'Ð 'àÐ=Ô>Ð Ø Bðð ð ð ð ˆyñ ô ð ðð ð ð ð ˜	ñ ô ð ð" �S�E˜4 œ>Ð)Ô*€Ø Dðð ð ð ð*ð ð ð ð6ð ð ð ð<ð ð ð ð*9ð 9ð 9ð 9ðz Ø%Ø
Ø%Øð*ð *Ð ð ð ð ñ ð 9àÐ ØÐ ðð ð ð ð"ð ð ð ð Ð ØÐ ð+ð +ð +ð +ð\ð ð ð ðð ð ð ðB7!ð 7!ð 7!ð 7!ðt €�$ÐÑÔð
ð 
ð 
ð 
ð 
ñ 
ô 
ñ Ôð
ð* €�$ÐÑÔð ð  ð  ð  ð  ñ  ô  ñ Ôð ð.ð ð €€€r   