AlkantarClanX12

Your IP : 18.191.195.105


Current Path : /opt/cloudlinux/venv/lib64/python3.11/site-packages/clselect/__pycache__/
Upload File :
Current File : //opt/cloudlinux/venv/lib64/python3.11/site-packages/clselect/__pycache__/clselect.cpython-311.pyc

�

!�gW���ddlmZddlmZddlmZddlZddlZddlZddlmZddlm	Z	ddl
mZdd	l
mZmZdd
lmZddlmZGd�d
e��ZdS)�)�absolute_import)�print_function)�divisionN)�glob)�map)�configparser�)�ClSelectExcept�BaseClSelectException)�clprint)�	in_cagefsc���eZdZe��rdndZe�d�Ze�d�ZdZe�d�Ze�d�Z	e�d�Z
d	Zd
ZdZ
dZeezZe
ezZd
ZeezZe
ezZed���Zed���Zd2d�Zd�Zd�Zd�Zd�Zd�Zd�Zd3d�Zd�Zd�Z d�Z!d�Z"d3d�Z#d�Z$d4d!�Z%d"�Z&ee&��Z&d#�Z'ee'��Z'd$�Z(ee(��Z(d5d&�Z)d'�Z*d(�Z+d)�Z,d*�Z-d6d+�Z.d6d,�Z/d-�Z0d4d.�Z1d/�Z2d3d0�Z3d6d1�Z4d S)7�ClSelectz/etc/cl.selector.conf.dz/etc/cl.selectorz/selector.confz
/defaults.cfgz/usr/bin/phpz/native.confz
/user.confz/php.extensions.d/z/usr/sbin/cagefsctlz/var/lvez/var/lve/php.dat.dz
/php%s.datz/php_native_ver.datc��t��rdS	ddlm}m}n#t$rtd���wxYw|��s|��std���dSdS)Nr��!multiphp_system_default_is_ea_php�selector_modules_must_be_usedzCageFS not installed.zesystem default PHP version is alt-php. PHP Selector is disabled. Use cPanel MultiPHP manager instead.)r
�clcagefslib.selector.configurerr�ImportErrorrrs  �H/opt/cloudlinux/venv/lib64/python3.11/site-packages/clselect/clselect.py�%check_multiphp_system_default_versionz.ClSelect.check_multiphp_system_default_version/s����;�;�	��F�	A�w�w�w�w�w�w�w�w�w���	A�	A�	A�'�(?�@�@�@�	A����1�0�2�2�	Q�;X�;X�;Z�;Z�	Q�'�)P�Q�Q�
Q�	Q�	Q�	Q�	Qs��5c�T�tj�tj��S�N)�os�path�existsr�	USER_CONF��r�work_without_cagefszClSelect.work_without_cagefs<s���w�~�~�h�0�1�1�1r�phpc��||_|���|_i|_i|_t��|_d|_t�	��|_
|���dSr)�_item�_get_default_config_handler�_dh�_selector_contents�_native_contents�set�_hidden_extensions�_native_versionrr �without_cagefs�_load_config_files)�self�items  r�__init__zClSelect.__init__@sl����
��3�3�5�5���"$��� "���"%�%�%���#���&�:�:�<�<������!�!�!�!�!rc����fd�tj��d����f�fd�tj��fg}|D]\}}|��r�|�dS)Nc�h��tj���d����S)N�cli)rrr�_get_native_path�r-s�r�<lambda>z-ClSelect.check_requirements.<locals>.<lambda>Ns#�������t�'<�'<�U�'C�'C�D�D�rr2c�h��t��p#tj��j��Sr)r
rrr�	_CAGFSCTLr4s�rr5z-ClSelect.check_requirements.<locals>.<lambda>Rs ���	���E�r�w�~�~�d�n�'E�'E�r)r
�NativeNotInstalledr3�MissingCagefsPackage)r-�	utilities�	predicate�errors`   r�check_requirementszClSelect.check_requirementsJs����E�D�D�D��1�$�2G�2G��2N�2N�O�O�
�
F�E�E�E��3�5�5�
�	
�	�!*�	�	��I�u��y�{�{�
���K�	�	rc��ttj�|jd����D]}|�|���dS)Nz*.cfg)rrr�join�CONFIGS_DIR�_load_config_file)r-�filenames  rr,zClSelect._load_config_files\sM���R�W�\�\�$�*:�G�D�D�E�E�	-�	-�H��"�"�8�,�,�,�,�	-�	-rc��tjdd���}	|�|��n=#tj$r+}t	j|dt
|��z����d}~wwxYw	|j�|�	dd���
d����dS#tjtjf$rYdSwxYw)NF��
interpolation�strictzConfig is malformed, error: %s��message�
extensions�hide_extensions�,)
�ConfigParser�SafeConfigParser�read�Errorr
�FileProcessError�strr)�update�get�split�NoSectionError�
NoOptionError)r-�filepath�dh�es    rrAzClSelect._load_config_file`s��
�
*��e�
L�
L�
L��	M��G�G�H�������!�	M�	M�	M� �1��"B�S��V�V�"K�M�M�M�
M�����	M����	��#�*�*����|�%6�7�7�=�=�c�B�B�
D�
D�
D�
D�
D���+�\�-G�H�	�	�	��D�D�	���s'�.�A(�&A#�#A(�,AB/�/C�
Cc�,�|���}g}t|�����D]N}	|�|||d||d|jf���?#t
$rY�KwxYwt
|��S)zM
        Returns alternatives summary as tuple
        :rtype: tuple
        �version�data)�get_all_alternatives_data�sorted�keys�appendr#�KeyError�tuple)r-�alternatives�list_of_alternatives�alts    r�list_alternativeszClSelect.list_alternativesos���
