
    =[jC                      d Z ddlmZ ddlZddlZddlZddlmZmZ ddl	m	Z	m
Z
 ddlmZmZmZmZmZmZ ddlmZ ddlmZ dd	lmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z" dd
l#m$Z$ ddl%m&Z&m'Z' ddl(m)Z)m*Z*m+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7 ddl8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@ ddlAmBZBmCZCmDZDmEZEmFZF ddlGmHZHmIZImJZJmKZKmLZLmMZM ddlNmOZOmPZPmQZQmRZR  ejS        eT          ZUdZVdEdZWdFdZXdddddGd)ZYg d*ZZdHd.Z[dId0Z\dJd2Z] G d3 d4e          Z^ G d5 d6e          Z_ G d7 d8e_          Z` G d9 d:ee          Za G d; d<ea          Zb G d= d>eb          Zc G d? d@eb          Zd G dA dB          Ze G dC dDe-          ZfdS )Kz.Modern Photos CloudKit service implementation.    )annotationsN)ABCabstractmethod)datetimetimezone)Any	GeneratorIterableIteratorOptionalcast)Mock)	urlencode)CKErrorItem
CKFVStringCKModifyOperationCKQueryFilterByCKQueryObjectCKQueryRequestCKRecordCKTombstoneRecordCKWriteRecordCKZoneChangesZoneReqCKZoneIDCKZoneIDReq)CloudKitApiError)CONTENT_TYPECONTENT_TYPE_TEXT)PyiCloudAPIResponseExceptionPyiCloudException$PyiCloudServiceNotActivatedException)BaseService   )PhotosCloudKitClient)PRIMARY_ZONE%SUPPORTED_SHARED_LIBRARY_SMART_ALBUMSAlbumTypeEnumDirectionEnumListTypeEnumObjectTypeEnumSmartAlbumEnum)build_photo_resourcedecode_encrypted_textmaster_asset_pairsrecord_change_tagrecord_field_valuerecord_namerecord_record_typerecord_zone)PhotoChangeEventPhotoResourcePhotosServiceExceptionPhotosUploadResponseSmartAlbumSpec)album_querycheck_indexing_state_query
list_queryparent_filterphoto_lookup_querysmart_album_filter)PhotoSyncOptionsPhotoSyncResultrun_photo_syncwatch_photo_synczSharedSync-returnintc                     t          t          j        t          j                                                  dz            S )zAReturn a fresh positive position for newly created album records.)tzi  )rD   r   nowr   utc	timestamp     q/home/thesage/.hermes/hermes-agent/venv/lib/python3.11/site-packages/pyicloud/services/photos_cloudkit/service.py_new_album_positionrM   O   s2     x|x|,,,66884?@@@rK   record_name_valuestrr   c                D    t          ddt          d|                     S )z+Return a typed record-name equality filter.EQUALS
recordNameSTRINGtypevalue)
comparator	fieldName
fieldValue)r   r   )rN   s    rL   _record_name_filterrZ   U   s2     83DEEE   rK   )desired_keysresults_limitcontinuationqueryr   zone_iddict[str, str]r[   list[str] | Noner\   
int | Noner]   
str | Nonedict[str, Any]c                h    t          | t          di ||||                              dd          S )z@Serialize a typed CloudKit query request for legacy/raw callers.)r^   zoneIDdesiredKeysresultsLimitcontinuationMarkerjsonTmodeexclude_nonerJ   )r   r   
model_dump)r^   r_   r[   r\   r]   s        rL   _query_request_payloadro   _   sK     %%W%% "'   jf4j001rK   )aresJPEGFullWidthresJPEGFullHeightresJPEGFullFileTyperesJPEGFullFingerprintresJPEGFullResresJPEGLargeWidthresJPEGLargeHeightresJPEGLargeFileTyperesJPEGLargeFingerprintresJPEGLargeResresJPEGMedWidthresJPEGMedHeightresJPEGMedFileTyperesJPEGMedFingerprintresJPEGMedResresJPEGThumbWidthresJPEGThumbHeightresJPEGThumbFileTyperesJPEGThumbFingerprintresJPEGThumbResresVidFullWidthresVidFullHeightresVidFullFileTyperesVidFullFingerprintresVidFullResresVidMedWidthresVidMedHeightresVidMedFileTyperesVidMedFingerprintresVidMedResresVidSmallWidthresVidSmallHeightresVidSmallFileTyperesVidSmallFingerprintresVidSmallResresSidecarWidthresSidecarHeightresSidecarFileTyperesSidecarFingerprintresSidecarResitemTypedataClassTypefilenameEncoriginalOrientationresOriginalWidthresOriginalHeightresOriginalFileTyperesOriginalFingerprintresOriginalResresOriginalAltWidthresOriginalAltHeightresOriginalAltFileTyperesOriginalAltFingerprintresOriginalAltResresOriginalVidComplWidthresOriginalVidComplHeightresOriginalVidComplFileTyperesOriginalVidComplFingerprintresOriginalVidComplRes	isDeleted
isExpungeddateExpungedremappedRefrR   
recordTyperecordChangeTag	masterRefadjustmentRenderType	assetDate	addedDate
isFavoriteisHiddenorientationdurationassetSubtypeassetSubtypeV2assetHDRType
burstFlagsburstFlagsExtburstId
captionEnclocationEnclocationV2EnclocationLatitudelocationLongitudeadjustmentTypetimeZoneOffsetvidComplDurValuevidComplDurScalevidComplDispValuevidComplDispScalevidComplVisibilityStatecustomRenderedValuecontainerIditemIdposition
isKeyAssetrV   r   boolc                ,    t          | t                    S N)
isinstancer   )rV   s    rL   _is_mock_liker      s    eT"""rK   sessionc                "    t          |            S r   )r   )r   s    rL   _can_use_typed_cloudkitr      s    W%%%%rK   	zone_namec                T    t          | o|                     t                              S r   )r   
startswithSHARED_LIBRARY_ZONE_PREFIX)r   s    rL   _is_shared_library_zone_namer      s$    	Ni223MNNOOOrK   c                  h    e Zd ZdZdd dZd!d	Zd"dZd#dZd$dZd%dZ		 dd&dZ
d'dZd(dZd)dZdS )*AlbumContainerzContainer for photo albums.Nalbumslist['BasePhotoAlbum'] | NonerC   Nonec                    i | _         |r|D ]}|| j         |j        <   t          | j                                                   | _        d S r   _albumsidlistkeys_indexselfr   albums      rL   __init__zAlbumContainer.__init__   sR    24 	/ / /).UX&&!%dl&7&7&9&9!:!:rK   rD   c                *    t          | j                  S r   )lenr   r   s    rL   __len__zAlbumContainer.__len__   s    4<   rK   key	str | int'BasePhotoAlbum'c                    t          |t                    r| j        | j        |                  S || j        v r| j        |         S |                     |          }||S t          d|           )NzPhoto album does not exist: )r   rD   r   r   findKeyError)r   r   r   s      rL   __getitem__zAlbumContainer.__getitem__   ss    c3 	2<C 011$,<$$		#L;c;;<<<rK   Iterator['BasePhotoAlbum']c                N    t          | j                                                  S r   )iterr   valuesr   s    rL   __iter__zAlbumContainer.__iter__   s    DL''))***rK   namerO   r   c                0    |                      |          d uS r   )r   )r   r   s     rL   __contains__zAlbumContainer.__contains__   s    yyd**rK   Optional['BasePhotoAlbum']c                r    | j                                         D ]}||j        k    s||j        k    r|c S d S r   )r   r   fullnamer   )r   r   r   s      rL   r   zAlbumContainer.find   sK    \((** 	 	Eu~%%);); *<trK   default'BasePhotoAlbum | None'c                8    | j                             ||          S r   )r   get)r   r   r  s      rL   r  zAlbumContainer.get  s    
 |W---rK   r   c                z    || j         |j        <   t          | j                                                   | _        d S r   r   r   r   s     rL   appendzAlbumContainer.append  s1    !&UX4<,,..//rK   album_idc                    | j                             |d            t          | j                                                   | _        d S r   )r   popr   r   r   r   r
  s     rL   removezAlbumContainer.remove  s;    4(((4<,,..//rK   idxc                    |dk     s|t          | j                  k    rt          d          | j        | j        |                  S )Nr   zPhoto album index out of range)r   r   
IndexErrorr   )r   r  s     rL   indexzAlbumContainer.index  sB    77cS----=>>>|DK,--rK   r   )r   r   rC   r   rC   rD   )r   r   rC   r   )rC   r   )r   rO   rC   r   )r   rO   rC   r   )r   rO   r  r  rC   r  )r   r   rC   r   r
  rO   rC   r   )r  rD   rC   r   )__name__
__module____qualname____doc__r   r   r   r   r   r   r  r	  r  r  rJ   rK   rL   r   r      s        %%; ; ; ; ;! ! ! != = = =+ + + ++ + + +    ,0. . . . .0 0 0 00 0 0 0. . . . . .rK   r   c                      e Zd ZdZddddddd+dZd,dZed-d            Zed-d            Zed.d            Z	d.dZ
d/dZd0dZd1d Zed.d!            Zd2d%Zdd&d3d)Zd4d*ZdS )5BasePhotoLibraryz1Represents a single Photos CloudKit zone/library.Nprivate)
asset_typer_   client
upload_urlscopeservice'PhotosService'r  type['PhotoAsset'] | Noner_   dict[str, str] | Noner  PhotosCloudKitClient | Noner  rc   r  rO   rC   r   c               v   || _         |pt          | _        |pt          | _        || _        | j        Ut          |d          rEt          t          |dd                     r't          |j
        |j        |j        |          | _        d | _        i | _        || _        || _        d | _        d | _        t          | j         d          r(| j         j
         dt'          | j         j                   nd| _        t+          |          r!t-          |           j        dk    r	d| _        d S |                                  d S )Nservice_endpointr   base_urlr   base_paramsr  /records/query? PhotoLibraryFINISHED)r   
PhotoAssetr  r%   r_   _clienthasattrr   getattrr$   r&  r   paramsr   _pending_albums_upload_urlr  _indexing_state_current_sync_tokenr   urlr   rU   r  _ensure_indexing_ready)r   r   r  r_   r  r  r  s          rL   r   zBasePhotoLibrary.__init__  sL    $2
.,L !344 !'D(I(IJJ ! 0 1#N%	  DL /368%
+//3  t|%788t|,]]Yt|GZ=[=[]]] 	
 !! 	d4jj&9^&K&K#-D F##%%%%%rK   c                   | j         t          | j        j                  r| j                             t                      t          di | j        d          }|j        | _	        d }|j
        D ]3}t          |t                    r|j                            d          } n4|t          |          nd | _        n| j        j                            | j        ddi| j        dt&          t(          i          }|                                }t-          |          rd| _        n]|                    d	i g          d
                             di                               di                               d          | _        | j        t-          | j                  rt-          | j                  rd| _        | j        dk    rt1          d          d S )Nr#   r^   r_   r\   stater   CheckIndexingState)r^   rf   r7  rj   headersr-  recordsr   fieldsrV   zNiCloud Photo Library not finished indexing. Please try again in a few minutes.rJ   )r/  r   r   r   r^   r:   r   r_   	syncTokenr6  r?  r   r   r@  	get_valuerO   r5  postr7  r   r   rj   r   r  r!   )r   responser;  recordrequests        rL   r8  z'BasePhotoLibrary._ensure_indexing_readyG  s   <#(?@T(U(U#|))022#33dl33 *  H
 (0'9D$E"*  fh// "M33G<<EE 271B3u:::D  l*//H %&: #l	  &'89 0 	 	G ||~~HX&& '1$$ LLRD11!4S2&&S"%%S\\	 $ $,d>R0S0S,-- -'1$:--6`   .-rK   c                    | j         S r   )r5  r   s    rL   indexing_statezBasePhotoLibrary.indexing_states  s    ##rK   c                    | j         S r   )r6  r   s    rL   current_sync_tokenz#BasePhotoLibrary.current_sync_tokenw  s    ''rK   r   c                v    | j         ,|                     |                                           | _         | j         S r   )r   _merge_pending_albums_get_albumsr   s    rL   r   zBasePhotoLibrary.albums{  s3    <55d6F6F6H6HIIDL|rK   c                h    |                      |                                           | _        | j        S r   )rL  rM  r   r   s    rL   refresh_albumszBasePhotoLibrary.refresh_albums  s+    11$2B2B2D2DEE|rK   r   'PhotoAlbum'c                j    || j         |j        <   | j        | j                            |           d S d S r   )r3  r   r   r	  r  s     rL   _cache_created_albumz%BasePhotoLibrary._cache_created_album  s=    ).UX&<#L&&&&& $#rK   r
  c                    | j                             |d            | j        | j                            |           d S d S r   )r3  r  r   r  r  s     rL   _remove_cached_albumz%BasePhotoLibrary._remove_cached_album  sG      4000<#L))))) $#rK   r   c                    | j                                         D ]1}|                    |j                  |                    |           2|S r   )r3  r   r  r   r	  r   s      rL   rL  z&BasePhotoLibrary._merge_pending_albums  sL    )0022 	% 	%Ezz%(##+e$$$rK   c                    t           r   NotImplementedErrorr   s    rL   rM  zBasePhotoLibrary._get_albums      !!rK   rD  dict[str, list[dict[str, Any]]]6tuple[dict[str, dict[str, Any]], list[dict[str, Any]]]c                    i }g }|d         D ]O}|d         dk    r |d         d         d         d         }|||<   .|d         dk    r|                     |           P||fS )	z4Legacy helper preserved for older callers and tests.r?  r   CPLAssetr@  r   rV   rR   	CPLMaster)r	  )r   rD  asset_recordsmaster_recordsrE  
master_refs         rL   parse_asset_responsez%BasePhotoLibrary.parse_asset_response  s     46/1y) 	. 	.Fl#z11#H-k:7CLQ
,2j))%44%%f---n,,rK   sincerd  Iterator[PhotoChangeEvent]c          
   #    K   t          t          di | j        |d          }| j                            |          D ]}|j        | _        |j        D ]}t          |t                    rt          d|j        d dd           V  3t          |t                    rEt          d|j        |j        t          |j                  |j        r|j        j        nd           V  d S )	NF)rf   rA  reverse)zone_reqdeletedT)kindr1   record_typeri  modifiedupdatedrJ   )r   r   r_   r/  iter_changesrA  r6  r?  r   r   r4   rR   r   r   r   ri  rl  rI   )r   rd  rh  zonerE  s        rL   rn  zBasePhotoLibrary.iter_changes  s3     '++dl++
 
 

 L--x-@@ 	 	D'+~D$,  f&788 *&$*$5$( $!%        11 *&$*$5$*$5 $V^ 4 4>Do!W!:!:SW     	 	rK   c                   | j         r| j         S | j        ft          | j        j                  rM| j                                        }|j        D ]+}|j        j        | j	        d         k    r|j
        | _          n,n| j        j        }t          | j        j                  }| d| }| j        j                            |i t          t           i                                          }|                    dg           D ]X}|                    di           }|                    d          | j	        d         k    r|                    d          | _          nY| j         st'          d          | j         S )NzoneName/zones/list?rj   r>  zonesrf   rA  z)No sync token available for photo library)r6  r/  r   r   r   
zones_listrt  rf   rq  r_   rA  r&  r   r2  rC  r   r   rj   r  r6   )r   rt  ro  endpointr2  r7  rD  r_   s           rL   sync_cursorzBasePhotoLibrary.sync_cursor  s   # 	,++<#(?@T(U(U#L++--E  ;'4<
+CCC/3~D,E D |4Ht|233F33633C|+00%'89 1   dff	 
 !Wb11  ((8R00;;z**dl:.FFF/3xx/D/DD,E G ' 	V()TUUU''rK   )r   r!  r  r"  r_   r#  r  r$  r  rc   r  rO   rC   r   )rC   r   )rC   rc   rC   r   )r   rP  rC   r   r  )r   r   rC   r   )rD  rZ  rC   r[  rd  rc   rC   re  rC   rO   )r  r  r  r  r   r8  propertyrH  rJ  r   rO  rR  rT  rL  r   rM  rb  rn  rw  rJ   rK   rL   r  r    sz       ;; 15)-.2!%'& '& '& '& '& '&R* * * *X $ $ $ X$ ( ( ( X(    X
   ' ' ' '
* * * *
    " " " ^"- - - -  37      4( ( ( ( ( (rK   r  c                      e Zd ZU dZej         eej        e	j
        ej                  ej         eej        e	j        ej         ed          f          ej         eej        e	j        ej         ed          f          ej         eej        e	j        ej         ed          f          ej         eej        e	j        ej                  ej         eej        e	j        ej         ed          f          ej         eej        e	j        ej         ed          f          ej         eej        e	j        ej         ed	          f          ej         eej        e	j        ej         ed
          f          ej          eej!        e	j!        ej                  ej"         eej"        e	j"        ej                  iZ#de$d<   d%d&dZ%d'dZ&d(dZ'e(j)        fd)dZ*d*d!Z+e,d+d#            Z-d+d$Z.dS ),r,  z6Represents a private or shared CloudKit photo library.)obj_type	list_type	direction	TIMELAPSE)r}  r~  r  query_filtersVIDEOSLOMOFAVORITEPANORAMA
SCREENSHOTLIVEz$dict[SmartAlbumEnum, SmartAlbumSpec]SMART_ALBUMSN	parent_idrc   rC   list[CKRecord]c                   | j         t          | j        j                  st	          |          }t          || j                  }| j        j                            | j        |t          t          i          }|                                }t          |                    dg                     }d|v rt          || j        |d                   }| j        j                            | j        |t          t          i          }|                                }|                    |                    dg                      d|v g }t          |          D ]}|                    di                               di                               d          }	|	t          j        j        k    r;|                    |                     |                    d	                               ||z   S g }d }
	 | j                             t	          |          t)          di | j        |
          }|j        p| j        | _        |j        D ],}t1          |t2                    r|                    |           -|j        }
|
sng }|D ]\}|j                            d          t          j        j        k    r-|                    |                     |j                             ]||z   S )N)r^   r_   r=  r?  ri   )r^   r_   r]   r@  	albumTyperV   rR   TrJ   )r/  r   r   r   r9   ro   r_   rC  r7  r   r   rj   r   r  extendr'   FOLDERrV   _fetch_album_recordsr^   r   rA  r6  r?  r   r   r	  ri   r@  rB  rR   )r   r  r^   payloadrF  rD  r?  nested_recordsrE  
album_typer]   s              rL   r  z!PhotoLibrary._fetch_album_records#  s   <'>t|?S'T'T	**E,5$,OOOGl*//H%'89 0  G
 ||~~H8<<	26677G&(220 L!)*>!?  
 ,.33 )+<= 4  
 #<<>>x||Ir::;;; '(22 46Nw--  #ZZ"5599+rJJNNwWW
!5!;;;"))11&**\2J2JKK   ^++"$#'	|))!),,#33dl33) *  H
 (0'9'UT=UD$"* + +fh// +NN6***#6L 	 *, 	T 	TF}&&{33}7K7QQQ%%d&?&?@Q&R&RSSS''rK   rE  CKRecord | dict[str, Any]BasePhotoAlbum | Nonec                0   t          |d          }|d S t          t          |d                    rd S t          |d          }	 t          t	          |                    }n# t
          $ r t          j        }Y nw xY wt          }t          j	        }t          j	        }t          j        }dddt          |          ddg}	t          t          |                    g}
t          |d	          }|t	          |          d
k    rt          j        }|t          j        u rt"          }|t          u rv || |t          |          ||||	| j        | j        |
t)          t*          t,                   t          |d                    t/          |          t          |d                    S  || |t          |          ||||	| j        | j        |
t)          t*          t,                   t          |d                    t/          |          t          |d                    S )NalbumNameEncr   r  parentIdrQ   rS   rT   rX   rW   rY   sortAscendingr#   recordModificationDate)libraryr   	record_idr}  r~  r  query_filterr  r_   r  r  r/   record_modification_date)r-   r   r0   r'   rD   	ExceptionALBUM
PhotoAlbumr*   	CONTAINERr)   r(   	ASCENDINGr1   r<   
DESCENDINGr  PhotoAlbumFolderr/  r_   r   r   rO   r/   )r   rE  
album_namealbum_type_valuer  clsr}  r~  r  r  typed_query_filterssort_ascendings               rL   _convert_record_to_albumz%PhotoLibrary._convert_record_to_albumZ  sA    +6>BB
4"6;7788 	4-fkBB	-&s+;'<'<==JJ 	- 	- 	-&,JJJ	- !+!+ *	!+	 (&'/+f:M:MNN 
  -[-@-@AAB+FODD%#n*=*=*B*B%0I---"C*3%f--!##)|1x}.@.T.TUU"3F";";);4* *   " s!&))%<L-8C=*<VZ*P*PQQ/77%70& &
 
 
 	
s   A" "A;:A;r   c                \    t                      } j                                        } j        dk    r t	           fdt
          D                       }|D ]\  }}|j        } j        dk    r|t          j        k    rt          j
        }|                    t           ||j        |j        | j         j        t#          |j                  pd                       j        dk    r|S                                  D ].}                     |          }||                    |           /|S )Nshared-libraryc              3  6   K   | ]}|j         |         fV  d S r   )r  ).0smart_albumr   s     rL   	<genexpr>z+PhotoLibrary._get_albums.<locals>.<genexpr>  sD       ! ! d/<=! ! ! ! ! !rK   )r  r   r}  r~  r  r  r_   r  )r   r  itemsr  tupler&   r  r+   	FAVORITESr(   r  r	  SmartPhotoAlbumr}  r~  r/  r_   r   r  r  r  )r   r   smart_albumsr  metar  rE  r   s   `       rL   rM  zPhotoLibrary._get_albums  sd   !!(..00:)))  ! ! ! !#H! ! !  L ". 	 	KI
...>#;;;)4	MM $!]"n'< L"&t'9":":"Bd	 	 	    :)))M//11 	% 	%F11&99E e$$$rK   r   rO   r  r'   Optional['PhotoAlbum']c                   t          j        |                    d                                        d          }t	                      }| j        0t          | j        j                  rt          dt          t          j        d                                                                          dd|ddt          |j                  dddddddd|ddd	ddd	dd
                    }| j                            |gt%          di | j        d          }|j        D ]Z}t+          |t,                    rC|                     |          }t+          |t0                    r|                     |           |c S [n| j        j        }	t7          | j        j                  }
|	 d|
 }| j        j                            |ddd|id|j        iddiddid|idd	idd	id
ddg| j        ddt<          t>          i          }|                                 }|!                    dg           }|rG|                     |d                   }t+          |t0                    r|                     |           |S d S )Nutf-8create   CPLAlbumENCRYPTED_BYTESrT   INT64r   r#   )r  r  r   r   r   sortTyper  rR   r   r@  operationTyperE  T
operationsr_   atomic/records/modify?rV   )r   r@  r  rf   r  rs  r?  rJ   )"base64	b64encodeencodedecoderM   r/  r   r   r   r   r   osurandomhexupperrD   rV   modifyr   r_   r?  r   r   r  r  rR  r&  r   r2  rC  r   r   rj   r  )r   r   r  encodedr   opresprE  r   rv  r2  r7  rD  r  r?  s                  rL   create_albumzPhotoLibrary.create_album  s   
 "4;;w#7#788??HH&((<#(?@T(U(U#"&$!z"~~113399;;) %6%,) ) /6JDT@U@U%V%V.5%B%B/6&C&C-4x$H$H-4q$A$A29A)F)F     B& <&&4#33dl33 '  D
 , % %fh// % 99&AAE!%44 %11%888$% |4Ht|233F77v77C|+00 .6.85<g4F29:;K1L2913:A,18(0C18!6=q\+" +"' ' #" #l"' * &'89/ 1  H2 mmooGkk)R00G !55gajAAeZ00 !--e444 LtrK   pathOptional['PhotoAsset']c                   | j         t          | j        j                  rj	 | j                             |t          | j        j        d                             }n# t          $ r"}t          t          |                    |d}~ww xY wt          j
                            |          }t          | j        j                  }||d<   | j         dt          |           }t          |d          5 }| j        j                            ||          }ddd           n# 1 swxY w Y   |                                }t%          |t&                    r|nt'          j        |          }	|	j        rt          dd	 |	j        D                       t-          |	j                  }
d
 |
D             }|                    d          }|                    d          }| j         duoM|duoI|duoEt3          |          du p4t3          |          du p#t5          |d          du pt5          |d          du }|r^| j                             t9          |          t9          |          gt;          di | j        t>                    }d |j        D             }d|vsd|vrdS |                      | j        |d         |d                   }tC          |d|            |S )z<Upload a file into the library and return the created asset.Ndsid)r  filenamez/upload?rb)r7  datar+  c                <    g | ]}|                     d d          S )rj   Trk   )rn   )r  errors     rL   
<listcomp>z,PhotoLibrary.upload_file.<locals>.<listcomp>,  s;        $$&t$DD  rK   c                z    i | ]8}t          |t                    r!t          |          d v (t          |          |9S >   r]  r^  r   r   r2   r  rE  s     rL   
<dictcomp>z,PhotoLibrary.upload_file.<locals>.<dictcomp>4  sW     
 
 
&(++
 #6**.GGG v&& HGGrK   r^  r]  r   r   )record_namesr_   r[   c                z    i | ]8}t          |t                    r!t          |          d v (t          |          |9S r  r  r  s     rL   r  z,PhotoLibrary.upload_file.<locals>.<dictcomp>S  sW       fh// 'v..2KKK #6**F LKKrK   _libraryrJ   )"r/  r   r   r   upload_filerO   r2  r   r   r  r  basenamedictr4  r   openrC  rj   r   r7   model_validateerrorsr   r?  r  r/   r0   lookupr1   r   r_   PHOTO_DESIRED_KEYSr  setattr)r   r  r  excr  r2  r  file_objrD  upload_payloadr?  records_by_typemaster_recordasset_recordneeds_lookupr  photos                    rL   r  zPhotoLibrary.upload_file  s    <#(?@T(U(U#F,22T\0899 3   $ F F F23s88<<#EF w''--H$,-..F!)F: ,IIi6G6GIIJdD!! TX</44(4SST T T T T T T T T T T T T T T mmooG '#788>GG%4W== 	
   	. !/!6     #'~'=">">
 
!
 
 
 (++K88&**:66
 L$ T)D( "-00D8 I$\22d:I%m]CCtKI &lK@@DH 	  	\((..-- $33dl33/ )  F $n  O o--?1R1R4LK(J'
 

 	z4(((s)   9A 
B&BB1"DD#&D#rP  c                `    t          t          | j        t          j        j                           S r   )r   r  r   r+   
ALL_PHOTOSrV   r   s    rL   allzPhotoLibrary.alld  s    JN,E,K LMMMrK   c           
         t          | ddt          j        t          j        t
          j        | j        | j                  S )NzRecently Added)r  r   r  r}  r~  r  r  r_   )	r  r*   ALLr)   ADDEDr(   r  r/  r_   r   s    rL   recently_addedzPhotoLibrary.recently_addedh  s>    !&#'"(#.<L	
 	
 	
 		
rK   r   )r  rc   rC   r  )rE  r  rC   r  rx  )r   rO   r  r'   rC   r  r  rO   rC   r  )rC   rP  )/r  r  r  r  r+   r  r8   r*   r  r)   DEFAULTr(   r  
TIME_LAPSEr  SMART_ALBUMr  r>   VIDEOSr  SLO_MOr  BURSTSBURSTSTACKr  r  	PANORAMASr  SCREENSHOTSr  r  RECENTLY_DELETEDDELETEDHIDDENr  __annotations__r  r  rM  r'   r  r  r  r{  r  r  rJ   rK   rL   r,  r,    s_        @@ 	!>>#'"*#.$
 $
 $

 	!>>#-".#---k::<	$
 $
 $
 	~~#)".#---g668	 
  
  
 	~~#)".#---g668	 
  
  
 	~~#)"(#- 
  
  

 	 ..#,".#---j99;	#
 #
 #
 	 ..#,".#---j99;	#
 #
 #
 	"NN#.".#---l;;=	%
 %
 %
 	^^#(".#---f557	
 
 
 	'#+"*#-*
 *
 *

 	~~#*")#- 
  
  
u?:L ? ? ? ?B5( 5( 5( 5( 5(nC
 C
 C
 C
J! ! ! !L %2$7J J J J JXT T T Tl N N N XN

 

 

 

 

 

rK   r,  c                     e Zd ZdZddej        ddGdZeedHd                        Z	edHd            Z
edHd            Zej        dId            ZedJd            ZedKd            ZeedHd                        ZdLdZedJd             ZdMd#ZdNd&ZdJd'ZdOd*ZdPd+ZedPd,            ZdQd-ZdId.ZdRd0ZdPd1ZdJd2ZdRd3ZdHd4ZdHd5ZdSd8Z dTd:Z!dUd;Z"dVd=Z#dWd>Z$dHd?Z%ddd@dXdFZ&dS )YBasePhotoAlbumzAbstract photo album.Nd   )r  	page_sizer  r  r  r   rO   r~  r)   r  r$  r  rD   r  r(   rC   r   c                   || _         || _        |pt          |dd           | _        || _        || _        || _        d | _        d S )Nr/  )_namer  r1  r/  
_page_size
_direction
_list_type_len)r   r  r   r~  r  r  r  s          rL   r   zBasePhotoAlbum.__init__x  sJ     
B)T!B!B####'			rK   c                    t           r   rW  r   s    rL   r  zBasePhotoAlbum.fullname  
     "!rK   c                    | j         S r   )r   r   s    rL   titlezBasePhotoAlbum.title  s
    yrK   c                    | j         S r   )r  r   s    rL   r   zBasePhotoAlbum.name  s
    zrK   rV   c                J    | j         |k    r|                     |           d S d S r   )r  renamer   rV   s     rL   r   zBasePhotoAlbum.name  s/    :KK rK   c                *    | j         dk     r| j         ndS )Nr  )r  r   s    rL   r  zBasePhotoAlbum.page_size  s    "&/C"7"7tS@rK   r!  c                8    t          | j        d| j                  S )Nr   )r1  r  r   s    rL   r   zBasePhotoAlbum.service  s    t}i???rK   c                    t           r   rW  r   s    rL   r   zBasePhotoAlbum.id  r  rK   offsetlist[CKQueryFilterBy]c                   ||f}g S r   rJ   r   r$  r  _s       rL   _query_filterszBasePhotoAlbum._query_filters  s     Y	rK   c                    t           r   rW  r   s    rL   _get_lenzBasePhotoAlbum._get_len  rY  rK   r  #Generator['PhotoAsset', None, None]c              #  4  K   t          | j        |t          d|          |                     t          d|          |                    }| j        t          | j        j                  st          | j        d          rt          | d          r| j        j        	                    | 
                                |                     t          d|          |dz  |          t          t          i          }|                     |                                          E d {V  d S | j                            |t#          d
i | j        j        |dz  	          }|j        p| j        j        | j        _        |                     |j                  E d {V  d S )Nr   r$  r  r~  r  r$  extra_filtersr   _get_url   )r$  r  r  r=  r:  rJ   )r;   r  maxr)  r/  r   r   r   r0  rC  r1  _get_payloadr   r   _process_photo_list_responserj   r^   r   r  r_   rA  r6  r?  )r   r  r  r  r^   rD  s         rL   _get_photos_atzBasePhotoAlbum._get_photos_at  s      oq%==--1e}}	 .  	
 
 
 \!)@AU)V)V!i00 "j)) " |+00MMOO&&q%=='!m' '  
 &'89 1  H 88IIIIIIIIIF<%%88$-"788#a- & 
 
 C$-"C 	) 44X5EFFFFFFFFFFFrK   photo_id'PhotoAsset'c                   t          | j        |          }|                     dt          j                  }|r|j                            |           | j        t          | j	        j
                  st          | j	        d          rt          | d          r| j	        j
                            |                                 |                     |          t          t           i          }|                     |                                          D ]}|j        |k    r|c S | j        D ]}|j        |k    r|c S t+          d|           | j                            |t/          d	i | j        j        |                                           }|j        p| j        j        | j        _        |                     |j                  D ]}|j        |k    r|c S | j        D ]}|j        |k    r|c S t+          d|           )
N)r~  r7  r   r.  r   r1  r=  Photo does not exist: r:  rJ   )r=   r  r)  r(   r  filterByr  r/  r   r   r   r0  rC  r1  _get_photo_payloadr   r   r5  rj   r   photosr   r^   r   r  r_   _photo_lookup_results_limitrA  r6  r?  )r   r7  r^   filtersrD  r  s         rL   
_get_photozBasePhotoAlbum._get_photo  s;   "T_xPPP%%Q-:Q%RR 	+N!!'***\!)@AU)V)V!i00 "j)) " |+00MMOO,,X66%'89 1  H
 ::8==??KK ! !8x'' LLL ( ! !8x'' LLL (>H>>???<%%88$-"788::<< & 
 
 C$-"C 	) 66x7GHH 	 	Ex8## $[ 	 	Ex8## $:::;;;rK   c                4    | j         t          j        k    rdS dS )zFReturn the minimum CloudKit result size for direct list-index lookups.   r2  )r  r)   r  r   s    rL   r>  z*BasePhotoAlbum._photo_lookup_results_limit  s     ?l4441qrK   r?  9list[CKRecord | CKTombstoneRecord | Any] | dict[str, Any]c              #    K   t          |t                    r|}t          | j        d          r| j                            |          \  }}n\i }g }|d         D ]O}|d         dk    r |d         d         d         d         }|||<   .|d         d	k    r|                    |           P|D ][}|                    |d                   }| | j                            | j        ||          }	t          |	d
| j                   |	V  \d S d |D             }
t          |
          \  }}|D ]Z}|                    |j                  }|| j                            | j        ||          }	t          |	d
| j                   |	V  [d S )Nrb  r?  r   r]  r@  r   rV   rR   r^  r  c                <    g | ]}t          |t                    |S rJ   )r   r   r  s     rL   r  z?BasePhotoAlbum._process_photo_list_response.<locals>.<listcomp>%  s'    VVVFFH9U9UVVVVrK   )r   r  r0  r  rb  r	  r  r  r   r  r.   rR   )r   r?  raw_responser_  mastersrE  ra  masterassetr  typed_recordsassets_by_masterr  r  s                 rL   r5  z+BasePhotoAlbum._process_photo_list_response  s      gt$$ 	"Lt}&<== /)-)K)K * *&ww !#*95 / /Fl+z99%+H%5k%B7%K(&
 5;j11-<<v...!  %))&*>??=00vuMMz4=999FVVgVVV$6}$E$E!'$ 	 	M+//0HIIL#M,,T\=,WWEE:t}555KKKK	 	rK   c              #    K   t                      }| j        }t          |dz
  d          }	 g }|                     || j        |          D ];}|j        |v r|                    |j                   |                    |           <|sdS t          |          D ]}|V  t          |          |k     rdS |t          |          z  })a  
        Iterate the recently-added index newest-first.

        The ``ADDED`` index uses a trailing ``startRank`` window instead of the
        forward paging used by the other Photos indexes. A request at rank ``n``
        returns the newest items up to ``n`` and the window itself arrives
        oldest-to-newest. The generic descending pager therefore under-fetches
        recent assets when the count endpoint is unavailable and would yield the
        wrong order even when a count exists.
        r#   r   TN)
setr  r3  r6  r  r   addr	  reversedr   )r   seenr  r$  windowr  s         rL   _iter_added_desc_photosz&BasePhotoAlbum._iter_added_desc_photos/  s       N	Y]A&&	"')F,,VT_iPP % %8t##"""e$$$$ !&))  6{{Y&&c&kk!F	"rK   c              #    K   d | _         | j        t          j        k    r1| j        t
          j        k    r|                                 E d {V  d S | j        t
          j        k    rt          |           dz
  nd}t                      }	 d}| 
                    || j        | j                  D ]/}|dz  }|j        |v r|                    |j                   |V  0|| j        dz  k     rd S | j        t
          j        k    r||z  }n||z  })Nr#   r   Tr2  )r  r  r)   r  r  r(   r  rR  r   rM  r6  r  r   rN  )r   r$  rP  num_resultsr  s        rL   r=  zBasePhotoAlbum.photosM  s,     	O|111=#;;;33555555555F"&/]5M"M"MTQST	&K,,VT_dnUU  q 8t##"""T^q000-":::+%+%	&rK   c                T    t          |                     || j        d                    S )Nr#   )nextr6  r  )r   r  s     rL   r  zBasePhotoAlbum.photog  s$    D''tBBCCCrK   c                     t          d          )NzAlbum name is read-onlyrW  r   s     rL   r  zBasePhotoAlbum.renamej  s    !";<<<rK   r   c                     t          d          )NzAlbum delete is not implementedrW  r   s    rL   deletezBasePhotoAlbum.deletem  s    !"CDDDrK   c                    | j         S r   )r=  r   s    rL   r   zBasePhotoAlbum.__iter__p  s
    {rK   c                P    | j         |                                 | _         | j         S r   )r  r+  r   s    rL   r   zBasePhotoAlbum.__len__s  s!    9DIyrK   c                    dS NTrJ   r   s    rL   __bool__zBasePhotoAlbum.__bool__x      trK   c                    | j         S r   )r  r   s    rL   __str__zBasePhotoAlbum.__str__{  s
    zrK   c                8    dt          |           j         d|  dS )N<z: 'z'>)rU   r  r   s    rL   __repr__zBasePhotoAlbum.__repr__~  s$    34::&3343333rK   r   'PhotoAsset | None'c                P    	 |                      |          S # t          $ r Y d S w xY wr   )r@  r   r   r   s     rL   r  zBasePhotoAlbum.get  s;    	??3''' 	 	 	44	s    
