Mini Shell

Direktori : /lib/python3.6/site-packages/blivet/devices/__pycache__/
Upload File :
Current File : //lib/python3.6/site-packages/blivet/devices/__pycache__/partition.cpython-36.opt-1.pyc

3

�Mf,��@sddlZddlZddlZddlZejdd�ddlmZddlm	Z	ddlm
Z
ddlmZdd	lmZdd
l
mZddlmZddlmZmZdd
lmZmZmZddlZejd�ZddlmZddlmZddlmZddl m!Z!m"Z"m#Z#ed�Z$ed�Z%Gdd�de�Z&dS)�N�BlockDevz2.0)r�)�errors)�util)�arch)�flags)�log_method_call)�udev)�DeviceFormat�
get_format)�Size�MiB�
ROUND_DOWNZblivet�)�Device)�
StorageDevice)�DMDevice)�device_path_to_name�device_name_to_disk_by_path�LINUX_SECTOR_SIZEZ500MiBZ256MiBcs�eZdZdZdZdZeZd{dd�Zd	d
�Z	e
�fdd��Zd
d�Z�fdd�Z
e
dd��Ze
dd��Ze
dd��Ze
dd��Ze
dd��Ze
dd��Ze
dd��Zdd �Zd!d"�Ze
d#d$�d%d$��Zd|d&d'�Zd(d)�Zd*d+�Ze
d,d$�d-d$��Zd.d/�Zd0d1�Zd2d3�Ze
�fd4d5��Ze
d6d7��Z d8d9�Z!d:d;�Z"e
e"e!�Z#d<d=�Z$d>d?�Z%d@dA�Z&dBdC�Z'e
dDdE��Z(d}�fdFdG�	Z)d~�fdHdI�	Z*dJdK�Z+dLdM�Z,dNdO�Z-dPdQ�Z.ddRdS�Z/dTdU�Z0e
�fdVdW��Z1e1j2dXdW��Z1e
�fdYdZ��Z3d[d\�Z4d]d^�Z5d_d`�Z6�fdadb�Z7dcdd�Z8�fdedf�Z9dgdh�Z:didj�Z;e
dkd$�dld$��Z<e
dmdn��Z=�fdodp�Z>e
�fdqdr��Z?e
dsdt��Z@e
�fdudv��ZAdwdx�ZB�fdydz�ZC�ZDS)��PartitionDeviceaJ A disk partition.

        On types and flags...

        We don't need to deal with numerical partition types at all. The
        only type we are concerned with is primary/logical/extended. Usage
        specification is accomplished through the use of flags, which we
        will set according to the partition's format.
    �	partitionTNF�cCs^g|_g|_d|_d|_d|_d|_td�|_td�|_td�|_	d|_
d|_d|_d|_
d|_d|_d|_d|_|r�|dkr�|dk	r�|dk	r�td�}n|j}tj||||||	|
|||
d�
|s�t|j�|_g|_d|_|jo�|jjo�|jjj�rtjd|j�d|_�n4|j�r�t j!�r�|jj�sDd|_t"j#d|jjj$��tj%d|j&�|jjj'j(|j&�|_|j�s�g|_t"j#d	|j��|j&|_|j)�|j*t+j,��r�t-d
|j&dd�|_n |j*t+j.��rBt-d|j&dd�|_nj|dk	�r�t|�nt�|_||_
||_||_tt/j0|��|_	||_||_|j1|_|j1|_||_
||_||_|j�rZ|j2�rZ|j3�dS)
a	
            :param name: the device name (generally a device node's basename)
            :type name: str
            :keyword exists: does this device exist?
            :type exists: bool
            :keyword size: the device's size
            :type size: :class::class:`~.size.Size`
            :keyword parents: a list of parent devices
            :type parents: list of :class:`StorageDevice`
            :keyword fmt: this device's formatting
            :type fmt: :class:`~.formats.DeviceFormat` or a subclass of it

            For existing partitions only:

            :keyword str uuid: partition UUID (not filesystem UUID)
            :keyword major: the device major
            :type major: long
            :keyword minor: the device minor
            :type minor: long
            :keyword sysfs_path: sysfs device path
            :type sysfs_path: str

            For non-existent partitions only:

            :keyword part_type: parted type constant, eg:
                                :const:`parted.PARTITION_NORMAL`
            :type part_type: parted partition type constant
            :keyword grow: whether or not to grow the partition
            :type grow: bool
            :keyword maxsize: max size for growable partitions
            :type maxsize: :class:`~.size.Size`
            :keyword start: start sector (see note, below)
            :type start: long
            :keyword end: end sector (see note, below)
            :type end: long
            :keyword bootable: whether the partition is bootable
            :type bootable: bool
            :keyword weight: an initial sorting weight to assign
            :type weight: int or NoneType
            :keyword disk_tags: (str) tags defining candidate disk set
            :type disk_tags: iterable

            .. note::

                If a start sector is specified the partition will not be
                adjusted for optimal alignment. That is up to the caller.

            .. note::

                You can only pass one of parents or disk_tags when instantiating
                a non-existent partition. If both disk set and disk tags are
                specified, the explicit disk set will be used.

            .. note::

                Multiple disk tags will be combined using the logical "or" operation.

        NrF)�fmt�uuid�size�major�minor�exists�
sysfs_path�parentsTz%partition %s disklabel is unsupportedzdisk has wrong format '%s'zlooking up parted Partition: %sz,cannot find parted partition instance for %s�prepboot)�devicer�biosboot)4�	req_disksZ
req_disk_tags�
req_part_type�req_primary�req_grow�req_bootabler�req_size�
req_base_size�req_max_size�req_base_weight�req_start_sector�req_end_sector�req_name�	_bootable�
_part_type�_parted_partitionZ
_orig_path�default_sizer�__init__�listr �disklabel_supportedr�diskZpartitioned�formatZ	supported�log�info�namerZtestingr�DeviceError�type�debug�path�parted_disk�getPartitionByPath�probe�get_flag�partedZPARTITION_PREPrZPARTITION_BIOS_GRUBrZnumeric_type�_size�status�update_size)�selfr;rrr�grow�maxsize�start�endrr�bootablerr r�	part_type�primary�weightZ	disk_tags�rQ�/usr/lib/python3.6/partition.pyr4Esx?






zPartitionDevice.__init__cCsttj|�}|d|j|j|j|j|j|j|j|j	|j
d�	7}|j	rp|d|j	jj|j	jj
|j	jj|j	j�d�7}|S)Nz�  grow = %(grow)s  max size = %(maxsize)s  bootable = %(bootable)s
  part type = %(part_type)s  primary = %(primary)s  start sector = %(start)s  end sector = %(end)s
  parted_partition = %(parted_part)s
  disk = %(disk)s
)	rIrJrMrNrOrKrLZparted_partr7zK  start = %(start)s  end = %(end)s  length = %(length)s
  flags = %(flags)s)�lengthrKrLr)r�__repr__r'r+rMrNr&r-r.�parted_partitionr7�geometryrSrKrL�getFlagsAsString)rH�srQrQrRrT�s
zPartitionDevice.__repr__csttt|�j}|jd|ji�|js>|j|j|j|j|j	d��|j
rp|j|j
jj|j
jj
|j
jj|j
j�d��|S)Nr=)rIrJrMrO)rSrKrLr)�superr�dict�updaterNrr'r+rMr&rUrVrSrKrLrW)rH�d)�	__class__rQrRrZ�szPartitionDevice.dictcCs4|td�kr|S|j|j|d�\}}t|jdd��S)a� Return newsize adjusted to allow for an end-aligned partition.

            :param :class:`~.Size` newsize: proposed/unaligned target size
            :raises _ped.CreateException: if the size extends beyond the end of
                                          the disk
            :returns: newsize modified to yield an end-aligned partition
            :rtype: :class:`~.Size`
        r)�newsize�B)�unit)r�_compute_resizerU�	getLength)rHr^Z_constraintrVrQrQrR�align_target_sizes
	z!PartitionDevice.align_target_sizecs�t|t�std��||jkr�y|j|�}Wntjk
rD|}YnX||krVtd��tt|�j	|�|j
jj}|j
|j�\}}|j|j||j|jd�dS)Nznew size must of type Sizez,new size will not yield an aligned partition)r�
constraintrKrL)�
isinstancer�
ValueErrorrrc�_pedZCreateExceptionrYr�_set_target_sizer7r8r@rarU�setPartitionGeometryrKrL)rHr^�alignedr7rdrV)r]rQrRrhs



z PartitionDevice._set_target_sizecCs(|jstj}n|jdj}d||jfS)Nrz%s/%s)r rZ_dev_dirr;)rHZdev_dirrQrQrRr?5szPartitionDevice.pathcCsBy|jj}Wntk
r&|j}YnX|jr>|dkr>|j}|S)z0 Get the partition's type (as parted constant). N)rUr=�AttributeErrorr1rr%)rHZptyperQrQrRrN>szPartitionDevice.part_typecCs|jdk	o|jtj@S)N)rNrD�PARTITION_EXTENDED)rHrQrQrR�is_extendedKs
zPartitionDevice.is_extendedcCs|jdk	o|jtj@S)N)rNrDZPARTITION_LOGICAL)rHrQrQrR�
is_logicalPs
zPartitionDevice.is_logicalcCs|jdk	o|jtjkS)N)rNrDZPARTITION_NORMAL)rHrQrQrR�
is_primaryUs
zPartitionDevice.is_primarycCs|jdk	o|jtj@S)N)rNrDZPARTITION_PROTECTED)rHrQrQrR�is_protectedZs
zPartitionDevice.is_protectedcCsB|j}|jr$|jjdkr$t|j�}n|jr>|jjr>d|jj}|S)N�dasdzUUID=%s)r?r7r=rr;r8r)rH�specrQrQrR�
fstab_spec_szPartitionDevice.fstab_speccCs|jS)N)r2)rHrQrQrR�_get_parted_partitionhsz%PartitionDevice._get_parted_partitioncCsLt||j�|dk	r*t|tj�r*td��tjd|j|�||_|j	�dS)z7 Set this PartitionDevice's parted Partition instance. Nz5partition must be None or a parted.Partition instancez!device %s new parted_partition %s)
rr;rerDZ	Partitionrfr9r>r2�update_name)rHrrQrQrR�_set_parted_partitionksz%PartitionDevice._set_parted_partitioncCs|j�S)N)rt)r\rQrQrR�<lambda>vszPartitionDevice.<lambda>cCs
|j|�S)N)rv)r\�prQrQrRrwwscCs�t||j�|js|jr dS|s.|jj}n|jj}|jr`|j}t	j
dtt|dd�pXd��n2|j
jj}|jj|�}t	j
dtt|dd�p�d��||_
dS)z; Re-get self.parted_partition from the original disklabel. Nz"extended lookup found partition %sr?z(none)z&sector-based lookup found partition %s)rr;rr6r7�original_formatr8rm�extended_partitionr9r>r�getattrrUrVrKr@�getPartitionBySector)rHZcurrent_fmtZ
_disklabelZ
_partitionZ_sectorrQrQrR�pre_commit_fixupys