�5�5�7�7��!���,�+�+�-�-�.�.�	�	�C�
�$�+�+��!�#�&�y�1�!�#�&�v�.�t�z�:�<�=�=�=�=���
�
�
���
�����)�*�*�*s�;A7�7
B�Bc��|js9	|���n##tjtjf$ricYSwxYw|jS)a�
        Returns dict of all selector config contents.
        If no data loads them
        :return:
        {'4.4': {'version': '4.4.9', 'data': {'lsphp': '/opt/alt/php44/usr/bin/lsphp',
                                              'php.ini': '/opt/alt/php44/etc/php.ini',
                                              'php': '/opt/alt/php44/usr/bin/php-cgi',
                                              'php-cli': '/opt/alt/php44/usr/bin/php'}}}
        :rtype: dict
        )r&�_load_alternatives_configr
�ConfigNotFound�WrongConfigFormatr4s rr]z"ClSelect.get_all_alternatives_data�sa���&�	�
��.�.�0�0�0�0��"�1�>�3S�T�
�
�
��	�	�	�
�����&�&s��>�>c��|js|���	||j|iS#t$rtj|���wxYw)z�
        Returns selector config contents of certain version as dict.
        If no data loads them
        @param version: string, selector version
        @return: dict
        )r&rhrar
�NoSuchAlternativeVersion�r-r[s  r�get_alternatives_datazClSelect.get_alternatives_data�sj���&�	-��*�*�,�,�,�	C��T�4�W�=�>�>���	C�	C�	C� �9�'�B�B�B�	C���s	�,�AFc��|���}	|j�d|j��}|||d||d|jfS#tjtf$r|�|��cYSwxYw)z/
        Gets default selector version
        �versionsr[r\)r]r%rSr#rLrUra�_compose_native_info)r-�show_native_versionrcr[s    r�get_versionzClSelect.get_version�s����5�5�7�7��	B��h�l�l�:�t�z�:�:�G���W�%�i�0��W�%�f�-�d�j�9�;�
;���+�X�6�	B�	B�	B��,�,�-@�A�A�A�A�A�	B���s�AA�+B�Bc��|���}|�||��|�|jd|j|j|f��}|�d�|��|j��dS)z/
        Sets default selector version
        )rp�
N)r]�_check_alternative�_process_ini_file�
DEFAULTS_PATH�_add_or_change_optionr#�_write_to_filer?�r-r[rc�defaults_contentss    r�set_versionzClSelect.set_version�s����5�5�7�7�������6�6�6� �2�2�����&�
�Z��!�	#�#��
	
����I�I�'�(�(�$�*<�	>�	>�	>�	>�	>rc��|���}|�||��|�|j|j|f|jd��}|�d�|��|j��dS)z5
        Removes disabled state from version
        �stateruN)r]rvrwrxr#�_remove_optionrzr?r{s    r�enable_versionzClSelect.enable_version�s����5�5�7�7�������6�6�6� �2�2���
�Z��!����	���
	
����I�I�'�(�(�$�*<�	>�	>�	>�	>�	>rc��|���}|�||��|�|j|j|f|jd��}|�d�|��|j��dS)z-
        Marks a vesrion as disabled
        )r�disabledruN)r]rvrwrxr#ryrzr?r{s    r�disable_versionzClSelect.disable_version�s����5�5�7�7�������6�6�6� �2�2���
�Z��!��&�!�	#�#��
	
����I�I�'�(�(�$�*<�	>�	>�	>�	>�	>rc�L�|j�|j�|��d��S)z�
        Method that allows you to check if some version is enabled in config.
        E.g. is_version_enabled('5.4') -> True
        :rtype: bool
        r)r%�
has_optionr#rms  r�is_version_enabledzClSelect.is_version_enabled�s3���8�&�&��j�j�'�'�*�G�5�5�5�	5rc�L�|���}|�|��}dddd�i}t|�����dgz}|D]4}||vri||<|�|��||d<d||d<�5	|j�d|j��}n##tj	tj
f$rd}YnwxYw	d||d<n"#t$rtj
|���wxYw|�d��||d<|�d��|�|d��t#t%|����D]+}||}	|	||	d||	dff||<�,t'|��S)	zl
        Returns state of alternatives
        @return: tuple[version, tuple[isEnabled, isDefault]]
        �nativeTF)�enabled�defaultr�r�rpr)r]rqr^r_r�r%rSr#rLrUrVrar
rl�pop�remover`�range�lenrb)
r-rrrc�native_info�summary�alt_versionsr[�default_version�idx�vs
          r�get_summaryzClSelect.get_summary�s���
�5�5�7�7���/�/�0C�D�D����%�@�@�A���l�/�/�1�1�2�2�h�Z�?��#�	0�	0�G��g�%�%�#%��� �*.�*A�*A�'�*J�*J�G�G��Y�'�*/�G�G��Y�'�'�	'�"�h�l�l�:�t�z�B�B�O�O���+�\�-G�H�	'�	'�	'�&�O�O�O�	'����	K�26�G�O�$�Y�/�/���	K�	K�	K� �9�/�J�J�J�	K����")�+�+�h�"7�"7���A������H�%�%�%����K��N�+�+�+���\�*�*�+�+�	)�	)�C��S�!�A�����I�&����I�&�(�!)�L�����\�"�"�"s� B/�/C�C�C�C>c�Z�	t|j��}|D]�}|���}|dkr�|���\}}}}|j|vr�@||jvr
i|j|<||j|d<d|j|vri|j|d<||j|d|<��|jst
jdd����dS#ttf$r'}t
jd|j�d|�d	�d����d}~wt$rt
j|j���wxYw)
a
        Parses selector config file and fills an instance config dict. Example:
        {'4.4': {'version': '4.4.9', 'data': {'lsphp': '/opt/alt/php44/usr/bin/lsphp',
                                              'php.ini': '/opt/alt/php44/etc/php.ini',
                                              'php': '/opt/alt/php44/usr/bin/php-cgi',
                                              'php-cli': '/opt/alt/php44/usr/bin/php'}}}
        :raises ClSelectExcept.ConfigNotFound:
        :raises ClSelectExcept.WrongConfigFormat:
        �r[r\Nzalt-php packages not foundrGzCannot read z: z
. Native used)�open�CONFIG_PATH�striprTr#r&r
ri�OSError�IOError�
ValueErrorrj)	r-�f�line�
stripped_liner.�
short_version�long_version�	item_pathrYs	         rrhz"ClSelect._load_alternatives_configs���	E��T�%�&�&�A��

Q�

Q�� $�
�
���
� �B�&�&��!.�!4�!4�!6�!6���}�l���:�T�)�)�� ��(?�?�?�=?�D�+�M�:�DP��'�
�6�y�A���!8��!G�G�G�EG�D�+�M�:�6�B�GP��'�
�6�v�>�t�D�D��*�
<�$�3�D�:�<�<�<�<�
<�
<����!�	8�	8�	8� �/�/�59�5E�5E�5E�q�q�q�I�6�8�8�8�
8������	E�	E�	E� �2�4�3C�D�D�D�	E���s�CC�D*�!"D�'D*Nc��tjdd���}t|_|r|�|��n|�|j��|S)z:
        Gets ConfigParser handler for future use
        NFrD)rLrQ�optionxformrNrx)r-rrXs   rr$z$ClSelect._get_default_config_handler'sS���
&�T�%�
H�
H�
H������	(��G�G�D�M�M�M�M��G�G�D�&�'�'�'��	rc�F�|dkr||vrtj|���dSdS)Nr�)r
rl)r[rcs  rrvzClSelect._check_alternative3s6���h���7�,�#>�#>� �9�'�B�B�B���#>�#>rc�^�dd�dgt|��z��z}||zS)z�
        Gets section header data tuple and returns ini section header string
        @param section_info: tuple
        @return: string
        z[%s]r�z%s)r?r�)�section_info�section_fmts  r�_make_section_headerzClSelect._make_section_header8s4���r�w�w��v��L�0A�0A�'A�B�B�B���\�)�)rc��ttd�|����}|r|ddkr|�d��|S)zN
        Removes empty lines from list and appends newline if missing
        c��|dkS)Nr�r)�is rr5z'ClSelect._smooth_data.<locals>.<lambda>Fs
��a�2�g�r���ru)�list�filterr`)r\s r�_smooth_datazClSelect._smooth_dataBsL���F�-�-��5�5�6�6���	�t�B�x�4�'�'��K�K������rTc
�f�g}g}g}	d}
d}d}|�|��}
	t|��}|D]�}|���}|�d��r_d}
