Ë
    —V.jg  ã                   ó0  — d Z ddl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 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mZ ddl m!Z!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,Z-ddl.m/Z/ 	 ddl1Z-dZ2dZ3dZ4dZ5dZ6dZ7dZ8dZ9dZ: e$e;«      Z< G d„ d e)«      Z= G d!„ d"e+e(«      Z> e?e-d#d«      r* G d$„ d%e-j€                  j‚                  e-j„                  «      ZC G d&„ d'e>«      ZDy# e0$ r dZ-dZ/Y Œ�w xY w# e0$ r Y Œ‡w xY w)(zRedis result store backend.é    N)Úcontextmanager)Úpartial)Ú	CERT_NONEÚCERT_OPTIONALÚCERT_REQUIRED)Úunquote)Úretry_over_time)Úcached_property)Ú
_parse_urlÚmaybe_sanitize_url)Ústates)Útask_join_will_block)Úmaybe_signature)ÚBackendStoreErrorÚ
ChordErrorÚImproperlyConfigured)ÚGroupResultÚallow_join_result)Ú_regenÚ
dictfilter)Ú
get_logger)Úhumanize_secondsé   )ÚAsyncBackendMixinÚBaseResultConsumer)ÚBaseKeyValueStoreBackend)Úget_redis_error_classes)ÚRedisBackendÚSentinelBackendzW
You need to install the redis library in order to use the Redis result store backend.
zp
You need to install the redis library with support of sentinel in order to use the Redis result store backend.
zÎ
Setting ssl_cert_reqs=CERT_OPTIONAL when connecting to redis means that celery might not validate the identity of the redis broker when connecting. This leaves you vulnerable to man in the middle attacks.
zÉ
Setting ssl_cert_reqs=CERT_NONE when connecting to redis means that celery will not validate the identity of the redis broker when connecting. This leaves you vulnerable to man in the middle attacks.
z”
SSL connection parameters have been provided but the specified URL scheme is redis://. A Redis SSL connection URL should use the scheme rediss://.
zv
A rediss:// URL must have parameter ssl_cert_reqs and this must be set to CERT_REQUIRED, CERT_OPTIONAL, or CERT_NONE
z+Connection to Redis lost: Retry (%s/%s) %s.z„
Retry limit exceeded while trying to reconnect to the Celery redis result store backend. The Celery application must be restarted.
c                   ó~   ‡ — e Zd ZdZˆ fd„Zˆ fd„Zd„ Zed„ «       Zd„ Z	ˆ fd„Z
d„ Zd	„ Zd
„ Zdd„Zd„ Zd„ Zd„ Zˆ xZS )ÚResultConsumerNc                 ó  •— t        ‰| �  |i |¤Ž | j                  j                  | _        | j                  j
                  | _        | j                  j                  | _        | j                  j                  | _
        t        «       | _        y ©N)ÚsuperÚ__init__ÚbackendÚget_key_for_taskÚ_get_key_for_taskÚdecode_resultÚ_decode_resultÚensureÚ_ensureÚconnection_errorsÚ_connection_errorsÚsetÚsubscribed_to©ÚselfÚargsÚkwargsÚ	__class__s      €úWC:\xampp\htdocs\tradingbinance\backend\.venv\Lib\site-packages\celery/backends/redis.pyr%   zResultConsumer.__init__S   sf   ø€ Ü‰Ñ˜$Ð) &Ò)Ø!%§¡×!>Ñ!>ˆÔØ"Ÿl™l×8Ñ8ˆÔØ—|‘|×*Ñ*ˆŒØ"&§,¡,×"@Ñ"@ˆÔÜ ›UˆÕó    c                 ó4  •— 	 | j                   j                  j                  j                  «        | j                  �| j                  j                  «        t        ‰| �-  «        y # t        $ r(}t        j                  t        |«      «       Y d }~Œ;d }~ww xY wr#   )r&   ÚclientÚconnection_poolÚresetÚ_pubsubÚcloseÚKeyErrorÚloggerÚwarningÚstrr$   Úon_after_fork)r2   Úer5   s     €r6   rB   zResultConsumer.on_after_fork[   sp   ø€ ð	#Ø�L‰L×Ñ×/Ñ/×5Ñ5Ô7Ø�|‰|Ð'Ø—‘×"Ñ"Ô$ô 	‰ÑÕøô ò 	#Ü�N‰Nœ3˜q›6×"Ñ"ûð	#ús   ƒAA& Á&	BÁ/BÂBc                 ó  — d | _         | j                  j                  j                  j	                  «        | j
                  ri| j                  j                  j                  | j
                  «      }|D �cg c]  }|sŒ|‘Œ	 }}|D ]#  }| j                  | j                  |«      d «       Œ% | j                  j                  j                  d¬«      | _         | j
                  r$ | j                   j                  | j
                  Ž  y | j                   j                  j                  d| j                   j                  «      | j                   _        | j                   j                  j                  | j                   j                  «       y c c}w )NT©Úignore_subscribe_messagesÚpubsub)r<   r&   r9   r:   r;   r0   ÚmgetÚon_state_changer*   rG   Ú	subscribeÚget_connectionÚ
