HEX
Server: Apache
System: Linux server2.voipitup.com.au 4.18.0-553.109.1.lve.el8.x86_64 #1 SMP Thu Mar 5 20:23:46 UTC 2026 x86_64
User: posscale (1027)
PHP: 8.2.30
Disabled: exec,passthru,shell_exec,system
Upload Files
File: //opt/saltstack/salt/lib/python3.10/site-packages/salt/cloud/clouds/__pycache__/xen.cpython-310.pyc
o

�N�gK��@sJdZddlZddlZddlmZddlmZddlZddlm	Z	m
Z
e�e�Z
zddlZdZWney:dZYnwdZdadd	�Zd
d�Zdd
�Zdd�Zdd�Zdd�Zdhdd�Zdidd�Zdjdd�Zdjdd�Zdkdd�Zdkdd�Zdkd d!�Zdjd"d#�Z dkd$d%�Z!d&d'�Z"d(d)�Z#d*d+�Z$d,d-�Z%d.d/�Z&d0d1�Z'dkd2d3�Z(dhd4d5�Z)dld6d7�Z*dkd8d9�Z+dkd:d;�Z,dkd<d=�Z-dkd>d?�Z.dkd@dA�Z/dkdBdC�Z0dkdDdE�Z1dkdFdG�Z2dkdHdI�Z3dkdJdK�Z4dkdLdM�Z5dkdNdO�Z6dkdPdQ�Z7djdRdS�Z8djdTdU�Z9djdVdW�Z:djdXdY�Z;dkdZd[�Z<dkd\d]�Z=djd^d_�Z>dhd`da�Z?dhdbdc�Z@dkddde�ZAdhdfdg�ZBdS)ma�
XenServer Cloud Driver
======================

The XenServer driver is designed to work with a Citrix XenServer.

Requires XenServer SDK
(can be downloaded from https://www.citrix.com/downloads/xenserver/product-software/ )

Place a copy of the XenAPI.py in the Python site-packages folder.

:depends: XenAPI

Example provider configuration:

    .. code-block:: yaml

        # /etc/salt/cloud.providers.d/myxen.conf
        myxen:
          driver: xen
          url: http://10.0.0.120
          user: root
          password: p@ssw0rd

Example profile configuration:

    .. code-block:: yaml

        # /etc/salt/cloud.profiles.d/myxen.conf
        suse:
          provider: myxen
          user: root
          password: p@ssw0rd
          image: opensuseleap42_2-template
          storage_repo: 'Local storage'
          resource_pool: default_pool
          clone: True
          minion:
            master: 10.0.0.18
        sles:
          provider: myxen
          user: root
          clone: False
          image: sles12sp2-template
          deploy: False
        w2k12:
          provider: myxen
          image: w2k12svr-template
          clone: True
          userdata_file: /srv/salt/win/files/windows-firewall.ps1
          win_installer: /srv/salt/win/files/Salt-Minion-2016.11.3-AMD64-Setup.exe
          win_username: Administrator
          win_password: p@ssw0rd
          use_winrm: False
          ipv4_cidr: 10.0.0.215/24
          ipv4_gw: 10.0.0.1

�N)�datetime)�SaltCloudException�SaltCloudSystemExitTF�xencCs,t�durdSt�durdStj�t�atS)z>
    Only load if Xen configuration and XEN SDK is found.
    F)�get_configured_provider�_get_dependencies�salt�cacheZCache�__opts__�__virtualname__�rr�I/opt/saltstack/salt/lib/python3.10/site-packages/salt/cloud/clouds/xen.py�__virtual__Rs

rcCs"zt��WStytYSw�N)Z__active_provider_name__�value�AttributeErrorrrrr
�_get_active_provider_nameas

�rcCst�tdti�S)zO
    Warn if dependencies aren't met.

    Checks for the XenAPI.py module
    �XenAPI)�configZcheck_driver_dependenciesr�HAS_XEN_APIrrrr
rhsrcCst�tt�ptd�S)z/
    Return the first configured instance.
    )�url)rZis_provider_configuredr
rrrrrr
rqs�rc
Cs(d}dt�d�}tjdt�tdd�}tjdt�tdd�}tjdt�tdd�}tjd	t�tddd
�}ztj||d�}t�d||d
|�|j	�
||||�W|Stjy�}z9t|j
dd�}|�d�}	d�|	dd��d|}
t�|
�}t�d|
|d
|�|j	�
||||�WYd}~|Sd}~ww)z0
    Get a connection to the XenServer host
    z1.0Zsalt_cloud_Z_driverrF)�
