
    iw                       d Z ddlmZ ddlZddlZddlZddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ dd	lmZ dd
lmZmZ ddlmZ ddlmZ ddlmZ ddlmZmZmZ ddlmZ ddlm Z m!Z! ddl"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z) 	 ddl*Z*	 ddl*m,Z,  ed      Z-e-j\                  e-j^                  cZ0Z/dZ1dZ2dZ3g dZ4 edd      Z5d Z6d Z7 G d d e8      Z9e
d!        Z:d" Z; G d# d$      Z< G d% d&e<e*jz                        Z> G d' d(e<e*j~                  j                        ZA G d) d*e*j~                  j                        ZC G d+ d,e)j                        ZD G d- d.      ZE G d/ d0e)j                        ZF G d1 d2e)j                        ZGe,r  G d3 d4e,j                  e*j                        ZJ G d5 d6eF      ZK G d7 d8eG      ZLy# e+$ r dZ*Y Bw xY w# e+$ r dZ,Y Iw xY w)9a  Redis transport module for Kombu.

Features
========
* Type: Virtual
* Supports Direct: Yes
* Supports Topic: Yes
* Supports Fanout: Yes
* Supports Priority: Yes
* Supports TTL: No

Connection String
=================
Connection string has the following format:

.. code-block::

    redis://[USER:PASSWORD@]REDIS_ADDRESS[:PORT][/VIRTUALHOST]
    rediss://[USER:PASSWORD@]REDIS_ADDRESS[:PORT][/VIRTUALHOST]

To use sentinel for dynamic Redis discovery,
the connection string has following format:

.. code-block::

    sentinel://[USER:PASSWORD@]SENTINEL_ADDRESS[:PORT]

Transport Options
=================
* ``sep``
* ``ack_emulation``: (bool) If set to True transport will
  simulate Acknowledge of AMQP protocol.
* ``unacked_key``
* ``unacked_index_key``
* ``unacked_mutex_key``
* ``unacked_mutex_expire``
* ``visibility_timeout``
* ``unacked_restore_limit``
* ``fanout_prefix``
* ``fanout_patterns``
* ``global_keyprefix``: (str) The global key prefix to be prepended to all keys
  used by Kombu
* ``socket_timeout``
* ``socket_connect_timeout``
* ``socket_keepalive``
* ``socket_keepalive_options``
* ``queue_order_strategy``
* ``max_connections``
* ``health_check_interval``
* ``retry_on_timeout``
* ``priority_steps``
    )annotationsN)bisect)
namedtuple)contextmanager)Empty)time)promise)InconsistencyErrorVersionMismatch)
get_logger)register_after_fork)bytes_to_str)ERRREADpoll)accepts_argument)dumpsloads)cached_property)cycle_by_name)
_parse_url   )virtual)sentinelzkombu.transport.redisi     )r         	   error_classes_t)connection_errorschannel_errorsc                    ddl m}  t        | d      r| j                  }n| j                  }t        t        j                  j                  t        t        j                  t        t        | j                  | j                  | j                   | j"                  fz   t        j                  j$                  || j&                  | j(                  fz         S )z$Return tuple of redis error classes.r   
exceptionsInvalidData)redisr$   hasattrr%   	DataErrorr   r   	Transportr    r
   socketerrorIOErrorOSErrorConnectionErrorBusyLoadingErrorAuthenticationErrorTimeoutErrorr!   InvalidResponseResponseError)r$   r(   s     u/var/www/html/hwPaymentPortal-be-dev/hw-payment-portal-api/venv/lib/python3.12/site-packages/kombu/transport/redis.pyget_redis_error_classesr5   y   s      z=)**	((					,	,LL&&''**##0% 
% 
			)	)&&$$-& 
&     c                 &    ddl m}  | j                  S )z1Return the redis ConnectionError exception class.r   r#   )r&   r$   r.   r#   s    r4   get_redis_ConnectionErrorr8      s     %%%r6   c                      e Zd ZdZy)	MutexHeldz)Raised when another party holds the lock.N__name__
__module____qualname____doc__ r6   r4   r:   r:      s    3r6   r:   c              #  f  K   | j                  ||      }d}	 |j                  d      }|rd n
t               	 |r	 |j                          yy# t        j
                  j                  $ r Y yw xY w# |r5	 |j                          w # t        j
                  j                  $ r Y w w xY ww xY ww)zTAcquire redis lock in non blocking way.

    Raise MutexHeld if not successful.
    timeoutF)blockingN)lockacquirer:   releaser&   r$   LockNotOwnedError)clientnameexpirerE   lock_acquireds        r4   MutexrM      s      ;;tV;,DMe4+    ##55  ##55  sc   B1#A5 B1 A B1A2/B11A22B15B.9B
	B.
B*'B.)B**B..B1c                $    | j                          y N)_after_fork)channels    r4   _after_fork_cleanup_channelrR      s    r6   c                  h     e Zd ZdZg dZddddddddddddd	Zd
 Z fdZ fdZddZ	 xZ
S )GlobalKeyPrefixMixina  Mixin to provide common logic for global key prefixing.

    Overriding all the methods used by Kombu with the same key prefixing logic
    would be cumbersome and inefficient. Hence, we override the command
    execution logic that is called by all commands.
    )HDELHGETHLENHSETLLENLPUSHPUBLISHRPUSHRPOPSADDSREMSETSMEMBERSZADDZREMZREVRANGEBYSCOREr   N)
args_startargs_end   r   )DELBRPOPEVALSHAWATCHc                   t        |      }|j                  d      }|| j                  v r| j                  t	        |d         z   |d<   nv|| j
                  v rh| j
                  |   d   }| j
                  |   d   }|dkD  r|d | ng }g }|||d  }|||| D cg c]  }| j                  t	        |      z    c}z   |z   }|g|S c c}w )Nr   re   rf   )listpopPREFIXED_SIMPLE_COMMANDSglobal_keyprefixstrPREFIXED_COMPLEX_COMMANDS)selfargscommandre   rf   pre_args	post_argsargs           r4   _prefix_argsz!GlobalKeyPrefixMixin._prefix_args   s    Dz((1+d333++c$q'l:DG66677@NJ55g>zJH,6NtKZ(HI# O	
84 %%C0  D
 $s   Cc                z    t        |   ||fi |}|dk(  r#|r!|\  }}|t        | j                        d }||fS |S )zParse a response from the Redis server.

        Method wraps ``redis.parse_response()`` to remove prefixes of keys
        returned by redis command.
        rj   Nsuperparse_responselenrq   )rt   
connectioncommand_nameoptionsretkeyvalue	__class__s          r4   r~   z#GlobalKeyPrefixMixin.parse_response   sU     g$ZII7"sJCc$//012C:
r6   c                @    t        |   | j                  |      i |S rO   r}   execute_commandrz   rt   ru   kwargsr   s      r4   r   z$GlobalKeyPrefixMixin.execute_command   #    w&(9(9$(?J6JJr6   c                ^    t        | j                  | j                  ||| j                        S )Nrq   )PrefixedRedisPipelineconnection_poolresponse_callbacksrq   )rt   transaction
shard_hints      r4   pipelinezGlobalKeyPrefixMixin.pipeline  s0    $  ##!22
 	