shard_hintÚ
connectionÚregister_connect_callbackÚ
on_connect)r2   ÚmetasÚmetas      r6   Ú_reconnect_pubsubz ResultConsumer._reconnect_pubsubd   s-  € ØˆŒØ�‰×Ñ×+Ñ+×1Ñ1Ô3ð ×ÒØ—L‘L×'Ñ'×,Ñ,¨T×-?Ñ-?Ó@ˆEÙ&+Ó4¡e˜dªt’T eˆEÐ4Û�Ø×$Ñ$ T×%8Ñ%8¸Ó%>ÀÕEð à—|‘|×*Ñ*×1Ñ1Ø&*ð 2ó 
ˆŒð ×ÒØ"ˆD�L‰L×"Ñ" D×$6Ñ$6Ò7à&*§l¡l×&BÑ&B×&QÑ&QØ˜$Ÿ,™,×1Ñ1ó'ˆD�L‰LÔ#ð
 �L‰L×#Ñ#×=Ñ=¸d¿l¹l×>UÑ>UÕVùò 5s   Á5F	Á=F	c              #   óÔ   K  — 	 d –— y # | j                   $ rM 	 | j                  | j                  d«       Y y # | j                   $ r t        j	                  t
        «       ‚ w xY ww xY w­w©N© )r.   r,   rR   r?   ÚcriticalÚE_RETRY_LIMIT_EXCEEDED©r2   s    r6   Úreconnect_on_errorz!ResultConsumer.reconnect_on_error|   s`   è ø€ ð	ÜøØ×&Ñ&ò 	ðØ—‘˜T×3Ñ3°RÖ8øØ×*Ñ*ò Ü—‘Ô 6Ô7Øðúð	üs-   ‚A(„	 ˆA(‰A%™7µA(·*A!Á!A%Á%A(c                 óX   — |d   t         j                  v r| j                  |d   «       y y )NÚstatusÚtask_id)r   ÚREADY_STATESÚ
cancel_for)r2   rQ   s     r6   Ú_maybe_cancel_ready_taskz'ResultConsumer._maybe_cancel_ready_task‡   s)   € Ø�‰>œV×0Ñ0Ñ0Ø�O‰O˜D ™OÕ,ð 1r7   c                 óH   •— t         ‰| �  ||«       | j                  |«       y r#   )r$   rI   r_   )r2   rQ   Úmessager5   s      €r6   rI   zResultConsumer.on_state_change‹   s    ø€ Ü‰Ñ  gÔ.Ø×%Ñ% dÕ+r7   c                 ó|   — | j                   j                  j                  d¬«      | _        | j	                  |«       y )NTrE   )r&   r9   rG   r<   Ú_consume_from)r2   Úinitial_task_idr4   s      r6   ÚstartzResultConsumer.start�   s6   € Ø—|‘|×*Ñ*×1Ñ1Ø&*ð 2ó 
ˆŒð 	×Ñ˜?Õ+r7   c                 ó\   —  |j                   di |¤ŽD ]  }|€Œ| j                  |d «       Œ y rT   )Ú
_iter_metarI   )r2   Úresultr4   rQ   s       r6   Úon_wait_for_pendingz"ResultConsumer.on_wait_for_pending•   s2   € Ø%�F×%Ñ%Ñ/¨Ô/ˆDØÑØ×$Ñ$ T¨4Õ0ñ 0r7   c                 óR   — | j                   �| j                   j                  «        y y r#   )r<   r=   rX   s    r6   ÚstopzResultConsumer.stopš   s!   € Ø�<‰<Ð#Ø�L‰L×ÑÕ ð $r7   c                 ó,  — | j                   rd| j                  «       5  | j                   j                  |¬«      }|r,|d   dk(  r$| j                  | j	                  |d   «      |«       d d d «       y |rt        j                  |«       y y # 1 sw Y   y xY w)N)ÚtimeoutÚtypera   Údata)r<   rY   Úget_messagerI   r*   ÚtimeÚsleep)r2   rm   ra   s      r6   Údrain_eventszResultConsumer.drain_eventsž   s€   € Ø�<Š<Ø×(Ñ(Õ*ØŸ,™,×2Ñ2¸7Ð2ÓC�Ù˜w v™°)Ò;Ø×(Ñ(¨×)<Ñ)<¸WÀV¹_Ó)MÈwÔW÷ +Ð*ñ Ü�J‰J�wÕð ÷	 +Ð*ús   �AB
Â
Bc                 ó`   — | j                   €| j                  |«      S | j                  |«       y r#   )r<   re   rc   )r2   r\   s     r6   Úconsume_fromzResultConsumer.consume_from§   s)   € Ø�<‰<ÐØ—:‘:˜gÓ&Ð&Ø×Ñ˜7Õ#r7   c                 óú   — | j                  |«      }|| j                  vrP| j                  j                  |«       | j                  «       5  | j                  j                  |«       d d d «       y y # 1 sw Y   y xY wr#   )r(   r0   ÚaddrY   r<   rJ   ©r2   r\   Úkeys      r6   rc   zResultConsumer._consume_from¬   sf   € Ø×$Ñ$ WÓ-ˆØ�d×(Ñ(Ñ(Ø×Ñ×"Ñ" 3Ô'Ø×(Ñ(Õ*Ø—‘×&Ñ& sÔ+÷ +Ð*ð )ç*Ð*ús   ÁA1Á1A:c                 óö   — | j                  |«      }| j                  j                  |«       | j                  r5| j	                  «       5  | j                  j                  |«       d d d «       y y # 1 sw Y   y xY wr#   )r(   r0   Údiscardr<   rY   Úunsubscriberx   s      r6   r^   zResultConsumer.cancel_for³   s_   € Ø×$Ñ$ WÓ-ˆØ×Ñ×"Ñ" 3Ô'Ø�<Š<Ø×(Ñ(Õ*Ø—‘×(Ñ(¨Ô-÷ +Ð*ð ß*Ð*ús   Á	A/Á/A8r#   )Ú__name__Ú
__module__Ú__qualname__r<   r%   rB   rR   r   rY   r_   rI   re   ri   rk   rs   ru   rc   r^   Ú__classcell__©r5   s   @r6   r!   r!   P   sY   ø„ Ø€Gô#ô òWð0 ñó ðò-ô,ò,ò1ò
!ó ò$ò
,ö.r7   r!   c                   óp  ‡ — e Zd ZdZeZeZerej                  ndZdZdZ	dZ
dZ	 	 	 d ˆ fd„	Zd„ Zeˆ fd„«       Zd„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zˆ fd„Zd„ Zd„ Zd„ Zd„ Zej:                  ej<                  fd„Zd„ Z d„ Z!ed„ «       Z"ed„ «       Z#	 d!d„Z$d„ Z%d„ Z&d„ Z'e(d„ «       Z)ed„ «       Z*d"ˆ fd„	Z+ˆ xZ,S )#r   zyRedis task result store.

    It makes use of the following commands:
    GET, MGET, DEL, INCRBY, EXPIRE, SET, SETEX
    NTi    c           
      ó(  •— t        ‰| �  ddt        i|¤Ž | j                  j                  j
                  }	| j                  €t        t        j                  «       «      ‚|rd|v r|d }}|xs  |	d«      xs | j                  | _
        || _         |	d«      }
 |	d«      } |	d«      } |	d«      } |	d«      } |	d	«      xs d
 |	d«      xs d |	d«      xs d |	d«      | j                  |