search_global�user�password�
ignore_ssl)�defaultr)rz-url: %s user: %s password: %s, originator: %szXXX-pw-redacted-XXX�details��/N�z:session is -> url: %s user: %s password: %s, originator:%s)rrZget_cloud_config_valuerr
rZSession�log�debug�xenapiZlogin_with_password�Failure�str�__dict__�split�join)�api_versionZ
originatorrrrr�session�exZpool_master_addrZslash_partsZnew_urlrrr
�_get_sessionzsZ
�
�
����

���r+c	Cs�t�}|jj��}i}|D]H}|jj�|�}|dsU|dsUz|dd}Wnty9d}t�d|d�Ynw|d||d|d	|d
t|d|�dd�||d<q
|S)zU
    List virtual machines

      .. code-block:: bash

          salt-cloud -Q

    �
is_a_template�is_control_domain�other_config�base_template_nameN�1VM %s, does not have base_template_name attribute�
name_label�uuid�memory_dynamic_max�power_state��id�image�name�size�state�private_ips�
public_ips)	r+r"�VM�get_all_records�
get_record�	Exceptionr r!�	get_vm_ip)r)�vms�ret�vm�recordr/rrr
�
list_nodes�s2	����	rFcCs|dkrtd��|durt�d�t�}t||d�}d}|jj�|�}|durN|D]$}|jj�	|�rM|jj�	|��
�}|�d�\}}t�d||�|Sq)|jj�|�}	z |jj
�|	�}
d|
��vrst�d	||
d�|
d}W|SW|Stjy�t�d
�Y|Sw)z�
    Get the IP address of the VM

    .. code-block:: bash

        salt-cloud -a get_vm_ip xenvm01

    .. note:: Requires xen guest tools to be installed in VM

    �function�1This function must be called with -a or --action.N�New session being created�r)rz'VM vif returned for instance: %s ip: %sz0/ipz3VM guest metrics returned for instance: %s 0/ip: %sz%Could not get vm metrics at this time)rr r!r+�_get_vmr"r=�get_VIFs�VIFZget_ipv4_addresses�popr&Zget_guest_metricsZVM_guest_metricsZget_networks�keysrr#�info)r8r)�callrDrC�vifs�vifZcidrZsubnetZvgm�netrrr
rA�s>
�
�
���rAc
	Cs�d}|dkr
td��t�d||||�|durt�d�t�}t||�}|jj�|�}|durct�dt|��|D])}|jj	�
|�}	t�|	�z|jj	�||||�Wq9tj
ybt�d�Yq9wd	S)
z:
    Set the IP address on a virtual interface (vif)

    ZstaticrGz0The function must be called with -a or --action.z3Setting name: %s ipv4_cidr: %s ipv4_gw: %s mode: %sNrIzThere are %s vifs.z,Static IP assignment could not be performed.T)rr r!r+rKr"r=rL�lenrMr?Zconfigure_ipv4rr#rP)
r8�	ipv4_cidr�ipv4_gwr)rQ�moderDrRrSrErrr
�	set_vm_ip�s4�


�rYc		CsT|durt�}i}|jj��}|D]j}|jj�|�}|ds{|ds{z|dd}Wnty=d}t�d|d�Ynw|jj�|�}|d|d	<|d|d
<||d<d|d<|d
|d<t|d|�|d<d|d<d|�	�vru|d=|||d<qt
�p�d}d|vr�|�d�}|d}t�d|�t�d|�t�dt�t
d||t�|S)zZ
    List full virtual machines

      .. code-block:: bash

          salt-cloud -F

    Nr,r-r.r/r0r1r2r6r8r7r9r4r:r;r<Z
snapshot_timer�:rzret: %szprovider: %sz__opts__: %szcloud.cache_node_list)r+r"r=�get_allr?r@r r!rArOrr&r
�	__utils__)	r)rCrBrDrEr/Zvm_cfg�provider�compsrrr
�list_nodes_fullsJ	���

r_cCstjj�t�td|�S)zf
    Perform a select query on Xen VM instances

    .. code-block:: bash

        salt-cloud -S

    zquery.selection)r�utilsZcloud�list_nodes_selectr_r
