
    .Ph_                        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Zd dlZd dlZd dl	Z	d dl
mZ d dlmZ d dlmZmZmZmZmZmZmZmZmZ d dlmZmZ d dlmZ d dlmZ d dlm Z m!Z!m"Z"m#Z#m$Z$ d d	l%m&Z& d d
l'm(Z(m)Z) d dl*m+Z+m,Z, d dl-m.Z.m/Z/  ej0        e1          Z2 G d de          Z3 G d de          Z4 G d de          Z5 G d de          Z6de7dee7         dee7         dee7         de7f
dZ8de7de7fdZ9de dee7e.f         dee7e)f         d ee7         d!e7d"ee+         d#e7dee7e)f         fd$Z:d%eej;                 d&e7dee3         fd'Z<dd(de d!e7d)eed*                  deej;                 fd+Z=de d!e7d,e6de6fd-Z>de d"ee+         dee7         d!e7de6f
d.Z?de d!e7d/e7dee7e4f         fd0Z@de dee7         dee7e)f         d ee7         d!e7d"ee+         de6fd1ZAedee)         d!e7dee7         fd2            ZBd/e7ddfd3ZCdS )4    N)contextmanager)dedent)	AnyDictIterableIteratorListLiteralMutableSequenceOptionalSequence)urlsplit
urlunsplit)	TypedDict)	MatchSpec)PathLike_get_conda_flagsconda_env_overrideconda_pkgs_diris_micromamba)apply_categories)	HashModelLockedDependency)Channelnormalize_url_with_placeholders)
DependencyVersionedDependencyc                       e Zd ZU dZeed<   eee                  ed<   eee                  ed<   eed<   eed<   ee         ed<   eed<   eed	<   eed
<   eed<   eed<   dS )FetchActionzb
    FETCH actions include all the entries from the corresponding package's
    repodata.json
    channel
constrainsdependsfnmd5sha256namesubdir	timestampurlversionN)	__name__
__module____qualname____doc__str__annotations__r   r	   int     W/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/conda_lock/conda_solver.pyr   r   .   s          
 LLLc####d3i    GGG	HHHSM
IIIKKKNNN	HHHLLLLLr3   r   c                   P    e Zd ZU dZeed<   eed<   eed<   eed<   eed<   eed<   dS )	
LinkActionzv
    LINK actions include only entries from conda-meta, notably missing
    dependency and constraint information
    base_urlr    	dist_namer&   platformr*   N)r+   r,   r-   r.   r/   r0   r2   r3   r4   r6   r6   A   sR          
 MMMLLLNNN
IIIMMMLLLLLr3   r6   c                   <    e Zd ZU ee         ed<   ee         ed<   dS )InstallActionsLINKFETCHN)r+   r,   r-   r	   r6   r0   r   r2   r3   r4   r;   r;   O   s4         
z
r3   r;   c                       e Zd ZU eed<   dS )DryRunInstallactionsN)r+   r,   r-   r;   r0   r2   r3   r4   r?   r?   T   s         r3   r?   conda_dep_nameconda_versionbuildconda_channelreturnc                     t          |           }|r||d<   |r||d<   d|vrd|d<   |r||d<   t          di |}|rt          |          S |                                S )Nr&   r*   rC   *r    r2   )dictr   r/   conda_build_form)rA   rB   rC   rD   kwargsmss         r4   _to_match_specrM   X   s     ~&&&F *)y $wF"" #F9 *)y			V		B %2ww ""$$$r3   proc_stdoutc                     	 | |                      d          |                     d          dz            S # t          $ r | cY S w xY w)N{}   )indexrindex
ValueError)rN   s    r4   extract_json_objectrV   r   s_    ;,,S11K4F4Fs4K4Ka4OOPP   s   25 AAcondaspecslockedupdater9   channelsmapping_urlc                 V   d |                                 D             }d |                                 D             }t          |                              |          }	|	r#t          | ||||t	          |	                    }
nt          | |||          }
t          j        d|
           i }|