z PartitionDevice.pre_commit_fixupcCs�t|jt�r|jSd}|jjr0|jjdkr0d}n�|jjr^|jjdkr^|jjd
kr^tj�r^d}n�tj	�r�|jjdkr�tj�r�d}n\|jjr�tj
�r�|jjd	kr�d}n:tj�r�tj�r�|jjdkr�d}ntj
�r�|jjdkr�d}|S)Nrz/booti�z	/boot/efi�efi�macefii�r#�/�dZ	applebootr!)r~ri����)rer,�intr8Z	mountableZ
mountpointr=rZis_efiZis_x86Zis_armZis_ppcZis_pmacZis_ipseries)rHrPrQrQrR�_get_weight�s*zPartitionDevice._get_weightcCs
||_dS)N)r,)rHrPrQrQrR�_set_weight�szPartitionDevice._set_weightcCs|j�S)N)r�)r\rQrQrRrw�scCs
|j|�S)N)r�)r\�wrQrQrRrw�scCs
||_dS)N)�_name)rH�valuerQrQrR�	_set_name�szPartitionDevice._set_namecCsj|jr|jrdS|jdkr&|j|_nt|jj�|_|jrf|jdjdkrf|jdj	rf|jdj
�dS)Nrz
luks/dm-crypt)r7r6rUr/r;rr?�childrenr=rru)rHrQrQrRru�s