%%	int | strc                J   t          |t                    rd|dk     rt          |           |z   }	 t          |                     || j        d                    S # t          $ r}t          d          |d }~ww xY w|                     |          }||S t          d|           )Nr   r#   zPhoto index out of ranger:  )
r   rD   r   rV  r6  r  StopIterationr  r  r   )r   r   r  r  s       rL   r   zBasePhotoAlbum.__getitem__  s    c3 	FQww$ii#oFD//T_aHHIII  F F F !;<<#EFL555666s   (A 
A7"A22A7c                0    |                      |          d uS r   )r  rg  s     rL   r   zBasePhotoAlbum.__contains__  s    xx}}D((rK   rd   c           
     j    |                      || j        |||                     ||                    S )Nr.  r$  r~  r  rT  r  )_list_query_genr  r)  )r   r$  r  r  s       rL   r4  zBasePhotoAlbum._get_payload  sE     ##o!--Vy-QQ $ 
 
 	
rK   c                    |                      dt          j                  }|                    t	          |                     |                     d| j        t          j        d|          S )Nr   r.  r#   rm  )r)  r(   r  r	  rZ   rn  r  )r   r7  r?  s      rL   r<  z!BasePhotoAlbum._get_photo_payload  si    %%Q-:Q%RR*844555##o#-! $ 
 
 	
rK   c                    t          | j        d          r(| j        j         dt          | j        j                   S t          d          )Nr&  r*  )r0  r   r&  r   r2  AttributeErrorr   s    rL   r1  zBasePhotoAlbum._get_url  sM    4<!344 	el3ddIdlNaDbDbddd/000rK   r  r  rT  r  list[dict[str, Any]] | Noner  list[CKQueryFilterBy] | Nonec                   ||d |D             }t          ||||          }t          |t          | dt          | j        dt                              t
          |          S )Nc                6    g | ]}t          j        |          S rJ   r   r  r  items     rL   r  z2BasePhotoAlbum._list_query_gen.<locals>.<listcomp>  s0       9=.t44  rK   r/  _zone_idr_   )r^   r_   r[   r\   )r;   ro   r1  r  r%   r  )r   r$  r~  r  rT  r  r  r^   s           rL   rn  zBasePhotoAlbum._list_query_gen  s      \%= AM  M '	
 
 
 &j'$-L"Q"Q  ,%
 
 
 	