�rQrrr
raOs
	�racCs�|dkrtd��t�d|�|dur%d|vr"|ddkrd}n
d}nd}ni}d}t�}|jj��}i}|D]0}|jj�|�}t�t|��|durX|�	d	�|d
�||�	d�<q6|�
d|i�|||�	d�<q6|S)
a
    Return available Xen VDI images

    If this function is called with the ``-f`` or ``--function`` then
    it can return a list with minimal deatil using the ``terse=True`` keyword
    argument.

    .. code-block:: bash

        salt-cloud -f vdi_list myxen terse=True

    �actionz3This function must be called with -f or --function.zkwargs is %sN�terse�TrueTFr2)r2ZOpqueRefr1Z	OpaqueRef)rr r!r+r"�VDIr[r?�type�get�update)rQ�kwargsrdr)ZvdisrCZvdi�datarrr
�vdi_list_s,
rlcCs|dkrtd��t�S)z�
    Return available Xen locations (not implemented)

    .. code-block:: bash

        salt-cloud --list-locations myxen

    rczBThe avail_locations function must be called with -f or --function.)r�	pool_list�r)rQrrr
�avail_locations�s

�rocCs|dkrtd��ddiS)zu
    Return a list of Xen template definitions

    .. code-block:: bash

        salt-cloud --list-sizes myxen

    rcz>The avail_sizes function must be called with -f or --function.ZSTATUSzKSizes are build into templates. Consider running --list-images to see sizes)rrnrrr
�avail_sizes�s	��rpcCsFi}t�}|jj��}|D]}|jj�|�}|dr |||d<q
|S)z�
    Return available Xen template information.

    This returns the details of
    each template to show number cores, memory sizes, etc..

    .. code-block:: bash

       salt-cloud -f template_list myxen

    r,r1)r+r"r=r[r?)rQZ	templatesr)rBrDrErrr
�
template_list�s�rqcCs�|dkrtd��t�d||�|durt�}t||d�}|jj�|�}|dse|dsez|dd	}WntyFd}t�d
|d�Ynw|d||d|d
|dt	||�dd�}t
d|t�t�|S)z�
    Show information about a specific VM or template

        .. code-block:: bash

            salt-cloud -a show_instance xenvm01

    .. note:: memory is memory_dynamic_max

    rG�=The show_instnce function must be called with -a or --action.z$show_instance-> name: %s session: %sNrJr,r-r.r/r0r1r2r3r4r5zcloud.cache_node)
rr r!r+rKr"r=r?r@rAr\rr
)r8r)rQrDrEr/rCrrr
�
show_instance�s:����
rscCsld}d|��vrt|d|�}n|jj��}|sd}n
|jj��d}|}|jj�|�}t�d|d�|S)z<
    Called by create() used to determine resource pool
    ��
resource_poolNrzresource pool: %sr1)rO�	_get_poolr"�poolr[r?r r!)r)�vm_rurwZ
first_pool�pool_recordrrr
�_determine_resource_pool�srzcCsnd}d|��vrt|d|�}nd}|r-|jj�|�}|jj�|�}t�d|d�|}nd}t�d|�|S)zF
    Called by create() used to determine storage repo for create
    rt�storage_repoNzstorage repository: %sr1)	rO�_get_srr"rwZget_default_SR�SRr?r r!)r)rurxr{Z
default_sr�	sr_recordrrr
�_determine_storage_reposrcCs�|d}i}i}tdddd|�d�||d|dd	�td
tdd�t�d
|�td|d|dd|d�t�}t||�}t|||�}|�d�}|�d�}|durWd}t�d|�tdddd|�d�td
tdd�|ryt|||�nt	||||�t
||�t||�}	t|d|�t||�}	t
||�t|||�|�dd�}
t�d|
�|
r�|jj�|	�}|dur�t|||�nt�d|d�|jj�|	�}t|�}|�d|i�tdddd|�d�||d|dd	�td
tdd�|S)z�
    Create a VM in Xen

    The configuration for this function is read from the profile settings.

    .. code-block:: bash

        salt-cloud -p some_profile xenvm01

    r8�cloud.fire_event�eventzstarting create�salt/cloud/z	/creating�profileZdriver)r8r�r]�sock_dir�	transport��argsr�r�zAdding %s to cloud cache.zcloud.cachedir_index_addrr7�cloneNTz