r6   )TN)r<   r=   r>   r?   rp   rs   rz   r~   r   r   __classcell__r   s   @r4   rT   rT      sO     (  T2 !r2"#3 !t4	! .K
r6   rT   c                      e Zd ZdZd Zd Zy)PrefixedStrictRedisz@Returns a ``StrictRedis`` client that prefixes the keys it uses.c                x    |j                  dd      | _        t        j                  j                  | g|i | y Nrq    )ro   rq   r&   Redis__init__rt   ru   r   s      r4   r   zPrefixedStrictRedis.__init__  s2     &

+=r BT3D3F3r6   c                F    t        | j                  fd| j                  i|S )Nrq   )PrefixedRedisPubSubr   rq   )rt   r   s     r4   pubsubzPrefixedStrictRedis.pubsub  s0    "  
!22
 
 	
r6   N)r<   r=   r>   r?   r   r   r@   r6   r4   r   r     s    J4
r6   r   c                      e Zd ZdZd Zy)r   a   Custom Redis pipeline that takes global_keyprefix into consideration.

    As the ``PrefixedStrictRedis`` client uses the `global_keyprefix` to prefix
    the keys it uses, the pipeline called by the client must be able to prefix
    the keys as well.
    c                    |j                  dd      | _        t        j                  j                  j
                  | g|i | y r   )ro   rq   r&   rI   Pipeliner   r   s      r4   r   zPrefixedRedisPipeline.__init__"  s8     &

+=r B&&t=d=f=r6   N)r<   r=   r>   r?   r   r@   r6   r4   r   r     s    >r6   r   c                  @     e Zd ZdZdZ fdZd Z fdZ fdZ xZ	S )r   zCRedis pubsub client that takes global_keyprefix into consideration.)	SUBSCRIBEUNSUBSCRIBE
PSUBSCRIBEPUNSUBSCRIBEc                R    |j                  dd      | _        t        |   |i | y r   )ro   rq   r}   r   r   s      r4   r   zPrefixedRedisPubSub.__init__1  s)     &

+=r B$)&)r6   c                    t        |      }|j                  d      }|| j                  v r%|D cg c]  }| j                  t	        |      z    }}|g|S c c}w Nr   )rn   ro   PUBSUB_COMMANDSrq   rr   )rt   ru   rv   ry   s       r4   rz   z PrefixedRedisPubSub._prefix_args5  si    Dz((1+d***   %%C0D 
 $s   Ac                    t        |   |i |}||S |^}}}|g|D cg c]  }|t        | j                        d  c}|S c c}w )zParse a response from the Redis server.

        Method wraps ``PubSub.parse_response()`` to remove prefixes of keys
        returned by redis command.
        Nr|   )	rt   ru   r   r   message_typechannelsmessagerQ   r   s	           r4   r~   z"PrefixedRedisPubSub.parse_responseA  sq     g$d5f5;J ,/(x
BJKwgc$//012K
 
 	
Ks   Ac                @    t        |   | j                  |      i |S rO   r   r   s      r4   r   z#PrefixedRedisPubSub.execute_commandW  r   r6   )
r<   r=   r>   r?   r   r   rz   r~   r   r   r   s   @r4   r   r   '  s(    MO*
 