rK   )r  r  r   rO   r~  r)   r  r$  r  rD   r  r(   rC   r   rz  rV   rO   rC   r   r  )rC   r!  r$  rD   r  r(   rC   r%  )r  rD   r  r(   r  rD   rC   r,  )r7  rO   rC   r8  )r?  rC  rC   r,  )rC   r,  )r  rD   rC   r8  rC   r   )r   rO   rC   re  )r   rh  rC   r8  )r   rO   rC   r   )r$  rD   r  rD   r  r(   rC   rd   r7  rO   rC   rd   )r$  rD   r~  r)   r  r(   rT  rD   r  rs  r  rt  rC   rd   )'r  r  r  r  r(   r  r   r{  r   r  r  r   setterr  r   r   r)  r+  r6  r@  r>  r5  rR  r=  r  r  rY  r   r   r^  ra  rd  r  r   r   r4  r<  r1  rn  rJ   rK   rL   r  r  u  sI        /3#0#:( ( ( ( ( ($ " " " ^ X"    X    X 
[   [ A A A XA @ @ @ X@ " " " ^ X"    " " " ^"&G &G &G &GP$< $< $< $<L   % % % %N" " " "< & & & X&2D D D D= = = =E E E E      
      4 4 4 4   7 7 7 7) ) ) )
 
 
 
	
 	
 	
 	