$zPartitionDevice.update_namecCs2t|t�r&|jr&|jr&|j|jkr&dStj||�S)z, Return True if this device depends on dep. T)rerrmrnr7r�
depends_on)rHZdeprQrQrRr��szPartitionDevice.depends_oncs^tt|�j}|jr@|jr@|jjjdkr@|j|jjjkr@|jj}nd}|joR|oR|j	}|o\|S)z. True if no other device depends on this one. �	disklabelN)
rYr�isleafr7rUr8r=�
partitionsrm�logical_partitions)rHZno_kidsr�Zextended_has_logical)r]rQrRr��s

zPartitionDevice.isleafcCs|jo|jS)z% Is this device directly accessible? )r�rm)rHrQrQrR�direct�szPartitionDevice.directcCsZ|jrPtj�rdS|jtj�r>|r0|jtj�qH|jtj�n
tj	d��||_
n||_dS)z+ Set the bootable flag for this partition. Nz*boot flag not available for this partition)rUrZis_s390�flag_availablerD�PARTITION_BOOT�set_flag�
unset_flagrr<r0r()rHrMrQrQrR�
_set_bootable�s
zPartitionDevice._set_bootablecCs|jp
|jS)N)r0r()rHrQrQrR�
_get_bootable�szPartitionDevice._get_bootablecCs|js
dS|jj|�S)N)rUZisFlagAvailable)rH�flagrQrQrRr��szPartitionDevice.flag_availablecCs4t||j|d�|js$|j|�r(dS|jj|�S)N)r?r�)rr?rUr�ZgetFlag)rHr�rQrQrRrCszPartitionDevice.get_flagcCs8t||j|d�|js$|j|�r(dS|jj|�dS)N)r?r�)rr?rUr�ZsetFlag)rHr�rQrQrRr�szPartitionDevice.set_flagcCs8t||j|d�|js$|j|�r(dS|jj|�dS)N)r?r�)rr?rUr�Z	unsetFlag)rHr�rQrQrRr�szPartitionDevice.unset_flagcCs4|js|jrdSt|jdd�}|jjj}||kS)NF�numberr���)r7r6r{rUr8Zmagic_partition_number)rHr��magicrQrQrR�is_magics

