*
    xh=B  c                   s   R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHtHtH	t	H
t
HtHt ]! R4      tRtRt. ROt ! R R]4      t ! R	 R
]4      t ! R R]4      t ! R R]4      t ! R R]4      t ! R R]4      tRsR R ltRR R lltR# )aI  Libvirt event loop implementation using asyncio

Register the implementation of default loop:

    import asyncio
    import libvirtaio

    async def myapp():
      libvirtaio.virEventRegisterAsyncIOImpl()

      conn = libvirt.open("test:///default")

For compatibility with Python < 3.7:

    loop = asyncio.new_event_loop()
    asyncio.set_event_loop(loop)

    loop.run_until_complete(myapp())

    asyncio.set_event_loop(None)
    loop.close()

If Python >= 3.7 can be required then

    asyncio.run(myapp())

.. seealso::
    https://libvirt.org/html/libvirt-libvirt-event.html
N)AnyCallableDict	GeneratorOptionalTypeVar_Tz,Wojtek Porczyk <woju@invisiblethingslab.com>z	LGPL-2.1+virEventAsyncIOImplc                   s   a a ] tR t^Et oRt]P                  ! 4       tV3R lV 3R lltV3R lR lt	V3R lR lt
RtVtV ;t# )	CallbackzBase class for holding callback

:param virEventAsyncIOImpl impl: the implementation in which we run
:param cb: the callback itself
:param opaque: the opaque tuple passed by libvirt
c                sT   < V ^8  d   QhRRRS[ S[S[.R3,          RS[RS[RS[RR/# )	   implr   cbNopaqueargskwargsreturn)r   intr   r    format__classdict__   "1/usr/lib64/python3.14/site-packages/libvirtaio.py__annotate__Callback.__annotate__P   sM      2 #rD8Q [] fi ux   ~B     c                s   < \         SV `  ! V/ VB  \        V P                  4      V n        Wn        W n        W0n        R # N)super__init__Znext_iden_counteridenr
   r   r   )selfr
   r   r   r   r   	__class__s   &&&&*,r   r   ZCallback.__init__P   s6    $)&)++,		r   c                    < V ^8  d   QhRS[ /# r	   r   Zstrr   r   r   r   r   W   s     I I# Ir   c                sb    R P                  V P                  P                  V P                  4      # )z<{} iden={}>)r   r   __name__r   r      &r   __repr__ZCallback.__repr__W   s#    $$T^^%<%<diiHHr   c                   < V ^8  d   QhRR/# r	   r   N r   r   r   r   r   Z   s     ? ?t ?r   c                s    V P                   P                  P                  RV P                  4       V P                   P	                  V P                  V P
                  4       R# )zSchedule *ff* callbackz"callback %d close(), scheduling ffN)r
   logdebugr   schedule_ff_callbackr   r$   r%   r   closeZCallback.closeZ   s;    		@$))L		&&tyy$++>r   )r   r   r
   r   )r#   
__module____qualname____firstlineno____doc__	itertoolsZcountr   r   r&   r-   __static_attributes____classdictcell____classcell__r   r      @@r   r   r   E   s=      OO%M I I? ? ?r   r   c                   s~   a  ] tR t^dt o RtV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR	 ltV 3R
 lR lt	Rt
V tR# )
DescriptorzManager of one file descriptor

:param virEventAsyncIOImpl impl: the implementation in which we run
:param int fd: the file descriptor
c                s(   < V ^8  d   QhRRRS[ RR/# )r	   r
   r   fdr   Nr   r   r   r   r   Descriptor.__annotate__j   s#      2   r   c                s,    Wn         W n        / V n        R # r   )r
   r9   	callbacks)r   r
   r9      &&&r   r   ZDescriptor.__init__j   s    	r   c                $   < V ^8  d   QhRS[ RR/# r	   eventr   Nr:   r   r   r   r   r;   o   s     L LS LT Lr   c                s   \        V P                  P                  4       4       F_  pVP                  f   K  VP                  V,          '       g   K.  VP	                  VP
                  V P                  WP                  4       Ka  	  R# )zoDispatch the event to the descriptors

:param int event: The event (from libvirt's constants) being dispatched
N)Zlistr<   valuesr@   r   r   r9   r   )r   r@   callback   && r   _handleZDescriptor._handleo   sT    
 T^^2245H~~)hnnu.D.DHMM477E??K 6r   c                r'   r(   r)   r   r   r   r   r;   x   s      2  2  2r   c                s   \         ;QJ d4    R V P                  P                  4        4       F  '       g   K   RM)	  RM%! R V P                  P                  4        4       4      '       d   \        P                  ! R\
        4       \         ;QJ d4    R V P                  P                  4        4       F  '       g   K   RM)	  RM%! R V P                  P                  4        4       4      '       dK   V P                  P                  P                  V P                  V P                  \        P                  4       M/V P                  P                  P                  V P                  4       \         ;QJ d4    R V P                  P                  4        4       F  '       g   K   RM)	  RM%! R V P                  P                  4        4       4      '       dL   V P                  P                  P                  V P                  V P                  \        P                  4       R# V P                  P                  P!                  V P                  4       R# )zsRegister or unregister callbacks at event loop

