§
    œŠtj„;  ã                  óþ   — 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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Z ddlmZ dd	lmZmZmZmZ dd„Zdd„Zdd„Zdd„Z G d„ deee         eef         ¦  «        ZdgZdS )z©File search middleware for Anthropic text editor and memory tools.

This module provides Glob and Grep search tools that operate on files stored
in state or filesystem.
é    )ÚannotationsN)Úsuppress)ÚdatetimeÚtimezone)ÚPath)ÚLiteral)Útool)ÚAgentMiddlewareÚ
AgentStateÚContextTÚ	ResponseTÚ	candidater   ÚrootÚreturnÚboolc                ó¦   — 	 |                       ¦   «                              |                      ¦   «         ¦  «        S # t          t          f$ r Y dS w xY w)aø  Return True iff `candidate` resolves to a path inside `root` (symlinks resolved).

    Args:
        candidate: The path to check. It is resolved (following symlinks and
            normalizing `..`) before the containment check.
        root: The allowed root directory. Also resolved before comparison.

    Returns:
        `True` if the fully resolved `candidate` lies inside the resolved `root`,
        using path-segment boundaries; `False` otherwise (including on resolution
        errors).
    F)ÚresolveÚis_relative_toÚOSErrorÚ
ValueError)r   r   s     úe/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain/agents/middleware/file_search.pyÚ_is_within_rootr      sV   € ðØ× Ò Ñ"Ô"×1Ò1°$·,²,±.´.ÑAÔAÐAøÝ•ZÐ ð ð ð Øˆuˆuðøøøs   ‚8; »AÁAÚpatternÚstrúlist[str] | Nonec                ól   ‡‡— d| v rd| vrdS g Šd	ˆˆfd„Š	  ‰| ¦  «         n# t           $ r Y dS w xY w‰S )
z=Expand brace patterns like `*.{py,pyi}` into a list of globs.Ú}Ú{NÚcurrentr   r   ÚNonec                ó^  •— |                       d¦  «        }|dk    r‰                     | ¦  «         d S |                       d|¦  «        }|dk    rt          ‚| d |…         }| |dz   d …         }| |dz   |…         }|st          ‚|                     d¦  «        D ]} ‰||z   |z   ¦  «         Œd S )Nr   éÿÿÿÿr   é   ú,)ÚfindÚappendr   Úsplit)	r   ÚstartÚendÚprefixÚsuffixÚinnerÚoptionÚ_expandÚexpandeds	          €€r   r.   z)_expand_include_patterns.<locals>._expand3   sÖ   ø€ Ø—’˜SÑ!Ô!ˆØ�BŠ;ˆ;Ø�OŠO˜GÑ$Ô$Ð$ØˆFà�lŠl˜3 Ñ&Ô&ˆØ�"Š9ˆ9ÝÐà˜˜%˜”ˆØ˜˜q™˜˜Ô#ˆØ˜ ™	 C˜Ô(ˆØð 	ÝÐà—k’k #Ñ&Ô&ð 	.ð 	.ˆFØˆG�F˜V‘O fÑ,Ñ-Ô-Ð-Ð-ð	.ð 	.ó    )r   r   r   r    )r   )r   r.   r/   s    @@r   Ú_expand_include_patternsr1   ,   s…   øø€ à
ˆg€~€~˜# WÐ,Ð,Øˆtà€Hð.ð .ð .ð .ð .ð .ð .ð&Øˆ�ÑÔÐÐøÝð ð ð Øˆtˆtðøøøð €Os   —# £
1°1c                óö   ‡ — ‰ sdS t          ˆ fd„dD ¦   «         ¦  «        rdS t          ‰ ¦  «        }|€dS 	 |D ](}t          j        t	          j        |¦  «        ¦  «         Œ)n# t          j        $ r Y dS w xY wdS )z/Validate glob pattern used for include filters.Fc              3  ó    •K  — | ]}|‰v V — Œ	d S ©N© )Ú.0Úcharr   s     €r   ú	<genexpr>z,_is_valid_include_pattern.<locals>.<genexpr>S   s'   øè è € Ð
<Ð
<˜tˆ4�7ˆ?Ð
<Ð
<Ð
<Ð
<Ð
<Ð
<r0   )ú ú
úNT)Úanyr1   ÚreÚcompileÚfnmatchÚ	translateÚerror)r   r/   r   s   `  r   Ú_is_valid_include_patternrB   N   sµ   ø€ àð Øˆuå
Ð
<Ð
<Ð
<Ð
<Ð';Ð
<Ñ
<Ô
<Ñ<Ô<ð Øˆuå'¨Ñ0Ô0€HØÐØˆuðØ!ð 	5ð 	5ˆIÝŒJ•wÔ(¨Ñ3Ô3Ñ4Ô4Ð4Ð4ð	5øåŒ8ð ð ð Øˆuˆuðøøøð ˆ4s   ·+A# Á#A6Á5A6Úbasenamec                ó`   ‡ — t          |¦  «        }|sdS t          ˆ fd„|D ¦   «         ¦  «        S )z8Return True if the basename matches the include pattern.Fc              3  óB   •K  — | ]}t          j         ‰|¦  «        V — Œd S r4   )r?   )r6   r   rC   s     €r   r8   z)_match_include_pattern.<locals>.<genexpr>i   s/   øè è € ÐNÐN¸	�wŒ˜x¨Ñ3Ô3ÐNÐNÐNÐNÐNÐNr0   )r1   r<   )rC   r   r/   s   `  r   Ú_match_include_patternrF   c   s@   ø€ å'¨Ñ0Ô0€HØð ØˆuåÐNÐNÐNÐNÀXÐNÑNÔNÑNÔNÐNr0   c                  óR   — e Zd ZdZdddœdd„Zdd„Zdd„Zdd„Zedd„¦   «         Z	dS ) ÚFilesystemFileSearchMiddlewareaž  Provides Glob and Grep search over filesystem files.

    This middleware adds two tools that search through local filesystem:

    - Glob: Fast file pattern matching by file path
    - Grep: Fast content search using ripgrep or Python fallback

    Example:
        ```python
        from langchain.agents import create_agent
        from langchain.agents.middleware import (
            FilesystemFileSearchMiddleware,
        )

        agent = create_agent(
            model=model,
            tools=[],  # Add tools as needed
            middleware=[
                FilesystemFileSearchMiddleware(root_path="/workspace"),
            ],
        )
        ```
    Té
   )Úuse_ripgrepÚmax_file_size_mbÚ	root_pathr   rJ   r   rK   Úintr   r    c               ó   ‡ — t          |¦  «                             ¦   «         ‰ _        |‰ _        |dz  dz  ‰ _        t
          ddˆ fd„¦   «         }t
          	 	 	 ddˆ fd„¦   «         }|‰ _        |‰ _        ||g‰ _        dS )a)  Initialize the search middleware.

        Args:
            root_path: Root directory to search.
            use_ripgrep: Whether to use `ripgrep` for search.

                Falls back to Python if `ripgrep` unavailable.
            max_file_size_mb: Maximum file size to search in MB.
        i   ú/r   r   Úpathr   c                óh  •— 	 ‰	                      |¦  «        }n# t          $ r Y dS w xY w|                     ¦   «         r|                     ¦   «         sdS |                      d¦  «        s,t          d„ |                      d¦  «        D ¦   «         ¦  «        rdS g }|                     | ¦  «        D ]·}|                     ¦   «         r¡t          |‰	j
        ¦  «        rŒdt          |                     ‰	j
        ¦  «        ¦  «        z   }|                     ¦   «         }t          j        |j        t"          j        ¬¦  «                             ¦   «         }|                     ||f¦  «         Œ¸|sdS |                     t-          j        d¦  «        d¬¦  «         d„ |D ¦   «         }d	                     |¦  «        S )
a«  Fast file pattern matching tool that works with any codebase size.

            Supports glob patterns like `**/*.js` or `src/**/*.ts`.

            Returns matching file paths sorted by modification time.

            Use this tool when you need to find files by name patterns.

            Args:
                pattern: The glob pattern to match files against.
                path: The directory to search in. If not specified, searches from root.

            Returns:
                Newline-separated list of matching file paths, sorted by modification
                time (most recently modified first). Returns `'No files found'` if no
                matches.
            zNo files foundrO   c              3  ó"   K  — | ]
}|d k    V — ŒdS )ú..Nr5   )r6   Úparts     r   r8   zOFilesystemFileSearchMiddleware.__init__.<locals>.glob_search.<locals>.<genexpr>»   s&   è è € Ð-ZÐ-Z¸t¨d°dªlÐ-ZÐ-ZÐ-ZÐ-ZÐ-ZÐ-Zr0   )Útzr#   T)ÚkeyÚreversec                ó   — g | ]\  }}|‘ŒS r5   r5   )r6   ÚpÚ_s      r   ú
<listcomp>zPFilesystemFileSearchMiddleware.__init__.<locals>.glob_search.<locals>.<listcomp>Î   s   € Ð1Ð1Ð1¡  1˜!Ð1Ð1Ð1r0   r:   )Ú_validate_and_resolve_pathr   ÚexistsÚis_dirÚ
startswithr<   r'   ÚglobÚis_filer   rL   r   Úrelative_toÚstatr   ÚfromtimestampÚst_mtimer   ÚutcÚ	isoformatr&   ÚsortÚoperatorÚ
itemgetterÚjoin)
r   rP   Ú	base_fullÚmatchingÚmatchÚvirtual_pathrc   Úmodified_atÚ
file_pathsÚselfs
            €r   Úglob_searchz<FilesystemFileSearchMiddleware.__init__.<locals>.glob_searchš   sÄ  ø€ ð&(Ø ×;Ò;¸DÑAÔA�	�	øÝð (ð (ð (Ø'Ð'Ð'ð(øøøð ×#Ò#Ñ%Ô%ð (¨Y×-=Ò-=Ñ-?Ô-?ð (Ø'Ð'ð ×!Ò! #Ñ&Ô&ð (­#Ð-ZÐ-ZÀwÇ}Â}ÐUXÑGYÔGYÐ-ZÑ-ZÔ-ZÑ*ZÔ*Zð (Ø'Ð'ð /1ˆHØ"Ÿš¨Ñ0Ô0ð Að A�ð —=’=‘?”?ð A¥°u¸d¼nÑ'MÔ'Mð Aà#&­¨U×->Ò->¸t¼~Ñ-NÔ-NÑ)OÔ)OÑ#O�LØ Ÿ:š:™<œ<�DÝ"*Ô"8¸¼Í8Ì<Ð"XÑ"XÔ"X×"bÒ"bÑ"dÔ"d�KØ—O’O \°;Ð$?Ñ@Ô@Ð@øàð (Ø'Ð'à�MŠM�hÔ1°!Ñ4Ô4¸dˆMÑCÔCÐCØ1Ð1¨Ð1Ñ1Ô1ˆJØ—9’9˜ZÑ(Ô(Ð(s   ƒ ™
'¦'NÚfiles_with_matchesÚincludeú
str | NoneÚoutput_modeú1Literal['files_with_matches', 'content', 'count']c                óÂ  •— 	 t          j        | ¦  «         n!# t           j        $ r}d|› �cY d}~S d}~ww xY w|rt          |¦  «        sdS d}‰j        rYt          t          t          j        t          j	        ¦  «        5  ‰ 
                    | ||¦  «        }ddd¦  «         n# 1 swxY w Y   |€‰                     | ||¦  «        }|sdS ‰                     ||¦  «        S )a¢  Fast content search tool that works with any codebase size.

            Searches file contents using regular expressions. Supports full regex
            syntax and filters files by pattern with the include parameter.

            Args:
                pattern: The regular expression pattern to search for in file contents.
                path: The directory to search in. If not specified, searches from root.
                include: File pattern to filter (e.g., `'*.js'`, `'*.{ts,tsx}'`).
                output_mode: Output format:

                    - `'files_with_matches'`: Only file paths containing matches
                    - `'content'`: Matching lines with `file:line:content` format
                    - `'count'`: Count of matches per file

            Returns:
                Search results formatted according to `output_mode`.
                    Returns `'No matches found'` if no results.
            zInvalid regex pattern: NzInvalid include patternzNo matches found)r=   r>   rA   rB   rJ   r   ÚFileNotFoundErrorÚ
subprocessÚCalledProcessErrorÚTimeoutExpiredÚ_ripgrep_searchÚ_python_searchÚ_format_grep_results)r   rP   ru   rw   ÚeÚresultsrr   s         €r   Úgrep_searchz<FilesystemFileSearchMiddleware.__init__.<locals>.grep_searchÑ   sn  ø€ ð65Ý”
˜7Ñ#Ô#Ð#Ð#øÝ”8ð 5ð 5ð 5Ø4°Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4øøøøð5øøøð ð 1Õ8¸ÑAÔAð 1Ø0Ð0ð ˆGØÔð KÝÝ%ÝÔ1ÝÔ-ñô ð Kð Kð
 #×2Ò2°7¸DÀ'ÑJÔJ�GðKð Kð Kñ Kô Kð Kð Kð Kð Kð Kð Køøøð Kð Kð Kð Kð ˆØ×-Ò-¨g°t¸WÑEÔE�àð *Ø)Ð)ð ×,Ò,¨W°kÑBÔBÐBs&   ƒ ˜6§1«6±6Á?B#Â#B'Â*B')rO   )r   r   rP   r   r   r   )rO   Nrt   )
r   r   rP   r   ru   rv   rw   rx   r   r   )	r   r   rL   rJ   Úmax_file_size_bytesr	   rs   rƒ   Útools)rr   rL   rJ   rK   rs   rƒ   s   `     r   Ú__init__z'FilesystemFileSearchMiddleware.__init__…   sÌ   ø€ õ  ˜i™œ×0Ò0Ñ2Ô2ˆŒØ&ˆÔØ#3°dÑ#:¸TÑ#AˆÔ õ 
ð4	)ð 4	)ð 4	)ð 4	)ð 4	)ð 4	)ñ 
Œð4	)õl 
ð Ø"&ØMað	4	Cð 4	Cð 4	Cð 4	Cð 4	Cð 4	Cñ 
Œð4	Cðl 'ˆÔØ&ˆÔØ! ;Ð/ˆŒ
ˆ
ˆ
r0   rP   r   c                óL  — |                      d¦  «        sd|z   }d|v sd|v rd}t          |¦  «        ‚|                     d¦  «        }| j        |z                       ¦   «         }	 |                     | j        ¦  «         n## t          $ r d|› �}t          |¦  «        d‚w xY w|S )z7Validate and resolve a virtual path to filesystem path.rO   rS   ú~zPath traversal not allowedzPath outside root directory: N)r_   r   ÚlstriprL   r   rb   )rr   rP   ÚmsgÚrelativeÚ	full_paths        r   r\   z9FilesystemFileSearchMiddleware._validate_and_resolve_path  sÌ   € ð �Š˜sÑ#Ô#ð 	Ø˜‘:ˆDð �4ˆ<ˆ<˜3 $˜;˜;Ø.ˆCÝ˜S‘/”/Ð!ð —;’;˜sÑ#Ô#ˆØ”^ hÑ.×7Ò7Ñ9Ô9ˆ	ð	,Ø×!Ò! $¤.Ñ1Ô1Ð1Ð1øÝð 	,ð 	,ð 	,Ø8°$Ð8Ð8ˆCÝ˜S‘/”/ tÐ+ð	,øøøð Ðs   Á&B Â B!r   Ú	base_pathru   rv   ú dict[str, list[tuple[int, str]]]c                óð  — 	 |                       |¦  «        }n# t          $ r i cY S w xY w|                     ¦   «         si S ddg}|r|                     d|g¦  «         |                     d|t	          |¦  «        g¦  «         	 t          j        |dddd¬¦  «        }n3# t
          j        t          f$ r |  	                    |||¦  «        cY S w xY wi }|j
                             ¦   «         D �]	}	 t          j        |¦  «        }	|	d	         d