zPartitionDevice.is_magiccsh|rR|jrR|jsdS|jjtjkrBt|jjj�dkrBt	d|j
��|jjj|j�tt
|�j|d�dS)NrzACannot remove extended partition %s.  Logical partitions present.)�	modparent)r6r7rUr=rDrl�lenr8r�rfr;�remove_partitionrYr�remove_hook)rHr�)r]rQrRr�s

zPartitionDevice.remove_hookcs�tt|�j|d�|rdS|js:|js:|j|jjjkr>dS|jjj|jjj	|jjj
|jj�|jrr|jjj
}n|jjj	}|jjjj|�}||_dS)N)�new)rYr�add_hookr7rUr8r��
add_partitionrVrKrLr=rmrzr@r|)rHr�rrK)r]rQrRr�/s

zPartitionDevice.add_hookcCs^t||j|jd�|js"|jr&dSt|jjdd��|_|j|_|jj	|_
|jtj
�|_dS)zg Probe for any missing information about this device.

            size, partition type, flags
        )rNr_)r`)rr;rr6rrUrbrE�target_sizer=r1rCrDr�r0)rHrQrQrRrBFs
zPartitionDevice.probec	Cs�t||j|jd�|jjj}|jjj|}t|jjjj	�}t
td�|�\}}|rX|d7}t||�}|jjjj}ddd|d|d|d	|g}zDyt
j|�Wn0tk
r�}ztjt|��WYd
d
}~XnXWd
tj�Xd
S)aX Wipe the partition metadata.

            Assumes that the partition metadata is located at the start
            of the partition and occupies no more than 1 MiB.

            Erases in block increments. Erases the smallest number of blocks
            such that at least 1 MiB is erased or the whole partition is
            erased.
        )rFz1 MiBrZddzif=/dev/zerozof=%szbs=%dzseek=%dzcount=%dN)rr;rFrUrVrKrLrr"�
sectorSize�divmod�minr?rZrun_program�OSErrorr9�error�strr	�settle)	rHrKZpart_lenZbs�countZremr"�cmd�erQrQrR�_wipeVs 


$zPartitionDevice._wipecCs�t||j|jd�|jjj|jjj|jjj	|jj
�|j�y|jjj�Wn8t
jk
r�|jjjj|j�}|jjj|��YnXdS)z Create the device. )rFN)rr;rFr7r8r�rUrVrKrLr=r��commitr�DiskLabelCommitErrorr@rAr?r�)rH�partrQrQrR�_create{s
zPartitionDevice._createcCsl|jr|jjj}n|jjj}|jjjj|�}t	j
dt|dd��||_|js^t|j
dd�j�tj|�dS)Nz post-commit partition path is %sr?T)r"r)rmr7r8rzrUrVrKr@r|r9r>r{r
r?Zdestroyr�_post_create)rHrrKrQrQrRr��s


zPartitionDevice._post_createc
Cs�t||j|jd�|dkr |j}|j}|j}tt|�t|j��}t	j
||j|d�}|j|jkrr|j
jjj}|}n|j
jjj}|}|||j�|_t	j|d�}	|	|fS)a$ Return a new constraint and end-aligned geometry for new size.

            :param :class:`parted.Partition` partition: the current partition
            :keyword :class:`~.size.Size` newsize: new partition size
            :return: a 2-tuple of constraint and geometry
            :raises _ped.CreateException: if the size extends beyond the end of
                                          the disk
            :raises _ped.CreateException: if newsize is 0

            If newsize is not specified, the current target size will be used.
        )rFN)r"rKrS)Z	exactGeom)rr;rFr�rVr"r�rr�rDZGeometryrKrSr7r8Z
end_alignmentZalignUpZ	alignDownrLZ
Constraint)
rHrr^Zcurrent_geomZcurrent_devZnew_lenZnew_geometryZalignZ
align_geomrdrQrQrRra�s"zPartitionDevice._compute_resizecCslt||j|jd�|j�|jjj}|j|j�}|j	|�\}}|j
|||j|jd�|jjj
�|j�dS)N)rF)rrdrKrL)rr;rF�_pre_resizer7r8r@rAr?rarirKrLr�rG)rHr@rrdrVrQrQrR�resize�s

zPartitionDevice.resizecs4tt|�j}|jr,|p*tdd�|jjD��S|SdS)Ncss|]}|jr|jVqdS)N)rn�	protected)�.0r�rQrQrR�	<genexpr>�sz,PartitionDevice.protected.<locals>.<genexpr>)rYrr�rm�anyr7r�)rHr�)r]rQrRr��szPartitionDevice.protectedcCs
||_dS)N)Z
_protected)rHr�rQrQrRr��scs|jr|jjStt|�jS)N)r7�sector_sizerYr)rH)r]rQrRr��szPartitionDevice.sector_sizecCs\|jstjd��tjsB|jjdkr:|jr:|jdjj�n|j�|j	sLdS|j
dd�dS)Nzdevice has not been createdZluksrT)�orig)rrr<rZallow_online_fs_resizer8r=r�Zteardownr�
setup_parents)rHrQrQrRr��s
zPartitionDevice._pre_resizecCs$tj|�|jsdS|jdd�dS)NT)r�)r�_pre_destroyrr�)rHrQrQrRr��s
zPartitionDevice._pre_destroycCs�t||j|jd�|jsdS|jjj|j�y|jjj�WnNt	j
k
r�|jjj|jjj
|jjj|jj�|jjjj|j�|_�YnX|jjjr�|jjjdkr�|jjj|jjjkr�|jjjj|j�}|jjj|�|jjj�dS)z Destroy the device. )rFNr�)rr;rFr6r7ryr�rUr�rr�r�rVrKrLr=r@rAr?r8r)rHr�rQrQrR�_destroy�s&

zPartitionDevice._destroycsh|js
dStt|�j�t|jt�rdtj�t	j
j|j
�rdytj
j|j�Wntjk
rbYnXdS)N)r6rYr�
_post_destroyrer7rr	r��osr?r�blockdev�dm�remover;ZDMError)rH)r]rQrRr�szPartitionDevice._post_destroycCs"|j}|jrt|jjdd��}|S)z Get the device's size. r_)r`)rErUrrb)rHrrQrQrR�	_get_size)szPartitionDevice._get_sizecsPt||j|j|j|d�t|t�s*td��tt|�j	|�|j
sL||_||_dS)a Set the device's size.

            .. note::

                If you change the size of an allocated-but-not-existing
                partition, you are responsible for calling do_partitioning to
                reallocate it with the new size.

        )rFrr^znew size must of type SizeN)