This should be called after change of any ``.event`` in callbacks.
c              3   s   "   T F<  pVP                   \        P                  \        P                  ,          ( ,          x  K>  	  R # 5ir   )r@   libvirtVIR_EVENT_HANDLE_READABLEVIR_EVENT_HANDLE_WRITABLEZ.0rB      & r   	<genexpr>$Descriptor.update.<locals>.<genexpr>   sE      9 !8H ~~----.!/ / / !8s   AATFzTThe only event supported are VIR_EVENT_HANDLE_READABLE and VIR_EVENT_HANDLE_WRITABLEc              3   d   "   T F&  pVP                   \        P                  ,          x  K(  	  R # 5ir   )r@   rE   rF   rH   rI   r   rJ   rK      )      9 7H ~~ A AAA 7   .0c              3   rL   r   )r@   rE   rG   rH   rI   r   rJ   rK      rM   rN   N)Zanyr<   rA   warningsZwarnZUserWarningr
   loopZ
add_readerr9   rD   rE   rF   Zremove_readerZ
add_writerrG   Zremove_writerr$   r%   r   updateZDescriptor.updatex   s    3 9 !% 5 5 79333 9 !% 5 5 79 9 9 MM0
 3 9 $ 5 5 79333 9 $ 5 5 79 9 9IINN%%w'H'HJ IINN((13 9 $ 5 5 79333 9 $ 5 5 79 9 9IINN%%w'H'HJ IINN((1r   c                "   < V ^8  d   QhRRRR/# )r	   rB   
FDCallbackr   Nr)   r   r   r   r   r;      s     	 	< 	D 	r   c                sV    WP                   VP                  &   V P                  4        R# )zAdd a callback to the descriptor

:param FDCallback callback: the callback to add
:rtype: None

After adding the callback, it is immediately watched.
N)r<   r   rQ   )r   rB      &&r   
add_handleZDescriptor.add_handle   s     )1x}}%r   c                r>   )r	   r   r   Nr:   r   r   r   r   r;      s      # $ r   c                s\    V P                   P                  V4      pV P                  4        V# )zRemove a callback from the descriptor

:param int iden: the identifier of the callback
:returns: the callback
:rtype: FDCallback

After removing the callback, the descriptor may be unwatched, if there
are no more handles for it.
)r<   poprQ   )r   r   rB   rC   r   remove_handleZDescriptor.remove_handle   s&     >>%%d+r   )r<   r9   r
   N)r#   r.   r/   r0   r1   r   rD   rQ   rU   rW   r3   r4   r      @r   r8   r8   d   s?     
 
L L 2  2D	 	 r   r8   c                   sT   a a ] tR t^t oRtV3R lV 3R lltV3R lR ltRtVtV ;t	# )DescriptorDictz\Descriptors collection

