
    W'Fgj                         S SK r SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SS	K	J
r
  SS
KJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  S r " S S\5      rg)    N   	cloudinit)
unattended)volumeupload)InstallerTreeMedia)perform_cdrom_injections   )DomainOs)
DeviceDisk)Guest)OSDB)log)progress)xmlutilc                     [         R                  R                  S[         R                  R                  U 5      R	                  SS5      S   5      $ )Nz/VIRTINST-TESTSUITE-r
   )ospathjoinbasenamesplit)r   s    5/usr/share/virt-manager/virtinst/install/installer.py_make_testsuite_pathr      s>    77<<-GGT"((a046 6    c                   H   \ rS rSrSr    S/S jr\S 5       rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS r\S 5       r\S 5       rS rS r S r!S r"S  r#S! r$S" r%S# r&S$ r'S% r(S& r)S' r*S( r+S) r,S* r-S+ r.S, r/   S0S- jr0S.r1g)1	Installer   a  
Class for kicking off VM installs. The VM is set up separately in a Guest
instance. This class tracks the install media/bootdev choice, alters the
Guest XML, boots it for the install, then saves the post install XML
config. The Guest is passed in via start_install, only install media
selection is done at __init__ time

:param cdrom: Path to a cdrom device or iso. Maps to virt-install --cdrom
:param location: An install tree URI, local directory, or ISO/CDROM path.
    Largely handled by installtreemedia helper class. Maps to virt-install
    --location
:param location_kernel: URL pointing to a kernel to fetch, or a relative
    path to indicate where the kernel is stored in location
:param location_initrd: location_kernel, but pointing to an initrd
:param install_kernel: Kernel to install off of
:param install_initrd: Initrd to install off of
:param install_kernel_args: Kernel args <cmdline> to use. This overwrites
    whatever the installer might request, unlike extra_args which will
    append arguments.
:param no_install: If True, this installer specifically does not have
    an install phase. We are just using it to create the initial XML.
Nc           	         Xl         SU l        SU l        S U l        / U l        / U l        SU l        S U l        S U l        X@l	        Xl
        Xl        S U l        S U l        S U l        S U l        U(       a/  [         R"                  " U R                   U5      nX l        SU l	        g U(       d  U(       d  U(       d  U(       d  U(       a  [!        U R                   UXVXxU	5      U l        g g )NFcdrom)conn	autostart_install_cdrom_device_added _unattended_install_cdrom_device	_tmpfiles_tmpvols_defaults_are_set_unattended_data_cloudinit_data_install_bootdev_no_install_is_reinstall_pre_reinstall_xml
_treemedia_treemedia_bootconfig_cdromr   validate_path)selfr"   r!   locationinstall_bootdevlocation_kernellocation_initrdinstall_kernelinstall_initrdinstall_kernel_args
no_installis_reinstalls               r   __init__Installer.__init__5   s     	 +0(04-!& $# /%)"&%)"&44TYYFEK$+D!/_0H#"4GIDO !/r   c                    U R                   R                   Vs/ s H  o"R                  (       d  M  UPM     nnU H  nUR                  5       n[        R
                  " SXTR                  5       5        [        R                  R                  U5      n UR                  [        S5      U-  S5        UR                  5       (       a  UR                  5       R                  5         O[        R                  " U5        UR                  5         M     gs  snf ! [         a9  n[        R
                  " SUSS9  [        R                   " SXg5         SnAGM  SnAff = f)zR
Remove any disks we created as part of the install. Only ever
called by clients.
z+Removing created disk path=%s vol_object=%szRemoving disk '%s'NzFailed to remove disk '%s'T)exc_infozFailed to remove disk '%s': %s)devicesdiskstorage_was_createdget_source_pathr   debugget_vol_objectr   r   r   start_deleteunlinkend	Exceptionerror)guestmeterdclean_disksrB   r   namees           r   cleanup_created_disksInstaller.cleanup_created_disks]   s
    #(--"4"4N"4Q8M8Mq"4ND'')DIIC))+-77##D)DEA23d:DA&&(('')002 IIdO		!   O&  E		64)		:DDDEs#   DDA8D
E-EEc                     [        U R                  5      nUR                  Ul        UR	                  U5        UR                  5         UR                  5         U$ N)r   r"   DEVICE_CDROMdeviceset_source_pathsync_path_propsvalidate)r3   r   devs      r   _make_cdrom_deviceInstaller._make_cdrom_device   sE    #%%
D!
r   c                 p    U R                   (       a  U R                   R                  5       $ U R                  $ rW   )r/   
cdrom_pathr1   r3   s    r   _cdrom_pathInstaller._cdrom_path   s&    ????--//{{r   c                    U R                   (       a  g [        U R                  5       5      (       d  g SU l         U R                  (       ah  UR                  R
                   Vs/ s H  o"R                  5       (       d  M  UPM     nnU(       a%  US   nUR                  U R                  5       5        g U R                  U R                  5       5      nU R                  (       a  UR                  U5        [        UR                  R
                  5       H5  u  pVUR                  5       (       d  M  UR                  R                  XES9    g    UR                  U5        g s  snf )NTr   )idx)r$   boolrc   r-   rA   rB   is_cdromrZ   r^   set_defaults	enumerate	add_child
add_device)r3   rN   rP   cdromsr]   rf   rB   s          r   _add_install_cdrom_device#Installer._add_install_cdrom_device   s   ++D$$&''+/(!&!3!3D!3Azz|a!3FDQi##D$4$4$67%%d&6&6&89U# #5==#5#56IC}}'''5 7 	! Es   "E>Ec                 Z   U R                   (       d  g UR                  R                  5       (       a  g UR                  R                   H_  nUR                  5       (       d  M  UR                  5       U R                  5       :X  d  M>  UR                  S 5        UR                  5           g    g rW   )
r$   osinfo
is_windowsrA   rB   rh   rD   rc   rZ   r[   )r3   rN   rB   s      r   _remove_install_cdrom_media%Installer._remove_install_cdrom_media   sz    //<<""$$MM&&D$$&$*:*:*<<$$T*$$& 'r   c                 D   U R                   (       a  g U R                  U5      nUR                  U5        UR                  U l         UR	                  U5        UR                  5         U R                  R                  5       (       a  [        U5      UR                  l
        g g rW   )r%   r^   ri   targetrl   add_virtioscsi_controllerr"   in_testsuiter   sourcefile)r3   rN   r4   r]   s       r   $_add_unattended_install_cdrom_device.Installer._add_unattended_install_cdrom_device   s~    00%%h/03