1 1 1 1 596:
 
 
 
 
 
 
 
rK   r  c            
          e Zd ZdZdddddddddd	d> fd"Zed?d#            Zed?d$            Zd@d'ZdAd)Z	dBd+Z
dCd.ZdDd1Zed?d2            Zed?d3            ZdEd4ZdFd7ZdGd:Zd?d;ZedHd<            ZedId=            Z xZS )Jr  zA user or virtual photo album.Nr  )	r7  r  r  r_   r  r  r  r/   r  r  r,  r   rO   r  r}  r*   r~  r)   r  r(   r7  rc   r  rs  r  r$  r_   r#  r  rt  r  rD   r  r/   r  
Any | NonerC   r   c               z   t                                          ||||	||           || _        || _        |                     ||          | _        |p>t          | j        d          r(| j        j         dt          | j        j
                   nd| _        |
pt          | _        || _        || _        || _        d S )N)r  r   r~  r  r  r  r&  r*  r+  )superr   
_record_id	_obj_type_coerce_query_filters_extra_filtersr0  r   r&  r   r2  _urlr%   rz  
_parent_id_record_change_tag_record_modification_date)r   r  r   r  r}  r~  r  r7  r  r  r_   r  r  r  r/   r  	__class__s                   rL   r   zPhotoAlbum.__init__  s    & 	 	 	
 	
 	
 $!"88}UU 