This is used internally by virEventAsyncIOImpl to hold descriptors.
c                rR   )r	   r
   r   r   Nr)   r   r   r   r   DescriptorDict.__annotate__   s      2 t r   c                s0   < \         SV `  4        Wn        R # r   )r   r   r
   )r   r
   r   s   &&r   r   ZDescriptorDict.__init__   s    	r   c                s&   < V ^8  d   QhRS[ RS[/# )r	   r9   r   )r   r8   r   r   r   r   r[      s      c j r   c                s:    \        V P                  V4      pW V&   V# r   )r8   r
   )r   r9   
descriptorrC   r   __missing__ZDescriptorDict.__missing__   s    		2.
Rr   )r
   )
r#   r.   r/   r0   r1   r   r]   r3   r4   r5   r6   r7   r   rZ   rZ      s#        r   rZ   c                   sf   a a ] tR t^t oRtV3R lV 3R lltV3R lR ltV3R lR ltRtVt	V ;t
# )	rS   zCallback for file descriptor (watcher)

:param Descriptor descriptor: the descriptor manager
:param int event: bitset of events on which to fire the callback
c          
      s6   < V ^8  d   QhRS[ RS[RS[RS[ RR/# )r	   r   r\   r@   r   r   N)r    r8   r   r   r   r   r   FDCallback.__annotate__   s2      c z # QT Y] r   c               s@   < \         SV `  ! V/ VB  Wn        W n        R # r   )r   r   r\   r@   )r   r\   r@   r   r   r   s   &$$*,r   r   ZFDCallback.__init__   s    $)&)$
r   c                r    r!   r"   r   r   r   r   r^      s     P P# Pr   c                s    R P                  V P                  P                  V P                  V P                  P
                  V P                  4      # )z<{} iden={} fd={} event={}>)r   r   r#   r   r\   r9   r@   r$   r%   r   r&   ZFDCallback.__repr__   s<    ,33NN##TYY0B0BDJJP 	Pr   c                r>   r?   r:   r   r   r   r   r^      s     ! !C !D !r   c                sF    Wn         V P                  P                  4        R# )z1Update the callback and fix descriptor's watchersN)r@   r\   rQ   )r   r@   rT   r   rQ   ZFDCallback.update   s    
 r   r\   r@   )r#   r.   r/   r0   r1   r   r&   rQ   r3   r4   r5   r6   r7   r   rS   rS      s/      
P P! ! !r   rS   c                   s   a a ] tR t^t oRtV3R lV 3R lltV3R lR ltV3R lR ltV3R lR	 ltV3R
 lV 3R llt	Rt
VtV ;t# )TimeoutCallbackzCallback for timerc                *   < V ^8  d   QhRS[ RS[ RR/# )r	   r   r   r   N)r    r   r   r   r   TimeoutCallback.__annotate__   s"      c S T r   c                sD   < \         SV `  ! V/ VB  RV n        RV n        R# )i   N)r   r   timeout_task)r   r   r   r   s   &*,r   r   ZTimeoutCallback.__init__   s#    $)&)
r   c                r    r!   r"   r   r   r   r   rb      s     > ># >r   c                sx    R P                  V P                  P                  V P                  V P                  4      # )z<{} iden={} timeout={}>)r   r   r#   r   rd   r$   r%   r   r&   ZTimeoutCallback.__repr__   s.    (//NN##TYY> 	>r   c                s6   < V ^8  d   QhRS[ S[RR3,          /# r(   )r   r    r   r   r   r   rb      s"     F FiT48 Fr   c                sn  "     V P                   ^ 8  dY   V P                   R,          pV P                  P                  P                  RV4       \        P
                  ! V4      G Rj  xL
  M\        P
                  ! ^ 4      G Rj  xL
   V P                  V P                  V P                  4       V P                  P                  P                  RV P                  4       K   L| L_  \        P                   d5    T P                  P                  P                  RT P                  4        R# i ; i5i)zAAn actual timer running on the event loop.