Clone: %s zrequesting instancez/requesting)r�r��deployzdelopy is set to %sz1The Salt minion will not be installed, deploy: %s�extrazcreated instancez/created)r\r
r r!r+rzrrh�	_clone_vm�_copy_vm�
_provision_vmrK�start�_wait_for_ip�_set_static_ipr"r=r?�_deploy_salt_minionrsri)rxr8rErCr)rur{r7r�rDr�rrr
�createsv
��



�	



�
�r�cCs�t||�|d<|�dd�|d<|�dd�|d<|�dd�|d<t�d||d�|dd	urCt�d
|�td|t�}t�d|�d	Sd	S)
z,
    Deploy salt minion during create()
    Zssh_hostr�rootrz	p@ssw0rd!r]rz%s has IP of %sNzInstalling Salt minion on %szcloud.bootstrapzboot return: %s)rArhr r!rPr\r
)r8r)rxZboot_retrrr
r�zs�r�cCsfd}d}d|��vrt�d�|d}d|��vr1t�d�|d}t�d�t||||d�dSdS)z2
    Set static IP during create() if defined
    rtrWzipv4_gw is found in keysrVzipv4_cidr is found in keysz attempting to set IP in instanceN)rOr r!rY)r8r)rxrVrWrrr
r��s


�r�cCs�t��}d}|durAt||�}|dur|�d�rd}t��}||}t�d|j|�|jdkr6t�d�dSt�	d�|dus
dSdS)z6
    Wait for IP  to be available during create()
    NZ169z0Waited %s seconds for %s to report ip address...�zTimeout getting IP address�)
r�nowrA�
startswithr r!�seconds�warning�time�sleep)r8r)Z
start_time�statusZ
check_time�deltarrr
r��s"

�


�r�cCs�|dus|dur
dS|jj�|�}t�d|�|jj�|�dkr@t|jj�|�d�d}t�d|�t�	d�|jj�|�dks t�d|�|jj�
|�dS)	zC
    Run  XenAPI task in asynchronous mode to prevent timeouts
    Nz
Running %s�pendingr�dzTask progress %.2f%%rzCleaning up task %s)r"�taskZget_name_labelr r!Z
get_status�roundZget_progressr�r��destroy)r�r)Z	task_nameZprogressrrr
�_run_async_task�s
�r�cCsF|durt�}t�d||�t||�}|jjj�||�}t||�dS)z�
    Create VM by cloning

    This is faster and should be used if source and target are
    in the same storage repository

    NzCreating VM %s by cloning %s)	r+r r!rKr"�Asyncr=r�r�)r7r8r)�sourcer�rrr
r��s
r�cCsH|durt�}t�d||�t||�}|jjj�|||�}t||�dS)z�
    Create VM by copy

    This is slower and should be used if source and target are
    NOT in the same storage repository

    template = object reference
    name = string name of new VM
    session = object reference
    sr = object reference
    NzCreating VM %s by copying %s)	r+r r!rKr"r�r=�copyr�)�templater8r)�srr�r�rrr
r��s
r�cCsB|durt�}t�d|�t||�}|jjj�|�}t||�dS)z-
    Provision vm right after clone/copy
    NzProvisioning VM %s)	r+r rPrKr"r�r=Z	provisionr�)r8r)rDr�rrr
r��s
r�cC�Z|dkrtd��|durt�}t�d|�t||�}|jjj�|dd�}t	||�t
|�S)zU
    Start  a vm

    .. code-block:: bash

        salt-cloud -a start xenvm01

    rGrrN�Starting VM %sFT)rr+r rPrKr"r�r=r�r�rs�r8rQr)rDr�rrr
r���	�

r�cC�V|dkrtd��|durt�}t�d|�t||�}|jjj�|�}t	||�t
|�S)zT
    Pause a vm

    .. code-block:: bash

        salt-cloud -a pause xenvm01

    rGrrNz
Pausing VM %s)rr+r rPrKr"r�r=�pauser�rsr�rrr
r��	�

r�cCr�)zX
    UnPause a vm

    .. code-block:: bash

        salt-cloud -a unpause xenvm01

    rGrrNzUnpausing VM %s)rr+r rPrKr"r�r=�unpauser�rsr�rrr