t|%788t|,]]Yt|GZ=[=[]]] 		
  /<#"3)A&&&rK   c                    | j         S r   )r  r   s    rL   r   zPhotoAlbum.id  
    rK   c                F    |                      t                                S )NrP  )	_fullnamerM  r   s    rL   r  zPhotoAlbum.fullname  s    ~~355~)))rK   rP  set[str]c               `   | j         |v s| j        | j        S |                    | j                    | j        j                            | j                  }|	|j         |v r| j        S t          |t                    r|	                    |          }n|j
        }|r| d| j         n| j        S )Nr  /)r   r  r   rN  r  r   r  r   r  r  r  )r   rP  parentparent_fullnames       rL   r  zPhotoAlbum._fullname  s    7d??do59%))$/::>VY$..9fj)) 	.$..D.99OO$oO3BQ///DI///	QrK   rV   c                   | j         |k    rd S t          j        |                    d                                        d          }| j        t          | j        j                  rt          dt          | j        d| j        dd|di                    }| j                            |gt          di | j        d	
          }|j        D ]e}t#          |t$                    rN|j        p| j        | _        |j                            d          p|j                            d          | _         nfnP| j        j        }t1          | j        j                  }| d| }| j        j                            |d	| j        d| j        d| j        dd|iiddgdt6          t8          i          }|                                }	|	                    d          pi gd         }
|
                    d| j                  | _        |
                    di                               di                               d|
                    di                               di                               d| j                            | _        || _         d S )Nr  updater  r  r  rT   rR   r   r   r@  r  Tr  r  userModificationDater  rV   r  rf   r  rs  r?  r   r   r@  rJ   )r  r  r  r  r  r/  r   r   r   r   r   r  r  r  r   rz  r?  r   r   r   r@  rB  r  r&  r   r2  rC  r   r   rj   r  )r   rV   r  r  rD  rE  rv  r2  r7  r  latests              rL   r  zPhotoAlbum.rename  s   :F"5<<#8#899@@II<#(?@T(U(U#"&$#)$($;&1BW(U(U	  
 
 
B |**4#44dm44 +  H
 #*  fh// .I$2I + 6<]5L5L06 6 6I001GHH 2 E |4Ht|233F77v77C|+00""m .6.2o.8373J$2(/5&+"		' 	' # & &'89+ 1  H. mmooGkk),,4a8F&,jj!'' 'D#
 

8R((-r22JJx,,S/44S$"@AA	  * 


rK   r   c                6   | j         xt          | j        j                  r_t	          dt          | j        d| j        ddddi                    }| j                             |gt          di | j
        d	
           nz| j        j        }t          | j        j                  }| d| }| j        j                            |d	| j
        d| j        d| j        dddiiddgdt          t           i           | j                            | j                   d	S )Nr  r  r   r  r#   rT   r  r  Tr  r  rV   r  rs  rJ   )r/  r   r   r   r   r   r  r  r  r   rz  r&  r   r2  rC  r   r   r  rT  )r   r  rv  r2  r7  s        rL   rY  zPhotoAlbum.delete^  so   <#(?@T(U(U#"&$#)$($;''A)F)FG	    B L4#44dm44       |4Ht|233F77v77CL %%""m .6.2o.8373J+6!*E	' ' 
#  &'89# &   & 	**4?;;;trK   r  r8  c                N   |                      |          }| j        t          | j        j                  rkt          dt          | d| j         dd|ddddd| j        dd	          
          }| j                            |gt          di | j
        d           n| j        j        }t          | j        j                  }| d| }| j        j                            |d| j
        d| d| j         dd|iddid| j        idd	d
gdt          t           i           dS )Nr  z-IN-CPLContainerRelationrS   rT   r  i   )r   r   r   r  r  Tr  r  rV   r  rs  rJ   )_relation_item_idr/  r   r   r   r   r   r  r  r   rz  r&  r   r2  rC  r   r   )r   r  item_idr  rv  r2  r7  s          rL   	add_photozPhotoAlbum.add_photo  s   ((//<#(?@T(U(U#"&$")@@t@@5+3g"F"F-4t$D$D084?'S'S     B L4#44dm44       |4Ht|233F77v77CL %%""m .618.O.Odo.O.O.D/6.@18$4;T_3M+" +"' ' # $ &'89) &   , trK   r  r  c                    t          | j        dd           }t          |          sd S  ||          }|d S | j        t          j        j        k    r'|                     |          st          d| |          |S )Nr  zFailed to add photo to album)r   r  )	r1  r  callabler   r+   r  rV   r  r6   )r   r  r  r  s       rL   uploadzPhotoAlbum.upload  s    dm]DAA$$ 	4D!!=47n/555dnnU>S>S5(.   
 rK   c                .    | j         j         d| j         S )N:)r  rV   r  r   s    rL   _get_container_idzPhotoAlbum._get_container_id  s    .&:::::rK   c                    | j         S r   )r  r   s    rL   _container_idzPhotoAlbum._container_id  s    %%rK   c                    | j         t          | j        j                  s8t	          | j        d          r"t	          | j        d          r| j        j        }t          | j        j                  }| d| }| j        j                            |dddddd	| j	        gd
ddd| j
        dgit          t          i          }|                                }	 t          |d         d         d         d         d         d         d                   S # t          t           t"          t$          f$ r' t&                              d| j        |d           Y dS w xY w| j                             | j        | j
                  S )Nr   r&  z/internal/records/query/batch?batchr#   HyperionIndexCountLookupindexCountIDINSTRING_LISTrT   r  )r   r;  T)rh   r^   zoneWiderf   rs  r   r?  r@  	itemCountrV   z+Unexpected Photos count response for %s: %rexc_info)container_idr_   )r/  r   r   r   r0  r&  r   r2  rC  r  rz  r   r   rj   rD   r  r   	TypeError
ValueErrorLOGGERdebugr  batch_count)r   rv  r2  r7  rF  rD  s         rL   r+  zPhotoAlbum._get_len  s   \!)@AU)V)V!i00 "&899 " |4Ht|233FEEVEECl*//,-.H1?260=262D1E3& 3&-" -"
& 
& )-&*m ( &'89- 0  G0 ||~~HW%a(3A6x@MgV   )Z@   A*!	     qq |''/M ( 
 
 	
s   8D A EEr$  r%  c               2    ||f}t          | j                  S r   )r   r  r'  s       rL   r)  zPhotoAlbum._query_filters  s     YD'(((rK   r7  rd   c                    |                      dt          j                  }|                    t	          |                     |                     d| j        t          j        |                                 |          S )Nr   r.  rm  )r)  r(   r  r	  rZ   rn  r  r>  )r   r7  r  s      rL   r<  zPhotoAlbum._get_photo_payload  sw    ++1@W+XX0::;;;##o#-88::' $ 
 
 	
rK   c                    | j         S r   )r  r   s    rL   r1  zPhotoAlbum._get_url  s
    yrK   c                d    t          | dd           }t          |t                    r|r|S | j        S )Nasset_id)r1  r   rO   r   )r  r  s     rL   r  zPhotoAlbum._relation_item_id  s8    5*d33h$$ 	 	OxrK   c                @    | d | D             S t          |pg           S )Nc                6    g | ]}t          j        |          S rJ   rw  rx  s     rL   r  z4PhotoAlbum._coerce_query_filters.<locals>.<listcomp>'  s#    RRRTO2488RRRrK   )r   rr  s     rL   r  z PhotoAlbum._coerce_query_filters!  s1    
 #RR\RRRRM'R(((rK   ) r  r,  r   rO   r  rO   r}  r*   r~  r)   r  r(   r7  rc   r  rs  r  r$  r_   r#  r  rt  r  rD   r  rc   r/   rc   r  r  rC   r   rz  )rP  r  rC   rO   r{  r}  )r  r8  rC   r   r   r  r|  r~  )r  r8  rC   rO   )r  rs  r  rt  rC   r%  )r  r  r  r  r   r{  r   r  r  r  rY  r  r  r  r  r+  r)  r<  r1  staticmethodr  r  __classcell__r  s   @rL   r  r    s       (( 48.2)-6: $(,/3#&B &B &B &B &B &B &B &BP    X * * * X*R R R RI I I IV( ( ( (T. . . .`     ; ; ; X; & & & X&1
 1
 1
 1