d|vrd}|
|krd}t	|��dkr|�|��g}|�|||	||����|g}	��|
r|	�|����|�|����|�|||	||����|���n#ttf$rYnwxYw|s(d|
vr$dd|j
zdg}|�|��|}|s�	|�d��}n#tj
$rYnwxYw|d	kr:|�|||
d
d�|��zg||����n`|dkr8|�|��|�|||
g||����n"|�|||
g||����|S)
z�
        Parses ini file by sections,
        calls supplied callable to modify section is question,
        returns file as list of strings
        F�[Tz
[versions]rz%s = nativer�r��disable_extentionsz
modules = rK�enable_extentions)r�r�r��
startswithr��extendr`�closer�r�r#�
_get_builtinsr
�UnableToGetExtensionsr?)r-rr��functionr\�trace�action�contents�no_section_contents�section�
in_section�found�has_default�section_headerr�r�r��build_ins                  rrwzClSelect._process_ini_fileLs����� �����
������2�2�<�@�@��	��T�
�
�A��
5�
5���z�z�|�|���?�?�3�'�'��!%�J�#�t�+�+�&*��%��-�-� $���.�/�/�1�4�4� ���(;�<�<�<�.0�+��O�O�H�H�\�7�D�%�$P�$P�Q�Q�Q�#�f�G���5��N�N�4�(�(�(�(�'�.�.�t�4�4�4�4��O�O�H�H�\�7�D�%�H�H�I�I�I�
�G�G�I�I�I�I����!�	�	�	��D�	�����	�|�>�A�A�#�]�T�Z�%?��D�G��N�N�8�$�$�$��H��	W�
��-�-�h�7�7����!�7�
�
�
���
�����-�-�-���������WZ�W_�W_�`h�Wi�Wi�Hi�7j�lp�rw� x� x�y�y�y�y��.�.�.����H�%�%�%��������7G��u� U� U�V�V�V�V��������7G��u� U� U�V�V�V��s$�C>D"�"D6�5D6�&E<�<F�
Fc��d|jz}|���}	||d|}n&#t$r|�d���}YnwxYw|S)z�
        Retrives path to php binary for supplied version
        :param version: php version to retrive path
        :return: path to php binary. If alternative version not found native php binary path returned
        z%s-clir\r2)�suffix)r#r]rar3)r-r[r.rcrs     r�_get_php_binary_pathzClSelect._get_php_binary_path�sv���$�*�$���5�5�7�7��	7���(��0��6�D�D���	7�	7�	7��(�(��(�6�6�D�D�D�	7�����s�5� A�Ac��|���}d|�d��i}|���D]}|�|��||<�|S)a
        Retrives paths to php binary for all versions
        :return: Dictionary version -> path. Example:
            { '5.2': '/opt/alt/php52/usr/bin/php',
              '5.3': '/opt/alt/php53/usr/bin/php',
              'native': '/usr/bin/php'
            }
        r�)r]r�r_)r-rc�
paths_dictr[s    r�get_all_php_binaries_pathsz#ClSelect.get_all_php_binaries_paths�sk���5�5�7�7���� 9� 9�(� C� C�D�
�#�(�(�*�*�	E�	E�G�"&�";�";�G�"D�"D�J�w����rc���t��r
|j|zn	|j|z}t|d��5}|���cddd��S#1swxYwYdS)z�
        Retrives contents of cache file for supplied php version
        :param version: PHP version to read file
        :return: file contents
        �rN)r
�CACHEFILE_CAGEFS_PATTERN�CACHEFILE_PATTERNr�rN)r-r[rBr�s    r�_read_php_cache_filezClSelect._read_php_cache_file�s���?H�k�k�o�4�0�7�:�:�t�Oe�ho�Oo��
�(�C�
 �
 �	�A��6�6�8�8�	�	�	�	�	�	�	�	�	�	�	�	����	�	�	�	�	�	s�A�A�Ac�d�g}	|�|��}n)#ttf$rtj|���wxYwd\}}|�|��|�|��}}|dkrdn|t
|��z}|||�}tjd��}	|�	d��D]p}
|	�
|
��s�d�tj	d|
�������}||j
vr|�|���q|S)z�
        Gets php extensions from the /var/lve/phpX.X.dat cache file,
        which contains list of modules that are either compiled-in
        or enabled in /opt/alt/phpXX/etc/php.ini config file
        )z
[PHP Modules]z[Zendr�rz\wru�_z\s+)r�r�r�r
r��findr��re�compilerT�matchr?�lowerr)r`)r-r[�builtins�output�
start_pattern�end_pattern�start_index�	end_index�modules_list�module_pattern�ext�modules            rr�zClSelect._get_builtins�sE����	@��.�.�w�7�7�F�F����!�	@�	@�	@� �6�w�?�?�?�	@����
&>�"�
�{�!'���]�!;�!;�V�[�[��=U�=U�Y��&�"�,�,�a�a�+��M�@R�@R�2R���k�)�3�4����E�*�*���%�%�d�+�+�	(�	(�C�!�'�'��,�,�
���X�X�b�h�u�c�i�i�k�k�:�:�;�;�F��T�4�4�4�����'�'�'���s	��&Ac����|�|��}t|��dks||dkr|S|�tt	�fd�|������S)z�
        Adds 'modules' option to section or extends it
        @param section_info: tuple (item and version)
        @param section: list
        @param data: string
        @return: list
        rc�0��|����Sr)r�)r�r\s �rr5z)ClSelect._remove_option.<locals>.<lambda>�s���q�|�|�D�'9�'9�#9�r)r�r�r�r�r�)r-r�r�r\r�r�s   `  rr�zClSelect._remove_option�sv����2�2�<�@�@���w�<�<�1����'�!�*� <� <��N�� � ���9�9�9�9�G�D�D�E�E�G�G�	Grc�h�|�|��}t|��dks||dkr|Sd}tt|����D]'}||�|d��r|}n�(d|z}|r|||<n|�|��|�|��S)z�
        Adds 'modules' option to section or extends it
        @param section_info: tuple
        @param section: list
        @param data: tuple
        @return: list
        rNz%s = %s)r�r�r�r�r`r�)	r-r�r�r\r�r��oidxr��options	         rryzClSelect._add_or_change_option�s����2�2�<�@�@���w�<�<�1����'�!�*� <� <��N�����W���&�&�	�	�C��s�|�&�&�t�A�w�/�/�
�����
��T�!���	#�"�G�D�M�M��N�N�6�"�"�"�� � ��)�)�)rc���	t|d��}|�d|z��|���dS#ttf$r}tj||���d}~wwxYw)z$
        Saves data to file
        �wz%s
N)r��writer�r�r�r
�UnableToSaveData)r-�
file_contents�	file_pathr�rYs     rrzzClSelect._write_to_file�sz��	@��Y��$�$�A�
�G�G�F�]�*�+�+�+�
�G�G�I�I�I�I�I����!�	@�	@�	@� �1�)�Q�?�?�?�����	@���s�<A�A+�A&�&A+c�\�dddd�}|j}|r||vr|j�||��}|js|�|j��||jvrM|j|}tj�|��r!tj�|��s|S|j|jS)z5
        Returns path for native interpreter
        z-cliz.iniz-fpm)r2�ini�fpm)r#r'�_load_native_contentsrr�isfile�islink)r-r��suffixesr.rs     rr3zClSelect._get_native_path�s���
�������z���	;�f��(�(�!�Z�Z��&�)9�)9�:�D��$�	3��&�&�t�z�2�2�2��4�(�(�(��(��.�D��w�~�~�d�#�#�
�B�G�N�N�4�,@�,@�
����$�T�Z�0�0rc	��	t|j��}|D]`}|�d��r�||vr�d|vr�"tt	d�|�d������\}}||j|<�a||jvr|j|j|<|���dS#ttf$r|j|j|<YdSwxYw)z�
        Parses native.conf file and loads it as dict, for example:
        {'php-fpm': '/usr/local/sbin/php-fpm', 'php.ini': '/usr/local/lib/php.ini', 'php': '/usr/bin/php', 'php-cli': '/usr/bin/php'}
        �#�=c�*�|���Sr)r�)�xs rr5z0ClSelect._load_native_contents.<locals>.<lambda>s�������rN)r��NATIVE_CONFr�r�rrTr'�DEFAULT_PHP_PATHr�r�r�)r-�valuer�r�r.rs      rr�zClSelect._load_native_contents