This is a coroutine.
gMbP?zsleeping %rNztimer %d cancelledztimer %r callback ended)
rd   r
   r*   r+   asyncioZsleepZCancelledErrorr   r   r   r   rd   rI   r   _timerZTimeoutCallback._timer   s     
 <<!#"llT1GIIMM''w?!--000 "--*** GGDIIt{{+IIMM 9499E 1 +)) 		##$8$))Ds[   D5A#C) (C%)C) -D5.C) C'C) AD5%C) 'C) )AD2.D51D22D5c                r>   )r	   rd   r   Nr:   r   r   r   r   rb      s      c d r   c                s   Wn         V P                   ^ 8  d   V P                  fr   V P                  P                  P	                  RV P
                  4       \        P                  ! V P                  4       V P                  P                  R7      V n        R# V P                   ^ 8  dd   V P                  eT   V P                  P                  P	                  RV P
                  4       V P                  P                  4        RV n        R# R# R# )z-Start or the timer, possibly updating timeoutNztimer %r startrP   ztimer %r stop)rd   re   r
   r*   r+   r   rf   ensure_futurerh   rP   Zcancelrg   rT   r   rQ   ZTimeoutCallback.update   s    <<1!3IIMM 0$))< ..t{{}48IINNDDJ \\A$**"8IIMM;JJDJ #9r   c                r'   r(   r)   r   r   r   r   rb     s     - -t -r   c                sP   < V P                  RR7       \        \        V `  4        R# )z#Stop the timer and call ff callbackrd   Nrc   )rQ   r   r`   r-   )r   r   s   &r   r-   ZTimeoutCallback.close  s    Bot*,r   )re   rd   )r#   r.   r/   r0   r1   r   r&   rh   rQ   r-   r3   r4   r5   r6   r7   r   r`   r`      sA      
> >F F, - - -r   r`   c                   s6  a  ] tR tRt o RtR#V 3R lR lltV 3R lR ltV 3R lR	 ltV 3R
 lR ltV 3R lR lt	V 3R lR lt
V 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R  lR! ltR"tV tR# )$r   i  zLibvirt event adapter to asyncio.

:param loop: asyncio's event loop

If *loop* is not specified, the current (or default) event loop is used.
Nc                s8   < V ^8  d   QhRS[ P                  RR/# )r	   rP   r   N)rf   AbstractEventLoopr   r   r   r    virEventAsyncIOImpl.__annotate__  s!     
 
W66 
$ 
r   c                s    T;'       g    \         P                  ! 4       V n        / V n        \	        V 4      V n        \        P                  ! V P                  P                  4      V n
        ^ V n        RV n        R# )i    N)rf   Zget_event_looprP   r<   rZ   descriptorsloggingZ	getLoggerr   r#   r*   _pending	_finished)r   rP   rT   r   r   ZvirEventAsyncIOImpl.__init__  sZ    44G224	)$/$$T^^%<%<= r   c                r    r!   r"   r   r   r   r   rm   +  s     C C# Cr   c                sv    R P                  \        V 4      P                  V P                  V P                  4      # )z <{} callbacks={} descriptors={}>)r   Ztyper#   r<   rn   r$   r%   r   r&   ZvirEventAsyncIOImpl.__repr__+  s2    188J1A1AC 	Cr   c                r'   r(   r)   r   r   r   r   rm   /  s     # #d #r   c                s    V ;P                   ^,          un         V P                  e   V P                  P                  4        R# R# )z;Increase the count of pending affairs. Do not use directly.N)rp   rq   Zclearr$   r%   r   _pending_incZ virEventAsyncIOImpl._pending_inc/  s/    >>%NN  " &r   c                r'   r(   r)   r   r   r   r   rm   5  s     ! !d !r   c                s    V P                   ^ 8  g   Q hV ;P                   ^,          un         V P                   ^ 8X  d-   V P                  e   V P                  P                  4        R# R# R# )z;Decrease the count of pending affairs. Do not use directly.N)rp   rq   Zsetr$   r%   r   _pending_decZ virEventAsyncIOImpl._pending_dec5  sO    }}q   ==A$.."<NN  #=r   c                r'   )r	   r   r   r)   r   r   r   r   rm   <  s      / r   c                s    V P                   P                  R4       \        P                  ! V P                  V P
                  V P                  V P                  V P                  V P                  4       V # )z3Register this instance as event loop implementationz
register())
r*   r+   rE   ZvirEventRegisterImpl_add_handle_update_handle_remove_handle_add_timeout_update_timeout_remove_timeoutr$   r%   r   registerZvirEventAsyncIOImpl.register<  s\     	|$$$d1143F3Ft33T5I5I	K r   c                *   < V ^8  d   QhRS[ RS[RR/# r	   r   r   r   Nr   r   r   r   r   r   rm   E  s'     O O Ob OT Or   c                sh    \         P                  ! V P                  W4      V P                  R7       R# )z8Schedule a ff callback from one of the handles or timersri   N)rf   rj   _ff_callbackrP   r   r   r   r=   r   r,   Z(virEventAsyncIOImpl.schedule_ff_callbackE  s!    d//=DIINr   c                r{   r|   r}   r   r   r   r   rm   I  s"      s B 4 r   c                s   "   V P                   P                  RV4       \        P                  ! V4       V P	                  4        R# 5i)z6Directly free the opaque object

This is a coroutine.
z ff_callback(iden=%d, opaque=...)N)r*   r+   rE   ZvirEventInvokeFreeCallbackrs   r   r=   r   r~   Z virEventAsyncIOImpl._ff_callbackI  s4     
 	94@**62s   AAc                r'   r(   r)   r   r   r   r   rm   R  s     & &T &r   c                sn  "   V P                   P                  R4       V P                  '       dg   V P                  e   Q h\        P
                  ! 4       V n        V P                  P                  4       G Rj  xL
  RV n        V P                  ^ 8X  g   Q hV P                   P                  R4       R#  L;5i)zBWait for the implementation to become idle.

This is a coroutine.
zdrain()Nzdrain ended)r*   r+   rp   rq   rf   ZEventZwaitr$   r%   r   drainZvirEventAsyncIOImpl.drainR  s     
 	y!===>>)))$]]_DN..%%'''!DN==A%%%}% (s   A5B57B38<B5c                r    r!   )Zboolr   r   r   r   rm   `  s     8 8 8r   c                sV    V P                   '       * ;'       d    V P                  '       * # )zReturns False if there are leftovers from a connection

Those may happen if there are sematical problems while closing
a connection. For example, not deregistered events before .close().
)r<   rp   r$   r%   r   is_idleZvirEventAsyncIOImpl.is_idle`  s      >>!77$--&77r   c          
      sL   < V ^8  d   QhRS[ RS[ RS[P                  RS[RS[ /# )r	   r9   r@   r   r   r   )r   rE   Z_EventCBr   r   r   r   r   rm   h  s7      c # 73C3C R TW r   c                sv   \        WVV P                  V,          VR7      pVP                  V P                  9  g   Q hV P                  P                  RWVP                  4       WPP                  VP                  &   V P                  V,          P                  V4       V P                  4        VP                  # )a  Register a callback for monitoring file handle events

:param int fd: file descriptor to listen on
:param int event: bitset of events on which to fire the callback
:param cb: the callback to be called when an event occurrs
:param opaque: user data to pass to the callback
:rtype: int
:returns: handle watch number to be used for updating and unregistering for events

.. seealso::
    https://libvirt.org/html/libvirt-libvirt-event.html#virEventAddHandleFuncFunc
r_   z4add_handle(fd=%d, event=%d, cb=..., opaque=...) = %d)rS   rn   r   r<   r*   r+   rU   rr   )r   r9   r@   r   r   rB   s   &&&&& r   rt   ZvirEventAsyncIOImpl._add_handleh  s     d)-)9)9")=UL}}DNN222M(--	1(0x}}%''1}}r   c                ra   )r	   watchr@   r   Nr:   r   r   r   r   rm     s"     % %C % % %r   c                    V P                   P                  RW4       V P                  V,          p\        V\        4      '       g   Q hVP                  VR7       R# )zChange event set for a monitored file handle

:param int watch: file descriptor watch to modify
:param int event: new events to listen on

.. seealso::
    https://libvirt.org/html/libvirt-libvirt-event.html#virEventUpdateHandleFunc
z!update_handle(watch=%d, event=%d))r@   N)r*   r+   r<   
isinstancerS   rQ   )r   r   r@   rB      &&& r   ru   Z"virEventAsyncIOImpl._update_handle  sF     	:EI>>%((J////e$r   c                &   < V ^8  d   QhRS[ RS[ /# )r	   r   r   r:   r   r   r   r   rm     s      C C r   c                s>   V P                   P                  RV4        V P                  P                  V4      p\        T\        4      '       g   Q hTP                  P                  pY P                  T,          P                  T4      J g   Q h\        T P                  T,          P                  4      ^ 8X  d   T P                  T TP                  4        ^ #   \         d:   pT P                   P                  RTP                  ^ ,          4       Ru Rp?# Rp?ii ; i)zUnregister a callback from a file handle.

:param int watch: file descriptor watch to stop listening on
:returns: -1 on error, 0 on success

.. seealso::
    https://libvirt.org/html/libvirt-libvirt-event.html#virEventRemoveHandleFunc
zremove_handle(watch=%d)z#remove_handle(): no such handle: %rNrc   )r*   r+   r<   rV   KeyErrorwarningr   r   rS   r\   r9   rn   rW   Zlenr-   )r   r   rB   errr9   s   &&   r   rv   Z"virEventAsyncIOImpl._remove_handle  s     	0%8	~~))%0H (J////  ##++B/==eDDDDt#--.!3  $  	HHBCHHQKPI	s   C D#.DDDc                sF   < V ^8  d   QhRS[ RS[P                  RS[RS[ /# )r	   rd   r   r   r   )r   rE   Z_TimerCBr   r   r   r   r   rm     s/      C W-=-= r c r   c                s,   \        WV4      pVP                  V P                  9  g   Q hV P                  P	                  RWP                  4       W@P                  VP                  &   VP                  VR7       V P                  4        VP                  # )a=  Register a callback for a timer event

:param int timeout: the timeout to monitor
:param cb: the callback to call when timeout has expired
:param opaque: user data to pass to the callback
:rtype: int
:returns: a timer value

.. seealso::
    https://libvirt.org/html/libvirt-libvirt-event.html#virEventAddTimeoutFunc
z0add_timeout(timeout=%d, cb=..., opaque=...) = %drk   )r`   r   r<   r*   r+   rQ   rr   )r   rd   r   r   rB   s   &&&& r   rw   Z virEventAsyncIOImpl._add_timeout  st     #4V4}}DNN222I	/(0x}}%(}}r   c                ra   )r	   timerrd   r   Nr:   r   r   r   r   rm     s"     ) )S )3 )4 )r   c                r   )zChange frequency for a timer