xr t        |
«      |xs d|xr t        |«      dœ| _         |	d«      }|r|| j                  d<   |r|| j                  d<   |r|| j                  d<    |	d«      }|r4| j                  j                  |«       | j                  | j                  d<   |r!| j!                  || j                  «      | _        d| j                  v rít#        | j                  d   t        j$                  «      rÆd}t&        t(        t*        t&        t(        t*        dœ}| j                  j                  d|«      }|j                  ||«      }||j-                  «       vrt/        t0        «      ‚|t(        k(  rt2        j5                  t6        «       n"|t*        k(  rt2        j5                  t8        «       || j                  d<   || _        t<        r
t=        «       nd\  | _        | _         | jC                  | | j                  | jD                  | jF                  | jH                  «      | _%        y )NÚexpires_typez://Úredis_max_connectionsÚredis_socket_timeoutÚredis_socket_connect_timeoutÚredis_retry_on_timeoutÚredis_socket_keepaliveÚ#redis_backend_health_check_intervalÚ
redis_hostÚ	localhostÚ
redis_portië  Úredis_dbr   Úredis_passwordF)ÚhostÚportÚdbÚpasswordÚmax_connectionsÚsocket_timeoutÚretry_on_timeoutÚsocket_connect_timeoutÚredis_usernameÚusernameÚhealth_check_intervalÚsocket_keepaliveÚredis_backend_use_sslÚconnection_classÚMISSING)r   r   r   ÚrequiredÚoptionalÚnoneÚssl_cert_reqs)rU   rU   rU   )&r$   r%   ÚintÚappÚconfÚgetÚredisr   ÚE_REDIS_MISSINGÚstripr”   Ú_ConnectionPoolÚfloatÚ
connparamsÚupdateÚconnection_class_sslÚ_params_from_urlÚ
issubclassÚSSLConnectionr   r   r   ÚvaluesÚ
ValueErrorÚ%E_REDIS_SSL_CERT_REQS_MISSING_INVALIDr?   r@   ÚW_REDIS_SSL_CERT_OPTIONALÚW_REDIS_SSL_CERT_NONEÚurlr   r-   Úchannel_errorsr!   ÚacceptÚ_pending_resultsÚ_pending_messagesÚresult_consumer)r2   r�   r‘   r’   r“   r”   r·   r:   r4   Ú_getr•   r—   r–   r›   rš   r™   ÚsslÚssl_cert_reqs_missingÚssl_string_to_constantr¢   r5   s                       €r6   r%   zRedisBackend.__init__Ò   sí  ø€ ô 	‰ÑÑ4¤cÐ4¨VÒ4Ø�x‰x�}‰}× Ñ ˆØ�:‰:ÐÜ&¤×'<Ñ'<Ó'>Ó?Ð?á�E˜T‘MØ˜d�ˆCð ò !ÙÐ(Ó)ò!à× Ñ ð 	Ôð  /ˆÔáÐ4Ó5ˆÙ!%Ð&DÓ!EÐÙÐ 8Ó9ÐÙÐ 8Ó9ÐÙ $Ð%JÓ KÐñ ˜Ó&Ò5¨+Ù˜Ó&Ò.¨$Ù�zÓ"Ò' aÙÐ-Ó.Ø#×3Ñ3Ø,ÒF´°~Ó1FØ 0Ò 9°Eà&ÒH¬5Ð1GÓ+Hñ

ˆŒñ Ð(Ó)ˆÙð +3ˆD�O‰O˜JÑ'á Ø7LˆD�O‰OÐ3Ñ4ñ Ø2BˆD�O‰OÐ.Ñ/ñ
 Ð*Ó+ˆÙØ�O‰O×"Ñ" 3Ô'Ø26×2KÑ2KˆD�O‰OÐ.Ñ/áØ"×3Ñ3°C¸¿¹ÓIˆDŒOð
  $§/¡/Ñ1Ü˜4Ÿ?™?Ð+=Ñ>Ä×@SÑ@SÔTØ$-Ð!Ü7DÜ7DÜ3<Ü2?Ü2?Ü.7ñ&9Ð"ð !ŸO™O×/Ñ/°ÐAVÓWˆMØ2×6Ñ6°}ÀmÓTˆMØÐ$:×$AÑ$AÓ$CÑCÜ Ô!FÓGÐGà¤Ò-Ü—‘Ô8Õ9Ø¤)Ò+Ü—‘Ô4Ô5Ø/<ˆD�O‰O˜OÑ,àˆŒõ *AÔ#Ô%Øñ 	4ˆÔ Ô 3ð  $×2Ñ2Ø�$—(‘(˜DŸK™KØ×!Ñ! 4×#9Ñ#9ó 