- 	'')99!!## 38<CJJO $r   c                     U R                   (       d  g UR                  R                   Vs/ s H!  nUR                  U R                   :X  d  M  UPM#     snS   nUR	                  S 5        UR                  5         g s  snf Nr   )r%   rA   rB   rv   rZ   r[   )r3   rN   rP   rB   s       r   '_remove_unattended_install_cdrom_device1Installer._remove_unattended_install_cdrom_device   sr    44 ==-- C-aDAAA - CCDFT"Cs   A;A;c                     U/nUR                   R                   H8  nUR                  UR                  :X  d  M  SnX#;  a  UR	                  U5          U$    U$ )Nhd)rA   rB   rY   DEVICE_DISKappend)r3   rN   bootdev	bootorderrB   s        r   _build_boot_orderInstaller._build_boot_order   s[    I	
 MM&&D{{d...+$$W- ' r   c                 4   UR                   R                  5       (       + =(       an    UR                   R                  (       + =(       aL    [        UR                  R                  5        Vs/ s H  o"R                  R                  PM     sn5      (       + $ s  snf rW   )r   is_containerkernelanyrA   get_allbootorder)r3   rN   rP   s      r   _can_set_guest_bootorder"Installer._can_set_guest_bootorder   sg    HH))++ EE5==+@+@+BC+BaVV\\+BCDD	FCs   *Bc                    U R                   (       d  g U R                  u  p#nU(       aD  U R                  R                  5       =(       a    [	        U5      =(       d    UUR
                  l        U(       aD  U R                  R                  5       =(       a    [	        U5      =(       d    UUR
                  l        U(       a  XAR
                  l        g g rW   )	r/   r0   r"   rx   r   r   r   initrdkernel_args)r3   rN   r   r   r   s        r   _alter_treemedia_bootconfig%Installer._alter_treemedia_bootconfig   s    &*&@&@##yy557  1(0 ;4: HHO#yy557  1(0 ;4: HHO#.HH  r   c                     SUl         U R                  U5        U R                  nU(       a7  U R                  U5      (       a!  U R	                  X5      UR
                  l        g/ UR
                  l        g)z
Generate the portion of the guest xml that determines boot devices
and parameters. (typically the <os></os> block)

:param guest: Guest instance we are installing
destroyN)	on_rebootr   r+   r   r   r   r   r3   rN   r   s      r   _alter_bootconfigInstaller._alter_bootconfig   sZ     $((/''t44U;;!%!7!7!GEHH!#EHHr   c                 d   U R                   (       d  gU R                   R                  X5      (       d  gUR                  R                  U5      nU=(       d    SS-  nX1R                  :  aE  [        S5      US-  UR                  R                  S.-  n[        R                  " U5        X1l        gg)z
Sets the appropriate amount of ram needed when performing a "network"
based installation

:param guest: Guest instance we are installing
Nr   i   zJOverriding memory to %(number)s MiB needed for %(osname)s network install.)numberosname)	r/   requires_internetrq    get_network_install_required_ramcurrentMemoryrH   rR   r   warning)r3   rN   rO   rammsgs        r   _alter_install_resources"Installer._alter_install_resources  s     00>>ll;;EBxaD $$$ . /$;%,,2C2CDEC KK"% %r   c                     [         R                  " U5      n[         R                  " U5      nU R                  R	                  5       (       a  gU R                  R                  5       (       a  gX#:X  a  gg)z
Return True if we should upload media to the connection scratchdir.
This doesn't consider if there is any media to upload, just whether
we _should_ upload if there _is_ media.
TF)r   make_scratchdirget_system_scratchdirr"   	is_remoteis_unprivileged)r3   rN   
scratchdirsystem_scratchdirs       r   _should_upload_mediaInstaller._should_upload_media  s]     (77>
.DDUK99  99$$&&*r   c                    [         R                  " U5      nU R                  U5      (       d2  [        R                  " 5       (       d  [
        R                  " S5        U$ UR                  R                  5       (       d  [
        R                  " S5        U$ [        R                  " UR                  XBU5      u  pVU =R                  U-  sl        U$ )Nz8Have access to preferred scratchdir so nothing to uploadzMedia upload not supported)r   r   r   r   rx   r   rE   r"   support_remote_url_installr   upload_pathsr'   )r3   rN   rO   pathsr   newpathstmpvolss          r   _upload_mediaInstaller._upload_media/  s    .DDUK))%00$$&&II - .Lzz4466II23L(55

-e= r   c                    [         R                  " U5      n/ nU Hw  nUR                  5       nUR                  5       n[        R
                  " SU5        UR                  5       n	U R                  R                  U	5        UR                  X45        My     UR                  R                  UR                  R                  5      n
[        R                  " XU5      nUR                  U5        U R                  R                  U Vs/ s H  oS   PM	     sn5        [!        XT5      nU R                  R                  U5        U R#                  XU/5      S   nU R%                  X5        g s  snf )Nz Generated unattended cmdline: %sr   )r   r   get_expected_filenamegenerate_cmdliner   rE   writer&   r   rq   $get_pre_installable_drivers_locationr   archr   download_driversextendr	   r   r{   )r3   rN   rO   scriptsr   
injectionsscriptexpected_filenameunattended_cmdline
scriptpathdrivers_locationdrivers
driverpairisos                 r   _prepare_unattended_data"Installer._prepare_unattended_dataC  s.   '77>

F & < < >!'!8!8!:II8:LMJNN!!*-z=>  !<<LL-- e5'"wGw!}wGH&z>c"  u5a811%= Hs   E)c                    S nS nU R                   (       ad  U R                   R                  5       (       a  U R                  nU R                   R                  X5      nU R                   R	                  X5      nSnOeUR
                  R                  5       (       d  [        R                  " S5        [        R                  " U R                  5      nU(       a  US   OS nSn[        R                  " XR                  UXTU5      $ )Nr   zAttempting unattended method=cdrom injection for a non-windows OS. If this doesn't work, try passing install media to --locationr   r!   )r/   is_network_urlr4   get_os_mediaget_os_treerq   rr   r   r   r   guess_os_by_isor!   r   prepare_install_scriptsr)   )r3   rN   rO   urlos_treeos_mediainjection_methodosguesss           r   _prepare_unattended_scripts%Installer._prepare_unattended_scripts\  s    ??--//mm33EAHoo11%?G'<<**,, > ? **4::6G%,wqz$H&11,,c#35 	5r   c                     U R                   R                  XU5      u  pEnXE/nU R                  XU5      u  pEXEU4U l        g rW   )r/   preparer   r0   )r3   rN   rO   unattended_scriptsr   r   r   r   s           r   _prepare_treemediaInstaller._prepare_treemediar  sK    &*oo&=&=e"'$#  ++E%@&,k%B"r   c                 V   [         R                  " U5      n[        R                  " X0R                  5      nU H!  nU R
                  R                  US   5        M#     [        XCSS9nU R
                  R                  U5        U R                  XU/5      S   nU R                  X5        g )Nr   Tr   )
r   r   r   create_filesr*   r&   r   r	   r   r{   )r3   rN   rO   r   	filepairsfilepairr   s          r   _prepare_cloudinitInstaller._prepare_cloudinitz  s    '77>
**:7K7KL	!HNN!!(1+. " 'yMc"  u5a811%=r   c                 X   U R                   (       a  UR                  5       U l        S nU R                  (       a  U R	                  X5      nU R
                  (       a  U R                  XU5        OU(       a  U R                  XU5        U R                  (       a  U R                  X5        g g rW   )
r-   get_xmlr.   r)   r   r/   r   r   r*   r   )r3   rN   rO   r   s       r   _prepareInstaller._prepare  s    &+mmoD#!  !%!A!A%!O??##E2DE))%8JK##E1  r   c                    U R                   (       a  U R                   R                  U5        U R                   H9  n[        R                  " SUR                  5       5        UR                  S5        M;     / U l        U R                   H9  n[        R                  " S[        U5      5        [        R                  " U5        M;     / U l        g )NzRemoving volume '%s'r   zRemoving %s)r/   cleanupr'   r   rE   rR   rI   r&   strr   rJ   )r3   rN   volfs       r   _cleanupInstaller._cleanup  s    ??OO##E*==CII,chhj9JJqM ! AIImSV,IIaL   r   c                    U R                   (       a!  U R                  (       a  [        R                  $ U R                  (       am  [        UR                  R                   Vs/ s H!  nUR                  UR                  :X  d  M  UPM#     sn5      (       a  [        R                  $ U R                  $ UR                  R                  =(       a#    UR                  R                  S   R                  =(       d    S nU[        R                  :X  a  [        R                  $ U[        R                  :X  a  [        R                  $ U[        R                  :X  a  [        R                  $ [        R                  $ s  snf r~   )r!   r,   r   BOOT_DEVICE_CDROMr+   r   rA   rB   rY   r   BOOT_DEVICE_HARDDISKr   rX   DEVICE_FLOPPYBOOT_DEVICE_FLOPPY)r3   rN   rP   rY   s       r   _get_postinstall_bootdev"Installer._get_postinstall_bootdev  s   ::$**---  u}}11 21!xx1==0 1 2 3 3444(((##D(:(:1(=(D(DLZ+++000z...---z///...,,,2s   !E6E6c                 R    U R                   (       a  U R                   R                  $ g rW   )r/   r4   rb   s    r   r4   Installer.location  s    ????+++ r   c                     U R                   $ rW   )r1   rb   s    r   r!   Installer.cdrom  s    {{r   c                 r    U R                   (       d  [        S5      eU R                   R                  U5        g )Nz2Install method does not support initrd injections.)r/   RuntimeErrorset_initrd_injections)r3   initrd_injectionss     r   r   Installer.set_initrd_injections  s.      ) * *--.?@r   c                 r    U R                   (       d  [        S5      eU R                   R                  U5        g )NzEKernel arguments are only supported with location or kernel installs.)r/   r   set_extra_args)r3   
extra_argss     r   r  Installer.set_extra_args  s-      3 4 4&&z2r   c                    U R                   (       a  gU R                  (       a  UR                  5       U l        U R	                  U5        UR
                  R                  (       dG  U R                  U5      (       a1  U R                  U5      nU R                  X5      UR
                  l        U R                  (       d  UR                  S5        SU l         g)z
Allow API users to set defaults ahead of time if they want it.
Used by vmmDomainVirtinst so the 'Customize before install' dialog
shows accurate values.

If the user doesn't explicitly call this, it will be called by
start_install()
NT)r(   r-   r   r.   rn   r   r   r   r   r   ri   r   s      r   set_install_defaultsInstaller.set_install_defaults  s     !!&+mmoD#&&u-xx!!d&C&CE&J&J33E:G!%!7!7!GEHH!!t$!%r   c                 N   / nU R                   (       d"  U R                  (       d  U R                  (       a;  U R                  U5      (       d%  UR	                  [
        R                  " U5      5        U R                  5       (       a  UR	                  U R                  5       5        U$ )za
Return a list of paths that the hypervisor will need search access
for to perform this install.
)r/   r*   r)   r   r   r   r   rc   )r3   rN   search_pathss      r   get_search_pathsInstaller.get_search_paths  sy    
 __!!""**511 2 B B5 IJ 0 0 23r   c                     U R                  5       (       d  U R                  5       (       a  gU R                  (       a  g[        U R                  =(       d    U R
                  =(       d    U R                  5      $ )z
Return True if the install operation has 2 XML phases, and
requires a hard VM poweroff to ensure the second stage is
used for subsequent boots.
TF)has_cloudinithas_unattendedr,   rg   r1   r+   r/   rb   s    r   requires_postboot_xml_changes'Installer.requires_postboot_xml_changes  s]     4#6#6#8#8DKK $))$OO% 	%r   c                 F    U R                   (       a  gU R                  5       $ )zD
Return True if some explicit install option was actually passed in
T)r,   r  rb   s    r   options_specifiedInstaller.options_specified  s     1133r   c                    SnU R                   (       a  U R                   R                  U5      nOU R                  (       ac  UR                  R	                  5       (       a  [
        R                  " S5        OC[        R                  " U R                  5      nU(       a  US   nO[
        R                  " S5        [
        R                  " SU5        U$ )z
Attempt to detect the distro for the Installer's 'location'. If
an error is encountered in the detection process (or if detection
is not relevant for the Installer type), None is returned.

:returns: distro variant string, or None
Nz0Can't detect distro for cdrom remote connection.r   zNo media for distro detection.z#installer.detect_distro returned=%s)	r/   detect_distror!   r"   r   r   rE   r   r   )r3   rN   retr   s       r   r  Installer.detect_distro  s     ??////6CZZzz##%%		 ) * ..tzz:!!*CII67		7=
r   c                     Xl         g rW   )r)   )r3   unattended_datas     r   set_unattended_dataInstaller.set_unattended_data'  s     /r   c                     Xl         g rW   )r*   )r3   cloudinit_datas     r   set_cloudinit_dataInstaller.set_cloudinit_data*  s    -r   c                 ,    [        U R                  5      $ rW   )rg   r*   rb   s    r   r  Installer.has_cloudinit-  s    D(())r   c                 ,    [        U R                  5      $ rW   )rg   r)   rb   s    r   r  Installer.has_unattended/  s    D))**r   c                 Z    U R                   (       a  U R                   R                  5       $ g rW   )r*   get_password_if_generatedrb   s    r   get_generated_password Installer.get_generated_password2  s%    ''AACC  r   c                 t   [        U R                  US9nU R                  U5        U R                  XC5        U R	                  5       (       a  UR                  5         UR                  (       aw  UR                  5       (       ab  [        UR                  R                  5      (       a>  [        R                  " S5        UR                  UR                  R                  S   5        [        U R                  US9nU R                  U5        U R                  U5        UR!                  5       UR!                  5       4$ )Nparsexmlzcombo of default TPM, UEFI, and cloudinit is used. assuming this VM is using a linux distro cloud image with shim in the boot path. disabling TPM for the first bootr   )r   r"   r   r   r  set_smbios_serial_cloudinithave_default_tpmis_uefilenrA   tpmr   rE   remove_devicers   r   r   )r3   guest_ro	final_xmlrO   initial_guestfinal_guests         r   _build_postboot_xmlInstaller._build_postboot_xml;  s    dii)<}-%%m;557" ))  ""M))--..		12
 ++M,A,A,E,Ea,HIDII	:((544[A$$&(;(;(===r   c                 .   S nUR                  5       nU R                  5       (       a  U R                  XU5      u  p4U R                  =(       d    Un[        R
                  " SU=(       a    SU-   =(       d    S5        [        R
                  " SU5        X44$ )NzGenerated initial_xml: %s
zNone requiredzGenerated final_xml: 
%s)r   r  r4  r.   r   rE   )r3   rN   rO   initial_xmlr1  s        r   
_build_xmlInstaller._build_xmla  s    MMO	--//%)%=%=e&-"K++8y			-1d[0D_	G		-y9%%r   c                 0   U R                   R                  U=(       d    U5      nU(       d  U$  UR                  5         U(       a   X:w  a  U R                   R                  U5      nU$ ! [         a#     UR	                  5         e ! [         a     e f = ff = f)zr
For hypervisors (like vz) that don't implement createXML,
we need to define+start, and undefine on start failure
)r"   	defineXMLcreaterL   undefine)r3   r8  r1  
needs_bootdomains        r   _manual_transient_create"Installer._manual_transient_createo  s    
 $$[%=I>M	MMO ;3YY((3F  	!   	s/   A( (
B3BB
BBBBc                    [        S5      n[        R                  " U5      nUR                  US5        U=(       d    [	        U5      nUR
                  S:X  a?  U R                  (       d.  U(       a  [        [        S5      5      eU R                  X4U5      n	OUU(       d  U(       a%  U R                  R                  U=(       d    US5      n	U(       d  U R                  R                  U5      n	 [        R                  " SW	R                  S5      5        UR!                  5         W	$ ! [         a!  n
[        R                  " SU
5         Sn
A
N8Sn
A
ff = f)zq
Actually do the XML logging, guest defining/creating

:param doboot: Boot guest even if it has no install phase
zCreating domain...Nvzz4Domain type 'vz' doesn't support transient installs.r   z#XML fetched from libvirt object:
%sz*Error fetching XML from libvirt object: %s)rH   r   ensure_meterrG   rg   typer-   r   rA  r"   	createXMLr<  r   rE   XMLDescrL   rK   )r3   rN   rO   r8  r1  doboot	transientmeter_labelr?  r@  rS   s              r   _create_guestInstaller._create_guest  s    ,-%%e,K&0tK0
::d&8&8"1 &* $+ , ,22J8F J,,[-EIqI,,Y7	GII< ..+- 			  	GIIBAFF	Gs   -&D% %
E/EEc                      UR                  S5        g! [         aK  nU R                  R                  R	                  U5      (       d  e [
        R                  " S5         SnAgSnAff = f)z<
Set the autostart flag for domain if the user requested it
TzLCould not set autostart flag: libvirt connection does not support autostart.N)setAutostartrL   r"   supportis_error_nosupportr   r   )r3   r@  rS   s      r   _flag_autostartInstaller._flag_autostart  s_    	F% 	F99$$77::KK E F F	Fs    
A)AA$$A)c                    U R                   (       d2  U(       d+  [        R                  " U R                  UR                  5        U R                  U5        UR                  R                  SS n[        U R                  UR                  5       S9nUR                  Ul	         U R                  X5        U(       d+  U R                   (       d  U H  n	U	R                  U5        M     U R                  X5      u  pU(       d  U(       a  X4U R                  U5        $ U R                  XXXV5      nU R                  (       a  U R!                  U5        UU R                  U5        $ ! U R                  U5        f = f)z
Begin the guest install. Will add install media to the guest config,
launch it, then redefine the XML with the postinstall config.

:param return_xml: Don't create the guest, just return generated XML
Nr(  )r-   r   validate_namer"   rR   r  rA   rB   r   r+  r   build_storager9  r   rL  r#   rR  )r3   
user_guestrO   dry
return_xmlrI  rJ  disksrN   r]   r8  r1  r@  s                r   start_installInstaller.start_install  s!    !!*		:??;!!*-""''* dii**<*<*>?!+!<!<	!MM%'t11 C%%e, ! &*__U%B"Kj#/ MM%  ''+'F ~~$$V,MM% DMM% s   "A&E" 6E" "E5)r1   r*   r(   r+   r$   r-   r,   r.   r&   r'   r/   r0   r)   r%   r#   r"   )
NNNNNNNNNF)NFFTF)2__name__
__module____qualname____firstlineno____doc__r=   staticmethodrT   r^   rc   rn   rs   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   propertyr4   r!   r   r  r  r	  r  r  r  r  r  r  r  r%  r4  r9  rA  rL  rR  r[  __static_attributes__ r   r   r   r      s-   , IM26JN*/!IP E ED
6=*F
/$ &4"(>25,C	>2"-0 , ,  A3&0%420.*+D$>L&.B
F" /3,1-2&!r   r   )r    r   r   r   installertreemediar   installerinjectr	   r@  r   rA   r   rN   r   osdictr   loggerr   r   r   r   objectr   re  r   r   <module>rl     sA    
    2 5        6
@! @!r   