,K Kr6   r   c                       e Zd ZdZdZ fdZ fdZddZ fdZd fd	Z	e
dd       Zdd	Zdd
ZddZed        Zed        Zed        Zed        Zed        Z xZS )QoSzRedis Ack Emulation.Tc                2    t        |   |i | d| _        y r   )r}   r   _vrestore_countr   s      r4   r   zQoS.__init__`  s    $)&) r6   c           
        |j                   }|d   |d   }}t        j                  d   dk\  r|t               ig}nt               |g}| j	                         5 } |j
                  | j                  g| j                  | j                  |t        |j                  ||g            j                          t        | 5  ||       d d d        y # 1 sw Y   y xY w)Nexchangerouting_keyr   r   )delivery_infor&   VERSIONr   pipe_or_acquirezaddunacked_index_keyhsetunacked_keyr   _rawexecuter}   append)	rt   r   delivery_tagdeliveryEXRK	zadd_argspiper   s	           r4   r   z
QoS.appendd  s    ((*%x'>B==q &/0I.I!!# 	2tDIId,,9y9d&&W\\2r235GN7L1	2 	2 	2s   A-CCc                    | j                   j                  |      5 }| j                  D ]  }| j                  ||        	 d d d        | j                  j	                          y # 1 sw Y   $xY w)NrI   )rQ   conn_or_acquire
_deliveredrestore_by_tagclear)rt   rI   tags      r4   restore_unackedzQoS.restore_unackedu  sc    \\))&1 	8V 8##C#78	8 		8 	8s   %A%%A.c                b    | j                  |      j                          t        |   |       y rO   )_remove_from_indicesr   r}   ack)rt   r   r   s     r4   r   zQoS.ack{  s&    !!,/779L!r6   c                    |r| j                  |d       n| j                  |      j                          t        |   |       y NT)leftmost)r   r   r   r}   r   )rt   r   requeuer   s      r4   rejectz
QoS.reject  s<    t<%%l3;;=L!r6   c              #     K   |r| y | j                   j                  |      5 }|j                          d d d        y # 1 sw Y   y xY wwrO   )rQ   r   r   )rt   r   rI   s      r4   r   zQoS.pipe_or_acquire  sC     J--f5 (oo''( ( (s   #AA	AA
Ac                    | j                  |      5 }|j                  | j                  |      j                  | j                  |      cd d d        S # 1 sw Y   y xY wrO   )r   zremr   hdelr   )rt   r   r   s      r4   r   zQoS._remove_from_indices  sM    !!$' 	=499T33\BT--|<	= 	= 	=s   6AAc           
        | xj                   dz  c_         | j                   dz
  |z  ry | j                  j                         5 }t               | j                  z
  }	 t        || j                  | j                        5  |j                  | j                  |d|xr ||d      }|xs g D ]  \  }}| j                  ||        	 d d d        d d d        y # 1 sw Y   xY w# t        $ r Y  w xY w# 1 sw Y   y xY w)Nr   r   T)startnum
withscores)r   rQ   r   r   visibility_timeoutrM   unacked_mutex_keyunacked_mutex_expirezrevrangebyscorer   r   r:   )	rt   r   r   intervalrI   ceilvisibler   scores	            r4   restore_visiblezQoS.restore_visible  s   !  1$0\\))+ 	v6D333D	64#9#9446 9$55..a!me 6 GG '.m 9
U++C899	 	9 9  	 	sC   C0!C!=ACC!C	C!!	C-*C0,C--C00C9c                      fd} j                   j                  |      5 }|j                  | j                         d d d        y # 1 sw Y   y xY w)Nc                    | j                  j                        }| j                          j                  |        |r8t	        t        |            \  }}}j                  j                  ||||        y y rO   )hgetr   multir   r   r   rQ   _do_restore_message)r   pMr   r   r   rt   r   s        r4   restore_transactionz/QoS.restore_by_tag.<locals>.restore_transaction  sh    		$**C0AJJL%%c40!,q/2	2r00BD(K r6   )rQ   r   r   r   )rt   r   rI   r   r   s   `` ` r4   r   zQoS.restore_by_tag  sO    	L \\))&1 	FV2D4D4DE	F 	F 	Fs   AAc                .    | j                   j                  S rO   )rQ   r   rt   s    r4   r   zQoS.unacked_key  s    ||'''r6   c                .    | j                   j                  S rO   )rQ   r   r   s    r4   r   zQoS.unacked_index_key      ||---r6   c                .    | j                   j                  S rO   )rQ   r   r   s    r4   r   zQoS.unacked_mutex_key  r   r6   c                .    | j                   j                  S rO   )rQ   r   r   s    r4   r   zQoS.unacked_mutex_expire  s    ||000r6   c                .    | j                   j                  S rO   )rQ   r   r   s    r4   r   zQoS.visibility_timeout  s    ||...r6   rO   FNN)r   
   r   )NF)r<   r=   r>   r?   restore_at_shutdownr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s   @r4   r   r   [  s    !2" "" ( (=
"F ( ( . . . . 1 1 / /r6   r   c                      e Zd ZdZeez  ZdZdZd Z	d Z
d Zd Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd ZddZed        Zy)MultiChannelPollerz%Async I/O poller for Redis transport.FNc                z    t               | _        i | _        i | _        t	               | _        t               | _        y rO   )set	_channels_fd_to_chan_chan_to_sockr   poller
after_readr   s    r4   r   zMultiChannelPoller.__init__  s-    f%r6   c                @   | j                   j                         D ]  }	 | j                  j                  |         | j                  j                          | j                  j                          | j                   j                          y # t        t
        f$ r Y w xY wrO   )	r  valuesr  
unregisterKeyError
ValueErrorr  r   r  )rt   fds     r4   closezMultiChannelPoller.close  s    $$++- 	B&&r*	
 	   "	 j) s   BBBc                :    | j                   j                  |       y rO   )r  addrt   rQ   s     r4   r  zMultiChannelPoller.add  s    7#r6   c                :    | j                   j                  |       y rO   )r  discardr  s     r4   r  zMultiChannelPoller.discard  s    w'r6   c                z    	 | j                   j                  |j                         y # t        t        f$ r Y y w xY wrO   )r  r	  _sockAttributeError	TypeErrorrt   r   s     r4   _on_connection_disconnectz,MultiChannelPoller._on_connection_disconnect  s6    	KK"":#3#34	* 		s   %( ::c                   |||f| j                   v r| j                  |||       |j                  j                  |j                  j	                          |j                  j                  }||f| j
                  |j                         <   || j                   |||f<   | j                  j                  || j                         y rO   )
r  _unregisterr   r  connectr  filenor  register
eventflags)rt   rQ   rI   typesocks        r4   	_registerzMultiChannelPoller._register  s    VT"d&8&88Wfd3""*%%'  &&+2D/'6:GVT23T4??3r6   c                Z    | j                   j                  | j                  |||f          y rO   )r  r	  r  )rt   rQ   rI   r  s       r4   r  zMultiChannelPoller._unregister  s&    t117FD2IJKr6   c                    t        |dd        |j                  j                  d      |_        |j                  j                  d uxr |||f| j
                  v S )Nr   _)getattrr   get_connectionr   r  r  )rt   rQ   rI   cmds       r4   _client_registeredz%MultiChannelPoller._client_registered   s]    6<.6 & 6 6 E Ec JF!!''t3 =&#&$*<*<<	>r6   c                    ||j                   df}| j                  ||j                   d      sd|_         | j                  |  |j                  s|j	                          yy)zEnable BRPOP mode for channel.rj   FN)rI   r(  _in_pollr!  _brpop_start)rt   rQ   idents      r4   _register_BRPOPz"MultiChannelPoller._register_BRPOP  sX    0&&wH$GDNNE"  "  r6   c                    | j                  ||j                  d      s$d|_        | j                  ||j                  d       |j                  s|j	                          yy)zEnable LISTEN mode for channel.LISTENFN)r(  	subclient
_in_listenr!  
_subscriber  s     r4   _register_LISTENz#MultiChannelPoller._register_LISTEN  sR    &&w0A0A8L!&GNN7G$5$5x@!!  "r6   c                    | j                   D ]W  }|j                  r+|j                  j                         r| j	                  |       |j
                  sG| j                  |       Y y rO   )r  active_queuesqoscan_consumer-  active_fanout_queuesr3  r  s     r4   on_poll_startz MultiChannelPoller.on_poll_start  sS    ~~ 	/G$$;;**,((1++%%g.	/r6   c                    || _         | j                  D ])  }|j                  j                  |j                        c S  y N)r   )r  r  r6  r   unacked_restore_limit)rt   r  rQ   s      r4   on_poll_initzMultiChannelPoller.on_poll_init  sA    ~~ 	G;;..11 /  	r6   c                    | j                   D ]6  }|j                  s|j                  j                  |j                        c S  y r;  )r  r5  r6  r   r<  r  s     r4   maybe_restore_messagesz)MultiChannelPoller.maybe_restore_messages&  sC    ~~ 	G$${{2255 3  	r6   c                    | j                   D ]G  }|j                  j                  d      }|!t        t	        |dd             s8|j                          I y )Nr0  check_health)r  __dict__getcallabler%  rA  )rt   rQ   rI   s      r4   maybe_check_subclient_healthz/MultiChannelPoller.maybe_check_subclient_health.  sN    ~~ 	&G%%))+6F! !FG##%	&r6   c                    | j                   |   \  }}|j                  j                         r |j                  |           y y rO   )r  r6  r7  handlers)rt   r  chanr  s       r4   on_readablezMultiChannelPoller.on_readable6  s<    %%f-
d88!DMM$! "r6   c                    |t         z  r| j                  |      | fS |t        z  r$| j                  |   \  }}|j	                  |       y y rO   )r   rI  r   r  _poll_error)rt   r  eventrH  r  s        r4   handle_eventzMultiChannelPoller.handle_event;  sM    4<##F+T11S[))&1JD$T" r6   c                   d| _         	 | j                  D ]W  }|j                  r+|j                  j	                         r| j                  |       |j                  sG| j                  |       Y | j                  j                  |      }|rc|D ]^  \  }}| j                  ||      }|s d| _         | j                  r0	 | j                  j                         } |        | j                  r/y y  | j                          t               # t        $ r Y y w xY w# d| _         | j                  r@	 | j                  j                         } |        n# t        $ r Y w w xY w| j                  r?w w xY w)NTF)_in_protected_readr  r5  r6  r7  r-  r8  r3  r  r   rM  r  ro   r
  r?  r   )	rt   callbackrC   rQ   eventsr  rL  r   funs	            r4   rC  zMultiChannelPoller.getB  sR   "&	>> 3(({{..0,,W5//))'23 [[%%g.F%+ MFE++FE:C ',D#////--/C E // '')'M   	 ',D#////--/C E    //s[   AD AD )D >D	 .D 		DDE--EE-	EE-EE-+E-c                    | j                   S rO   )r  r   s    r4   fdszMultiChannelPoller.fds`  s    r6   rO   )r<   r=   r>   r?   r   r   r  rO  r  r   r  r  r  r  r!  r  r(  r-  r3  r9  r=  r?  rE  rI  rM  rC  propertyrT  r@   r6   r4   r   r     s    /J  J
 #$(4L>#!/&"
#<    r6   r   c                      e Zd ZdZeZdZdZdZdZdZ	dZ
dZdZdZi ZdZdZd	Zd
ZdZdZdZeZdZdZdZdZdZdZeZdZ dZ!dZ"dZ#dZ$dZ%e&jN                  jP                  dz   Z(e)re)jT                  ndZ+e)re)jX                  ndZ- fdZ.d Z/d Z0d Z1	 dAdZ2dA fd	Z3d Z4 fdZ5d Z6 fdZ7d Z8d Z9d Z:d Z;d Z<d  Z=d! Z>dBd"Z?d# Z@d$ ZAd% ZBd& ZCd' ZDd( ZEd) ZFd* ZGdAd+ZHd, ZId- ZJd. ZKd/ ZLd0 ZM fd1ZNd2 ZOd3 ZP	 	 dCd4ZQdAd5ZRdAd6ZSdAd7ZTd8 ZUeVdDd9       ZWeXd:        ZYeXd;        ZZe[d<        Z\e[d=        Z]d> Z^d? Z_eXd@        Z` xZaS )EChannelzRedis Channel.NFTz_kombu.binding.%sz/{db}.zunackedunacked_indexunacked_mutexi,  i  r   r   round_robin)sepack_emulationr   r   r   r   r   r<  fanout_prefixfanout_patternsrq   socket_timeoutsocket_connect_timeoutsocket_keepalivesocket_keepalive_optionsqueue_order_strategymax_connectionshealth_check_intervalretry_on_timeoutpriority_stepsc                8   t        |   |i | | j                  st        j                  | _        d| _         t        | j                               | _        | j                         | _
        | j                         | _        t               | _        t               | _        i | _        | j"                  | j$                  d| _        | j(                  r,t+        | j(                  t,              r| j(                  | _        nd| _        	 | j0                  j3                          | j8                  j:                  j=                  |        d| _        | j8                  j>                  | _        t@        tA        | tB               y y # t4        $ r | j7                           w xY w)NF)rj   r/  r   T)"r}   r   r]  r   r   _registeredr   rd  _queue_cycle_get_clientClient_get_response_errorr3   r  r8  auto_delete_queues_fanout_to_queue_brpop_read_receiverG  r^  
isinstancerr   keyprefix_fanoutrI   ping	Exception_disconnect_poolsr   cycler  r    r   rR   r   s      r4   r   zChannel.__init__  sN   $)&)!!{{DH DM$*C*CDF&&(!557$'E!"%% ""&"2"2dmmL$,,c2(,(:(:% %'D!	KK
 	!!$' "&!B!B*&AB +  	""$	s   E> >Fc                $    | j                          y rO   )rw  r   s    r4   rP   zChannel._after_fork  s     r6   c                    | j                   }| j                  }d x| _        | _         ||j                          ||j                          y y rO   )_pool_async_pool
disconnect)rt   pool
async_pools      r4   rw  zChannel._disconnect_pools  sL    zz%%
(,,4:OO!!!# "r6   c                    | j                   |u rd | _         | j                  |u rd | _        | j                  r=| j                  j                  r&| j                  j                  j	                  |       y y y rO   )r*  r1  r   rx  r  r  s     r4   r  z!Channel._on_connection_disconnect  sZ    ==J& DM??j("DO??t44OO!!;;JG  5?r6   c                N   	 	 d|d   d<   d|d   d   d<   | j                  ||      D ]O  }| j                  |d      } |r|j                  n|j                  | j                  ||      t        |             Q y # t         $ r Y pw xY w# t        $ r t        d|d	       Y y w xY w)
NTheadersredelivered
propertiesr   FreversezCould not restore message: %rexc_info)	r
  _lookup_get_message_prioritylpushrpush
_q_for_prir   rv  crit)rt   payloadr   r   r   r   queuepris           r4   r   zChannel._do_restore_message  s    	J48	"=1HL%o6}E h< 00%0H7xTZZOOE3/w    	J0'DI	Js/   A; A$B
 ;	BB
 BB
 
B$#B$c                      j                   st         	  |      S |j                   fd} j	                         5 }|j                  | j                         d d d        y # 1 sw Y   y xY w)Nc                    | j                  j                        }| j                          | j                  j                         |r.t	        t        |            \  }}}j                  ||||        y y rO   )r   r   r   r   r   r   r   )r   Pr   r   r   r   rt   r   s        r4   r   z-Channel._restore.<locals>.restore_transaction%  sh    		$**C0AJJLIId&&,!,q/2	2r((BD(C r6   )r]  r}   _restorer   r   r   r   )rt   r   r   r   rI   r   r   s   ` `  @r4   r  zChannel._restore   sm    !!7#G,,""	D !!# 	Fv2D4D4DE	F 	F 	Fs   A))A2c                (    | j                  |d      S r   )r  )rt   r   s     r4   _restore_at_beginningzChannel._restore_at_beginning0  s    }}Wt}44r6   c                    || j                   v r<| j                   |   \  }}| j                  j                  |       || j                  |<   t	        |   |g|i |}| j                          |S rO   )_fanout_queuesr8  r  rp  r}   basic_consume_update_queue_cycle)rt   r  ru   r   r   r$  r   r   s          r4   r  zChannel.basic_consume3  su    D'''--e4KHa%%))%0.3D!!(+g#E;D;F; 	  "
r6   c                    | j                   }|ra|j                  j                  r:|j                  j                  j	                  t        | j                  |f            S | j                  |      S y rO   )r   rx  rO  r  r  r	   _basic_cancel)rt   consumer_tagr   s      r4   basic_cancelzChannel.basic_cancelG  sh    
 __