k    rÉ|	d         d         d         }
t          t          |
¦  «        | j        ¦  «        sŒ[dt	          t          |
¦  «                             | j        ¦  «        ¦  «        z   }|	d         d         }|	d         d         d                              d¦  «        }||vrg ||<   ||                              ||f¦  «         Œî# t          j        t*          f$ r Y �Œw xY w|S )z Search using ripgrep subprocess.Úrgz--jsonz--globz--Té   F)Úcapture_outputÚtextÚtimeoutÚcheckÚtypern   ÚdatarP   r“   rO   Úline_numberÚlinesr:   )r\   r   r]   Úextendr   r{   Úrunr}   rz   r   ÚstdoutÚ
splitlinesÚjsonÚloadsr   r   rL   rb   Úrstripr&   ÚJSONDecodeErrorÚKeyError)rr   r   r�   ru   rl   ÚcmdÚresultr‚   Úliner—   rP   ro   Úline_numÚ	line_texts                 r   r~   z.FilesystemFileSearchMiddleware._ripgrep_search$  sM  € ð	Ø×7Ò7¸	ÑBÔBˆIˆIøÝð 	ð 	ð 	ØˆIˆIˆIð	øøøð ×ÒÑ!Ô!ð 	ØˆIð �XÐˆàð 	,à�JŠJ˜ 'Ð*Ñ+Ô+Ð+à�
Š
�D˜'¥3 y¡>¤>Ð2Ñ3Ô3Ð3ð
	DÝ”^ØØ#ØØØðñ ô ˆFˆFøõ Ô)Õ+<Ð=ð 	Dð 	Dð 	Dà×&Ò& w°	¸7ÑCÔCÐCÐCÐCð	Døøøð
 57ˆØ”M×,Ò,Ñ.Ô.ð 	ñ 	ˆDðÝ”z $Ñ'Ô'�Ø˜”< 7Ò*Ð*Ø œ<¨Ô/°Ô7�Dõ +­4°©:¬:°t´~ÑFÔFð !Ø à#&­­T°$©Z¬Z×-CÒ-CÀDÄNÑ-SÔ-SÑ)TÔ)TÑ#T�LØ# Fœ|¨MÔ:�HØ $ V¤¨WÔ 5°fÔ =× DÒ DÀTÑ JÔ J�Ià#¨7Ð2Ð2Ø02˜ Ñ-Ø˜LÔ)×0Ò0°(¸IÐ1FÑGÔGÐGøøÝÔ(­(Ð3ð ð ð Ø‘ðøøøð ˆs8   ‚ ˜'¦'ÂB Â-CÃCÃ/AGÅBGÇG3Ç2G3c           	     ó`  — 	 |                       |¦  «        }n# t          $ r i cY S w xY w|                     ¦   «         si S t          j        |¦  «        }i }t          j        |d¬¦  «        D �]@\  }}}	|	D �]5}