f) ) ) )	
 	
 	
 	
       \ ) ) ) \) ) ) ) )rK   r  c                      e Zd ZdZddZdS )	r  zA folder album.r  rO   rC   r  c                    d S r   rJ   )r   r  s     rL   r  zPhotoAlbumFolder.upload.  r_  rK   Nr   )r  r  r  r  r  rJ   rK   rL   r  r  +  s.             rK   r  c                  P     e Zd ZdZdddd fdZed d            Zd! fdZ xZS )"r  zA well-known smart album.Nr  )r  r  r  r,  r   r+   r}  r*   r~  r)   r  r(   r  r$   r_   r`   r  rt  r  rD   rC   r   c               r    t                                          ||j        |j        |||||||	
  
         d S )N)
r  r   r  r}  r~  r  r  r_   r  r  )r  r   rV   )r   r  r   r}  r~  r  r  r_   r  r  r  s             rL   r   zSmartPhotoAlbum.__init__5  sR     	j' 	 	
 	
 	
 	
 	
rK   rO   c                    | j         j         S r   )r  rV   r   s    rL   r  z!SmartPhotoAlbum._get_container_idO  s    .&((rK   r  r  c                ~    | j         t          j        j        k    r!t	                                          |          S d S r   )r   r+   r  rV   r  r  )r   r  r  s     rL   r  zSmartPhotoAlbum.uploadS  s1    7n/55577>>$'''trK   )r  r,  r   r+   r}  r*   r~  r)   r  r(   r  r$   r_   r`   r  rt  r  rD   rC   r   rz  r   )	r  r  r  r  r   r{  r  r  r  r  s   @rL   r  r  2  s        ## 7;
 
 
 
 
 
 
 
4 ) ) ) X)         rK   r  c            	         e Zd ZU dZi ddddddddddd	dd
ddddddddddddddddddddddddZded<   i ddddddddddd	dd
ddddd dd!dd"dd#dd$dd%dd&dd&dd'd(d)dZded*<   d+d,d-d.d/d0d1d2d3Zded4<   d+d0d1d.d-d5Zded6<   dkd>Z	e
dld@            Ze
dldA            Ze
dldB            Ze
dldC            Ze
dmdE            Ze
dndG            Ze
dndH            Ze
dndI            Ze
dodK            Ze
dldL            Ze
dpdN            Ze
dqdP            Ze
drdR            ZdsdtdVZdsdudXZdYdYdZdvd`ZdpdaZedwdd            ZdxdfZdpdgZdpdhZ dpdiZ!dldjZ"dYS )yr.  zEA logical photo asset built from a ``CPLMaster`` + ``CPLAsset`` pair.zpublic.heicimagezpublic.heifzpublic.jpegz
public.pngzcom.apple.quicktime-moviemoviezpublic.mpeg-4zcom.apple.m4v-videozcom.adobe.raw-imagezcom.canon.cr2-raw-imagezcom.canon.cr3-raw-imagezcom.canon.crw-raw-imagezcom.fuji.raw-imagezcom.nikon.nrw-raw-imagezcom.nikon.raw-imagezcom.olympus.or-raw-imagezcom.olympus.raw-imagezcom.panasonic.rw2-raw-image)zcom.pentax.raw-imagezcom.sony.arw-raw-imager`   
ITEM_TYPESz.HEICz.HEIFz.JPGz.PNGz.MOVz.MP4z.M4Vz.DNGz.CR2z.CR3z.CRWz.RAFz.NRFz.NEFz.ORFz.RW2z.PEFz.ARWFILE_TYPE_EXTENSIONSresOriginalresOriginalAlt
resJPEGMedresJPEGThumbresOriginalVidCompl	resVidMedresVidSmall
resSidecar)originalalternativemediumthumboriginal_videomedium_videothumb_videosidecarPHOTO_VERSION_LOOKUP)r  r  r  thumb_imagemedium_imageVIDEO_VERSION_LOOKUPr   r!  r  r   r  rC   r   c                L    || _         || _        || _        d | _        d | _        d S r   )_service_master_record_asset_record
_resourcesr  )r   r   r  r  s       rL   r   zPhotoAsset.__init__  s-      +);?-1rK   rO   c                *    t          | j                  S r   r1   r  r   s    rL   r   zPhotoAsset.id      4-...rK   c                *    t          | j                  S r   )r1   r  r   s    rL   	master_idzPhotoAsset.master_id  s    4.///rK   c                *    t          | j                  S r   r  r   s    rL   r  zPhotoAsset.asset_id  r  rK   c                :    t          | j        d          p| j        S )Nr   )r-   r  r   r   s    rL   r  zPhotoAsset.filename  s    $T%8-HHSDGSrK   rb   c                    t          | j        d          }t          |t                    r3t	          t
          t                   |                    d                    S t          |dd           S )Nr   size)	r0   r  r   r  r   r   rD   r  r1  )r   tokens     rL   r  zPhotoAsset.size  sY    "4#68HIIeT"" 	:uyy'8'8999ufd+++rK   r   c                    | j         S r   )
asset_dater   s    rL   createdzPhotoAsset.created  r  rK   c                   t          | j        d          }t          |t                    r|S t          |t          t
          f          r"t          j        |dz  t          j                  S t          j        dt          j                  S )Nr        @@r   	r0   r  r   r   rD   floatfromtimestampr   rH   r   s     rL   r  zPhotoAsset.asset_date  p    "4#5{CCeX&& 	Lec5\** 	H)%&.(,GGG%a666rK   c                   t          | j        d          }t          |t                    r|S t          |t          t
          f          r"t          j        |dz  t          j                  S t          j        dt          j                  S )Nr   r  r   r  r   s     rL   
added_datezPhotoAsset.added_date  r  rK   tuple[int | None, int | None]c                    t          t          t                   t          | j        d                    t          t          t                   t          | j        d                    fS )Nr   r   )r   r   rD   r0   r  r   s    rL   
dimensionszPhotoAsset.dimensions  sZ     "4#68JKK  "4#68KLL 	
 		
rK   c                   t          | j        d          }|| j        v r| j        |         S t          | j        d          }|| j        v r| j        |         S t          |t                    rd|                                v rdS | j                                                            d          rdS | j                                                            d          rdS dS )Nr   r   rawr  )z.heicz.pngz.jpgz.jpeg)z.arwz.cr2z.cr3z.crwz.dngz.nefz.nrfz.nrwz.orfz.pefz.rafz.rw2r  )r0   r  r  r   rO   lowerr  endswith)r   raw_types     rL   	item_typezPhotoAsset.item_type  s    %d&9:FFt&&?8,,%d&9;PQQt&&?8,,h$$ 	(..2B2B)B)B7=  ))*LMM 	7=  ))
 
 	  7wrK   r   c                F    | j         dk    ot          | j        d          d uS )Nr  r   )r  r0   r  r   s    rL   is_live_photozPhotoAsset.is_live_photo   s1     Ng% "4#68UVV	
rK   dict[str, PhotoResource]c           
        | j         ui | _         | j        dk    r| j        n| j        }|                                D ]@\  }}t          ||| j        | j        | j        | j	        | j
                  }|
|| j         |<   A| j         S )Nr  )r   prefixr  r  item_type_extensionsr  item_type_lookup)r  r  r  r  r  r,   r  r  r  r  r  )r   mappingr   r  resources        rL   	resourceszPhotoAsset.resources  s    ?" DO >W,, )). 
  '}} 4 4V/!"&"5!])-)B"&"4%)_   '+3DOC(rK   dict[str, dict[str, Any]]c                H    d | j                                         D             S )Nc                >    i | ]\  }}||                                 S rJ   )as_dict)r  r   rV   s      rL   r  z'PhotoAsset.versions.<locals>.<dictcomp>!  s&    NNNeU]]__NNNrK   )r  r  r   s    rL   versionszPhotoAsset.versions  s$    NNt~7K7K7M7MNNNNrK   r  versionrc   c                L    | j                             |          }|r|j        nd S r   )r  r  r7  )r   r  r  s      rL   download_urlzPhotoAsset.download_url#  s(    >%%g..'1x||T1rK   bytes | Nonec                H   |                      |          }|d S t          | j        d          rBt          t	          | j        dd                     r| j        j                            |          S  | j        j        j        |fddi|}|j	        
                                S )N_private_clientr   streamT)r  r0  r  r   r1  r  download_asset_bytesr   r  r  read)r   r  kwargsr7  rD  s        rL   downloadzPhotoAsset.download'  s    ((;44="344 	K9PDM9d33:
 :
 	K =0EEcJJJ,4=(,SHHHHH|  """rK   Nfallback_fieldfallback_valuer?  #Iterable[CKRecord | dict[str, Any]]r"  r#  r   c               D   t          | j                  }|D ]}t          |t                    r!|j        dk    r|j        |k    r
|| _         dS 8t          |t                    r<|                    d          dk    r#|                    d          |k    r
|| _         dS |dS t          | j        t                    r| j                            dd          }|	                    di                               |i           }|                    d	d
          |d|d         |<   t          j
        |          | _        dS | j        	                    di           }|                    |i           }d|i}	t          |t                    rd	|v r|d	         |	d	<   |	||<   dS )Nr]  Tr   rR   Frj   rk   r@  rU   r  rT   rV   )r1   r  r   r   r   rR   r  r  rn   
setdefaultr  )
r   r?  r"  r#  
asset_namerE  r  existingr@  rm  s
             rL   _replace_asset_recordz PhotoAsset._replace_asset_record2  s    !!344
 	  	 F&(++ $
22v7HJ7V7V)/D&44&$''  JJ|,,
::

<00J>>)/D&44!5d((33 	(33d3SSG))(B77;;NBOOH VW55'1 1GHn- "*!8!A!AD5#..x<<::nb11N+h%% 	/&H*<*<&v.GFO!(~urK   c                    | j         }|dS 	 |j                            | j                  }n# t          $ r Y dS w xY w|dS |j        | _        |j        | _        dS )NFT)r  r  r  r   r  r  r  )r   r  	refresheds      rL   _refresh_from_libraryz PhotoAsset._refresh_from_libraryZ  sw    -?5	00II 	 	 	55	5'6&4ts   - 
;;1Iterable[CKRecord | dict[str, Any] | CKErrorItem]	list[str]c           	        g }| D ]}t          |t                    r6|j        pd}|j        pd}|                    | d|j         d| d           Mt          |t                    scd|vrh|                    d          pd}|                    d          pd}|                    | d|d          d| d           |S )	Nz<unknown record>zno reason provided: z ()serverErrorCoderR   reason)r   r   rR   r3  r	  r2  r  r  )r?  r  rE  record_name_r3  s        rL   _record_errorszPhotoAsset._record_errorsh  s     	U 	UF&+.. %0F4F>*>TT1GTT6TTTUUUfd++  ..!::l33I7ILZZ))A-AFMM\SSV4E-FSS&SSSTTTTrK   rV   c                   |rdnd}t          | j                  pt          }t          |d         |                    d          |                    d                    }d}t          | j        d          rt          t          | j        d	d                     rt          d
t          t          | j                  t          | j                  t          | j                  pt          | j                  dd|dit          d i |                    }| j        j                            |g|d          }t%          |j                  }|                     |j        d|          }n| j        j        }	t-          | j        j                  }
|	 d|
 }| j        j                            |d
t          | j                  t          | j                  t          | j                  pt          | j                  dd|iiddg|ddt4          t6          i          }|                                }t%          |                    dg                     }|                     |d|          }|                     |          }d}t          | j        dd           dk    s|r|r|                                 }tA          tC          | j        d          pd          }|r.|s,dd"                    |           }tG          d| |           ||k    r0|rdd"                    |           nd}tG          d| |           dS )!Nr#   r   rq  ownerRecordNamezoneTyperq  r7  r8  Fr  r   r  r   r  rT   rR   r   r   r@  rf   r  Tr  r!  r  rV   r  r  rs  r?  r  r  r0  z; zFailed to update favorite state)r  r+  rJ   )$r3   r  r%   r   r  r0  r  r   r1  r   r   r1   r2   r/   r  r   r  r  r   r?  r)  r&  r   r2  r   rC  r   r   rj   r5  r  r,  rD   r0   joinr6   )r   rV   favorite_value	zone_dictr_   matched_assetr  rD  response_recordsrv  r2  r7  r  r  r+  current_favoritedetails                    rL   set_favoritezPhotoAsset.set_favorite|  s   #* 233C|	z*%MM*;<<]]:..
 
 
 4="344 9	9PDM9d33:
 :
 9	 #&$*4+=>>1$2DEE$5d6H$I$I %>()<==(7^*T*TU#00i00  
 
 
B }4;;4 <  H
  $H$455 66 +- 7  MM }5Ht}344F77v77C},11 .6.9$:L.M.M.@AS.T.T3DTEW3X3X 4J#4T5H#I#I$07N2K+"' ' # ("! $ &'89) 2  H, mmooG#GKK	2$>$>?? 66 +- 7  M
 $$%566	DM7D115EEE  F F 2244It1<@@EA
 
  	) 	-$))F++--F(:&::    ~--17?-$))F++---RF(:&::    trK   c                ,    |                      d          S r]  rB  r   s    rL   favoritezPhotoAsset.favorite  s      &&&rK   c                ,    |                      d          S )NFrD  r   s    rL   
unfavoritezPhotoAsset.unfavorite  s      '''rK   c                   t          | j                  pt          }t          |d         |                    d          |                    d                    }t          | j        d          rt          t          | j        dd                     rt          dt          t          | j                  t          | j                  t          | j                  pt          | j                  dd	d
dit          di |                    }| j        j                            |g|d           n| j        j        }t'          | j        j                  }| d| }| j        j                            |dt          | j                  t          | j                  t          | j                  pt          | j                  ddd
iiddg|ddt.          t0          i           dS )Nrq  r7  r8  r9  r  r   r  r   r  r#   rT   r:  r  Tr  r  rV   r  r  rs  rJ   )r3   r  r%   r   r  r0  r  r   r1  r   r   r1   r2   r/   r  r   r  r  r&  r   r2  r   rC  r   r   )r   r=  r_   r  rv  r2  r7  s          rL   rY  zPhotoAsset.delete  s+    233C|	z*%MM*;<<]]:..
 
 

 4="344 *	9PDM9d33:
 :
 *	 #&$*4+=>>1$2DEE$5d6H$I$I %>()<==''A)F)FG#00i00  
 
 