22!''2266D..@  %%l33 r6   c                v   	 | j                   |   }	 | j                  j                  |       | j	                  |       	 | j
                  |   \  }}| j                  j                  |       t        | %  |      }| j                          |S # t        $ r Y y w xY w# t        $ r Y iw xY w# t        $ r Y Jw xY wrO   )_tag_to_queuer
  r8  remove_unsubscribe_fromr  rp  ro   r}   r  r  )rt   r  r  r   r$  r   r   s         r4   r  zChannel._basic_cancelT  s    	&&|4E	*%%,,U3 ""5)	--e4KHa!!%%h/ g"<0  "
  		  		  		s4   B B  -B, 	BB	B)(B),	B87B8c                    |r+| j                   rdj                  | j                  |d|g      S dj                  | j                  |g      S )Nr   /)r_  joinrt  )rt   r   r   s      r4   _get_publish_topiczChannel._get_publish_topich  sE    4//77D118S+NOOww--x899r6   c                J    | j                   |   \  }}| j                  ||      S rO   )r  r  )rt   r  r   r   s       r4   _get_subscribe_topiczChannel._get_subscribe_topicm  s*     $ 3 3E :+&&x==r6   c                    | j                   D cg c]  }| j                  |       }}|sy | j                  }|j                  j                  |j                  j                          |j                  | _        |j                  |       y c c}w rO   )r8  r  r0  r   r  r  r1  