ˆÕr7   c                 óÂ  ‡‡— t        |«      \  }}}}}}Št        |fi t        ||||‰j                  dd «      dœ«      ¤ŽŠ|dk(  ra‰j	                  | j
                  j                  d|z   dœ«       ‰j                  dd «       ‰j                  dd «       ‰j                  d«       n|‰d	<   g d
¢}	|dk(  r7t        ˆfd„|	D «       «      st        ˆfd„|	D «       «      rt        t        «      ‚|dk(  r=t
        j                  ‰d<   |	D ]%  }
‰j                  |
d «      }|sŒt        |«      ‰|
<   Œ' ‰j                  d	«      xs d}t        |t        «      r|j                  d«      n|}t!        |«      ‰d	<   ‰j#                  «       D ]G  \  }}|t
        j$                  j&                  v sŒ#t        j$                  j&                  |   |«      ‰|<   ŒI ‰j	                  ‰«       ‰S )NÚvirtual_host)r�   r‘   r™   r“   r’   ÚsocketÚ/)r�   Úpathr�   r‘   r—   r’   )Ússl_ca_certsÚssl_certfileÚssl_keyfiler¢   r§   c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wr#   rU   )Ú.0ry   r¬   s     €r6   Ú	<genexpr>z0RedisBackend._params_from_url.<locals>.<genexpr>N  s   øè ø€ Ð@±¨#�C˜:Ô%±ùó   ƒc              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­wr#   rU   )rÊ   ry   Úquerys     €r6   rË   z0RedisBackend._params_from_url.<locals>.<genexpr>O  s   øè ø€ Ð?±¨˜˜uœ±ùrÌ   Úredissr�   r   )r   Údictr   Úpopr­   r§   ÚUnixDomainSocketConnectionÚanyr³   Ú&E_REDIS_SSL_PARAMS_AND_SCHEME_MISMATCHr±   r   r¦   Ú
isinstancerA   r©   r£   ÚitemsrM   ÚURL_QUERY_ARGUMENT_PARSERS)r2   r·   ÚdefaultsÚschemer�   r‘   r™   r“   rÅ   Ússl_param_keysÚssl_settingÚssl_valr’   ry   Úvaluer¬   rÎ   s                  @@r6   r¯   zRedisBackend._params_from_url3  sÖ  ù€ Ü>HÈ»oÑ;ˆ��d˜H h°°eÜØñ
Ü"Ø d¸Ø$¨E¯I©I°nÀdÓ,Kñ$Mó Nñ
ˆ
ð �XÒð ×ÑØ$(§J¡J×$IÑ$IØ˜d™
ñô ð
 �N‰N˜6 4Ô(Ø�N‰N˜6 4Ô(Ø�N‰NÐ3Õ4à#ˆJ�tÑò+ˆð �WÒäÓ@±Ó@Ô@ÜÓ?±Ó?Ô?Ü Ô!GÓHÐHà�XÒÜ-2×-@Ñ-@ˆJÐ)Ñ*ó  .�ØŸ)™) K°Ó6�ÚÜ.5°gÓ.>�J˜{Ò+ð  .ð �^‰^˜DÓ!Ò& QˆÜ(¨¬SÔ1ˆR�X‰X�cŒ]°rˆÜ˜r›7ˆ
�4ÑàŸ+™+ž-‰JˆC�Ø”e×&Ñ&×AÑAÒAÜ"×-Ñ-×HÑHÈÑMØó��c’
ð (ð 	×Ñ˜%Ô ØÐr7   c                 ó”   •— t         ‰| �  }d| j                  v r.|j                  «       }|j	                  | j                  d   «       |S )NÚretry_policy)r$   rß   Ú_transport_optionsÚcopyr­   )r2   rß   r5   s     €r6   rß   zRedisBackend.retry_policyj  sH   ø€ ä‘wÑ+ˆØ˜T×4Ñ4Ñ4Ø'×,Ñ,Ó.ˆLØ×Ñ × 7Ñ 7¸Ñ GÔHàÐr7   c                 óP   — t        «       s| j                  j                  |«       y y r#   )r   r¼   ru   )r2   Úproducerr\   s      r6   Úon_task_callzRedisBackend.on_task_calls  s!   € Ü#Ô%Ø× Ñ ×-Ñ-¨gÕ6ð &r7   c                 ó8   — | j                   j                  |«      S r#   )r9   r¦   ©r2   ry   s     r6   r¦   zRedisBackend.getw  s   € Ø�{‰{�‰˜sÓ#Ð#r7   c                 ó8   — | j                   j                  |«      S r#   )r9   rH   )r2   Úkeyss     r6   rH   zRedisBackend.mgetz  s   € Ø�{‰{×Ñ Ó%Ð%r7   c           
      ó¬   — t        | j                  fi |¤Ž}|j                  d«      }t        || j                  |i t        | j                  |«      fi |¤ŽS )NÚmax_retries)rÐ   rß   r¦   r	   r-   r   Úon_connection_error)r2   Úfunr3   Úpolicyrß   rê   s         r6   r+   zRedisBackend.ensure}  s]   € Ü˜D×-Ñ-Ñ8°Ñ8ˆØ"×&Ñ& }Ó5ˆÜØ�×'Ñ'¨¨rÜ�D×,Ñ,¨kÓ:ñð ñð 	r7   c           	      óŒ   — t        |«      }t        j                  t        j	                  «       ||xs dt        |d«      «       |S )NÚInfzin )Únextr?   ÚerrorÚE_LOSTr©   r   )r2   rê   ÚexcÚ	intervalsÚretriesÚttss         r6   rë   z RedisBackend.on_connection_error…  s<   € Ü�9‹oˆÜ�‰Ü�L‰L‹NØ�[Ò) EÔ+;¸CÀÓ+Gô	Ið ˆ