s���
	A��T�%�&�&�A��
3�
3���?�?�3�'�'�����$�$���d�?�?��!�#�':�':�T�Z�Z��_�_�"M�"M�N�N�
��d�.2��%�d�+�+��D�1�1�1�/3�/D��%�e�,�
�G�G�I�I�I�I�I����!�	A�	A�	A�+/�+@�D�!�%�(�(�(�(�	A���s�B#B'�' C�
Cc���|sdd|���fS|�d���}|r+d|d�d�d|d�d�|���fSdd|���fS)Nr�F)�verboseznative (r�)r	)r3�get_native_version)r-�show_version�native_versions   rrqzClSelect._compose_native_info s����	?��X�t�'<�'<�'>�'>�>�>��0�0��0�?�?���	-�	-�%3�A�%6�%6�%6�8�8�%3�A�%6�%6�%6�8��)�)�+�+�-�
-���4�#8�#8�#:�#:�:�:rc�"�|jr|jStjd��}	t|jd��}|���}|���nF#ttf$r2}|r%tj
ddt|��d���Yd}~dSd}~wwxYw|���D]R}|�
|��}|r9|�d��|�d��}	}||	f|_||	fcS�SdS)Nz(PHP\s+(?P<full>(?P<short>\d+\.\d+)\.\d+)r��text�ERROR)�statusrH�short�full)r*r�r�r��CACHEFILE_NATIVE_VER_PATTERNrNr�r�r�r�
print_diagrQ�
splitlinesr��group)
r-r��version_patternr�r\rYr��mrrs
          rrzClSelect.get_native_version*s1����	(��'�'��*�%P�Q�Q��	��T�6��<�<�A��6�6�8�8�D�
�G�G�I�I�I�I����!�	�	�	��
S��"�6�g�#�a�&�&�+Q�+Q�R�R�R��4�4�4�4�4�����	�����O�O�%�%�	#�	#�D��%�%�d�+�+�A��
#��g�g�g�.�.�������t��(-�t�}��$��d�{�"�"�"�
#��ts�=A"�"B%�3'B � B%)r!)Fr)TN)T)5�__name__�
__module__�__qualname__r
�BASE_ETC_CL_SELECTORr�rxr�r�rr@r7�
CACHEFILE_DIR�CACHEFILE_CAGEFS_DIR�CACHEFILE_PHP_PATTERNr�r��CACHEFILE_PHP_NATIVE_PATTERNr	�#CACHEFILE_NATIVE_VER_CAGEFS_PATTERN�staticmethodrr r/r=r,rArfr]rnrsr}r�r�r�r�rhr$rvr�r�rwr�r�r�r�r�ryrzr3r�rqrrrrrrsB������8A�	���[�4�4�I[��)�9�9�9�K�+�:�:�:�M�%��)�7�7�7�K�'�3�3�3�I�)�=�=�=�K�%�I��M�/��(��%�(=�=��3�6K�K��#8� �#0�3O�#O� �*>�A]�*]�'��
Q�
Q��\�
Q��2�2��\�2�"�"�"�"����$-�-�-�
�
�
�+�+�+�$'�'�'�$C�C�C�B�B�B�B�>�>�>�>�>�>�>�>�>�5�5�5�#�#�#�#�B"E�"E�"E�H
�
�
�
�C�C�C�&��&8�9�9��*�*�*�(�<�(<�=�=����� �<��-�-�L�5�5�5�5�n���
�
�
�������:G�G�G�G�*�*�*�*�.	@�	@�	@�1�1�1�1�&A�A�A�,;�;�;�;������rr)�
__future__rrrrr��sysrr�r�future.movesrrL�clselectexceptr
r�
clselectprintr�clselect.utilsr
�objectrrrr�<module>r s��'�&�&�&�&�&�%�%�%�%�%�%�������	�	�	�	�	�	�	�	�
�
�
�
�������������5�5�5�5�5�5�A�A�A�A�A�A�A�A�"�"�"�"�"�"�$�$�$�$�$�$�d�d�d�d�d�v�d�d�d�d�dr