psubscribe)rt   r  keyscs       r4   r2  zChannel._subscribeq  s{    !668 ))%0 8 8NN<<%LL  ",,	T8s   Bc                    | j                  |      }| j                  }|j                  r*|j                  j                  r|j	                  |g       y y y rO   )r  r0  r   r  unsubscribe)rt   r  topicr  s       r4   r  zChannel._unsubscribe_from|  sC    ))%0NN<<ALL..MM5'" /<r6   c                    t        |d         dk(  r|d   dk(  rd|_        y t        |d         dk(  r|d   |d   |d   |d   f\  }}}}n|d   d |d   |d   f\  }}}}||||dS )	Nr   r  rh   Fpmessager   r   )r  patternrQ   data)r   
subscribed)rt   rI   rr  r  rQ   r  s          r4   _handle_messagezChannel._handle_message  s    !.1Q419 %F!++,Q41qtQqT+A(D'7D+,Q4qtQqT+A(D'7D	
 	
r6   c                v   | j                   }g }	 |j                  | j                  |             |j                  e|j                  j                  d      rI|j                  | j                  |             |j                  |j                  j                  d      rIt        |      S # t        $ r Y w xY w)Nr   rB   )r0  r   _receive_oner   r   can_readany)rt   r  r   s      r4   rr  zChannel._receive  s    NN	JJt((+, ll&1<<+@+@+@+KJJt((+, ll&1<<+@+@+@+K3x	  		s    B, ,	B87B8c                l   d }	 |j                         }t        |t        t
        f      r| j                  ||      }t        |d         j                  d      rt        |d         }|d   rt|d   dk(  r|j                  d      \  }}}	 t        t        |d               }|j!                  dd
      d   }| j"                  j%                  || j&                  |          yy y y # | j                  $ r	 d | _         w xY w# t        t        f$ r& t        d|t        |      d d	 d
       t               w xY w)Nr  r   rQ   r  r   r  .z&Cannot process event on channel %r: %si   r   r  T)r~   r    r1  rs  rn   tupler  r   endswith	partitionr   r  r  warningreprr   splitr   _deliverrp  )rt   r  responser  rQ   r$  r   r   s           r4   r  zChannel._receive_one  sK   	'')H hu.**1h7GGFO,55i@&wy'9:6?qzS((/(9(9#(>1g&"'WV_(E"F
  '}}S!4Q7HOO,,!6!6x!@B # A / %% 	"DO	 &z2 & H 'gu)=K#g&s   C# 