r7   c                 ó¨   — t        |t        «      r#t        |«      | j                  kD  rt	        d«      ‚ | j
                  | j                  ||ffi |¤ŽS )Nz!value too large for Redis backend)rÕ   rA   ÚlenÚ_MAX_STR_VALUE_SIZEr   r+   Ú_set)r2   ry   rÝ   rß   s       r6   r/   zRedisBackend.setŒ  sI   € Ü�eœSÔ!¤c¨%£j°4×3KÑ3KÒ&KÜ#Ð$GÓHÐHàˆt�{‰{˜4Ÿ9™9 s¨E lÑC°lÑCÐCr7   c                 ó  — | j                   j                  «       5 }| j                  r|j                  || j                  |«       n|j	                  ||«       |j                  ||«       |j                  «        d d d «       y # 1 sw Y   y xY wr#   )r9   ÚpipelineÚexpiresÚsetexr/   ÚpublishÚexecute)r2   ry   rÝ   Úpipes       r6   rú   zRedisBackend._set’  s`   € Ø�[‰[×!Ñ!Ô# tØ�|Š|Ø—
‘
˜3 §¡¨eÕ4à—‘˜˜eÔ$Ø�L‰L˜˜eÔ$Ø�L‰LŒN÷ $×#Ñ#ús   ›ABÂBc                 óZ   •— t         ‰| �  |«       | j                  j                  |«       y r#   )r$   Úforgetr¼   r^   )r2   r\   r5   s     €r6   r  zRedisBackend.forget›  s#   ø€ Ü‰‰�wÔØ×Ñ×'Ñ'¨Õ0r7   c                 ó:   — | j                   j                  |«       y r#   )r9   Údeleteræ   s     r6   r  zRedisBackend.deleteŸ  s   € Ø�‰×Ñ˜3Õr7   c                 ó8   — | j                   j                  |«      S r#   )r9   Úincrræ   s     r6   r  zRedisBackend.incr¢  s   € Ø�{‰{×Ñ Ó$Ð$r7   c                 ó:   — | j                   j                  ||«      S r#   )r9   Úexpire)r2   ry   rÝ   s      r6   r	  zRedisBackend.expire¥  s   € Ø�{‰{×!Ñ! # uÓ-Ð-r7   c                 ó\   — | j                   j                  | j                  |d«      d«       y )Nú.tr   )r9   r  Úget_key_for_group)r2   Úgroup_idrh   s      r6   Úadd_to_chordzRedisBackend.add_to_chord¨  s#   € Ø�‰×Ñ˜×/Ñ/°¸$Ó?ÀÕCr7   c                 ót   —  ||«      \  }}}}||v r| j                  |«      }||v rt        d|› d|›�«      ‚|S )NzDependency z raised )Úexception_to_pythonr   )	r2   ÚtupÚdecodeÚEXCEPTION_STATESÚPROPAGATE_STATESÚ_ÚtidÚstateÚretvals	            r6   Ú_unpack_chord_resultz!RedisBackend._unpack_chord_result«  sU   € ñ !' s£Ñˆˆ3��vØÐ$Ñ$Ø×-Ñ-¨fÓ5ˆFØÐ$Ñ$Ü˜{¨3¨%¨x¸°zÐBÓCÐCØˆr7   c                 óH   — | j                  | j                  |d«      |«       y )Nú.s)r/   r  )r2   r  Ú
chord_sizes      r6   Úset_chord_sizezRedisBackend.set_chord_sizeµ  s   € Ø�‰�×'Ñ'¨°$Ó7¸ÕDr7   c                 ó¼   — t        |d   t        «      sI | j                  j                  |Ž }t	        d„ |j
                  D «       «      r|j                  | ¬«       y y y )Nr   c              3   ó<   K  — | ]  }t        |t        «      –— Œ y ­wr#   )rÕ   r   )rÊ   Únrs     r6   rË   z+RedisBackend.apply_chord.<locals>.<genexpr>Á  s   è ø€ ÐOÑ9N°2”:˜b¤+×.Ñ9Nùs   ‚)r&   )rÕ   r   r¤   r   rÓ   ÚresultsÚsave)r2   Úheader_result_argsÚbodyr4   Úheader_results        r6   Úapply_chordzRedisBackend.apply_chord¸  s[   € ô Ð,¨QÑ/´Ô8Ø0˜DŸH™H×0Ñ0Ð2DÐEˆMÜÑO¸×9NÒ9NÓOÔOØ×"Ñ"¨4Ð"Õ0ð Pð 9r7   c                 ó:   — | j                   j                  dd«      S )NÚresult_chord_orderedT)rà   r¦   rX   s    r6   Ú_chord_zsetzRedisBackend._chord_zsetÄ  s   € à×&Ñ&×*Ñ*Ð+AÀ4ÓHÐHr7   c                 óN   — | j                   j                  j                  di «      S )NÚ result_backend_transport_options)r¤   r¥   r¦   rX   s    r6   rà   zRedisBackend._transport_optionsÈ  s   € à�x‰x�}‰}× Ñ Ð!CÀRÓHÐHr7   c                 ó€
  — | j                   }|j                  |j                  |j                  }	}}|r|sy |	€d}	| j                  }
