__  __    __   __  _____      _            _          _____ _          _ _ 
 |  \/  |   \ \ / / |  __ \    (_)          | |        / ____| |        | | |
 | \  / |_ __\ V /  | |__) | __ ___   ____ _| |_ ___  | (___ | |__   ___| | |
 | |\/| | '__|> <   |  ___/ '__| \ \ / / _` | __/ _ \  \___ \| '_ \ / _ \ | |
 | |  | | |_ / . \  | |   | |  | |\ V / (_| | ||  __/  ____) | | | |  __/ | |
 |_|  |_|_(_)_/ \_\ |_|   |_|  |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1
 if you need WebShell for Seo everyday contact me on Telegram
 Telegram Address : @jackleet
        
        
For_More_Tools: Telegram: @jackleet | Bulk Smtp support mail sender | Business Mail Collector | Mail Bouncer All Mail | Bulk Office Mail Validator | Html Letter private



Upload:

Command:

[email protected]: ~ $
�

��g#����SrSSKrSSKrSSKrSSKJr SSKJr SSKJr SSKJr SSKJ	r	 SSKJ
r
 SS	KJr SS
KJ
r
 "SS\5r"S
S\5r"SS\5r"SS\5r"SS\5r"SS\5r"SS\5rg)z6Classes and functions on collections of backup volumes�N)�config)�dup_time)�file_naming)�log)�manifest)�path)�util)�GPGErrorc��\rSrSrSrg)�CollectionsError�&�N)�__name__�
__module__�__qualname__�__firstlineno__�__static_attributes__r��;/usr/lib/python3/dist-packages/duplicity/dup_collections.pyrr&s��rrc��\rSrSrSrSrSrSSjrSrSr	S	r
S
rSrSr
S
rSSjrSrSrSrSrSrSrSrSrSrSrSrg)�	BackupSet�*z=
Backup set - the backup information produced by one session
c���XlSUl0UlSUlSUlSUlSUlSUlSUlSUl	SUl
SUl/UlX l
g)z>
Initialize new backup set, only backend is required at first
FN)�backend�info_set�volume_name_dict�remote_manifest_name�local_manifest_path�remote_jsonstat_name�local_jsonstat_path�time�
start_time�end_time�partial�	encrypted�
files_changed�action)�selfrr's   r�__init__�BackupSet.__init__/sh������
� "���$(��!�#'�� �$(��!�#'�� ���	������
�����������rc��UR$)z(
Assume complete if found manifest file
)r�r(s r�is_complete�BackupSet.is_completeBs���(�(�(rNc	���U(d[R"U5nU(a@URS:Xd1URS:Xd!URS:XdURS:XdgUR(dUR	U5 O�URRSS5UR:wagURUR:wagURUR:wdURUR:wag[UR5[UR5:wa3UR(a"UR(aURUl
SUR;a3URRSS5UlURU5 gUR(aURU5 gURceURUR ;dcS[#UR5S	[$R&"UR UR5S
[$R&"U5S35eXR UR'g)
ak
Add a filename to given set.  Return true if it fits.

The filename will match the given set if it has the right
times and is of the right type.  The information will be set
from the first filename given.

@param filename: name of file to add
@type filename: string

@param pr: pre-computed result of file_naming.parse(filename)
@type pr: Optional[ParseResults]
�full�incz	full-statzinc-statF�-stat�zVolume z" is already in the volume list as z. zF has the same volume number. Please check your command line and retry.T)r�parse�typer�set_info�replacer!r"r#�boolr%r$�set_jsonstatr�set_manifest�
volume_numberr�int�os�fsdecode�r(�filename�prs   r�add_filename�BackupSet.add_filenameHs�����"�"�8�,�B��"�'�'�V�+�r�w�w�%�/?�2�7�7�k�CY�]_�]d�]d�hr�]r���}�}��M�M�"���w�w���w��+�t�y�y�8���w�w�$�)�)�#���}�}����/�2�;�;�$�-�-�3O���B�L�L�!�T�$�.�.�%9�9��<�<�B�L�L�%'�\�\�D�N��b�g�g���������4�D�I����h�'���[�[����h�'���#�#�/�/�/��#�#�4�+@�+@�@�
��#�b�.�.�/�0�0R��;�;�t�4�4�R�5E�5E�F�G�H���;�;�x�(�)�*<�=�
�@�7?�!�!�"�"2�"2�3�rc�8�UR(aeURUlURUlURUlURUlURUlUR
Ul[
UR5UlSUlg)ze
Set BackupSet information from ParseResults object

@param pr: parse results
@type pr: ParseResults
TN)rr5r!r"r#r$r8r%)r(rAs  rr6�BackupSet.set_infoysj���=�=� � ��G�G��	��G�G��	��-�-�������
��G�G��	��z�z����b�l�l�+�����
rc�B�UR(aSUSURS35eXl[RR5nUH�n[R
"U5nU(dM"UR(aM5URURS3:XdMTURUR:XdMpURUR:XdM�URUR:XdM�[RRU5Ul g g)�7
Add local and remote manifest filenames to backup set
�*Cannot set filename of remote manifest to �; already set to �.r2N)
rr�archive_dir_path�listdirrr4rr5r!r"r#�appendr �r(�remote_filename�local_filename_list�local_filenamerAs     rr9�BackupSet.set_jsonstat�s���
�)�)�	w�
7��7H�HY�Z^�Zs�Zs�Yt�tu�v�	w�)�$3�!�$�5�5�=�=�?��1�N��"�"�>�2�B��������G�G�$�)�)��E�2�2��G�G�t�y�y�(��M�M�T�_�_�4��K�K�4�=�=�0�+1�+B�+B�+I�+I�.�+Y��(��2rc�N�UR5nUR5Ulg�N)�get_manifest�get_files_changedr&)r(�mfs  r�set_files_changed�BackupSet.set_files_changed�s!��
�
�
�
 ���1�1�3��rc�\�UR(aSUSURS35eXl[RR5nUH�n[R
"U5nU(dM"UR(dM5URUR:XdMQURUR:XdMmURUR:XdM�URUR:XdM�[RRU5UlUR5  g g)rGrHrIrJN)rrrKrLrr4rr5r!r"r#rMrrXrNs     rr:�BackupSet.set_manifest�s���
�)�)�	w�
7��7H�HY�Z^�Zs�Zs�Yt�tu�v�	w�)�$3�!�$�5�5�=�=�?��1�N��"�"�>�2�B����K�K�K��G�G�t�y�y�(��G�G�t�y�y�(��M�M�T�_�_�4��K�K�4�=�=�0�+1�+B�+B�+I�+I�.�+Y��(��&�&�(��2rc��UR5nUR5 URRU5 [RR5nUH�n[R"U5nU(dM"URUR:XdM>UR UR :XdMZUR"UR":XdMv[RR%U5R5 M� [&R("5 g![aQ [
R"[S5UVs/sHn[R"U5PM Os snfsn-5 GN8f=f![aR [
R"[S5UVs/sHn[R"U5PM Os snfsn-5 GMwf=f)z0
Remove all files in set, both local and remote
zBackupSet.delete: missing %sN)�
get_filenames�reverser�delete�	Exceptionr�Debug�_r=r>rrKrLrr4r!r"r#rMr	�release_lockfile)r(�rfn�frP�lfnrAs      rr_�BackupSet.delete�sU��� � �"�����
�	��L�L����$�%�5�5�=�=�?��&�C��"�"�3�'�B��r�b�g�g����*�r�}�}����/O�TV�T_�T_�cg�cp�cp�Tp���+�+�2�2�3�7�>�>�@�	'�	
������	��I�I�a�6�7�SV�:W�SV�a�2�;�;�q�>�SV��:W�W�X��	��!���I�I�a� >�?�[^�B_�[^�VW�2�;�;�q�>�[^��B_�_�`���s;�D�-E9�(E6� E$�#E6�5E6�9(G�! G�G�Gc��/nUR(aURUR5 UR[URR555 SSR
[[RU55S3$)z 
For now just list files in set
�[�, �])
rrM�extend�listr�values�join�mapr=r>)r(�filelists  r�__str__�BackupSet.__str__�sh�����$�$��O�O�D�5�5�6�����T�2�2�9�9�;�<�=��4�9�9�S����h�7�8�9��;�;rc�h�[R"UR=(d UR5$)z0
Return time string suitable for log statements
)r�timetoprettyr!r#r,s r�get_timestr�BackupSet.get_timestr�s"���$�$�T�Y�Y�%?�$�-�-�@�@rc��UR(dIUR(d8[R"[	S5[R
R5 UR(dS5eU(aUR5OSnUR(aUR5nU(a�UR(a�W(a�X#:wa�[R(a9[R"[	S5[R
R5 O[[R"[	S5[R"UR5[R "["54-5 gU(dLUR(aWnO8[R"[	S5[R
R$5 UR'5 g)z1
Make sure remote manifest is equal to local one
z6Fatal Error: No manifests found for most recent backupzif only one, should be remoteNz�Fatal Error: Remote manifest does not match local one.  Either the remote backup set or the local archive directory has been corrupted.z)Error processing remote manifest (%s): %sz;Fatal Error: Neither remote nor local manifest is readable.)rrr�
FatalErrorrb�	ErrorCode�no_manifests�get_remote_manifest�get_local_manifestr�check_remote�mismatched_manifests�Errorr=r>r	�uexc�message�unreadable_manifests�
check_dirinfo)r(r~�remote_manifest�local_manifests    r�check_manifests�BackupSet.check_manifests�s?���(�(��1I�1I��N�N��J�K��
�
�*�*�
��(�(�I�*I�I�(�8D�$�2�2�4�$���#�#�!�4�4�6�N��t�7�7�N��0��&�&��N�N��N��
�
�
�:�:�
��I�I��E�F��;�;�t�'@�'@�A�4�9�9�W�CU�V�W�� ���'�'�"0������V�W��M�M�6�6��	�%�%�'rc�&�UR(deURR5n[R"[	S5URR
[
U54-5 [R"5RU5$)z7
Return manifest object by reading local manifest file
z!Processing local manifest %s (%s))
r�get_datar�Inforb�uc_name�lenr�Manifest�from_string�r(�manifest_buffers  rr}�BackupSet.get_local_manifestsp���'�'�'�'��2�2�;�;�=������6�7�4�;S�;S�;[�;[�]`�ap�]q�:r�r�s�� � �"�.�.��?�?rc��UR(deURUR5n[R"5R	U5$)z7
Return manifest by reading remote manifest on backend
)r�get_remote_filerr�r�r�s  rr|�BackupSet.get_remote_manifestsC���(�(�(�(��.�.�t�/H�/H�I��� � �"�.�.��?�?rc��URRU5n[R"[S[R"U5S[U5S355 U$![aWn[R"[S[R"U5S[R"U5355 SnAgSnAff=f)NzError processing remote file (z): rzProcessing remote file z (�))rr�r
rryrbr=r>r	r�r�r�)r(�remote_file�remote_file_bufferr�s    rr��BackupSet.get_remote_files���	�!%���!6�!6�{�!C��	����,�R�[�[��-E�,F�b��M_�I`�Ha�ab�c�d�e�!�!��	�	��N�N�1�=�b�k�k�+�>V�=W�WZ�[_�[d�[d�el�[m�Zn�o�p�q���	�s�A"�"
C�,A
B>�>Cc�d�UR(aUR5$UR5$)z;
Return manifest object, showing preference for local copy
)rr}r|r,s rrU�BackupSet.get_manifest(s+���#�#��*�*�,�,��+�+�-�-rc�J�UR(a/[R"URR55nONUR(aURUR5nO![R"[S55 0$[R"U5$)Nz%No Jsonstat file found, return empty.)r �gzip�
decompressr�rr�rr�rb�json�loads)r(�json_stat_bytess  r�get_jsonstat�BackupSet.get_jsonstat1sm���#�#�"�o�o�d�.F�.F�.O�.O�.Q�R�O�
�
&�
&�"�2�2�4�3L�3L�M�O��H�H�Q�>�?�@��I��z�z�/�*�*rc���UR(de[URR55nUVs/sHo RUPM nnUR(aS[
R"UR5nU(a,UR(dURUR5 UR(aURUR5 U$s snf)z:
Return sorted list of (remote) filenames of files in set
)
r�sortedr�keysrrr4r$rMr)r(�volume_num_list�x�volume_filenamesrAs     rr]�BackupSet.get_filenames;s����}�}��}� ��!6�!6�!;�!;�!=�>��>M�N�o��1�1�!�4�o��N��$�$�
�"�"�4�#<�#<�=�B��"�*�*� �'�'��(A�(A�B��$�$��#�#�D�$=�$=�>����Os�C'c��UR(aUR$UR(aUR$S5e)z8
Return time if full backup, or end_time if incremental
z'Neither self.time nor self.end_time set)r!r#r,s r�get_time�BackupSet.get_timeNs1���9�9��9�9���=�=��=�=� �;�;�;�qrc��UR$rT)r&r,s rrV�BackupSet.get_files_changedXs���!�!�!rc�Z�[[URR555$)z)
Return the number of volumes in the set
)r�rmrr�r,s r�__len__�BackupSet.__len__[s#���4��-�-�2�2�4�5�6�6rc�0�URUR:H=(aw URUR:H=(aW URUR:H=(a7 URUR:H=(a [	U5[	U5:H$)z2
Return whether this backup set is equal to other
)r5r!r"r#r�)r(�others  r�__eq__�BackupSet.__eq__ass��

�I�I����#�
(��	�	�U�Z�Z�'�
(����5�#3�#3�3�
(��
�
����/�
(��D�	�S��Z�'�	
r)r'rr%r#r&rr rr$rrr"r!r5rrT)T)rrrr�__doc__r)r-rBr6r9rXr:r_rrrvr�r}r|r�rUr�r]r�rVr�r�rrrrrr*su����&)�/�b�"�04��2 �,<�A�'(�R@�@�"�.�+� �&<�"�7�

rrc�h�\rSrSrSrSrSrSrSSjrSr	Sr
S	rS
rSSjr
SrS
rSrSrg)�BackupChaininz�
BackupChain - a number of linked BackupSets

A BackupChain always starts with a full backup set and continues
with incremental ones.
c�J�XlSUl/UlSuUlUlg)z9
Initialize new chain, only backend is required at first
N�NN)r�fullset�incset_listr"r#)r(rs  rr)�BackupChain.__init__vs&����������)3�&����rc���UR(d[U[5(deXlUR(deURURsUlUlg)z
Add full backup set
N)r��
isinstancerr!r"r#)r(r�s  r�set_full�BackupChain.set_fullsF���<�<�J�w�	�$B�$B�B�B����|�|��|�)0���w�|�|�&����rc�T�URUR:XaURRU5 O�UR(a|URURSR:XaUURURSR:�a.[R
"[
S55 XRS'Oa[R
"[
S5[R"UR5[R"UR54-5 gURUl[R
"[
S5[R"UR5[R"UR54-5 UR(deg)z<
Add incset to self.  Return False if incset does not match
���z'Preferring Backupset over previous one!z;Ignoring incremental Backupset (start_time: %s; needed: %s)Fz;Added incremental Backupset (start_time: %s / end_time: %s)T)	r#r"r�rMrr�rbrru)r(�incsets  r�add_inc�BackupChain.add_inc�s<���=�=�F�-�-�-����#�#�F�+�� � ��%�%��)9�)9�"�)=�)H�)H�H��O�O�d�&6�&6�r�&:�&C�&C�C�����D�E�F�'-� � ��$�����S�T� �-�-�f�.?�.?�@� �-�-�d�m�m�<���������
����
�K�L��%�%�f�&7�&7�8��%�%�f�o�o�6��
�	
��}�}��}�rc��[[UR5S-
SS5H nURUR5 M" UR(a#U(dURR5 ggg)z,
Delete all sets in chain, in reverse order
�r�N)�ranger�r�r_r�)r(�	keep_full�is   rr_�BackupChain.delete�s^���s�4�+�+�,�q�0�"�b�9�A����Q��&�&�(�:��<�<�	��L�L���!�!*�<rc��URVs/sHo"RU::dMUPM nnUR/U-$s snf)z9
Return a list of sets in chain earlier or equal to time
)r�r#r�)r(r!�s�
older_incsetss    r�get_sets_at_time�BackupChain.get_sets_at_time�s@��%)�$4�$4�K�$4�q�
�
�d�8J��$4�
�K����~�
�-�-��Ls�>�>c�Z�UR(aURS$UR$)z 
Return last BackupSet in chain
r�)r�r�r,s r�get_last�BackupChain.get_last�s(������#�#�B�'�'��<�<�rc��UR$)z6
Return first BackupSet in chain (ie the full backup)
)r�r,s r�	get_first�BackupChain.get_first�s���|�|�rc��S[R"UR5S[R"UR5S3$)zN
Return a short one-line description of the chain,
suitable for log messages.
riz]-[rk)rrur"r#r,s r�
short_desc�BackupChain.short_desc�s=��
�8�(�(����9�:�#�h�>S�>S�TX�Ta�Ta�>b�=c�cd�e�erc�6�/nUR5H�nUR(aSnURnOSnURnUR(aSnOSnUR	UUS[
R"U5S[U5SU35 M� U$)z.
Return summary, suitable for printing to log
r0r1�enc�noenc� )�get_all_setsr!r#r%rMr�timetostringr�)r(�prefix�lr��btyper!r�s       r�to_log_info�BackupChain.to_log_info�s���
���"�"�$�A��v�v����v�v�����z�z���{�{�����
�H�H��x��w�a��(=�(=�d�(C�'D�A�c�!�f�X�Q�s�e�T�U�%��rc���SnS[S5[R"UR5-[S5[R"UR5-[S5[UR5S-4-[S5UR54-U[S5[S	5[S
54-/nUR5HvnUR(a[S5nURnO[S5nURnURX[R"U5[U54-5 Mx URS5 S
RU5$)z4
Return string representation, for testing purposes
z%20s   %30s   %15s�-------------------------zChain start time: zChain end time: z#Number of contained backup sets: %dr�z%Total number of contained volumes: %d�Type of backup set:�Time:zNum volumes:�Full�Incremental�
)rbrrur"r#r�r��get_num_volumesr�r!rMro)r(�
set_schemar�r�r�r!s      rrr�BackupChain.__str__�s*��*�
�'�
�"�#�h�&;�&;�D�O�O�&L�L�
� �!�H�$9�$9�$�-�-�$H�H�
�3�4��D�<L�<L�8M�PQ�8Q�7S�S�
�5�6�$�:N�:N�:P�9R�R��!�1�2�A�g�J��.�@Q�R�R�

���"�"�$�A��v�v��&�	���v�v���-�(���z�z��
�H�H�Z�(�*?�*?��*E�s�1�v�"N�N�O�%�	
���,�-��y�y��|�rc�T�SnUR5HnU[U5-
nM U$)z1
Return the total number of volumes in the chain
r)r�r�)r(�nr�s   rr��BackupChain.get_num_volumes�s.��
���"�"�$�A�
��Q��K�A�%��rc�p�UR(aUR/UR-$UR$)z)
Return list of all backup sets in chain
)r�r�r,s rr��BackupChain.get_all_setss.���<�<��L�L�>�D�$4�$4�4�4��#�#�#r)rr#r�r�r"N�F)r3)rrrrr�r)r�r�r_r�r�r�r�r�rrr�r�rrrrr�r�nsF���4�D� �D"�.� ��f��&�4�$rr�c�X�\rSrSrSrSrSrSrSrS
Sjr	S
S	jr
SS
jrS
SjrSr
g)�SignatureChainizn
A number of linked SignatureSets

Analog to BackupChain - start with a full-sig, and continue with
new-sigs.
c��U(aUSsUlUlOSUsUlUlSUl/UlSuUlUlg)aV
Return new SignatureChain.

local should be true iff the signature chain resides in
config.archive_dir_path and false if the chain is in
config.backend.

@param local: True if sig chain in config.archive_dir_path
@type local: Boolean

@param location: Where the sig chain is located
@type location: config.archive_dir_path or config.backend
Nr�)rKr�fullsig�inclistr"r#)r(�local�locations   rr)�SignatureChain.__init__sE���2:�D�/�D�!�4�<�26��/�D�!�4�<�������)3�&����rc��UR(a[S5nO[S5n/nUR(aURUR5 UR	UR
5 USSR
U5S3$)z.
Local or Remote and List of files in the set
r��remotez: [rjrk)rKrbr�rMrlr�ro)r(�placerqs   rrr�SignatureChain.__str__.sh��� � ��g�J�E��h�K�E����<�<��O�O�D�L�L�)�������%����D�I�I�h�/�0��2�2rc�\�UH&n[U[5(aMSUSUS35e g)z/
Check to make sure times are in whole seconds
zTime z in z wrong typeN)r�r<)r(�	time_listr!s   r�check_times�SignatureChain.check_times<s4���D��d�C�(�(�B�E�$��t�I�;�k�B�B�q�rc�(�UR(agg)zA
Return true if represents a signature chain in archive_dir_path
TF)rKr,s r�islocal�SignatureChain.islocalDs��� � ��rNc��U(d[R"U5nU(dgUR(auURS:wagURUR
:wagURRU5 URUR
/5 UR
UlgURS:wagXlURURUR/5 URURsUlUlg)z=
Add new sig filename to current chain.  Return true if fits
N�new-sigr��full-sig)
rr4r�r5r"r#r�rMrr!r?s   rrB�SignatureChain.add_filenameMs�����"�"�8�,�B����<�<��w�w�)�#���}�}��
�
�-���L�L����)����b�k�k�]�+��K�K�D�M���w�w�*�$��#�L����b�g�g�r�w�w�/�0�-/�W�W�b�g�g�*�D�O�T�]�rc��^�TR(deTR(aU4SjnOTRRnTR	U5Vs/sH
o2"U5PM sn$s snf)z\
Return ordered list of signature fileobjs opened for reading,
optionally at a certain time
c�~>�[R"TRRU45nUR	S5$)z:Open filename in archive_dir_path, return filtered fileobj�rb)r�DupPathrK�name�
filtered_open)r@�sig_dpr(s  �r�filename_to_fileobj�8SignatureChain.get_fileobjs.<locals>.filename_to_fileobjos2������d�&;�&;�&@�&@�8�+�N���+�+�D�1�1r)r�rKr�get_fileobj_readr])r(r!rres`   r�get_fileobjs�SignatureChain.get_fileobjsgs\���
�|�|��|�� � �
2�#'�,�,�"?�"?��04�0B�0B�4�0H�I�0H�1�#�A�&�0H�I�I��Is�A*c�<�UR(a�[[UR5S-
SS5H9nURR	URU5R5 M; U(d4URR	UR5R5 ggUR(deURSSnUR5 U(dUR	UR5 URRU5 g)z#
Remove all files in signature set
r�r�N)	rKr�r�r�rMr_r�rr^)r(r�r��inclist_copys    rr_�SignatureChain.deletexs���
� � ��3�t�|�|�,�q�0�"�b�9���%�%�,�,�T�\�\�!�_�=�D�D�F�:���%�%�,�,�T�\�\�:�A�A�C���<�<��<��<�<��?�L�� � �"���#�#�D�L�L�1��L�L����-rc�
�UR(aUR/nO/nURnU(a8UVs/sH+n[R"U5RU::dM)UPM- nnURU5 U$s snf)z@
Return ordered list of filenames in set, up to a provided time
)r�r�rr4r#rl)r(r!r�r�r�s     rr]�SignatureChain.get_filenames�sj���<�<�����A��A��,�,���")�S�'�Q�[�->�->�q�-A�-J�-J�d�-R�q�'�G�S�	��������Ts�(B�%B)rKrr#r�r�r"rTr�)rrrrr�r)rrrr	rBrr_r]rrrrr�r�s1���4�,3�C���4J�".�$rr�c��\rSrSrSrSrSrSrSSjrSr	Sr
S	rS
rSSjr
S
rSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrg) �CollectionsStatusi�z2
Hold information about available chains and sets
c��XlX lX0lSUlSUlSUlSUl/Ul/UlSUl	SUl
SUlg)z'
Make new object.  Does not set values
N)rrKr'�matched_chain_pair�all_backup_chains�other_backup_chains�all_sig_chains�local_orphaned_sig_names�remote_orphaned_sig_names�orphaned_backup_sets�incomplete_backup_sets�
values_set)r(rrKr's    rr)�CollectionsStatus.__init__�sc���� 0����#'���"&���#'�� �"���)+��%�)+��&�$(��!�&*��#���rc�N�SURRR3SUR3/n[	[UR55H@nURS[U535 XRURS5-
nMB UR(a1URS5 XRSRS5-
nURS[UR535 URS[UR535 U$)	z@
Return summary of the collection, suitable for printing to log
zbackend zarchive-dir z
chain-no-sig r�zchain-completer�zorphaned-sets-num zincomplete-sets-num )
r�	__class__rrKr�r�r%rMr<r�r#r)r*�r(r�r�s   rr��CollectionsStatus.to_log_info�s��
�t�|�|�-�-�6�6�7�8��4�0�0�1�2�
��
�s�4�3�3�4�5�A�
�H�H�}�S��V�H�-�.�
�)�)�!�,�8�8��=�=�A�6�
�"�"�
�H�H�%�&�
�(�(��+�7�7��<�<�A�	���%�c�$�*C�*C�&D�%E�F�G�	���'��D�,G�,G�(H�'I�J�K��rc���[S5S[S5URRR4-[S5UR(aURR
OS4-/nUR
S[S5[UR5--5 [[UR55HpnUR
[S5US	-[UR54-5 UR
[URU55 UR
S
5 Mr UR(aEUR
S[S5-5 UR
[URS	55 OUR
[S55 UR(dUR(a{UR
[S
5[UR5-5 UR
[S5[UR5-5 UR
[S55 OUR
[S55 SRU5$)z)
Return string summary of the collection
zCollection Statusz-----------------zConnecting with backend: %szArchive dir: %s�Noner�z#Found %d secondary backup chain(s).zSecondary chain %d of %d:r�r3z9Found primary backup chain with matching signature chain:z-No backup chains with active signatures foundz2Also found %d backup set(s) not part of any chain,z and %d incomplete backup set(s).zEThese may be deleted by running duplicity with the "cleanup" command.z,No orphaned or incomplete backup sets found.)rbrr.rrKr�rMr�r%r��strr#r)r*ror/s   rrr�CollectionsStatus.__str__�s���

�!�"��
�+�,����0F�0F�0O�0O�/Q�Q�
�� �T�EZ�EZ�D�$9�$9�$A�$A�`f�#h�h�	
��	
�����?�@�3�t�G_�G_�C`�`�`�a��s�4�3�3�4�5�A�
�H�H�Q�2�3�q�1�u�c�$�BZ�BZ�>[�6\�\�]�
�H�H�S��1�1�!�4�5�6�
�H�H�R�L�6�
�"�"�
�H�H�T�A�\�]�]�^�
�H�H�S��0�0��3�4�5�
�H�H�Q�F�G�H��$�$��(C�(C�
�H�H�Q�K�L�s�SW�Sl�Sl�Om�m�n�
�H�H�Q�9�:�S��A\�A\�=]�]�^�
�H�H�Q�a�b�c�
�H�H�Q�E�F�G��y�y��|�rc�.�SUlURR5n[R"[S5[
U5-5 URR5n[R"[S5[
U5-5 /nUHFn[R"U5nU(dM"UR(dM5URU5 MH URXB-5unUlUlUR!U5nXpl[
U5[
UR"5:XdS5eUR%S5uo�lUR%SUS9uo�lUR+X�-U5 UR-U5 U$)z�
Set values from archive_dir_path and backend.

Returns self for convenience.  If sig_chain_warning is set to None,
do not warn about unnecessary sig chains.  This is because there may
naturally be some unecessary ones after a full backup.
r�z%d file(s) exists on backendz%d file(s) exist in cachez7get_sorted_chains() did something more than re-orderingTF)rq)r+rrmrrarbr�rKrLrr4r$rM�get_backup_chainsr)r*�get_sorted_chainsr$�get_signature_chainsr'r(�set_matched_chain_pair�warn)
r(�sig_chain_warning�backend_filename_listrP�partialsrQrA�
backup_chains�local_sig_chains�remote_sig_chainss
          r�
set_values�CollectionsStatus.set_values�s~�����!%��� 1� 1� 3���	�	�!�2�3�c�:O�6P�P�Q�#�3�3�;�;�=���	�	�!�/�0�3�7J�3K�K�L���1�N��"�"�>�2�B��r�b�j�j�j�����/�2�
�"�"�8�#C�D�		
���%��'��.�.�}�=�
�!.���=�!�S��"�"�&
�
�	E�D�	E�
�;?�:S�:S�TX�:Y�7��7�<@�<U�<U��1�=V�=
�9��9�	
�#�#�$4�$H�-�X��	�	�#�$��rc��U=(a URU5nXlUSSUlSUlU(Ga
U(GaUSn[	[U5S-
SS5H�nXRUR:XaO�[UR55S:�a�XRUR5SR:Xa\[R"[S55 URRURS5 URSSUl
OM�URcXU4Ul O UR(a)URRURS5 gg)a	
Set self.matched_chain_pair and self.other_sig/backup_chains

The latest matched_chain_pair will be set.  If there are both
remote and local signature chains capable of matching the
latest backup chain, use the local sig chain (it does not need
to be downloaded).
Nr�r�����zGWarning, discarding last backup set, because of missing signature file.)r7r&r%r#r�r�r#r�r�Warnrbr*rMr��remove)r(�
sig_chainsr>�latest_backup_chainr�s     rr9�(CollectionsStatus.set_matched_chain_pair sY�� �F�D�$:�$:�:�$F�
�(��#0��#3�� �"&����-�"/��"3���3�z�?�Q�.��B�7���=�)�)�-@�-I�-I�I���+�8�8�:�;�q�@�"�
�.�.�2E�2R�2R�2T�UW�2X�2a�2a�a��H�H�Q�k�l�m��/�/�6�6�7J�7V�7V�WY�7Z�[�6I�6U�6U�VY�WY�6Z�'�3���*�*�2�/9�}�>Q�.R�D�+��'8�*�"�"��$�$�+�+�D�,C�,C�A�,F�G�#rc	�l�UR(deUR(ao[R"[	S5S-SR[
[RUR55-[RR5 UR(ao[R"[	S5S-SR[
[RUR55-[RR5 UR(aPU(aIUR(d8[R"[	S5[RR5 UR(a8[R"[	S5[RR 5 UR"(af[R"[	S5S-SR[
[$UR"55-[RR&5 gg)z>
Log various error messages if find incomplete/orphaned files
z>Warning, found the following local orphaned signature file(s):r�z?Warning, found the following remote orphaned signature file(s):z;Warning, found signatures but no corresponding backup fileszIWarning, found incomplete backup sets, probably left from aborted sessionz5Warning, found the following orphaned backup file(s):N)r+r'rrFrbrorpr=r>�WarningCode�orphaned_sigr(r&r#�
unmatched_sigr*�incomplete_backupr)r3�orphaned_backup)r(r;s  rr:�CollectionsStatus.warnGs���������(�(��H�H��R�S����)�)�C����T�-J�-J�K�L�M����,�,�	
��)�)��H�H��S�T����)�)�C����T�-K�-K�L�M�N����,�,�	
����#4�T�=T�=T��H�H��R�S����-�-�
�
�&�&��H�H��`�a����1�1�
�
�$�$��H�H��I�J����)�)�C��T�%>�%>�?�@�A����/�/�	
�%rc	�D^^^^	�[R"[S5UVs/sHn[R"U5PM sn-5 /m	UU	4SjnUHnU"U5 M
 TRT	5um	n//smmUUU4SjnT	HnU"U5 M
 TTU4$s snf)z�
Split given filename_list into chains

Return value will be tuple (list of chains, list of sets, list
of incomplete sets), where the list of sets will comprise sets
not fitting into any chain, and the incomplete sets are sets
missing files.
z/Extracting backup chains from list of files: %sc�L>�[R"U5nTHRnURX5(dM[R"[S5[R"U54-5  g [R"[S5[R"U54-5 [TRTR5nURX5(aTRU5 g[R"[S5[R"U5-5 g)z7
Try adding filename to existing sets, or make new one
zFile %s is part of known setz4File %s is not part of a known set; creating new setz+Ignoring file (rejected by backup set) '%s'N)rr4rBrrarbr=r>rrr'rM)r@rA�set�new_setr(�setss    ��r�add_to_sets�8CollectionsStatus.get_backup_chains.<locals>.add_to_sets~s�����"�"�8�,�B����#�#�H�1�1��I�I�a� >�?�2�;�;�x�CX�BZ�Z�[���
�	�	�!�R�S�WY�Wb�Wb�ck�Wl�Vn�n�o�#�D�L�L�$�+�+�>���'�'��5�5��K�K��(��I�I�a� M�N�QS�Q\�Q\�]e�Qf�f�grc�`>�URS:Xah[TR5nURU5 TR	U5 [
R"[S5UR5-5 gURS:XdeTH[nURU5(dM[
R"[S5UR5UR54-5  g [
R"[S5UR54-5 TR	U5 g)z4
Try adding set to existing chains, or make new one
r0zFound backup chain %sr1z%Added set %s to pre-existing chain %szFound orphaned set %sN)r5r�rr�rMrrarbr�r�rv)rT�	new_chain�chain�chains�
orphaned_setsr(s   ���r�
add_to_chains�:CollectionsStatus.get_backup_chains.<locals>.add_to_chains�s�����x�x�6�!�'����5�	��"�"�3�'��
�
�i�(��	�	�!�3�4�	�8L�8L�8N�O�P��x�x�5�(�(�(�#�E��}�}�S�)�)��	�	�!�$K�"L�PS�P_�P_�Pa�ch�cs�cs�cu�Ov�"v�w��$�
�I�I�a� 7�8�C�O�O�<M�;O�O�P�!�(�(��-r)rrarbr=r>�get_sorted_sets)
r(�
filename_listrerW�incomplete_setsr^r�r\r]rVs
`      @@@rr6�#CollectionsStatus.get_backup_chainsqs����	�	�	�!�E�F�bo�Ip�bo�]^�"�+�+�VW�.�bo�Ip�p�q���	h�"�A���N�� $� 4� 4�T� :���o� "�B���
�	.�&�A��!����}�o�5�5��aJqs� B
c�Z�//p2UHwnUR5(dURU5 M+URS:XaURURU45 MZURURU45 My URSS9 UVs/sHoUSPM	 snU4$s snf)z=
Sort set list by end time, return (sorted list, incomplete)
r0c��US$)Nrr�r�s r�<lambda>�3CollectionsStatus.get_sorted_sets.<locals>.<lambda>�s��!�A�$r��keyr�)r-rMr5r!r#�sort)r(�set_list�time_set_pairsrbrT�ps      rr`�!CollectionsStatus.get_sorted_sets�s���+-�b���C��?�?�$�$��&�&�s�+����V�#��%�%�s�x�x��o�6��%�%�s�|�|�S�&9�:�
�	�����/�,�-�n��!��n�-��>�>��-s�B(Nc��^^^�UUU4SjnUU4Sjn//peU"5H�n[R"U5nU(dM"URS:Xa2U"5n	U	RXx5(deUR	U	5 MdURS:XdMvUR	U5 M� /n
URSS9 UH6nUHnURU5(dM M# U
R	U5 M8 XZ4$)z�
Find chains in archive_dir_path (if local is true) or backend

Use filelist if given, otherwise regenerate.  Return value is
pair (list of chains, list of signature paths not in any
chains).
c�>�TbT$T(aTRR5$TRR5$rT)rKrLrrm)rqr�r(s���r�get_filelist�<CollectionsStatus.get_signature_chains.<locals>.get_filelist�s9����#�����,�,�4�4�6�6��|�|�(�(�*�*rc�j>�T(a[STR5$[STR5$)z"
Return new empty signature chain
TF)r�rKr)r�r(s��r�get_new_sigchain�@CollectionsStatus.get_signature_chains.<locals>.get_new_sigchain�s,����%�d�D�,A�,A�B�B�%�e�T�\�\�:�:rr
rc�T�[[R"U5R5$rT)r<rr4r"rfs rrg�8CollectionsStatus.get_signature_chains.<locals>.<lambda>�s��S��1B�1B�1�1E�1P�1P�-Qrri)rr4r5rBrMrk)
r(r�rqrrrur\�new_sig_filenamesr@rArZ�orphaned_filenames�sig_filenamer[s
```          rr8�&CollectionsStatus.get_signature_chains�s����	+�	;�%'��!�$��H��"�"�8�,�B��r��7�7�j�(� 0� 2�I�$�1�1�(�?�?�?�?��M�M�)�,��W�W�	�)�%�,�,�X�6�'� �����#Q��R�-�L����%�%�l�3�3�� �#�)�)�,�7�.��)�)rc� �0nUHAnURU;aX#RRU5 M2U/X#R'MC [UR55n/nUH�nX&n[	U5S:XaURUS5 M,[	U5S:XdeUSR
(a*URUS5 URUS5 M{URUS5 URUS5 M� U$)z<
Return chains sorted by end_time.  If tie, local goes last
r�rrD)r#rMr�r�r�r)r(�
chain_list�endtime_chain_dictr[�sorted_end_times�sorted_chain_listr#s       rr7�#CollectionsStatus.get_sorted_chains�s��
 ���E��~�~�!3�3�"�>�>�2�9�9�%�@�6;�W�"�>�>�2�	 �"�"4�"9�"9�";�<����(�H�+�5�J��:��!�#�!�(�(��A��7��:��!�+�+�+��a�=�(�(�%�,�,�Z��]�;�%�,�,�Z��]�;�%�,�,�Z��]�;�%�,�,�Z��]�;�)�!� rc��UR(d[S5eURVs/sH+o"RUs=::aUR::dM%O M)UPM- nn[	U5S:�a[S5e[	U5S:XaUS$URVs/sHo"RU:dMUPM nnU(aUS$URS$s snfs snf)z�
Return backup chain covering specified time

Tries to find the backup chain covering the given time.  If
there is none, return the earliest chain before, and failing
that, the earliest chain.
zNo backup chains foundr�zTwo chains cover the given timerr�)r$rr"r#r�)r(r!�c�covering_chains�
old_chainss     r�get_backup_chain_at_time�*CollectionsStatus.get_backup_chain_at_time
s����%�%�"�#;�<�<�&*�&<�&<�c�&<����PT�@b�XY�Xb�Xb�@b�1�@b�1�&<��c����!�#�"�#D�E�E�
��
!�Q�
&�"�1�%�%�!%�!7�!7�M�!7�A�:�:��;L�a�!7�
�M���b�>�!��)�)�!�,�,��d��Ns�$C�C�C�C�2Cc��UR(d[S5eURVs/sH+o"RUs=::aUR::dM%O M)UPM- nnU(aUS$URVs/sHo"RU:dMUPM nnU(aUS$URSnXR:ax[R
"[
S5[R"UR5-[RR[R"UR55 U$s snfs snf)z�
Return signature chain covering specified time

Tries to find the signature chain covering the given time.  If
there is none, return the earliest chain before, and failing
that, the earliest chain.
zNo signature chains foundr�rz]No signature chain for the requested time. Using oldest available chain, starting at time %s.)r&rr"r#rrFrbrrurL�no_sig_for_timer�)r(r!r�r�r��oldests      r�get_signature_chain_at_time�-CollectionsStatus.get_signature_chain_at_time!s���"�"�"�#>�?�?�&*�&9�&9�`�&9��\�\�T�=_�UV�U_�U_�=_�1�=_�1�&9��`��"�2�&�&�!%�!4�!4�J�!4�A�
�
�T�8I�a�!4�
�J���b�>�!��(�(��+�F��'�'�'�����M���+�+�F�,=�,=�>�	?�
�O�O�3�3��)�)�&�*;�*;�<���M��)a��Ks�$D<�D<�D<�9E�Ec�T�UR(de/n/nURUR-nUHTnUR(a!UR	UR55 M5UR	UR55 MV XR-
nX R-
nX4$)z�
Return list of the names of extraneous duplicity files

A duplicity file is considered extraneous if it is
recognizable as a duplicity file, but isn't part of some
complete backup set, or current signature chain.
)r+r)r*rrlr]r'r()r(�local_filenames�remote_filenames�ext_containers�set_or_chains     r�get_extraneous� CollectionsStatus.get_extraneousBs�������������2�2�T�5P�5P�P��*�L��#�#� �'�'��(B�(B�(D�E��&�&�|�'A�'A�'C�D�	+�
	�8�8�8���:�:�:���0�0rc��[UVs/sHo"R5U4PM sn5nUVs/sHoDSPM	 sn$s snfs snf)z@Return new list containing same elems of setlist, sorted by timer�)r�r�)r(�setlistr��pairsrns     r�	sort_sets�CollectionsStatus.sort_setsWsC���7�;�7�a����q�)�7�;�<��#�$�e��!��e�$�$��<��$s
�A�Ac���UR(de/nURHJnURU:dMUR(aX0RSLdM9UR	U5 ML U$)aj
Returns a list of backup chains older than the given time t

All of the times will be associated with an intact chain.
Furthermore, none of the times will be of a chain which a newer
set may depend on.  For instance, if set A is a full set older
than t, and set B is an incremental based on A which is newer
than t, then the time of set A will not be returned.
r�)r+r$r#r#rM�r(�tr�r[s    r�get_chains_older_than�'CollectionsStatus.get_chains_older_than\s`��������
��+�+�E��~�~��!�4�+B�+B�e�Sj�Sj�kl�Sm�Fm��!�!�%�(�,��rc���UR(de/nURHJnURU:dMUR(aX0RSLdM9UR	U5 ML U$)am
Returns a list of signature chains older than the given time t

All of the times will be associated with an intact chain.
Furthermore, none of the times will be of a chain which a newer
set may depend on.  For instance, if set A is a full set older
than t, and set B is an incremental based on A which is newer
than t, then the time of set A will not be returned.
r)r+r&r#r#rMr�s    r�get_signature_chains_older_than�1CollectionsStatus.get_signature_chains_older_thanns`��������
��(�(�E��~�~��!�4�+B�+B�e�Sj�Sj�kl�Sm�Fm��!�!�%�(�)��rc�$�URS5$)zA
Return the time of the last full backup,
or 0 if there is none.
r�)�get_nth_last_full_backup_timer,s r�get_last_full_backup_time�+CollectionsStatus.get_last_full_backup_time�s��
�1�1�!�4�4rc�`�URU5nUcgUR5R$)zH
Return the time of the nth to last full backup,
or 0 if there is none.
r)�get_nth_last_backup_chainr�r!)r(r�r[s   rr��/CollectionsStatus.get_nth_last_full_backup_time�s/��
�.�.�q�1���=���?�?�$�)�)�)rc�$�URS5$)zZ
Return the last full backup of the collection,
or None if there is no full backup chain.
r�)r�r,s r�get_last_backup_chain�'CollectionsStatus.get_last_backup_chain�s��
�-�-�a�0�0rc���UR(deUS:�de[UR5U:agURSSnURSS9 UR	5 X!S-
$)z�
Return the nth-to-last full backup of the collection,
or None if there is less than n backup chains.

NOTE: n = 1 -> time of latest available chain (n = 0 is not
a valid input). Thus the second-to-last is obtained with n=2
rather than n=1.
rNc�6�UR5R$rT)r�r!rfs rrg�=CollectionsStatus.get_nth_last_backup_chain.<locals>.<lambda>�s��!�+�+�-�"4�"4rrir�)r+r�r$rkr^)r(r�r�s   rr��+CollectionsStatus.get_nth_last_backup_chain�sf��������1�u��u��t�%�%�&��*���'�'��*�����4��5������!�e�}�rc��/nURU5H"nURUR55 M$ URU5$)af
Returns a list of backup sets older than the given time t

All of the times will be associated with an intact chain.
Furthermore, none of the times will be of a set which a newer
set may depend on.  For instance, if set A is a full set older
than t, and set B is an incremental based on A which is newer
than t, then the time of set A will not be returned.
)r�rlr�r�)r(r��old_setsr[s    r�get_older_than� CollectionsStatus.get_older_than�sB�����/�/��2�E��O�O�E�.�.�0�1�3��~�~�h�'�'rc�Z�UR(deURVs/sHo"RU:�dMUPM nn/nUHInUR5Vs/sHofR	5U:dMUPM nnURU5 MK UR
U5$s snfs snf)z�
Returns list of old backup sets required by new sets

This function is similar to the previous one, but it only
returns the times of sets which are old but part of the chains
where the newer end of the chain is newer than t.
)r+r$r#r�r�rlr�)r(r�r��
new_chains�result_setsr[r�r�s        r�get_older_than_required�)CollectionsStatus.get_older_than_required�s��������!%�!7�!7�K�!7�A�:�:��?�a�!7�
�K����E�#(�#5�#5�#7�L�#7�a�:�:�<�!�;K��#7�H�L����x�(� ��~�~�k�*�*��L��Ms�B#�B#�B(�5B(c	��UnS[U5;aSURSS5-S-nUR(dgURSR5n/n/n[R
"U5nUHsnUR
5Vs/sHowSPM	 nnX(;dM,URU5 URU5n	URUR
5U	S5 Mu [U[[XT555$s snf)z-
Returns time line of specified file changed
r��"z\x20r3r�r)r3r7r#r�r=�fsencoderVrM�index�FileChangedStatusrm�zip)
r(�filepath�modified_filepath�all_backup_set�specified_file_backup_set�specified_file_backup_type�bs�fileinforqr�s
          r�get_file_changed_record�)CollectionsStatus.get_file_changed_record�s��
%���#�h�-�� #�h�&6�&6�s�G�&D� D�s� J���&�&���0�0��3�@�@�B��$&�!�%'�"��K�K�(9�:�� �B�46�4H�4H�4J�K�4J����4J�H�K� �,�)�0�0��4� ���'8�9��*�1�1�"�2F�2F�2H��2O�PQ�2R�S�!�!��4��4N�0j�+k�l�l��
Ls�
D
c��UR(dg[[URSR555n[	X!5$)z1
Returns file changes in the specific backup set
r3r�)r#rm�reversedr��BackupSetChangesStatus)r(�	set_indexr�s   r�get_all_file_changed_records�.CollectionsStatus.get_all_file_changed_records�sA���&�&���h�t�'>�'>�q�'A�'N�'N�'P�Q�R��%�n�&?�@�@rc��UR(dg[[URSR555n0nUS:�aX!/nUH�nURS[
R"UR553nUR5n0X5'XcUS'0X5S'UR5H'nUSX5S[R"US5'M) M� [R"U[RSS9$)	z�
@param idex_set: index of the backup set.
    0: most recent backup
    max: full backup set
    -1 statistics for all sets of the most recent chain will be returned
@return: statistics for "last - index_set" backup as json formated string.
r3r�r�-�	json_statr&�)�cls�indent)r#rmr�r�r5rr�r�r�rVr=r>r��dumpsr	�BytesEncoder)r(r�r��json_objrTrr��files        r�get_changes_in_set_json�)CollectionsStatus.get_changes_in_set_json�s����&�&���h�t�'>�'>�q�'A�'N�'N�'P�Q�R������>�,�7�8�N�!�C��h�h�Z�q��!6�!6�s�|�|�~�!F� G�H�D��(�(�*�I��H�N�*3�T�N�;�'�.0�H�N�?�+��-�-�/��HL�Q�����/����D��G�0D�E�0�
"��z�z�(��(9�(9�!�D�Dr)r'r$r&rKrr*r'r#r)r%r(r+)r�rT)rrrrr�r)r�rrrAr9r:r6r`r8r7r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrr!r!�s�����4�.�B,�\%H�N(�T96�v
?�/*�b!�<-�.�B1�*%�
�$�$5�	*�1��*
(�+� m�4A�Err!c� �\rSrSrSrSrSrg)r�i
c��XlX lgrT)r��
fileinfo_list)r(r�r�s   rr)�FileChangedStatus.__init__s
�� �
�*�rc	��SnS[S5UR-[S5[UR5-U[S5[S5[S54-/nURH|nUSnUS	nUR(a[S
5nO[S5nURUU[R"UR55UR54-5 M~ URS5 SRU5$)
Nz%20s   %30s  %20sr�zFile: %szTotal number of backup: %dr�r��Type of file change:rr�r�r�r�)rbr�r�r�r!rMrrur��titlero)r(r�r�r��backup_type�
backup_setr5s       rrr�FileChangedStatus.__str__s���(�
�'�
�j�M�D�M�M�)�
�*�+�c�$�2D�2D�.E�E��!�1�2�A�g�J��BX�@Y�Z�Z�	
���#�#�A��A�$�K��1��J������y����'��
�H�H����)�)�*�*=�*=�*?�@��%�%�'���
�$� 	
���,�-��y�y��|�r)r�r�N�rrrrr)rrrrrrr�r�
s��+�rr�c� �\rSrSrSrSrSrg)r�i,c��XlgrT�r�)r(r�s  rr)�BackupSetChangesStatus.__init__-s��$�rc	��URR5n[UVs/sHn[US5PM snS/-5nSU-nS[	S5URR5-[	S5[U5-U[	S5[	S54-/UVs/sH-o$USR
S	5US
R
S	54-PM/ sn-S/-nSRU5$s snfs snf)Nr��z
%%-%ds  %%20sr�z Backup set time: %szTotal number of changes: %dzFile:r�zutf-8rr�)r�rV�maxr�rbrv�decodero)r(�
changed_filesr��max_file_path_lenr�r�s      rrr�BackupSetChangesStatus.__str__0s�����9�9�;�
��M� B�M�q��Q�q�T��M� B�a�S� H�I��$�'8�8�
�,��(�)�T�_�_�-H�-H�-J�K��/�0�3�}�3E�E��a��j�!�,B�*C�D�D�	
�S`�`�R_�Q�Q�q�T�[�[��1�1�Q�4�;�;�w�3G�H�H�R_�`�

a�+�+�
,�	
��y�y��|���!C��as�C3�%4C8r�Nr�rrrr�r�,s��%�rr�)r�r=r�r��	duplicityrrrrrrr	�
duplicity.gpgr
r`r�objectrr�r�r!r�r�rrr�<module>r�s���,=�	�����!�����"�	�y�	�A
��A
�H
_$�&�_$�DH�V�H�Vl	E��l	E�^���D�V�r

Filemanager

Name Type Size Permission Actions
__init__.cpython-313.pyc File 398 B 0644
__main__.cpython-313.pyc File 4.74 KB 0644
argparse311.cpython-313.pyc File 98.99 KB 0644
backend.cpython-313.pyc File 32.15 KB 0644
backend_pool.cpython-313.pyc File 18.72 KB 0644
cached_ops.cpython-313.pyc File 1.09 KB 0644
cli_data.cpython-313.pyc File 32.01 KB 0644
cli_main.cpython-313.pyc File 14.13 KB 0644
cli_util.cpython-313.pyc File 22.31 KB 0644
config.cpython-313.pyc File 5.74 KB 0644
diffdir.cpython-313.pyc File 31.95 KB 0644
dup_collections.cpython-313.pyc File 63.51 KB 0644
dup_main.cpython-313.pyc File 78.6 KB 0644
dup_tarfile.cpython-313.pyc File 432 B 0644
dup_temp.cpython-313.pyc File 12.87 KB 0644
dup_time.cpython-313.pyc File 11.17 KB 0644
errors.cpython-313.pyc File 3.53 KB 0644
file_naming.cpython-313.pyc File 16.93 KB 0644
filechunkio.cpython-313.pyc File 3.83 KB 0644
globmatch.cpython-313.pyc File 6.01 KB 0644
gpg.cpython-313.pyc File 20.98 KB 0644
gpginterface.cpython-313.pyc File 25.69 KB 0644
lazy.cpython-313.pyc File 17 KB 0644
librsync.cpython-313.pyc File 11.48 KB 0644
log.cpython-313.pyc File 19.18 KB 0644
manifest.cpython-313.pyc File 23.66 KB 0644
patchdir.cpython-313.pyc File 27.63 KB 0644
path.cpython-313.pyc File 43.08 KB 0644
progress.cpython-313.pyc File 14.45 KB 0644
robust.cpython-313.pyc File 1.91 KB 0644
selection.cpython-313.pyc File 31.35 KB 0644
statistics.cpython-313.pyc File 18.78 KB 0644
tempdir.cpython-313.pyc File 12.04 KB 0644
util.cpython-313.pyc File 16.51 KB 0644
Filemanager