B M)004 1     }5Ht}344F77v77CM!&& .6.9$:L.M.M.@AS.T.T3DTEW3X3X 4J#4T5H#I#I+6!*E' '	 	# ("   &'89% '   ( trK   c                B    dt          |           j         d| j         dS )Nrc  z: id=>)rU   r  r   r   s    rL   rd  zPhotoAsset.__repr__  s&    74::&77TW7777rK   )r   r!  r  r   r  r   rC   r   rz  )rC   rb   )rC   r   )rC   r  r}  )rC   r	  )rC   r  )r  )r  rO   rC   rc   )r  rO   rC   r  )r?  r$  r"  rc   r#  r   rC   r   )r?  r-  rC   r.  )rV   r   rC   r   )#r  r  r  r  r  r  r  r  r  r   r{  r   r  r  r  r  r  r  r  r   r  r  r  r  r  r   r)  r,  r  r5  rB  rE  rG  rY  rd  rJ   rK   rL   r.  r.  Y  s1        OO"w"w" 	w" 	g	"
 	$W" 	" 	w" 	w" 	"7" 	"7" 	"7" 	g" 	"7" 	w" 	#G"  	 !"" 	&w#"$ !(")'" " "J    ,,w,w, 	v, 	f	,
 	$V, 	, 	v, 	v, 	"6, 	"6, 	"6, 	f, 	"6, 	v, 	#F,  	 !," 	&v#,$ !'"(', , ,    . "'/#$	, 	, 	 	 	 	 "%$, ,    