| j                  |d«      }| j                  |d«      }| j                  |d«      }| j                  ||«      }| j                  d|||g«      }|
j                  «       5 }| j                  r%|j                  |||	i«      j                  |dd«      n |j                  ||«      j                  |«      j                  |«      j                  |«      }| j                  rP|j!                  || j                  «      j!                  || j                  «      j!                  || j                  «      }|j#                  «       d d \  }}}}d d d «       t%        xs d«      }�r 	 t'        |j(                  |¬	«      }t%        |«      |z   }|k(  �rst+        j,                  |«      }|�f|j/                  «        |j0                  r|j2                  n|j4                  }t7        «       5   ||j8                  j:                  d
¬«      }d d d «       nŒ| j<                  | j>                  }}|
j                  «       5 }| j                  r|jA                  |dd«      }n|jC                  |d|«      }|j#                  «       \  }d d d «       D �cg c]  } |||«      ‘Œ }}	 |jE                  «       	 |
j                  «       5 }|jQ                  |«      jQ                  |«      jQ                  |«      j#                  «        d d d «       y y y # 1 sw Y   �Œ½xY w# 1 sw Y   Œ‚xY w# 1 sw Y   Œ¤xY wc c}w # tF        $ r«}tH        jK                  d|j                  |«       | jM                  |tO        d|›�«      «      cY d }~|
j                  «       5 }|jQ                  |«      jQ                  |«      jQ                  |«      j#                  «        d d d «       S # 1 sw Y   S xY wd }~ww xY w# 1 sw Y   y xY w# |
j                  «       5 }|jQ                  |«      jQ                  |«      jQ                  |«      j#                  «        d d d «       w # 1 sw Y   w xY wxY w# tN        $ r=}tH        jK                  d|j                  |«       | jM                  |«      cY d }~S d }~wtF        $ rI}tH        jK                  d|j                  |«       | jM                  tO        d|›�«      «      cY d }~S d }~ww xY w)Nz+infz.jr  r  r   z-infé   r   )r¤   T)rm   Ú	propagateéÿÿÿÿz Chord callback for %r raised: %rzCallback error: zChord %r raised: %rzJoin error: ))r¤   ÚidÚgroupÚgroup_indexr9   r  Úencode_resultÚencoderü   r)  ÚzaddÚzcountÚrpushÚllenr¦   rý   r	  r   r£   r   Úchordr   ÚrestoreÚon_readyÚsupports_native_joinÚjoin_nativeÚjoinr   r¥   Úresult_chord_join_timeoutr  r  ÚzrangeÚlrangeÚdelayÚ	Exceptionr?   Ú	exceptionÚchord_error_from_stackr   r  )r2   Úrequestr  rh   r.  r4   r¤   r  Úgidr2  r9   ÚjkeyÚtkeyÚskeyÚencodedr  rü   r  Ú
readycountÚ	totaldiffÚchord_size_bytesÚcallbackÚtotalr%  Ú	join_funcÚreslr  Úunpackr  ró   s                                 r6   Úon_chord_part_returnz!RedisBackend.on_chord_part_returnÌ  su  € à�h‰hˆØ '§
¡
¨G¯M©M¸7×;NÑ;N�+ˆSˆÙ™#ØØÐØ ˆKà—‘ˆØ×%Ñ% c¨4Ó0ˆØ×%Ñ% c¨4Ó0ˆØ×%Ñ% c¨4Ó0ˆØ×#Ñ# F¨EÓ2ˆØ—+‘+˜q # u¨fÐ5Ó6ˆØ�_‰_Ô $ð ×#Ò#ð —	‘	˜$ ¨+Ð 6Ó7×>Ñ>¸tÀVÈVÔTà—Z‘Z  gÓ.×3Ñ3°DÓ9ß‰c�$‹iŸ™˜D›	ð	 ð
 �|Š|Ø#ß‘V˜D $§,¡,Ó/ß‘V˜D $§,¡,Ó/ß‘V˜D $§,¡,Ó/ð ð
 :B×9IÑ9IÓ9KÈBÈQÐ9OÑ6ˆAˆz˜9Ð&6÷ ô ˜	š QÓ'ˆ	âð=Ü*¨7¯=©=¸cÔB�ÜÐ,Ó-°	Ñ9�Ø Ó&Ü$/×$7Ñ$7¸Ó$<�MØ$Ð0ð &×.Ñ.Ô0ð  -×AÒAð *×5Ò5à!.×!3Ñ!3ð "ô
 /Õ0Ù#,Ø(+¯©×(JÑ(JØ*.ô$˜D÷ 1Ð0ð *.¯©°d×6OÑ6O ˜Ø#Ÿ_™_Ô.°$Ø#×/Ò/Ø+/¯;©;°t¸QÀÓ+C¡à+/¯;©;°t¸QÀÓ+F Ø$,×$4Ñ$4Ó$6™E˜D÷ /ñ @DÓD¹t¸¡ s¨FÕ 3¸t˜ÐDð+Ø Ÿ™ tÕ,ð $Ÿ_™_Ô.°$Ø ß!'¡¨£ß!'¡¨£ß!'¡¨£ß!(¡¤÷ /Ð.ðY 'ð	 ÷! Ñú÷J 1Ð0ú÷ /Ð.üò  Eøô %ò Ü×(Ñ(Ø>ÀÇÁÈsôTà#×:Ñ:Ø$Ü&Ð)9¸#¸Ð'AÓBó ô ð
 $Ÿ_™_Ô.°$Ø ß!'¡¨£ß!'¡¨£ß!'¡¨£ß!(¡¤÷ /×.Ñ.þðú÷ /Ð.û˜VŸ_™_Ô.°$Ø ß!'¡¨£ß!'¡¨£ß!'¡¨£ß!(¡¤÷ /×.Ñ.þô ò BÜ× Ñ Ð!6¸¿¹ÀsÔKØ×2Ñ2°8¸SÓAÕAûÜò Ü× Ñ Ð!6¸¿¹ÀsÔKØ×2Ñ2ØÜ ¨c¨WÐ5Ó6óõ ûðús  Â3C%MÆ3B R' È3M É1R' ÊAM,Ë	R' ËM8Ë%R' Ë(M= Ë:R' Ì
>P4ÍR' ÍMÍ M)Í%R' Í,M5Í1R' Í=	P1Î>P,ÏP1ÏQ  Ï	R' Ï>P ÐR' Ð P)	Ð%R' Ð)R' Ð,P1Ð1Q  Ð4P=Ð9R' Ð=R' Ñ R$Ñ>RÒ	R$ÒR!ÒR$Ò$R' Ò'	T=Ò02S(Ó"T=Ó(T=Ó4>T8Ô2T=Ô8T=c                 óP   —  | j                  «        | j                  di |¤Ž¬«      S )N)r:   rU   )Ú_get_clientÚ	_get_pool©r2   Úparamss     r6   Ú_create_clientzRedisBackend._create_client+  s+   € Ø!ˆt×ÑÓ!Ø*˜DŸN™NÑ4¨VÑ4ô
ð 	
r7   c                 ó.   — | j                   j                  S r#   )r§   ÚStrictRedisrX   s    r6   rV  zRedisBackend._get_client0  s   € Ø�z‰z×%Ñ%Ð%r7   c                 ó&   —  | j                   di |¤ŽS rT   )ÚConnectionPoolrX  s     r6   rW  zRedisBackend._get_pool3  s   € Ø"ˆt×"Ñ"Ñ, VÑ,Ð,r7   c                 óh   — | j                   €| j                  j                  | _         | j                   S r#   )rª   r§   r^  rX   s    r6   r^  zRedisBackend.ConnectionPool6  s,   € à×ÑÐ'Ø#'§:¡:×#<Ñ#<ˆDÔ Ø×#Ñ#Ð#r7   c                 ó:   —  | j                   di | j                  ¤ŽS rT   )rZ  r¬   rX   s    r6   r9   zRedisBackend.client<  s   € à"ˆt×"Ñ"Ñ5 T§_¡_Ñ5Ð5r7   c                 óp   •— |si n|}t         ‰| �  |t        || j                  | j                  ¬«      «      S )N)rý   r·   )r$   Ú
__reduce__rÐ   rý   r·   r1   s      €r6   rb  zRedisBackend.__reduce__@  s6   ø€ Ù!‘ vˆÜ‰wÑ!Ø”$�v t§|¡|¸¿¹ÔBóDð 	Dr7   )NNNNNNNr#   )rU   N)-r}   r~   r   Ú__doc__r!   r§   r±   r®   r”   Úsupports_autoexpirer<  rù   r%   r¯   r
   rß   rä   r¦   rH   r+   rë   r/   rú   r  r  r  r	  r  r   r  r  r  r  r&  r)  rà   rT  rZ  rV  rW  Úpropertyr^  r9   rb  r€   r�   s   @r6   r   r   »   sH  ø„ ñð $€Nð €EÙ27˜5×.Ò.¸TÐð €OàÐØÐð $Ðà?CØ+/Ø!%õ_