r�r�r�cCr�)z`
    Suspend a vm to disk

    .. code-block:: bash

        salt-cloud -a suspend xenvm01

    rGrrNzSuspending VM %s)rr+r rPrKr"r�r=�suspendr�rsr�rrr
r�4r�r�cCr�)z`
    Resume a vm from disk

    .. code-block:: bash

        salt-cloud -a resume xenvm01

    rGrrNzResuming VM %sFT)rr+r rPrKr"r�r=�resumer�rsr�rrr
r�Jr�r�cCs|dkrtd��t|||�S)zS
    Stop a vm

    .. code-block:: bash

        salt-cloud -a stop xenvm01


    rGrr)r�shutdown)r8rQr)rrr
�stop`s

�r�cCr�)z[
    Shutdown  a vm

    .. code-block:: bash

        salt-cloud -a shutdown xenvm01

    rGrrNr�)rr+r rPrKr"r�r=r�r�rsr�rrr
r�qr�r�cCsv|dkrtd��|durt�}t�d|�t||�}|jj�|�}|dkr6|jjj�	|�}t
||�t|�S|�d�S)zV
    Reboot a vm

    .. code-block:: bash

        salt-cloud -a reboot xenvm01

    rGrrNr�ZRunningz is not running to be rebooted)rr+r rPrKr"r=Zget_power_stater�Zclean_rebootr�rs)r8rQr)rDr4r�rrr
�reboot�s	�


r�csX�durt���jj�|�}�fdd�|D�}t|�dkr!|dSt�d|t|��dS)z.
    Get XEN vm instance object reference
    Ncsg|]}�jj�|�s|�qSr)r"r=Zget_is_a_template)�.0�xrJrr
�
<listcomp>�sz_get_vm.<locals>.<listcomp>rrz,VM %s returned %s matches. 1 match expected.)r+r"r=�get_by_name_labelrUr �error)r8r)rBrrJr
rK�srKcCs4|durt�}|jj�|�}t|�dkr|dSdS)z4
    Get XEN sr (storage repo) object reference
    Nrr)r+r"r}r�rU)r8r)�srsrrr
r|�sr|cCsL|durt�}|jj��}|D]}|jj�|�}||�d�vr#|SqdS)z0
    Get XEN resource pool object reference
    Nr1)r+r"rwr[r?rh)r8r)�poolsrwryrrr
rv�s�rvcCs2|dkrtd��i}tdddd|�d�d|itd	td
d�t�}t|�}|r�|jj�|�}t�	d|d
�|d
dkrK|jj
j�|�}t||�t
||�|d<|jj
j�|�}t||�d|d<tdddd|�d�d|itd	td
d�t�dd�dur�td|t��d�dt�td|�|SdS)zg
    Destroy Xen VM or template instance

    .. code-block:: bash

        salt-cloud -d xenvm01

    rGzEThe destroy action must be called with -d, --destroy, -a or --action.r�r�zdestroying instancer�z/destroyingr8r�r�r�zpower_state: %sr4ZHalted�vbdT�	destroyedzdestroyed instancez
/destroyedZupdate_cachedirFzcloud.delete_minion_cachedirrZrzcloud.cachedir_index_delN)rr\r
r+rKr"r=r?r r!r�Z
hard_shutdownr��destroy_vm_vdisr�rhrr&)r8rQrCr)rDrEr�rrr
r��sP	�
�


���r�cC�N|dkrtd��i}t�}|jj��}|D]}|jj�|�}|||d<q|S)zk
    Geta list of storage repositories

    .. code-block:: bash

        salt-cloud -f sr_list myxen

    rG�:This function must be called with -f, --function argument.r1)rr+r"r}r[r?)rQrCr)r�r�r~rrr
�sr_list�	�r�cC�N|dkrtd��i}t�}|jj��}|D]}|jj�|�}|||d<q|S)zd
    Get a list of Xen Servers

    .. code-block:: bash

        salt-cloud -f host_list myxen
    rcr�r1)rr+r"�hostr[r?)rQrCr)�hostsr�Zhost_recordrrr
�	host_list��r�cCr�)zh
    Get a list of Resource Pools

    .. code-block:: bash

        salt-cloud -f pool_list myxen

    rcr�r1)rr+r"rwr[r?)rQrCr)r�rwryrrr
rm,r�rmcCr�)zg
    Get a list of Resource Pools

    .. code-block:: bash

        salt-cloud -f pool_list myxen
    rGr�r2)rr+r"ZPIFr[r?)rQrCr)ZpifsZpifrErrr
�pif_listBr�r�cCs�|dkrtd��|durdSi}i}t�}t|�}|jj�|�}|dur=d}|D]}	|jj�|	�}
|
|d|��<|d7}q(|||<|S)z�
    Get a list of virtual network interfaces  on a VM

    **requires**: the name of the vm with the vbd definition

    .. code-block:: bash

        salt-cloud -a vif_list xenvm01

    rG�8This function must be called with -a, --action argument.N�A name kwarg is rquiredrzvif-r)rr+rKr"r=rLrMr?)r8rQrjrCrkr)rDrRr�rSZ
vif_recordrrr
�vif_listWs&�
r�cCs�|dkrtd��|durdSi}i}t�}|jj�|�}t|�dkrJ|d}|jj�|�}|durJd}|D]}	|jj�|	�}
|
|d|��<|d7}q5|}|S)z�
    Get a list of VBDs on a VM

    **requires**: the name of the vm with the vbd definition

    .. code-block:: bash

        salt-cloud -a vbd_list xenvm01

    rGr�Nr�rrzvbd-)	rr+r"r=r�rU�get_VBDs�VBDr?)r8rQrCrkr)rBrD�vbdsr�r��
vbd_recordrrr
�vbd_listws*�
r�cCs|dkrtd��t�S)z�
    Get a list of images from Xen

    If called with the `--list-images` then it returns
    images with all details.

    .. code-block:: bash

        salt-cloud --list-images myxen

    rcr�)rrqrbrrr
�avail_images�s
�r�c
Cs�|durt�}i}|jj�|�}t|�dkr\|jj�|d�}|dur\d}|D]4}|jj�|�}|ddkrW|jj�|d�}	d|	dvrW|jj�	|d�|	d|d|��<|d7}q'|S)	zt
    Get virtual block devices on VM

    .. code-block:: bash

        salt-cloud -a destroy_vm_vdis  xenvm01

    NrrrfzOpaqueRef:NULLZisor1zvdi-)
r+r"r=r�rUr�r�r?rfr�)
r8r)rQrCrBr�r�r�r�Z
vdi_recordrrr
r��s"	
r�c	Cs�|dkrtd��|duri}|�dd�}t�}|jj��}i}d}|D]"}|jj�|�}|drE|d|krEd}|jj�|�d	d
i||<q#|sNd	di||<|S)z�
    Destroy Xen VM or template instance

        .. code-block:: bash

            salt-cloud -f destroy_template myxen name=testvm2

    rcz6The destroy_template function must be called with  -f.Nr8Fr,r1Tr�r�z	not found)rrhr+r"r=r>r?r�)	r8rQrjr)rBrC�foundrDrErrr
�destroy_template�s,	��r�cCsN|dkrtd��|durt�d�t�}t||d�}|jj�|�}|r%|SdS)zi
    Get PV arguments for a VM

    .. code-block:: bash

        salt-cloud -a get_pv_args xenvm01

    rGrHNrIrJ)rr r!r+rKr"r=Zget_PV_args)r8r)rQrD�pv_argsrrr
�get_pv_args�s	
r�cCs�|dkrtd��|durt�d�t�}t||d�}zt�d|d�|jj�|t|d��WdSt	y@t�
d�Yd	StjyOt�
d
�Yd	Sw)z�
    Set PV arguments for a VM

    .. code-block:: bash

        salt-cloud -a set_pv_args xenvm01 pv_args="utf-8 graphical"

    rGrHNrIrJzSetting PV Args: %sr�zNo pv_args parameter found.FzSetting PV Args failed.T)rr r!r+rKr"r=Zset_PV_argsr$�KeyErrorr�rr#rP)r8rjr)rQrDrrr
�set_pv_argss"	
�

�r�)NNN)NNNNNr)NN)NNNN)C�__doc__�loggingr�rZsalt.configrZsalt.utils.cloudrZsalt.exceptionsrr�	getLogger�__name__r rr�ImportErrorrr	rrrrr+rFrArYr_rarlrorprqrsrzrr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rKr|rvr�r�r�rmr�r�r�r�r�r�r�r�rrrr
�<module>s�;
�		0
#
*
'
1

)


+d
















7




 
"


!