t          |¦  «        |
z  }t          || j	        ¦  «        sŒ+| 
                    ¦   «         sŒ@|rt          |j        |¦  «        sŒX|                     ¦   «         j        | j        k    rŒ{	 |                     ¦   «         }n# t"          t$          f$ r Y Œ¤w xY wt'          |                     ¦   «         d¦  «        D ]j\  }}|                     |¦  «        rPdt-          |                     | j	        ¦  «        ¦  «        z   }||vrg ||<   ||                              ||f¦  «         Œk�Œ7�ŒB|S )z%Search using Python regex (fallback).F)Úfollowlinksr#   rO   )r\   r   r]   r=   r>   ÚosÚwalkr   r   rL   ra   rF   Únamerc   Úst_sizer„   Ú	read_textÚUnicodeDecodeErrorÚPermissionErrorÚ	enumerater�   Úsearchr   rb   r&   )rr   r   r�   ru   rl   Úregexr‚   Ú	walk_rootÚ_dirsÚfilesr¬   Ú	file_pathÚcontentr¦   r¥   ro   s                   r   r   z-FilesystemFileSearchMiddleware._python_search]  s  € ð	Ø×7Ò7¸	ÑBÔBˆIˆIøÝð 	ð 	ð 	ØˆIˆIˆIð	øøøð ×ÒÑ!Ô!ð 	ØˆIå”