2 
2 
2 
2 / / / X/ 0 0 0 X0 / / / X/ T T T XT , , , X,    X 7 7 7 X7 7 7 7 X7 

 

 

 X

    X< 
 
 
 X
    X, O O O XO2 2 2 2 2	# 	# 	# 	# 	# &*"& & & & & &P       \&[ [ [ [z' ' ' '( ( ( (2 2 2 2h8 8 8 8 8 8rK   r.  c                       e Zd ZdZd0 fd
Zed1d            Zed2d            Zed3d            Zed3d            Z	e
j        fd4dZddd5dZd6dZddd7d#Zd8d'Zdd(d9d.Zd:d/Z xZS );PhotosServicez&Modern CloudKit-backed Photos service.service_rootrO   r2  rd   r  shared_streams_urlrC   r   c                4   t                                          |||           | j                            ddd           | j         d}| j         d}|| _        t          ||| j        |          | _        t          ||| j                  | _        || _	        || _
        d | _        d | _        | d| j        d	          d
}t          | t          t          |          r| j        nd t           |d          | _        ddlm}	  |	| |          | _        d S )N)rM  r   r2  T)
remapEnumsgetCurrentSyncTokenz5/database/1/com.apple.photos.cloud/production/privatez4/database/1/com.apple.photos.cloud/production/sharedr'  )r(  r   r)  r  r  z/sharedstreams/webgetalbumslistr  )r_   r  r  r  r  r   )PhotoStreamLibrary)rN  )r  r   r2  r  rM  r&  r$   r  _shared_clientr4  _shared_streams_url
_libraries_legacy_servicer,  r%   r   r.  _root_librarypyicloud.services.photos_legacyrR  _shared_library)r   rM  r   r2  r  rN  private_endpointshared_endpointshared_streams_album_urlrR  r  s             rL   r   zPhotosService.__init__  s|    	lGFSSS$tLLMMM WWW 	  VVV 	 !13%!	 
  
  
 3$
 
 

 &#5 >B#!XXDK$7XXX 	! * +B7+K+KU4''QU!!
 
 
 	GFFFFF117 
  
  
rK   dict[str, BasePhotoLibrary]c                H   | j         | j        | j        d}t          | j                  rX| j                                        }|j        D ]}|j        r
|j	        
                    d          }|j	        j        }|t          d         k    r|j        | j        _        T|}d}t          |          rd| }d}t!          | || j        |          ||<   	 | j                                        }|j        D ]V}|j        r
|j	        
                    d          }|j	        j        }d| }||v r;t!          | || j        d          ||<   WnE# t$          t&          f$ r  t(                              d	d
           Y nw xY w| j                            | j         dt1          | j                   i t4          t6          i                                          }	|	                    dg           D ]}|                    d          r|                    di           }
|
                    d          }|t          d         k    r |                    d          | j        _        t|}d}t          |          rd| }d}t!          | |
|          ||<   || _         | j         S )N)rootsharedT)rm   rq  r  zshared:r  )r_   r  r  z(Shared CloudKit photos zones unavailabler  rr  rs  rt  ri  rf   rA  )r_   r  )rU  rW  rY  r   r   r  ru  rt  ri  rf   rn   rq  r%   rA  r6  r   r,  rS  r   r    r  r  rC  r&  r   r2  r   r   rj   r  )r   	librariesprivate_zonesro  r=  r   r   r  shared_zonesrD  r_   s              rL   ra  zPhotosService.librariesL  s"   ?"*.6 6I 't|44 <V $ 4 ? ? A A)/  D| !  $ 6 6D 6 I II $ 4I L$<<<AE*> #C%E3I>> 13	33 0%1 )#3#	& & &IcNN#'#6#A#A#C#CL , 2  < %$$(K$:$:$:$M$M	$(K$8	3	33)++$)5 $-#'#6"2	* * *	# )*;<   LLBT !     
  <,,,RR)DK:P:PRR)+<= -   $&&	 
 %LL"55 V VDxx	** ! "hhx44G 'J 7 7I L$<<<AE+AVAV*> #C%E3I>> 13	33 0%1$u%U%U%UIcNN'DOs   A7E -FFr  c                    | j         j        S r   )rW  r  r   s    rL   r  zPhotosService.all  s    !%%rK   r   c                    | j         j        S r   )rW  r   r   s    rL   r   zPhotosService.albums  s    !((rK   c                N    t          t          | j        j                            S r   )r   r   rY  r   r   s    rL   shared_streamszPhotosService.shared_streams  s    d4#7#>??@@@rK   r   r  r'   Optional[PhotoAlbum]c                8    | j                             ||          S r   )rW  r  )r   r   r  s      rL   r  zPhotosService.create_album  s    
 !..tZ@@@rK   Nr   r  r   str | BasePhotoAlbum | NoneOptional[PhotoAsset]c               R   || j                             |          S t          |t                    r`| j                            |          }|,| j                                                             |          }|t          d| d|          n|}|                    |          S )z
        Upload a file into the root library or a specific album.

        ``album`` may be omitted for the root library, provided as an album
        object, or provided as an album name/fullname.
        NzNo album matched ''rj  )	rW  r  r   rO   r   r   rO  r6   r  )r   r  r   	album_objs       rL   r  zPhotosService.upload  s     =%11$777 eS!! 
	((//I  .==??DDUKK	 ,1111    ! I%%%rK   c                4    | j                                         S r   )rW  rw  r   s    rL   rw  zPhotosService.sync_cursor  s    !--///rK   rc  rd  rc   re  c             #  L   K   | j                             |          E d {V  d S )Nrc  )rW  rn  )r   rd  s     rL   rn  zPhotosService.iter_changes  s8      %222???????????rK   optionsr?   r@   c                "    t          | |          S )z:Synchronize photo resources into a local output directory.)rA   )r   rr  s     rL   synczPhotosService.sync  s     dG,,,rK   )
iterationsinterval_secondsrD   ru  rb   Iterator[PhotoSyncResult]c             #  <   K   t          | |||          E d{V  dS )z3Yield repeated sync runs for the given sync target.)rv  ru  N)rB   )r   rr  rv  ru  s       rL   watchzPhotosService.watch  sS       $-!	
 
 
 	
 	
 	
 	
 	
 	
 	
 	
 	
rK   c                    | j                             |          }|d S |j        t          j        j        k    r|                    |           |S r   )rW  r  r   r+   r  rV   r  )r   r   r  r  s       rL   _upload_into_albumz PhotosService._upload_into_album  sL    "..t44=48~0666OOE"""rK   )
rM  rO   r2  rd   r  rO   rN  rO   rC   r   )rC   r]  )rC   r  rx  )r   rO   r  r'   rC   rh  )r  rO   r   rk  rC   rl  rz  ry  )rr  r?   rC   r@   )rr  r?   rv  rD   ru  rb   rC   rw  )r   r  r  rO   rC   rl  )r  r  r  r  r   r{  ra  r  r   rg  r'   r  r  r  rw  rn  rt  ry  r{  r  r  s   @rL   rL  rL    s       000
 0
 0
 0
 0
 0
d D D D XDL & & & X& ) ) ) X) A A A XA %2$7A A A A A .2	& & & & & &>0 0 0 0 37 @ @ @ @ @ @- - - - "&
 
 
 
 
 
        rK   rL  r  )rN   rO   rC   r   )r^   r   r_   r`   r[   ra   r\   rb   r]   rc   rC   rd   )rV   r   rC   r   )r   r   rC   r   )r   rc   rC   r   )gr  
__future__r   r  loggingr  abcr   r   r   r   typingr   r	   r
   r   r   r   unittest.mockr   urllib.parser   pyicloud.common.cloudkitr   r   r   r   r   r   r   r   r   r   r   r   pyicloud.common.cloudkit.clientr   pyicloud.constr   r   pyicloud.exceptionsr   r    r!   pyicloud.services.baser"   r  r$   	constantsr%   r&   r'   r(   r)   r*   r+   mappersr,   r-   r.   r/   r0   r1   r2   r3   modelsr4   r5   r6   r7   r8   queriesr9   r:   r;   r<   r=   r>   rt  r?   r@   rA   rB   	getLoggerr  r  r   rM   rZ   ro   r  r   r   r   r   r  r,  r  r  r  r  r.  rL  rJ   rK   rL   <module>r     s   4 4 " " " " " "   				 # # # # # # # # ' ' ' ' ' ' ' ' E E E E E E E E E E E E E E E E       " " " " " "                            = < < < < < : : : : : : : :         
 / . . . . . ( ( ( ( ( (                 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	                             V U U U U U U U U U U U		8	$	$* A A A A    &* $#1 1 1 1 1 1&b b b J# # # #& & & &P P P P5. 5. 5. 5. 5.X 5. 5. 5.pA( A( A( A( A(s A( A( A(HS
 S
 S
 S
 S
# S
 S
 S
l[
 [
 [
 [
 [
Xs [
 [
 [
|
U) U) U) U) U) U) U) U)p
    z   $ $ $ $ $j $ $ $N{8 {8 {8 {8 {8 {8 {8 {8|O O O O OK O O O O OrK   