d         d         D ]}i }|                    d          pg D ]2}t          |          }|j
        }|j        |j        j        nd
}|||<   3t          |d         |d         d||t          |d         |          t          d|v r|d         nd
|                    d                              }|||d         <   t!          d |                                D             ||           |S )a  
    Solve (or update a previous solution of) conda specs for the given platform

    Parameters
    ----------
    conda :
        Path to conda, mamba, or micromamba
    specs :
        Conda package specifications
    locked :
        Previous solution for the given platform (conda packages only)
    update :
        Named of packages to update to the latest version compatible with specs
    platform :
        Target platform
    channels :
        Channels to query

    c                     g | ]H}t          |t                    r1|j        d k    "t          |j        |j        |j        |j                  IS rW   )
isinstancer   managerrM   r&   r*   rC   rD   .0deps     r4   
<listcomp>zsolve_conda.<locals>.<listcomp>   s[       c.// 58K74J4J 	sxci9JKK4J4J4Jr3   c                 4    i | ]}|j         d k    |j        |S r_   )ra   r&   rb   s     r4   
<dictcomp>zsolve_conda.<locals>.<dictcomp>   s(    WWWcw@V@VCHc@V@V@Vr3   )rW   r9   r[   rX   rY   rZ   )rW   r9   r[   rX   zdry_run_install:
%sr@   r=   r"   N r&   r*   rW   r)   )r[   r$   r%   )r$   r%   )r&   r*   ra   r9   dependenciesr)   hashc                 0    i | ]\  }}|j         d k    ||S r_   )ra   rc   kvs      r4   rg   zsolve_conda.<locals>.<dictcomp>   s*    JJJDAqQY'5I5I1a5I5I5Ir3   )	requestedplannedr\   )valuessetintersectionupdate_specs_for_archlistsolve_specs_for_archloggingdebuggetr   r&   r*   spec_strr   r   r   r   items)rW   rX   rY   rZ   r9   r[   r\   conda_specsconda_locked	to_updatedry_run_installrp   actionri   rd   	matchspecr&   r*   locked_dependencys                      r4   solve_condar   y   s   : <<>>  K
 XWV]]__WWWLF((66I 
/	??
 
 
 /	
 
 
 M(/::: G!),W5 4 4::i((.B 	) 	)C!#I>D.7.?.K	!**QS  ")L,9%%/uQQQ%*f__F5MM"zz(++  
 
 
 #4v JJEKKMMJJJ    Nr3   	pkgs_dirsr8   c           
         d}t          d|dz             D ]}| D ]b}||z  dz  dz  }|                                rAt          |          5 }t          j        |          }ddd           n# 1 swxY w Y   |c c S ct
                              d| d| d| d	           t          j        d
           t
                              d| d           dS )a`  Get the repodata_record.json of a given distribution from the package cache.

    On rare occasion during the CI tests, conda fails to find a package in the
    package cache, perhaps because the package is still being processed? Waiting for
    0.1 seconds seems to solve the issue. Here we allow for a full second to elapse
    before giving up.
    
   rR   infozrepodata_record.jsonNz(Failed to find repodata_record.json for z. Retrying in 0.1 seconds (/)g?z. Giving up.)	rangeexistsopenjsonloadloggerwarningtimesleep)r   r8   NUM_RETRIESretrypkgs_dirrecordfrepodatas           r4   _get_repodata_recordr      sS    Kq+/**  ! 	  	 H	)F25KKF}}  &\\ 9Q,0IaLLH9 9 9 9 9 9 9 9 9 9 9 9 9 9 9  	?y ? ?(-? ?0;? ? ?	
 	
 	
 	
3
NNUiUUUVVV4s   
A++A/2A/)methodr   )configr   c                    |t          |           rdnd}|dk    rt          |           ddddg}n|dk    rt          |           ddg}t          |          }t          j        ||                                          }t          |          }t          j        |          }d|v r	|d         }n d|v r	|d         }nt          d	| d
          d |D             }	|	S )zCExtract the package cache directories from the conda configuration.Nr   r   --jsonru   r   )envzpackage cachez!Unable to extract pkgs_dirs from z8. Please report this issue to the conda-lock developers.c                 6    g | ]}t          j        |          S r2   )pathlibPath)rc   ds     r4   re   z"_get_pkgs_dirs.<locals>.<listcomp>  s     999Qa999r3   )
r   r/   r   
subprocesscheck_outputdecoderV   r   loadsrU   )
rW   r9   r   argsr   outputjson_object_strjson_objectpkgs_dirs_listr   s
             r4   _get_pkgs_dirsr      s    ~*511=vE

HhD	6		E

FH-
X
&
&C$Ts333::<<F)&11O"&*_"="=Kk!!$[1	K	'	'$_5E E E E
 
 	
 :9.999Ir3   r   c                 2   d|d         vrg |d         d<   d|d         vrg |d         d<   d |d         d         D             }d |d         d         D             }t          |                                                              |                                          }|rt          | |          }ng }|D ]}||         }d|v r	|d         }	n~d|v rgt	          |d                   }	|	                    d	          r|	d
d         }	nE|	                    d          r|	d
d         }	n%t          d|	           t          d| d          t          ||	          }
|
t          d|	 d|           |d         d         	                    |
           |S )aI  
    Conda may choose to link a previously downloaded distribution from pkgs_dirs rather
    than downloading a fresh one. Find the repodata record in existing distributions
    that have only a LINK action, and use it to synthesize a corresponding FETCH action
    with the metadata we need to extract for the package plan.
    r<   r@   r=   c                      i | ]}|d          |S rG   r2   rc   ps     r4   rg   z._reconstruct_fetch_actions.<locals>.<dictcomp>  s    MMMQAfIqMMMr3   c                      i | ]}|d          |S rG   r2   r   s     r4   rg   z._reconstruct_fetch_actions.<locals>.<dictcomp>   s    OOOaQvYOOOr3   )rW   r9   r8   r#   .tar.bz2Ni.condaizUnknown filename format: z%Unable to extract the dist_name from .zDistribution 'z' not found in pkgs_dirs )
rr   keys
differencer   r/   endswithrU   r   FileNotFoundErrorappend)rW   r9   r   link_actionsfetch_actionslink_only_namesr   link_pkg_namelink_actionr8   r   s              r4   _reconstruct_fetch_actionsr     s    _Y///-/	"6*oi000.0	"7+MM/)*DV*LMMMLOO?9+Eg+NOOOM,++--..99-:L:L:N:NOOO "BBB			( = ="=1+%%#K0II[  K-..I!!*-- J%crcN		##H-- J%crcN		 !HY!H!HIIIS[SSSTTT'	9==#PPPYPP   		"7+228<<<<r3   c                    t          |           ddt          j                            t	                      d          ddg}|                    t          ||                     |                    |           t                              d||           t          	                    dt          j        |                      t          j        d	 |D             t          |          t          j        t          j        d
          }dt          j        ddfd}	 |                                 n# t          j        $ r 	 t%          j        |j                  }	 |d         }n!# t*          $ r t-          d           |}Y nw xY wnA# t$          j        $ r/}	t-          d|	 t0          j                   |j        }Y d}	~	nd}	~	ww xY wt-          d| t0          j                   |rt-          |t0          j                    ||            w xY w	 t%          j        t5          |j                            }
t7          | ||
          S # t$          j        $ r}	t9          d|j         d          |	d}	~	ww xY w)a  
    Solve conda specifications for the given platform

    Parameters
    ----------
    conda :
        Path to conda, mamba, or micromamba
    channels :
        Channels to query
    specs :
        Conda package specifications
    platform :
        Target platform

    createz--prefixprefix	--dry-runr   r[   r9   z%s using specs %sRunning command c                 ,    g | ]}t          |          S r2   r/   rc   args     r4   re   z(solve_specs_for_arch.<locals>.<listcomp>`  s    """cS"""r3   utf8r   stdoutstderrencodingprocrE   Nc                     t          d| j         t          j                   | j        r#t          d| j         t          j                   | j        r%t          d| j         t          j                   d S d S )Nz    Command: filez    STDOUT:
z    STDERR:
)printr   sysr   r   )r   s    r4   
print_procz(solve_specs_for_arch.<locals>.print_procg  s    )di))
;;;;; 	B/$+//cjAAAA; 	B/$+//cjAAAAAA	B 	Br3   messagez;Message key not found in json! returning the full json textzFailed to parse json, r   ,Could not lock the environment for platform zFailed to parse json: '')r/   ospathjoinr   extendr   r   r   rx   shlexr   runr   PIPECompletedProcesscheck_returncodeCalledProcessErrorr   r   r   KeyErrorr   JSONDecodeErrorr   r   rV   r   RuntimeError)rW   r[   rX   r9   r   r   r   err_jsonr   edryrun_installs              r4   rv   rv   >  s   , 	E


^%%x00"D 	KK (XFFFGGGKK
KK#Xu555
LL6EJt$4$466777>""T"""x((  DB4 B B B B B(   		"z$+..H#"9- # # #STTT"# # 	" 	" 	".1..SZ@@@@kGGGGGG	" 	E8EECJ	
 	
 	
 	
  	,'
++++
4'*L(,
3Ft{3S3S(T(T)%>JJJ L L LCT[CCCDD!KLss   D0 0H FE#"F#F>F FFHG%F>9H>GAH6I	 	I6I11I6r   c                 h   	 t          j        t          |           ddd|dgt          |          t           j                  }n# t           j        $ r}t          |j        t                    r|j        	                    d          n|j        }d|v r_t                              d|  d	           t          j        t          |           dd|dgt          |          t           j                  }n Y d
}~nd
}~ww xY w|	                    d          }d t          j        |          D             }|S )a  
    Get the installed conda packages for the given prefix.

    Try to get installed packages, first with --no-pip flag, then without if that fails.
    The --no-pip flag was added in Conda v2.1.0 (2013), but for mamba/micromamba only in
    v2.0.7 (March 2025).
    ru   z--no-pip-pr   )r   r   zutf-8z1The following argument was not expected: --no-pipz(The '--no-pip' flag is not supported by z. Please consider upgrading.Nc                      i | ]}|d          |S rG   r2   rc   entrys     r4   rg   z1_get_installed_conda_packages.<locals>.<dictcomp>  s+     ( ( (!&fu( ( (r3   )r   r   r/   r   STDOUTr   r`   r   bytesr   r   r   r   r   )rW   r9   r   r   r   
err_outputdecoded_output	installeds           r4   _get_installed_conda_packagesr     s_   (ZZT68D"8,,$
 
 

 (   (218U(C(CQAHOOG$$$ 	 ?*LLNN^5^^^    ,UVT68<&x00!(  FF  FFFF" ]]7++N( (*.*^*D*D( ( (I s   AA C<BC77C<c                    t          |                                |          5 }t          | ||          }d |D             fdt          |                              |          D             }|rkt          j        |           j                            d          rt          j        |          dz  dz  }	|		                                rJ t          |	d          5 }
t          |                                                              |          D ])}|
                    | d||         d	          d
           *	 ddd           n# 1 swxY w Y   t          |           dgt          ||          }t!          dt"          j                   n3t          |           t'          |           rdndgt          ||          }d g |d|dd|D             }t(                              dt-          j        |                      t1          j        |t5          |          t0          j        t0          j        d          }	 |                                 nY# t0          j        $ rG}t=          j        |j                   }tC          d| d|"                    d                     |d}~ww xY wt=          j        tG          |j                             }ndg g di}d|vrg g d|d<   d |d         d         D             }t          |                              |          D ]}||         }|d          d }|d!          d"|d#          }| d"| }||         j$        j%        }|tC          d$          ||         j$        j&        }|d         d%         '                    |d&         ||||||d	         d' ||d&                  j(        )                                D             g |d#         d(d)           |d         d         '                    |           tU          | ||          cddd           S # 1 swxY w Y   dS )*a  
    Update a previous solution for the given platform

    Parameters
    ----------
    conda :
        Path to conda, mamba, or micromamba
    specs :
        Conda package specifications
    locked :
        Previous solution for the given platform (conda packages only)
    update :
        Named of packages to update to the latest version compatible with specs
    platform :
        Target platform
    channels :
        Channels to query

    )r9   c                 8    i | ]}t          |          j        |S r2   )r   r&   )rc   rn   s     r4   rg   z)update_specs_for_arch.<locals>.<dictcomp>  s#    ===!1*A===r3   c                      g | ]
}|         S r2   r2   )rc   r&   spec_for_names     r4   re   z)update_specs_for_arch.<locals>.<listcomp>  s+     
 
 
$(M$
 
 
r3   mamba
conda-metapinnedwz ==r*   
NrZ   r   zWarning: mamba cannot update single packages without resorting to pinning. If the update fails to solve, try with conda or micromamba instead.r   installc                 ,    g | ]}t          |          S r2   r   r   s     r4   re   z)update_specs_for_arch.<locals>.<listcomp>  s.        C  r3   r   r   r   r   r   r   r   z: r   r@   )r<   r=   c                      i | ]}|d          |S rG   r2   r   s     r4   rg   z)update_specs_for_arch.<locals>.<dictcomp>  s    WWWE5=%WWWr3   r<   r8   r   r7   r   r9   z*Conda packages require non-null md5 hashesr=   r&   c                 F    g | ]\  }}| d |                                  S  striprl   s      r4   re   z)update_specs_for_arch.<locals>.<listcomp>+  sB           Aq 

q

((**     r3   r   )r&   r    r)   r#   r$   r%   r*   r"   r!   r'   r(   )+fake_conda_environmentrq   r   rr   rs   r   r   r&   
startswithr   r   r   r   writer/   r   r   r   r   r   r   rx   r   r   r   r   r   r   r   r   r   r   r   r   ry   rV   rj   r$   r%   r   ri   r{   r   )rW   rX   rY   rZ   r9   r[   r   r   r~   pinned_filenamer   r&   r   cmdr   excr   r   updatedpackager   r#   r    r)   r$   r%   r   s                             @r4   rt   rt     s   8 
 (	C	C	C cKv1%6JJ	==u===
 
 
 
,/	NN,G,G,O,O
 
 
	  ;	D |E""'227;; "),v"6"6"E"P*1133333/3// Q6 #INN$4$4 5 5 @ @ H H Q Q%O%O41K%O%O%OPPPPQQ Q Q Q Q Q Q Q Q Q Q Q Q Q Q JJ &x(KKK
 Z     JJ -e 4 4CHH) &x(KKK
 STS4SSS;SS  C LL=EJsOO==>>>>&x00!!  D%%''''0   :dk22"h8hhx||\eOfOfhh  -1J7J4;7W7W,X,XNN'"r)B)BCNN**13b(A(AN9%WW^I5Nv5VWWW9~~0099 	< 	<Gg&E+&000Bz*@@U:->@@G##r##C/&*C{"#OPPPG_)0F9%g.55!&M&$$Y/   $*5=$9$F$L$L$N$N      #%#J/!"   $ 9%f-44U;;;;)%>JJGcK cK cK cK cK cK cK cK cK cK cK cK cK cK cK cK cK cKs^   B;P; AE P;E	P;E	C5P;
IP;J5.AJ00J55E9P;;P?P?c              #   n  K   t          j                    5 }t          j        |          dz  }|                                 |dz                                   fd| D             D ]}t          |j                  }t          j        |j	                  }t          |j        |j        t          |j                  ddf          }|}|j        dv r|                    d          }|j        dv |j                            d          d         }		 t'          |	                    d	          d                   }
n# t(          $ r d
}
Y nw xY w|j        ||j        |j        j        |	|
|j        |j        j        |j        d |j                                        D             d
}|j        j        |j        j        |d<   t7          ||j        dz   z  d          5 }t9          j        ||d           ddd           n# 1 swxY w Y   t=          |           |V  ddd           dS # 1 swxY w Y   dS )z
    Create a fake conda prefix containing metadata corresponding to the provided dependencies

    Parameters
    ----------
    locked :
        Previous solution
    platform :
        Target platform

    r   historyc              3   H   K   | ]}|j         d k    |j        k    |V  dS )rW   N)ra   r9   )rc   rd   r9   s     r4   	<genexpr>z)fake_conda_environment.<locals>.<genexpr>K  sE       
 
S[G%;%;PX@X@XC@X@X@X@X
 
r3   N>   .gz.bz2.tarr   rh   -_r   c                 F    g | ]\  }}| d |                                  S r  r  rl   s      r4   re   z*fake_conda_environment.<locals>.<listcomp>e  s2    TTT41aqJJ1JJ,,..TTTr3   )
r&   r    r)   r$   rC   build_numberr*   r'   r#   r"   r%   z.jsonr      )indent)tempfileTemporaryDirectoryr   r   mkdirtouchr   r)   PurePosixPathr   r   schemehostnamer/   parentsuffixwith_suffixr&   splitr1   rU   rj   r$   r*   ri   r{   r%   r   r   dumpmake_fake_python_binary)rY   r9   r   
conda_metard   r)   r   r    truncated_pathrC   r  r   r   s    `           r4   r  r  8  s      
	$	&	& '&\&))L8
	i	&&(((
 
 
 
!
 
 
 "	, "	,C 37##C(22D S\3t{+;+;T4H G "N '+LLL!/!;!;B!?!? !'+LLL"'--c2226E!"5;;s#3#3B#788 ! ! ! ! "wx| ,;+*iTT3;K;Q;Q;S;STTT E x*"%(/hjN$7'$ABCHH .A	%1----. . . . . . . . . . . . . . .#F++++O' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' 's[   C:H*(D;:H*;E
H*	E

BH*G=1H*=HH*HH**H.1H.c                    t          j        |           dz  }|                    t          d                     t          j        dk    rt          j        |           dz  dz  }|j                            dd           t          j	        t          j
        |           t          j        |           dz  dz  }t          d	|  d
| d          }|                    |           dS t          j        |           dz  dz  }|j                            dd           t          dt          j
         d| d          }|                    |           |                    d           dS )a  Create a fake python binary in the given prefix.

    Our fake Conda environment contains metadata indicating that `python`
    is installed in the prefix, however no packages are installed.

    This is intended to prevent failure of `PrefixData.load_site_packages`
    which was introduced in libmamba v2. That function invokes the command
    `python -q -m pip inspect --local` to check for installed pip packages,
    where the `python` binary is the one in the conda prefix. Our fake
    prefix only contains the package metadata records, not the actual
    packages or binaries. At this stage for conda-lock, we are only
    interested in the conda packages, so we spoof the `python` binary
    to return an empty stdout so that things proceed without error.
    zfake_python_script.pya              import sys
            import shlex

            cmd = shlex.join(sys.argv)

            stderr_message = f'''            This is a fake python binary generated by conda-lock.

            It prevents libmamba from failing when it tries to check for installed             pip packages.

            For more details, see the docstring for `make_fake_python_binary`.

            This was called as:
                {cmd}
            '''

            print(stderr_message, file=sys.stderr, flush=True, end='')

            if "-m pip" in cmd:
                # Simulate an empty `pip inspect` output
                print('{}', flush=True)
            else:
                raise RuntimeError("Expected to invoke pip module with `-m pip`.")
            win32Scriptsz
python.exeT)parentsexist_okz
python.batz1            @echo off
            set PYTHONPATH=z;%PYTHONPATH%
            "z" %*
        binpythonz+            #!/usr/bin/env sh
            "z" "z" "$@"
        i  N)r   r   
write_textr   r   r9   r"  r  shutilcopyfile
executablechmod)r   fake_python_scriptfake_python_binarywrapper_batchwrapper_batch_contentshell_script_contents         r4   r'  r'  q  s     !f--0GG!!	
 	
  > |w$\&11I=L!''t'DDD(:;;;  V,,y8<G & ("( ( !( ( ( ! !
 	  !677777 %\&11E9HD!''t'DDD% 'n' '!3' ' '     	%%&:;;;  '''''r3   )Dr   rw   r   r   r   r2  r   r   r  r   
contextlibr   textwrapr   typingr   r   r   r   r	   r
   r   r   r   urllib.parser   r   typing_extensionsr   $conda_lock.interfaces.vendored_condar   conda_lock.invoke_condar   r   r   r   r   conda_lock.lockfiler   #conda_lock.lockfile.v2prelim.modelsr   r   conda_lock.models.channelr   r   conda_lock.models.lock_specr   r   	getLoggerr+   r   r   r6   r;   r?   r/   rM   rV   r   r   r   r   r   rv   r   rt   r  r'  r2   r3   r4   <module>rG     s     				        



   % % % % % %      
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 . - - - - - - - ' ' ' ' ' ' : : : : : :              1 0 0 0 0 0 K K K K K K K K N N N N N N N N G G G G G G G G 
	8	$	$    )   &           Y   
    I   %%C=% C=% C=	%
 	% % % %4S S    ZZZ Z &&'Z I	Z
 Z 7mZ Z 
#
 Z Z Z ZzGL!.1k   > 37	    W-./	
 
',   @**"*5B** * * *ZKLKLwKL 9KL 	KL
 KL KL KL KL\''' ' 
#z/	' ' ' 'TKK9K &&'K I	K
 K wK K K K KD 5%&5255c]5 5 5 5pH(C H(D H( H( H( H( H( H(r3   