˜7Ñ#Ô#ˆØ46ˆõ (*¤w¨yÀeÐ'LÑ'LÔ'Lð 	Gñ 	GÑ#ˆI�u˜eØð Gñ G�Ý  ™OœO¨dÑ2�	õ ' y°$´.ÑAÔAð Øà ×(Ò(Ñ*Ô*ð Øð ð Õ#9¸)¼.È'Ñ#RÔ#Rð Øð —>’>Ñ#Ô#Ô+¨dÔ.FÒFÐFØðØ'×1Ò1Ñ3Ô3�G�GøÝ*­OÐ<ð ð ð Ø�Hðøøøõ '0°×0BÒ0BÑ0DÔ0DÀaÑ&HÔ&Hð Gð G‘N�H˜dØ—|’| DÑ)Ô)ð GØ'*­S°×1FÒ1FÀtÄ~Ñ1VÔ1VÑ-WÔ-WÑ'W˜Ø'¨wÐ6Ð6Ø46˜G LÑ1Ø Ô-×4Ò4°hÀÐ5EÑFÔFÐFøñGñ3Gð@ ˆs   ‚ ˜'¦'Ã1DÄDÄDr‚   rw   c           	     ó–  — |dk    r4d                      t          |                      ¦   «         ¦  «        ¦  «        S |dk    rfg }t          |                      ¦   «         ¦  «        D ]-}| |         D ]"\  }}|                     |› d|› d|› �¦  «         Œ#Œ.d                      |¦  «        S |dk    rjg }t          |                      ¦   «         ¦  «        D ]1}t	          | |         ¦  «        }|                     |› d|› �¦  «         Œ2d                      |¦  «        S d                      t          |                      ¦   «         ¦  «        ¦  «        S )z)Format grep results based on output mode.rt   r:   r¸   ú:Úcount)rk   ÚsortedÚkeysr&   Úlen)r‚   rw   r™   r·   r¦   r¥   r»   s          r   r€   z3FilesystemFileSearchMiddleware._format_grep_results‘  sZ  € ð Ð.Ò.Ð.à—9’9�V G§L¢L¡N¤NÑ3Ô3Ñ4Ô4Ð4à˜)Ò#Ð#àˆEÝ# G§L¢L¡N¤NÑ3Ô3ð Cð C�	Ø&-¨iÔ&8ð Cð C‘N�H˜dØ—L’L IÐ!AÐ!A°Ð!AÐ!A¸4Ð!AÐ!AÑBÔBÐBÐBðCà—9’9˜UÑ#Ô#Ð#à˜'Ò!Ð!àˆEÝ# G§L¢L¡N¤NÑ3Ô3ð 5ð 5�	Ý˜G IÔ.Ñ/Ô/�Ø—’ 	Ð3Ð3¨EÐ3Ð3Ñ4Ô4Ð4Ð4Ø—9’9˜UÑ#Ô#Ð#ð �yŠy� §¢¡¤Ñ/Ô/Ñ0Ô0Ð0r0   N)rL   r   rJ   r   rK   rM   r   r    )rP   r   r   r   )r   r   r�   r   ru   rv   r   rŽ   )r‚   rŽ   rw   r   r   r   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r†   r\   r~   r   Ústaticmethodr€   r5   r0   r   rH   rH   l   s©   € € € € € ðð ð8 !Ø "ðE0ð E0ð E0ð E0ð E0ð E0ðNð ð ð ð07ð 7ð 7ð 7ðr2ð 2ð 2ð 2ðh ð1ð 1ð 1ñ „\ð1ð 1ð 1r0   rH   )r   r   r   r   r   r   )r   r   r   r   )r   r   r   r   )rC   r   r   r   r   r   )rÂ   Ú
__future__r   r?   rž   ri   rª   r=   r{   Ú
contextlibr   r   r   Úpathlibr   Útypingr   Úlangchain_core.toolsr	   Ú!langchain.agents.middleware.typesr
   r   r   r   r   r1   rB   rF   rH   Ú__all__r5   r0   r   ú<module>rË      sŠ  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à %Ð %Ð %Ð %Ð %Ð %à ^Ð ^Ð ^Ð ^Ð ^Ð ^Ð ^Ð ^Ð ^Ð ^Ð ^Ð ^ðð ð ð ð&ð ð ð ðDð ð ð ð*Oð Oð Oð Oð@1ð @1ð @1ð @1ð @1 _°ZÀ	Ô5JÈHÐV_Ð5_Ô%`ñ @1ô @1ð @1ðH
 %ð€€€r0   