/ lib / PyInstaller / depend / bindepend.pyc
bindepend.pyc
  1  o

  2  �G�c��@s�dZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
  3  mZddl
  4  mZ
ddlmZmZddlmZe
�e�Ze�ZejrYddlmZddlZddlmZmZd7d	d
  5  �Zdd�Zd
d�Z e�!dd�Z"dd�Z#da$dd�Z%dd�Z&dd�Z'd8dd�Z(dd�Z)d7dd�Z*dd �Z+d9d!d"�Z,d7d#d$�Z-d%d&�Z.d'd(�Z/d)d*�Z0d+d,�Z1d-d.�Z2d/d0�Z3d1d2�Z4d3d4�Z5d5d6�Z6dS):z1
  6  Find external dependencies of binary libraries.
  7  �N)�compat)�log)�dylib�utils)�winutils)�get_python_lib)�winmanifest�winresourcecCs�g}tjrtj�t�d�g}tjr|�tj�tjddd��t	j|t
  8  ��t�dd��
tj�}|durEt|t�rA|�d|�n||}|D]}tj�||�}tj�|�r^t|�r^|SqGdS)z�
  9      Return the full path name of MOD.
 10  
 11      * MOD is the basename of a dll or pyd.
 12      * XTRAPATH is a path or list of paths to search first.
 13  
 14      Return the full path name of MOD. Will search the full Windows search path, as well as sys.path
 15      �pywin32_system32�Libz
site-packages�PATH�Nr)r�is_win�os�path�joinr�is_venv�append�base_prefix�sysr�get_system_path�getenv�split�pathsep�
 16  isinstance�str�insert�exists�matchDLLArch)�mod�xtrapathZ
pywin32_pathsZepath�p�npth�r#��C:\Users\Jacks.GUTTSPC\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\PyInstaller\depend\bindepend.py�
getfullnameof+s.	����
 17  �r%c	Cs�t�}tj|dd�}|jtjdtjdgddd�t|dg�D]
}t�|j�}|�	|�q t|dd�}|rU|j
 18  D]}|jdurTt�|j�}|�d	�d
 19  }|�	|d�q9|�
�|S)z�
 20      Find the binary dependencies of PTH.
 21  
 22      This implementation walks through the PE header and uses library pefile for that and supports 32/64bit Windows
 23      T��	fast_load�IMAGE_DIRECTORY_ENTRY_IMPORT�IMAGE_DIRECTORY_ENTRY_EXPORT)�directories�forwarded_exports_only�import_dllnames_only�DIRECTORY_ENTRY_IMPORT�DIRECTORY_ENTRY_EXPORTN�.rz.dll)�set�pefile�PE�parse_data_directories�DIRECTORY_ENTRY�getattrr�convert_dll_name_to_str�dll�add�symbols�	forwarderr�close)	�pth�dlls�pe�entryZdll_strZ
exportSymbols�symr:r7r#r#r$�_getImports_peJs,��
 24  
 25  �rAcCsHg}|D]}|\}}}tj�|�st|�dd}|�|||f�q|S)z�
 26      Ensure all binary modules in zipped eggs get extracted and included with the frozen executable.
 27  
 28      return  modified table of content
 29      r)rr�isfile�check_extract_from_eggr)�toc�new_toc�item�modnamer<�typr#r#r$�_extract_from_eggts
 30  rI�BindingRedirectz7name language arch oldVersion newVersion publicKeyTokencCs:t|j|jk|j|jk|j|jk|j|jk|j|jkg�S�N)�all�name�version�
 31  oldVersion�language�processorArchitecture�arch�publicKeyToken)�manifest�redirectr#r#r$�match_binding_redirect�s
 32  
 33  
 34  
 35  
 36  �rVc
 37  Cs�tjsdSz,tdurtj}tj|dd�}|jja|��|}tj|dd�}|jjtk}|��W|Stj	yF}zt
 38  d||f��d}~ww)z�
 39      Return True if the DLL given by filename matches the CPU type/architecture of the Python process running
 40      PyInstaller.
 41  
 42      Always returns True on non-Windows platforms.
 43  
 44      :param filename:
 45      :type filename:
 46      :return:
 47      :rtype:
 48      TNr&z2Cannot get architecture from file: %s
 49    Reason: %s)rr�_exe_machine_type�python_executabler1r2�FILE_HEADER�Machiner;�
PEFormatError�
 50  SystemExit)�filenameZ
 51  pefilenameZexe_per>Z
 52  match_arch�excr#r#r$r�s"

 53  ���rcCs�ddl}|��}|�|���t�tj���t�tj	���h}g}|D]}|s(q#t�|���}|�
 54  �s4q#||vr9q#|�|�q#t|dd�dd�}|S)a�
 55      Return list of paths that serve as prefixes for parent-directory preservation of collected binaries and/or
 56      shared libraries. If a binary is collected from a location that starts with a path from this list, the relative
 57      directory structure is preserved within the frozen application bundle; otherwise, the binary is collected to the
 58      frozen application's top-level directory.
 59      rNcSs
 60  t|j�SrK)�len�parents)�xr#r#r$�<lambda>�s
 61  z>_get_paths_for_parent_directory_preservation.<locals>.<lambda>T)�key�reverse)�site�getsitepackagesr�getusersitepackages�pathlib�Pathrr�resolve�prefix�is_dir�sorted)reZ
 62  orig_pathsZexcluded_paths�pathsrr#r#r$�,_get_paths_for_parent_directory_preservation�s$�rocCsRtjr|j}|j��dkr|j|vr|jS|D]}||jvr%|�|�Sq|jS)NZ	pythonwin)rr�parentrM�lowerr`�relative_to)Zsrc_filename�parent_dir_preservation_paths�
 63  parent_dirZparent_dir_preservation_pathr#r#r$�_select_destination_directory�s
 64  �rucCs�g}tjrt�}t|�}|D]a\}}}|��tvrqt�d|�t�|���tjr=t	|||�D]\}}	|�
 65  ||	df�q0t||�D],\}
 66  }|
 67  ��tvsR|��tvrSqBt�|���t�
|�}t||�}
|�
 68  t|
�|df�qBq|S)a�
 69      Expand LTOC to include all the closure of binary dependencies.
 70  
 71      `LTOC` is a logical table of contents, ie, a seq of tuples (name, path). Return LTOC expanded by all the binary
 72      dependencies of the entries in LTOC, except those listed in the module global EXCLUDES
 73  
 74      `manifest` may be a winmanifest.Manifest instance for a program manifest, so that all dependent assemblies of
 75      python.exe can be added to the built exe.
 76  
 77      `redirects` may be a list. Any assembly redirects found via policy files will be added to the list as
 78      BindingRedirect objects so they can later be used to modify any manifests that reference the redirected assembly.
 79      zAnalyzing %s�BINARY)rrrorI�upper�seen�logger�debugr8�getAssemblyFilesr�
selectImportsrhrirur)ZlTOCr rT�	redirectsrs�nmr<rH�ftocnm�fn�libr"�src_pathZdst_pathr#r#r$�Dependenciess*
 80  
 81  �
r�cCs�t�d�}|dur|Stjdkrtj�d�Sd}dd|fd|fd	|fd
 82  d|fg}|D].\}}d}|D]}|tjvrDtj�|t�|��}q2n|rOtj�||�}tj�|d
�Sq*td��)a

 83      Determine the default cache location
 84  
 85      This returns the ``PYTHON_EGG_CACHE`` environment variable, if set. Otherwise, on Windows, it returns a
 86      'Python-Eggs' subdirectory of the 'Application Data' directory.  On all other systems, it's '~/.python-eggs'.
 87      �PYTHON_EGG_CACHEN�ntz~/.python-eggszApplication Data))�APPDATAN)�USERPROFILE)�	HOMEDRIVE�HOMEPATH)r�))�HOMEN)�WINDIRr
zPython-Eggsz4Please set the PYTHON_EGG_CACHE environment variable)	rrrrMr�
 88  expanduser�environr�RuntimeError)Z	egg_cacheZapp_dataZ	app_homes�keys�subdir�dirnamercr#r#r$�pkg_resources_get_default_cache1s0
 89  
 90  �	
 91  �r�c
Cs�g}tjjr|�tjjtjj�}|�tjj�}t|�D]�\}}|���d�r�tjj�	|d|d��}tj�
 92  |�r�zt�|�}Wntj