òB5ðn óó ðò7ò$ò&òòòDòô1ò ò%ò.òDð /5×.EÑ.EØ.4×.EÑ.EóòEò
1ð ñIó ðIð ñIó ðIð (,ó]ò~
ò
&ò-ð ñ$ó ð$ð
 ñ6ó ð6÷Dñ Dr7   r   Úsentinelc                   ó   — e Zd ZdZy)ÚSentinelManagedSSLConnectionzâConnect 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.
        N)r}   r~   r   rc  rU   r7   r6   rh  rh  G  s   „ ò	r7   rh  c                   óh   ‡ — e Zd ZdZdZ eedd«      ZerendZ	ˆ fd„Z
d
ˆ fd„	Zˆ fd„Zd„ Zd	„ Zˆ xZS )r   z!Redis sentinel task result store.Ú;rf  Nc                 óv   •— | j                   €t        t        j                  «       «      ‚t	        ‰| �  |i |¤Ž y r#   )rf  r   ÚE_REDIS_SENTINEL_MISSINGr©   r$   r%   r1   s      €r6   r%   zSentinelBackend.__init__[  s4   ø€ Ø�=‰=Ð Ü&Ô'?×'EÑ'EÓ'GÓHÐHä‰Ñ˜$Ð) &Ó)r7   c                 óÌ   •— |rt         ‰| �  |¬«      S d„ | j                  xs dj                  | j                  «      D «       }| j                  j                  d„ |D «       «      S )zDReturn the server addresses as URIs, sanitizing the password or not.)Úinclude_passwordc              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr#   )r   )rÊ   Úchunks     r6   rË   z)SentinelBackend.as_uri.<locals>.<genexpr>j  s   è ø€ ð 
áK�ô ˜u×%ÙKùs   ‚Ú c              3   óL   K  — | ]  }|j                  d «      r|dd n|–— Œ y­w)z:///Nr/  )Úendswith)rÊ   Úuris     r6   rË   z)SentinelBackend.as_uri.<locals>.<genexpr>p  s.   è ø€ ð /
á!�ð Ÿ™ VÔ,ˆC��‰H°#Ó5Ù!ùs   ‚"$)r$   Úas_urir·   ÚsplitÚ_SERVER_URI_SEPARATORr>  )r2   rn  Ú
uri_chunksr5   s      €r6   ru  zSentinelBackend.as_uria  sq   ø€ ñ Ü‘7‘>Ø!1ð "ó ð ñ