C> #C;>5D3c           	        | j                   j                  t        | j                              }|sy | j                  D cg c]  }|D ]  }| j                  ||        c}}|xs dgz   }| j                  j                  | _        dg|}| j                  r| j                  j                  |      } | j                  j                  j                  |  y c c}}w )Nr   rj   )rk  consumer   r5  rh  r  rI   r   r*  rq   rz   send_command)rt   rC   queuesr  r  r  command_argss          r4   r+  zChannel._brpop_start  s    ""**3t/A/A+BC7;7J7J %#% s+ %+ %(/1~6..'$'  ;;33LAL+++\:%s    Cc                   	 	  | j                   j                  | j                   j                  dfi |}|r|\  }}t        |      j                  | j                  d      d   }| j                  j                  |       | j                  j                  t        t        |            |       	 d | _        yt               # | j                  $ r& | j                   j                  j	                           w xY w# d | _        w xY w)Nrj   r   r   T)rI   r~   r   r    r}  r   rsplitr\  rk  rotater  r   r*  r   )rt   r   
dest__itemdestitems        r4   rq  zChannel._brpop_read  s    	!7T[[778N8N8?C:AC
 '
d#D)001=a@!!((.((|D/A)BDI !DM g ))  &&113	 !DMs#   2C  A8C8 6
C8  5C55C8 8	Dc                    |dk(  r| j                   j                          y | j                  j                  | j                  j                  |       y )Nr/  )r0  r~   rI   r   )rt   r  r   s      r4   rK  zChannel._poll_error  s8    8NN))+KK&&t{{'='=tDr6   c                    | j                         5 }| j                  D ]D  }|j                  | j                  ||            }|s't	        t        |            c cd d d        S  t               # 1 sw Y   y xY wrO   )r   rh  rpopr  r   r   r   )rt   r  rI   r  r  s        r4   _getzChannel._get  st    !!# 	v** 5{{4??5##>? d!344		 	5 'M	 	s   3A/A/$A//A8c           	     V   | j                         5 }|j                         5 }| j                  D ]#  }|j                  | j	                  ||            }% |j                         }t        d |D              cd d d        cd d d        S # 1 sw Y   nxY w	 d d d        y # 1 sw Y   y xY w)Nc              3  T   K   | ]   }t        |t        j                        r| " y wrO   )rs  numbersIntegral).0sizes     r4   	<genexpr>z Channel._size.<locals>.<genexpr>  s)      BD(w/?/?@   Bs   &()r   r   rh  llenr  r   sum)rt   r  rI   r   r  sizess         r4   _sizezChannel._size  s    !!# 	Bv" Bd.. BC99T__UC%@ADB BE B B	B B	B 	BB B B	B 	B 	Bs#   BAB	6	B	B	BB(c                P    | j                  |      }|r| | j                   | S |S rO   )priorityr\  )rt   r  r  s      r4   r  zChannel._q_for_pri  s/    mmC WTXXJse,,r6   c                >    | j                   }|t        ||      dz
     S )Nr   )rh  r   )rt   nstepss      r4   r  zChannel.priority  s$    ##VE1%)**r6   c                    | j                  |d      }| j                         5 }|j                  | j                  ||      t	        |             ddd       y# 1 sw Y   yxY w)zDeliver message.Fr  N)r  r   r  r  r   )rt   r  r   r   r  rI   s         r4   _putzChannel._put  s[    ((%(@!!# 	FvLL4eGnE	F 	F 	Fs   ,AA"c                    | j                         5 }|j                  | j                  ||      t        |             ddd       y# 1 sw Y   yxY w)zDeliver fanout message.N)r   publishr  r   )rt   r   r   r   r   rI   s         r4   _put_fanoutzChannel._put_fanout  sH    !!# 	vNN''+>g	 	 	s   ,AAc                @    |r| j                   j                  |       y y rO   )ro  r  )rt   r  auto_deleter   s       r4   
_new_queuezChannel._new_queue
  s    ##''. r6   c           
     \   | j                  |      j                  dk(  r!||j                  dd      f| j                  |<   | j	                         5 }|j                  | j                  |fz  | j                  j                  |xs d|xs d|xs dg             d d d        y # 1 sw Y   y xY w)Nfanout#*r   )	typeofr  replacer  r   saddkeyprefix_queuer\  r  )rt   r   r   r  r  rI   s         r4   _queue_bindzChannel._queue_bind  s    ;;x %%1 +--c37*D& !!# 	6vKK,,{:{'8b'.}"',{'4 56	6 	6 	6s   A	B""B+c           
        | j                   j                  |       | j                  |j                  d            5 }|j	                  | j
                  |fz  | j                  j                  |xs d|xs d|xs dg             |j                         5 }| j                  D ]#  }	|j                  | j                  ||	            }% |j                          d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)NrI   r   r   )ro  r  r   rC  sremr  r\  r  r   rh  deleter  r   )
rt   r  r   r   r  ru   r   rI   r   r  s
             r4   _deletezChannel._delete  s    ''.!!H)=!> 	&KK,,{:{'8b'.}"',{'4 56 " d.. DC;;tuc'BCDD	 	
 	 	s%   AC6AC*C6*C3	/C66C?c           	     D   | j                         5 }|j                         5 }| j                  D ]#  }|j                  | j	                  ||            }% t        |j                               cd d d        cd d d        S # 1 sw Y   nxY w	 d d d        y # 1 sw Y   y xY wrO   )r   r   rh  existsr  r  r   )rt   r  r   rI   r   r  s         r4   
_has_queuezChannel._has_queue&  s    !!# 	+v" +d.. DC;;tuc'BCDD4<<>*+ +	+ 	++ + +	+ 	+ 	+s#   BAB -	B B		BBc           	     (   | j                   |z  }| j                         5 }|j                  |      }|sg cd d d        S |D cg c]/  }t        t	        |      j                  | j                              1 c}cd d d        S c c}w # 1 sw Y   y xY wrO   )r  r   smembersr  r   r  r\  )rt   r   r   rI   r  vals         r4   	get_tablezChannel.get_table-  s    ""X-!!# 	Pv__S)F 	P 	P IOOE,s+11$((;<O	P 	P P	P 	Ps"   BB4B7BBBc                v   | j                         5 }|j                         5 }| j                  D ]4  }| j                  ||      }|j	                  |      j                  |      }6 |j                         }t        |d d d         cd d d        cd d d        S # 1 sw Y   nxY w	 d d d        y # 1 sw Y   y xY w)Nrh   )r   r   rh  r  r  r  r   r  )rt   r  rI   r   r  priqr  s          r4   _purgezChannel._purge7  s    !!# 	'v" 'd.. 8C??5#6D99T?11$7D8 51:' '	' 	'' ' '	' 	' 	's#   B/A$B	B/B"	B//B8c                   d| _         | j                  r	 | j                          | j                  s| j
                  j                  j                  |        | j                  j                  d      }|3| j                  D ]$  }|| j                  v s| j                  ||       & | j                          | j                          t        | A          y # t        $ r Y w xY w)NTrI   r   )_closingr*  rq  r   closedr   rx  r  rB  rC  r  ro  queue_deleterw  _close_clientsr}   r  )rt   rI   r  r   s      r4   r  zChannel.close@  s    ==  " {{OO!!))$/ ]]&&x0F!!00 @E 7 77))%)?@ ""$!  s   C 	C"!C"c                    dD ]6  }	 | j                   |   }|j                  d c}|_        |j                          8 y # t        t        | j
                  f$ r Y Vw xY w)N)rI   r0  )rB  r   r}  r
  r  r3   )rt   attrrI   r   s       r4   r  zChannel._close_clientsU  sf    ) 	Dt,060A0A4-