yU}ztd||f��d}~ww|durdtj�	t�|d�}||dd�ryd�	||dd��g}	n|��}	|	D]E}
 93  tj�	||
 94  �}tj�
 95  |�s�tj�|�}tj�|�s�t�|�t|d��}|�|�|
 96  ��Wd�n1s�wY|�|||
 97  f�q|Sq|ddfgS)a�
 98      Check if path points to a file inside a python egg file, extract the file from the egg to a cache directory (
 99      following pkg_resources convention) and return [(extracted path, egg file path, relative path inside egg file)].
100  
101      Otherwise, just return [(original path, None, None)]. If path points to an egg file directly, return a list with
102      all files from the egg formatted like above.
103  
104      Example:
105      >>> check_extract_from_egg(r'C:\Python26\Lib\site-packages\my.egg\mymodule\my.pyd')
106      [(r'C:\Users\UserName\AppData\Roaming\Python-Eggs\my.egg-tmp\mymodule\my.pyd',
107      r'C:\Python26\Lib\site-packages\my.egg', r'mymodule/my.pyd')]
108      z.eggN�zError: %s %sz-tmp�/�wb)rr�altsep�replace�sepr�	enumeraterq�endswithrrB�zipfile�ZipFile�
109  BadZipfiler\r��namelistr��isdir�makedirs�open�write�readr)
r<Ztodir�rv�
110  components�irMZeggpth�egg�e�members�memberr��fr#r#r$rCYs@
��
111  ��rCc	Cs�|���d�r	gS|d}tj�|�r4t|d��}tjdd|��iii}Wd�n1s.wYn-zt�	|�}Wn%t
112  jjy`}z|j
dt
113  jkr[t�d|�gWYd}~S�d}~wwg}tj|vr�t|tj�r�|tjD]a}|tj|D]W}z$t��}d�|ttj�t|�t|�g�|_|�|tj||d�Wnty�tjd	|||dd
114  �Yq}w|jr�t�d|�t�d�d
d�|jD���|�|j�q}qt|S)a
115      On Windows return the dependent Side-by-Side (SxS) assemblies of a binary as a list of Manifest objects.
116  
117      Dependent assemblies are required only by binaries compiled with MSVC 9.0. Python 2.7 and 3.2 are compiled with
118      MSVC 9.0 and thus depend on Microsoft Redistributable runtime libraries 9.0.
119  
120      Python 3.3+ is compiled with version 10.0 and does not use SxS assemblies.
121  
122      FIXME: Can this be removed since we now only support Python 3.5+?
123      FIXME: IS there some test-case covering this?
124      �	.manifest�rbr�rNz0Cannot get manifest resource from non-PE file %s�:Fz-Cannot parse manifest resource %s, %s from %s��exc_infozDependent assemblies of %s:�, cSsg|]}|���qSr#)�getid)�.0�assemblyr#r#r$�
125  <listcomp>�sz!getAssemblies.<locals>.<listcomp>)rqr�rrrBr�r�RT_MANIFESTr��GetManifestResourcesr	�
126  pywintypes�error�args�ERROR_BAD_EXE_FORMATry�infor_�Manifestrrr]�parse_string�	Exception�dependentAssembliesrz�extend)	r<Z
127  manifestnm�fd�resr^r�rMrPrTr#r#r$�
getAssemblies�sN�������r�cCs^g}|rtdd�|jD��}t|�D]�}|����tvrq|r8|j|vr8t�d|j|�|j�	|�|�
128  |j�t�|j�sGt�
d|���q|jrSt�
d|���qddlm}|�d�rc|��}ng}t|�s�|jd	d
129  �}t|�r�|dur�|j}|��}	t�d|j||	�|�	t|j|j|j|j||	d
��|�rt�
130  |�����|D]]}
131  tj�|
132  �\}}|��dkr�|j|}
ntj�|
133  �}
|
}|jdvr�tj�|� �|�}dd�|
||
134  fD�\}
}}
135  |
136  ��tv�rt�
d|�t�
137  |
���t�
138  |
139  ���|�	||
140  f�q�	q�qt�!d|���qg}|D]}|d�"d�}|d�"d�}|�	||f��q|}|S)aF
141      Find all assemblies that are dependencies of the given binary and return the files that make up the assemblies as
142      (name, fullpath) tuples.
143  
144      If a WinManifest object is passed as `manifest`, also updates that manifest to reference the returned assemblies.
145      This is done only to update the built app's .exe with the dependencies of python.exe
146  
147      If a list is passed as `redirects`, and binding redirects in policy files are applied when searching for
148      assemblies, BindingRedirect objects are appended to this list.
149  
150      Return a list of pairs (name, fullpath)
151      css�|]}|jVqdSrK�rM)r��depr#r#r$�	<genexpr>�s�z#getAssemblyFiles.<locals>.<genexpr>zFAdding %s to dependent assemblies of final executable
152    required by %szSkipping assembly %szSkipping optional assembly %sr)�CONFZwin_no_prefer_redirectsF)�ignore_policiesNz#Adding redirect %s version %s -> %s)rMrPrRrSrO�
153  newVersionr�)Nr
�*�neutralcSsg|]	}|�t����qSr#)�encoder�getfilesystemencoding)r�rFr#r#r$r�sz$getAssemblyFiles.<locals>.<listcomp>z	Adding %szAssembly %s not found�asciir�)#r0r�r�r�rwrxrMryr�rr8r�include_libraryrz�optional�PyInstaller.configr��get�
154  find_filesr_rN�get_policy_redirectrJrPrQrSrr�splitextrq�basenamer�getlanguager��decode)r<rTr}r�Z	_depNamesr�r��filesZold_versionZnew_versionr��fname�fextr~rZnew_rvrF�a�br#r#r$r{�s|

155  
156  ��
157  �r{cCs,g}|durtj�|�g}nt|t�sJ�tj�|�g|}t|�}|D]o}|��tvr-q$tj	s9|}tj�
158  |�}nt||�}|rC|}n|}t�
|�sk|�d�dkrj|�d�dkrj|��tvrit�d|tj�
159  |��q$	|r�|��tvr�t�d|tj�
160  |�|�|�||f�q$t�|�r�t�d||�q$|S)zs
161      Return the dependencies of a binary that should be included.
162  
163      Return a list of pairs (name, fullpath)
164      N�	libpythonrzPython.frameworkzSkipping %s dependency of %sz"Adding %s dependency of %s from %sz"lib not found: %s dependency of %s)rrr�r�list�
165  getImportsrwrxrrr�r%rr��findryrzr�warn_missing_lib�warning)r<r r�r=r�r"Zcandidatelibr#r#r$r|s>
166  
167  �
168  �r|c
169  Cs�t�}tjrt�d�}ntjrt�d�}ntjrt�d�}nt�d�}tjd|gtj	tj	dd�}|j
170  ��D]}|s:q5|�d�rE|�
d�rEq5t|tj
171  d	�q5|j��D]�}|�|�}|r�tjr|�d
172  �}|rs|}tj�|�|�d�}n&|�d�}tj�|�}ntjr�|�d
�|�d�}}n|�d
�|�d�}}|dd�dvr�qRtjr�|���d�r�qRtj�|�r�||vr�|�|�qRt�|�r�t�d|||�qR|�
d�r�|�d�}	t|	�dkr�qR|	d� �}t�|�r�t�d||�qR|S)zk
173      Find the binary dependencies of PTH.
174  
175      This implementation is for ldd platforms (mostly unix).
176      zR^\s*(((?P<libarchive>(.*\.a))(?P<objectmember>\(.*\)))|((?P<libshared>(.*\.so))))$z^\s+(.*)\s+=>\s+(.*)$z\s*(.*?)\s+=>\s+(.*?)\s+\(.*\)�lddT)�stderr�stdout�universal_newlineszError relocating z symbol not found)�file�
177  libarchiveZobjectmemberZ	libsharedr��N�
178  )z
179  linux-gatez
180  linux-vdsoz/cygdrive/c/windows/systemz(Cannot find %s in path %s (needed by %s)z	not foundz=>rzCannot find %s (needed by %s))!r0r�is_aix�re�compile�is_hpux�is_solar�
181  subprocess�run�PIPEr��
182  splitlines�
183  startswithr��printrr��search�grouprrr��	is_cygwinrqrr8rr�ryr�rr_�strip)
184  r<�rsltZ
185  lddPatternr!�line�mr�r�rM�tokensr#r#r$�_getImports_lddIsb
186  
187  
188  
189  
190  �
191  �
192  
193  
194  �rcCs�ddlm}ddlm}ddlm}ddlm}t�}t�}||�}|j	D]}|�
195  �D]\}	}
196  }||vr9|�|�q+q%t�}|j	D]H}|jD]B}
|
dj
}||kr~|
d�d�}|�d�}tj�|�}t�d	|d
197  |�}tj�tj�||��}|�|g�qFd|vr�|�dg�qFqA|�tj�tjd
��tj�tj�|��}tj�tj�tj��}|D]�}|�d�r�|�dd�}d}|D],}tj�|�s�tj�||�}tj� tj�||��r�tj�tj�||��}|�|�nq�|s�t!�"|�r�t#�$d||�q�|�d��r|�dd�}z
|||d�}|�|�Wq�t%�yFz
|||d�}|�|�Wnt%�yC||��sAt!�"|��rAt#�$d||�YnwYq�w|S)zr
198      Find the binary dependencies of PTH.
199  
200      This implementation is for Mac OS X and uses library macholib.
201      r)�	dyld_find)�LC_RPATH)�MachO)�in_system_pathr�zutf-8�z*^@(executable_path|loader_path|rpath)(/|$)z\2z
202  .frameworkz	../../../r�z@rpathr/Nz"Cannot find path %s (needed by %s)z@loader_pathz@executable_path)�executable_path)&�
macholib.dyldr�macholib.mach_or�macholib.MachOr�
macholib.utilrr0�headersZwalkRelocatablesr8�commands�cmdr��rstriprrr�r��sub�normpathr�updaterr�abspathr�
203  executabler�r��isabsrrr�ryr��
204  ValueError)r<rrrrr�rxr��header�idxrMr�Z	run_paths�commandZcmd_type�rpathrZ	exec_pathZpython_bin_pathZ	final_lib�run_pathr#r#r$�_getImports_macholib�s~
205  
206  ��	
207  
208  
209  
210  ��
211  
212  ������rc
213  Cs�tjr9|���d�rgSzt|�WSty8}zt�d|�tjd|t|t	j
214  �d�gWYd}~Sd}~wwtjr@t|�St
|�S)zM
215      Forwards to the correct getImports implementation for the platform.
216      r�z+Cannot get binary dependencies for file: %sz  Reason: %sr�N)rrrqr�rAr�ryr�rr1r[�	is_darwinrr)r<�	exceptionr#r#r$r�
217  s
218  ��r�cCstjsJd��tjrt�dd�}ntjrt�dd�}nt�dd�}t|td|�tj	���}|durEt
219  ��t
220  j�
|�}|rEtj�|�sEJ�|dur�ddg}tjd	krZ|�d
221  dg�n|�dd
g�tjdkrxtjd	krr|�dg�n|�dg�z#ddl}|�d�}|r�tj�|�}|�tj�d|��nt�d�Wnty�t�d�Ynwtj�d�r�|�d�tjr�|�d�ntjr�tjd	kr�|�d�n|�d�ntjs�tjr�|�d�t||�}|dur�dStjs�tjs�tjr�|Stj�|�}tj�|t |��S)z�
222      Look for a library in the system.
223  
224      Emulate the algorithm used by dlopen. `name` must include the prefix, e.g., ``libpython2.4.so``.
225      zCCurrent implementation for Unix only (Linux, Solaris, AIX, FreeBSD)�LIBPATHr
�DYLD_LIBRARY_PATH�LD_LIBRARY_PATHNz/libz/usr/lib�32bitz/lib32z
226  /usr/lib32z/lib64z
227  /usr/lib64�intelz/usr/lib/i386-linux-gnuz/usr/lib/x86_64-linux-gnurZmultiarchsubdirz!Multiarch directory not detected.z#/data/data/com.termux/files/usr/libz/opt/freeware/libz/usr/local/lib/hpux32z/usr/local/lib/hpux64z/usr/local/lib)!r�is_unixr�rr�_which_library�filterrrrr�load_ldconfig_cache�LDCONFIG_CACHEr�rrB�architecturer��machine�	sysconfig�get_config_varr�rrryrz�ImportErrorr�r��
228  is_freebsd�
229  is_openbsdr��_get_so_name)rM�lpr�rnr*�arch_subdir�dirr#r#r$�findLibrary sb
230  
231  
232  
233  
234  ��
235  
236  
237  
238  r3cCsNt|�}ttjj|�D]}t�|�D]}||�r#tj�||�SqqdS)a9
239      Search for a shared library in a list of directories.
240  
241      Args:
242          name:
243              The library name including the `lib` prefix but excluding any `.so` suffix.
244          dirs:
245              An iterable of folders to search in.
246      Returns:
247          The path to the library if found or None otherwise.
248  
249      N)�_library_matcherr%rrr�listdirr)rM�dirs�matcherr�_pathr#r#r$r$ws
���r$cCst�|d�jS)zv
250      Create a callable that matches libraries if **name** is a valid library prefix for input library full names.
251      z[0-9]*\.)r�r��matchr�r#r#r$r4�sr4cCs>dd|g}d}tjrdd|g}d}t�|tj|��}|�d�S)zq
252      Return the soname of a library.
253  
254      Soname is useful when there are multiple symplinks to one library.
255      �objdumpz-pz\s+SONAME\s+([^\s]+)Zelfdumpz-dz\s+SONAME\s+[^\s]+\s+([^\s]+)r�)rr�r�r��exec_commandr�)r]r
�patternr�r#r#r$r/�s
256  
257  
258  r/cCs.dd�}tjr|tj�}|r|Sttj�}|D]#}tjD]}tj�|�|kr9tj	r3tj�
259  |�s3t|�}|Sqqtj	rOd|vrOdtj
dd�}t|�Stjra|tj�tjd��}|r`|SntjrttjD]}t|�}|rs|Sqgtjsztjr�|tjtj�tjd��}|r�|Sdd	�tj�f}t|��)
260  aO
261      Find dynamic Python library that will be bundled with frozen executable.
262  
263      NOTE: This is a fallback option when the Python executable is likely statically linked with the Python library and
264            we need to search more for it. For example, this is the case on Debian/Ubuntu.
265  
266      Return  full path to Python dynamic library or None when not found.
267  
268      We need to know name of the Python dynamic library for the bootloader. Bootloader has to know what library to
269      load and not try to guess.
270  
271      Some linux distributions (e.g. debian-based) statically link the Python executable to the libpython,
272      so bindepend does not include it in its output. In this situation let's try to find it.
273  
274      Custom Mac OS builds could possibly also have non-framework style libraries, so this method also checks for that
275      variant as well.
276      cWsZ|D](}tjD]"}tj�||�}tj�|�sqtj�|�}tj�|�s$q|SqdSrK)r�
PYDYLIB_NAMESrrrr�realpath)�libdirs�libdirrM�	full_pathr#r#r$�_find_lib_in_libdirs�s
277  �z5get_python_library_path.<locals>._find_lib_in_libdirszVERSION.dllzpython%d%d.dllNr�r�a�Python library not found: %s
278      This means your Python installation does not come with proper shared library files.
279      This usually happens due to missing development package, or unsuitable build parameters of the Python installation.
280  
281      * On Debian/Ubuntu, you need to install Python development packages:
282        * apt-get install python3-dev
283        * apt-get install python-dev
284      * If you are building Python by yourself, rebuild with `--enable-shared` (or, `--enable-framework` on macOS).
285      r�)r�is_ms_app_storerr�rXr=rrr�rrr%r�version_info�is_condarr#r3r�is_linux�IOError)rBZpython_libnamer=r]rM�pydll�msgr#r#r$�get_python_library_path�sN
286  
287  
288  ���
289  �	��	rJcCs8tj�|�r|Stjrt|�Stjrt|�Stj	�
290  |�S)z�
291      Given a library name, try to resolve the path to that library.
292  
293      If the path is already an absolute path, return it without searching.
294      )rrrrr#r3rr%�ctypes�util�find_libraryr�r#r#r$�findSystemLibrary	srNrK)NNN)NN)7�__doc__�collections�ctypes.utilrKrrhr�rr�r��PyInstallerrr�logging�PyInstaller.dependrr�PyInstaller.utils.win32r�	getLogger�__name__ryr0rxr�distutils.sysconfigrr1rr	r%rArI�
295  namedtuplerJrVrWrrorur�r�rCr�r{r|rrr�r3r$r4r/rJrNr#r#r#r$�<module>sV
296  
297  
298  *
299  !2
300  0
301  (0
302  4
303  [1YhWg