àŸ(™(š. b×/Ñ/°×0JÑ0JÔKó
ˆ
ð ×)Ñ)×.Ñ.ñ /
á!ó/
ó 
ð 	
r7   c                 óD  •— |j                  | j                  «      }t        |g ¬«      }|D ]'  }t        ‰| �  ||¬«      }|d   j                  |«       Œ) dD ]  }|j                  |«       Œ dD ]-  }|d   sŒ	||d   d   v sŒ|d   d   j                  |«      ||<   Œ/ |S )N)Úhosts)r·   rØ   rz  )r�   r‘   r’   r“   )r’   r“   r   )rv  rw  rÐ   r$   r¯   ÚappendrÑ   r¦   )	r2   r·   rØ   Úchunksr¬   rp  ro   Úparamr5   s	           €r6   r¯   z SentinelBackend._params_from_urlu  s½   ø€ Ø—‘˜4×5Ñ5Ó6ˆÜ˜(¨"Ô-ˆ
ÛˆEÜ‘7Ñ+Ø Hð ,ó .ˆDà�wÑ×&Ñ& tÕ,ð ó 8ˆEØ�N‰N˜5Õ!ð 8ó (ˆEØ˜'Ó" u°
¸7Ñ0CÀAÑ0FÒ'FØ$.¨wÑ$7¸Ñ$:×$>Ñ$>¸uÓ$E�
˜5Ò!ð (ð Ðr7   c                 ó.  — |j                  «       }|j                  d«      }| j                  j                  dd«      }| j                  j                  di «      } | j                  j
                  |D �cg c]  }|d   |d   f‘Œ c}f||dœ|¤Ž}|S c c}w )Nrz  Úmin_other_sentinelsr   Úsentinel_kwargsr�   r‘   )r  r€  )rá   rÑ   rà   r¦   rf  ÚSentinel)r2   rY  r¬   rz  r  r€  ÚcpÚsentinel_instances           r6   Ú_get_sentinel_instancez&SentinelBackend._get_sentinel_instance…  s§   € Ø—[‘[“]ˆ
à—‘˜wÓ'ˆØ"×5Ñ5×9Ñ9Ð:OÐQRÓSÐØ×1Ñ1×5Ñ5Ð6GÈÓLˆà2˜DŸM™M×2Ñ2Ù05Ó6±¨"ˆb�‰j˜"˜V™*Ò%°Ñ6ðà 3Ø+ñð ñ	Ðð !Ð ùò 7s   Á4Bc                 ó´   —  | j                   di |¤Ž}| j                  j                  dd «      }|j                  || j	                  «       ¬«      j
                  S )NÚmaster_name)Úservice_nameÚredis_classrU   )r„  rà   r¦   Ú
master_forrV  r:   )r2   rY  rƒ  r†  s       r6   rW  zSentinelBackend._get_pool”  s^   € Ø7˜D×7Ñ7ÑA¸&ÑAÐà×-Ñ-×1Ñ1°-ÀÓFˆà ×+Ñ+Ø$Ø×(Ñ(Ó*ð ,ó 
÷ ‰/ð	r7   )F)r}   r~   r   rc  rw  Úgetattrr§   rf  rh  r®   r%   ru  r¯   r„  rW  r€   r�   s   @r6   r   r   R  s@   ø„ Ù+ð  Ðá�u˜j¨$Ó/€HÙ;CÑ7ÈÐô*õ
ô(ò !ör7   r   )Erc  rq   Ú
contextlibr   Ú	functoolsr   r¾   r   r   r   Úurllib.parser   Úkombu.utils.functionalr	   Úkombu.utils.objectsr
   Úkombu.utils.urlr   r   Úceleryr   Úcelery._stater   Úcelery.canvasr   Úcelery.exceptionsr   r   r   Úcelery.resultr   r   Úcelery.utils.functionalr   r   Úcelery.utils.logr   Úcelery.utils.timer   Úasynchronousr   r   Úbaser   Úredis.connectionr§   Úkombu.transport.redisr   ÚImportErrorÚredis.sentinelÚ__all__r¨   rl  rµ   r¶   rÔ   r´   rò   rW   r}   r?   r!   r   rŠ  rf  ÚSentinelManagedConnectionr±   rh  r   rU   r7   r6   Ú<module>r¡     s9  ðÙ !Û Ý %Ý ß 7Ñ 7Ý  å 2Ý /ß :å Ý .Ý )ß QÑ Qß 8ß 6Ý 'Ý .ç ?Ý *ð#ÛÝ=ð
	Ûð .€ð€ð
Ð ð
Ð ðÐ ð*Ð &ð
)Ð %ð
 
7€ðÐ ñ
 
�HÓ	€ôh.Ð'ô h.ôVHDÐ+Ð->ô HDñV ˆ5�*˜dÔ#ôØ�N‰N×4Ñ4Ø×ÑôôJ�lõ Jøðo ò #Ø€EØ"Òð#ûð ò 	Ùð	ús$   Á>
C> Â	D Ã>	D
Ä	D
ÄDÄD