F-%%'		
 nd.@.@A s   3=AAc                    t        |t        j                        s2|r|dk(  rt        }n|j	                  d      r|dd  }	 t        |      }|S |S # t        $ r t        dj                  |            w xY w)Nr  r   z/Database is int between 0 and limit - 1, not {})rs  r  r  
DEFAULT_DB
startswithintr  format)rt   vhosts     r4   _prepare_virtual_hostzChannel._prepare_virtual_host_  s    %!1!12ESL"!!#&ab	E
 u   ELL s    A $A3c                    |S rO   r@   )rt   rb  rc  paramss       r4   _filter_tcp_connparamszChannel._filter_tcp_connparamsn  s    r6   c                   | j                   j                  }|j                  xs d|j                  xs | j                   j                  |j
                  |j                  |j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  d}| j                  }t!        |d      rW|g}t!        |d      r|t#        |j$                        z  }|D ]  }t'        |j(                  d      s n |j+                  d       |j,                  r+	 |j/                  |j,                         | j0                  |d<   |d   }d|v rt5        |      \  }}	}	}
}}}|d	k(  ro | j6                  di |} |j.                  t8        j:                  d
|z   dfi | |j+                  dd        |j+                  dd        |j+                  dd        |
|d<   ||d<   |j+                  dd        |j+                  dd        | j=                  |j+                  dd             |d<   | |j?                  d      xs | j                  }|r G fdd|      }|}||d<   |S # t2        $ r Y 'w xY w)Nz	127.0.0.1)hostportvirtual_hostusernamepasswordre  r`  ra  rb  rc  rf  rg  r   	__bases__rf  connection_classr  z://r*   r  )r  pathra  rb  rc  r  r  r  r  dbc                  "     e Zd Z fdZ xZS )'Channel._connparams.<locals>.Connectionc                Z    t        |   |  j                  rj                  |        y y rO   )r}   r}  rj  r  )rt   ru   r   rQ   s     r4   r}  z2Channel._connparams.<locals>.Connection.disconnect  s.    G&- **99$? +r6   )r<   r=   r>   r}  r   )r   rQ   s   @r4   
Connectionr     s    @ @r6   r"  r@   ) r   rI   hostnamer  default_portr  useridr  re  r`  ra  rb  rc  rf  rg  r  r'   rn   r  r   r   ro   sslupdateconnection_class_sslr  r   r  r&   UnixDomainSocketConnectionr  rC  )rt   asynchronousconninfo
connparams
conn_classclassesklassr  schemer$  r  r  r  queryconnection_clsr"  rQ   s                   @r4   _connparamszChannel._connparamsr  s   ??))%%4MMAT__%A%A$11  ))#33"11&*&A&A $ 5 5(,(E(E%)%?%? $ 5 5

 **
 :z* "lGz;/4
 4 455  8#ENN4KL8 67<<!!(,,/151J1J
-. &!D=<Ft<L9FAq(HdE!8T88F:F
!
!!(-(H(H$J#( 2+02 7>14894@%-Jz"%-Jz"NN64(NN64(55NN>402
4 NN-. "!! 	
 @^ @ (N)7
%&Q  s   7*I< <	J	J	c                v    |r| j                  | j                        S | j                  | j                        S )N)r   )rm  r  r~  )rt   r*  s     r4   _create_clientzChannel._create_client  s/    ;;t;??{{499{55r6   c                    | j                  |      }| j                  j                  |d         | _        t        j                  di |S )Nr*  r  r  r@   )r3  rt  r  r&   ConnectionPoolrt   r*  r  s      r4   	_get_poolzChannel._get_pool  sI    !!|!< $ 5 5 < <t < M##-f--r6   c                    t         j                  dk  rt        dj                  t                     | j                  r%t        j                  t        | j                        S t         j                  S )N)r   rh   r   zSRedis transport requires redis-py versions 3.2.0 or later. You have {0.__version__}r   )	r&   r   r   r  rq   	functoolspartialr   r   r   s    r4   rl  zChannel._get_client  s_    ==9$!++16%=: :   $$#!%!6!6 
 {{r6   c              #  >   K   |r| y | j                          y wrO   r5  rt   rI   s     r4   r   zChannel.conn_or_acquire  s     L%%''s   c                \    | j                   | j                         | _         | j                   S rO   )r{  r;  r   s    r4   r~  zChannel.pool  s$    ::)DJzzr6   c                `    | j                   | j                  d      | _         | j                   S )NTr7  )r|  r;  r   s    r4   r  zChannel.async_pool  s-    ##~~4~@Dr6   c                &    | j                  d      S )z+Client used to publish messages, BRPOP etc.Tr7  r@  r   s    r4   rI   zChannel.client  s     """55r6   c                F    | j                  d      }|j                         S )z1Pub/Sub connection used to consume fanout queues.Tr7  )r5  r   rA  s     r4   r0  zChannel.subclient  s#     $$$$7}}r6   c                N    | j                   j                  | j                         y rO   )rk  r'  r5  r   s    r4   r  zChannel._update_queue_cycle  s      !3!34r6   c                &    ddl m} |j                  S )Nr   r#   )r&   r$   r3   )rt   r$   s     r4   rn  zChannel._get_response_error  s    $'''r6   c                \    | j                   D ch c]  }|| j                  vr| c}S c c}w )z<Set of queues being consumed from (excluding fanout queues).)_active_queuesr8  )rt   r  s     r4   r5  zChannel.active_queues   s7     $(#6#6 ;% 9 99  ; 	; ;s   )r   )r   r   rO   )br<   r=   r>   r?   r   _client
_subclientr  supports_fanoutr  rt  r\  r*  r1  r  r]  r   r   r   r   r<  r   PRIORITY_STEPSrh  r`  ra  rb  rc  rg  re  DEFAULT_HEALTH_CHECK_INTERVALrf  r^  r_  rq   rd  r|  r{  r   rW  from_transport_optionsr&   r"  r  SSLConnectionr(  r   rP   rw  r  r   r  r  r  r  r  r  r  r2  r  r  rr  r  r+  rq  rK  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r3  r5  r;  rl  r   r   rU  r~  r  r   rI   r0  r  rn  r5  r   r   s   @r4   rW  rW  e  s]   
CGJHO)O
CHJNMK'' #NN!#O9 M O
 4 )KE 	..		 0 ,1u''d275..T&CP!
$H ,1J"F 5(4(:
>	#
 	 2;!,EB+F/
6
+P'* 7;8<Ob6
.
 ( (  
    
 6 6  
5( ; ;r6   rW  c                       e Zd ZdZeZdZeZdZdZ	e
j                  j                  j                  d eg d            Zer
 e       \  ZZ fdZd Zd	 Zd
 Z xZS )r)   zRedis Transport.Nr&   T)directr  r  )r*  exchange_typec                d    t         t        d      t        |   |i | t	               | _        y )Nz)Missing redis library (pip install redis))r&   ImportErrorr}   r   r   rx  r   s      r4   r   zTransport.__init__  s2    =IJJ$)&) ()
r6   c                "    t         j                  S rO   )r&   __version__r   s    r4   driver_versionzTransport.driver_version!  s       r6   c                  	 | j                   j                  j                         j                  j                  | j
                  	fd}|_        	fdj                  j                         j                  dj                         |j                  j                  j                  dt              }j                  |j                         y )Nc                    | j                   rj                  | j                          j                  r	 j                  j                         y y # t        $ r Y y w xY wrO   )r  r  rT  on_tickr
  )r   rx  loopr9  s    r4   _on_disconnectz:Transport.register_with_event_loop.<locals>._on_disconnect+  sW    J,,- yyLL''6    s   A 	AAc                 b             j                   D  cg c]  }  | |        c}  y c c} w rO   )rT  )r  
add_readerrx  cycle_poll_startrI  s    r4   r9  z9Transport.register_with_event_loop.<locals>.on_poll_start8  s'    7<yyAZK,AAs   ,r   rf  )rx  r=  r  r9  r_  rI  r  r[  r  call_repeatedlyr?  rI   transport_optionsrC  rN  rE  )
rt   r   r\  r]  rf  r_  rx  r`  r9  rI  s
     `  @@@@@r4   register_with_event_loopz"Transport.register_with_event_loop$  s    

4;;' ..__
&&
	 +9'	B 	'R!=!=> * 1 1 C C G G#)!
 	!..	
r6   c                :    | j                   j                  |       y)z1Handle AIO event for one of our file descriptors.N)rx  rI  )rt   r  s     r4   rI  zTransport.on_readableF  s    

v&r6   )r<   r=   r>   r?   rW  polling_intervalDEFAULT_PORTr$  driver_typedriver_namer   r)   
implementsextend	frozensetr&   r5   r    r!   r   rX  rc  rI  r   r   s   @r4   r)   r)     su    GLKK""--44 => 5 J
 ,C,E)>*! 
D'r6   r)   c                      e Zd ZdZy)SentinelManagedSSLConnectionzConnect to a Redis server using Sentinel + TLS.

        Use Sentinel to identify which Redis server is the current master
        to connect to and when connecting to the Master server, use an
        SSL Connection.
        Nr;   r@   r6   r4   rm  rm  L  s    	 	r6   rm  c                  j    e Zd ZdZej
                  dz   Zerej                  ndZere	ndZ
ddZddZy)SentinelChannela  Channel with explicit Redis Sentinel knowledge.

    Broker url is supposed to look like:

    .. code-block::

        sentinel://0.0.0.0:26379;sentinel://0.0.0.0:26380/...

    where each sentinel is separated by a `;`.

    Other arguments for the sentinel should come from the transport options
    (see `transport_options` of :class:`~kombu.connection.Connection`).

    You must provide at least one option in Transport options:
     * `master_name` - name of the redis group to poll

    Example:
    -------
    .. code-block:: python

        >>> import kombu
        >>> c = kombu.Connection(
             'sentinel://sentinel1:26379;sentinel://sentinel2:26379',
             transport_options={'master_name': 'mymaster'}
        )
        >>> c.connect()
    )master_namemin_other_sentinelssentinel_kwargsNc           	        | j                  |      }|j                         }|j                  dd        |j                  dd        g }| j                  j                  j
                  D ]^  }t        |      }|j                  dk(  s|j                  xs | j                  j                  }|j                  |j                  |f       ` |s|j                  |d   |d   f       t        j                  |ft        | dd      t        | dd       d|}t        | dd       }|t        d	      |j!                  |t"        j$                        j&                  S )
Nr  r  r   rq  r   rr  )rq  rr  rp  z1'master_name' transport option must be specified.)r3  copyro   r   rI   altr   r0  r  r$  r   r#  r   Sentinelr%  r  
master_forr&   r   r   )	rt   r*  r,  additional_params	sentinelsurlr  sentinel_instrp  s	            r4   _sentinel_managed_poolz&SentinelChannel._sentinel_managed_pool~  sQ   %%l3
&OO-fd+fd+	??))-- 	7CS/CzzZ'xx?4??#?#?  #,,!56		7 j0*V2DEF ))! '.CQ G#D*;TB!  	! dM48C  ''KK
 /	r6   c                    | j                  |      }| j                  j                  |d         | _        | j                  |      S )Nr7  r  r8  )r3  rt  r  r|  r:  s      r4   r;  zSentinelChannel._get_pool  sF    !!|!< $ 5 5 < <t < M**<88r6   r   )r<   r=   r>   r?   rW  rO  r   SentinelManagedConnectionr  rm  r(  r|  r;  r@   r6   r4   ro  ro  Y  sH    8 %;; ? 
 >Fx994;C7#J9r6   ro  c                      e Zd ZdZdZeZy)SentinelTransportzRedis Sentinel Transport.ig  N)r<   r=   r>   r?   r$  ro  rW  r@   r6   r4   r  r    s    #LGr6   r  )Mr?   
__future__r   r=  r  r*   r   collectionsr   
contextlibr   r  r   r   viner	   kombu.exceptionsr
   r   	kombu.logr   kombu.utils.compatr   kombu.utils.encodingr   kombu.utils.eventior   r   r   kombu.utils.functionalr   kombu.utils.jsonr   r   kombu.utils.objectsr   kombu.utils.schedulingr   kombu.utils.urlr   r   r   r&   rU  r   loggercriticalr  r  rf  r  rN  rM  r   r5   r8   rv  r:   rM   rR   rT   r   r   rI   r   r   PubSubr   r   r   rW  r)   r~  rP  rm  ro  r  r@   r6   r4   <module>r     s  3j #     " %    @   2 - / / 3 ) / 0 & 
 
+	,g
 " . 1 (4&4	 4  ,P
 P
f
. 

>0%,,2G2G 
>1K%,,-- 1Khh/'++ h/V\  \ ~_
;goo _
;DA'!! A'H 
..
M9g M9`	 o*  E
  Hs$   G  	G  G
GGG