rr;rFrErerrfrYr�	_set_sizerr)r*)rHr^)r]rQrRr�0s

zPartitionDevice._set_sizecCs,y|jd}Wntk
r&d}YnX|S)z' The disk that contains this partition.rN)r �
IndexError)rHr7rQrQrR�	_get_diskEs

zPartitionDevice._get_diskcCs>t||jt|jdd�t|dd�d�g|_|r:|jj|�dS)z�Change the parent.

        Setting up a disk is not trivial.  It has the potential to change
        the underlying object.  If necessary we must also change this object.
        r;N)�oldr�)rr;r{r7r �append)rHr7rQrQrR�	_set_diskMs
zPartitionDevice._set_diskcCs|j�S)N)r�)rxrQrQrRrwYscCs
|j|�S)N)r�)rxr\rQrQrRrwYsc
Cs�|j}|jr.|jjj�}|jjj|jjkr.|S|jjjd}y|jjj|�}Wntj	k
rdYn"X|j
tj@r�|t
|jdd��7}|S)zs Maximum size partition can grow to with unchanged start sector.

            :rtype: :class:`~.size.Size`
        rr_)r`)rrnrUr7ZgetExtendedPartitionrVrLr|rgZPartitionExceptionr=rDZPARTITION_FREESPACErrb)rH�
max_part_sizeZextendedZsectorrrQrQrR�_unaligned_max_part_size[s
z(PartitionDevice._unaligned_max_part_sizecs�|jrnt||j|j|jd�td�}|jr|tjj|j�r|tjj|j�r|tj	tj
|j��}|r|tt|�t�}nt
t|�j�}|S)N)rr?rr)rmrrr?rrr��isdirr	Zdevice_get_part_sizeZ
get_devicer�rrYr�read_current_size)rHrZblocks)r]rQrRr�ys
z!PartitionDevice.read_current_sizecs�|jrh|jjj}|rJt|jjj|djj|jjj�}|j	|j
|�}qt|j	ttd�|jjjj
��}ntt|�j}|jr�|r�|j	|�}||kr�tjd�|j
}|S)Nrz1 KiBz3failed to align min size up; returning current sizer�)rmr7r8r�rrUrVrLr�rc�current_size�maxZ	alignmentZ	grainSizerYr�min_size�	resizabler9r>)rHZlogicalsZend_freer�rj)r]rQrRr��s



zPartitionDevice.min_sizecCsX|j}|jj}|rt||�n|}y|j|�}Wn$tk
rRtjd�|j}YnX|S)z) The maximum size this partition can be. z5failed to align max size down; returning current size)	r�r8�max_sizer�rc�ArithmeticErrorr9r>r�)rHr�Zmax_format_sizeZ
unaligned_maxr�rQrQrRr��s
zPartitionDevice.max_sizecs<|js
dS|jjdks|jr"dS|jr,dStt|�jSdS)NFrqT)rr7r=r6rmrYrr�)rH)r]rQrRr��szPartitionDevice.resizablecCsZ|jjr|j|jjkrdS|jjr8|jr8|j|jjksR|jrV|jrV|j|jjkrVdSdS)z� Check to make sure the size of the device is allowed by the
            format used.

            Returns:
            0  - ok
            1  - Too large
            -1 - Too small
        rrr�)r8r�rr�r'r+)rHrQrQrR�
check_size�s	zPartitionDevice.check_sizecs�tt|�j|�|jo&|jo&|j|jk|_|js�|jjt	t
d�jt	d�|_|j
|_|j
rf|jjt	�|_|jr�t|j�dkr�|jj|_|j|_n(|j|_|jr�|jjt	t
d�jt	d�|_dS)N)Zrounding)rrr)rYr�populate_ksdatarr�r�r�r*Zround_to_nearestr
rZ
convert_torr'rIr+Z	maxSizeMBr$r�r7r;r&ZprimOnlyZonPart)rH�data)r]rQrRr��s

zPartitionDevice.populate_ksdata)NNNFNNNNNNrNFNFNN)F)T)T)N)E�__name__�
__module__�__qualname__�__doc__Z_typeZ
_resizable�DEFAULT_PART_SIZEr3r4rT�propertyrZrcrhr?rNrmrnrorprsrtrvrUr}r�r�rPr�rur�r�r�r�r�rMr�rCr�r�r�r�r�rBr�r�r�rar�r��setterr�r�r�r�r�r�r�r�r�r7r�r�r�r�r�r�r��
__classcell__rQrQ)r]rRr6s�

	
	




	%
%
r)'r�rDrgZgiZrequire_versionZ
gi.repositoryrr�rrrrrZstorage_logrr	Zformatsr
rrrr
rZloggingZ	getLoggerr9r"rZstoragerr�r�librrrr�ZFALLBACK_DEFAULT_PART_SIZErrQrQrQrR�<module>s,