:param int timer: the timer to modify
:param int timeout: the new timeout value in ms

.. seealso::
    https://libvirt.org/html/libvirt-libvirt-event.html#virEventUpdateTimeoutFunc
z$update_timeout(timer=%d, timeout=%d)rk   N)r*   r+   r<   r   r`   rQ   )r   r   rd   rB   r   r   rx   Z#virEventAsyncIOImpl._update_timeout  sF     	=uN>>%((O4444(r   c                r   )r	   r   r   r:   r   r   r   r   rm     s      S S r   c                s$   V P                   P                  RV4        V P                  P                  V4      pTP                  4        ^ #   \         d:   pT P                   P                  RTP                  ^ ,          4       Ru Rp?# Rp?ii ; i)zUnregister a callback for a timer

:param int timer: the timer to remove
:returns: -1 on error, 0 on success

.. seealso::
    https://libvirt.org/html/libvirt-libvirt-event.html#virEventRemoveTimeoutFunc
zremove_timeout(timer=%d)z%remove_timeout(): no such timeout: %rNrc   )r*   r+   r<   rV   r   r   r   r-   )r   r   rB   r   s   &&  r   ry   Z#virEventAsyncIOImpl._remove_timeout  ss     	159	~~))%0H 		  	HHDchhqkRI	s   A B.B
B
B)rq   rp   r<   rn   r*   rP   r   )r#   r.   r/   r0   r1   r   r&   rr   rs   rz   r,   r~   r   r   rt   ru   rv   rw   rx   ry   r3   r4   rX   rY   r   r   r     s     
 
C C# #! ! O O & &8 8 0% % . ,) ) r   c                s:    V ^8  d   QhR\         \        ,          /# r!   )r   r   r      "r   r   r     s      !45 r   c                 s    \         # )z@Return the current implementation, or None if not yet registered)_current_implr)   r   r   getCurrentImplr     s    r   c                sD    V ^8  d   QhR\         P                  R\        /# )r	   rP   r   )rf   rl   r   r   r   r   r   r     s!      g&?&? K^ r   c                sB    \        V R7      P                  4       s\        # )zArrange for libvirt's callbacks to be dispatched via asyncio event loop

The implementation object is returned, but in normal usage it can safely be
discarded.
ri   )r   rz   r   ri   r%   r   virEventRegisterAsyncIOImplr     s     (T2;;=Mr   )r   r   r   r   )r1   rf   r2   ro   rO   rE   Ztypingr    r   r   r   r   r   r   Z
__author__Z__license__Z__all__Zobjectr   r8   ZdictrZ   rS   r`   r   r   r   r   r)   r   r   <module>r      s   (<      D DT];
?v ?>M M`T ! !62-h 2-rB& BJ 
 r   