§
    eŠtj5A  ã                  óÀ  — d 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	 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 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 ddlmZ ddlm Z  ddl!m"Z" ddl!m#Z# er`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, dd#l-m.Z. dd$l/m0Z0 dd%lm1Z1 dd&lm2Z2 dd'lm3Z3 dd(l4m5Z5 dd)l6m7Z7 dd*l8m9Z9 dd+l:m;Z; d,d-gZ< ed.e¬/¦  «        Z=e>Z? G d0„ d1e"¦  «        Z@ G d2„ d3e"¦  «        ZA G d4„ d-ee=         ¦  «        ZB G d5„ d,e ¦  «        ZC G d6„ d7e¦  «        ZDd>d<„ZEd=S )?aÌ  Horizontal sharding support.

Defines a rudimental 'horizontal sharding' system which allows a Session to
distribute queries and persistence operations across multiple databases.

For a usage example, see the :ref:`examples_sharding` example included in
the source distribution.

.. deepalchemy:: The horizontal sharding extension is an advanced feature,
   involving a complex statement -> database interaction as well as
   use of semi-public APIs for non-trivial cases.   Simpler approaches to
   referring to multiple database "shards", most commonly using a distinct
   :class:`_orm.Session` per "shard", should always be considered first
   before using this more complex and less-production-tested system.



é    )Úannotations)ÚAny)ÚCallable)ÚDict)ÚIterable)ÚOptional)ÚTuple)ÚType)ÚTYPE_CHECKING)ÚTypeVar)ÚUnioné   )Úevent)Úexc)Úinspect)Úutil)ÚPassiveFlag)ÚOrmExecuteOptionsParameter)Ú	ORMOption)ÚMapper)ÚQuery)Ú_BindArguments)Ú_PKIdentityArgument)ÚSession)ÚProtocol)ÚSelf)Ú
Connection)ÚEngine)ÚOptionEngine)ÚIteratorResult)ÚResult)ÚLoaderCallableStatus)Ú_O)ÚBulkUDCompileState)ÚQueryContext)Ú_EntityBindKey)Ú_SessionBind)ÚORMExecuteState)ÚInstanceState)Ú
Executable)Ú_TP)ÚClauseElementÚShardedSessionÚShardedQueryÚ_T)Úboundc                  ó   — e Zd Zd
d„Zd	S )ÚShardChooserÚmapperúOptional[Mapper[_T]]Úinstancer   ÚclauseúOptional[ClauseElement]Úreturnc                ó   — d S ©N© )Úselfr3   r5   r6   s       ú]/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/sqlalchemy/ext/horizontal_shard.pyÚ__call__zShardChooser.__call__R   s	   € ð
 ˆcó    N)r3   r4   r5   r   r6   r7   r8   r   ©Ú__name__Ú
__module__Ú__qualname__r>   r;   r?   r=   r2   r2   Q   s(   € € € € € ðð ð ð ð ð r?   r2   c                  ó   — e Zd Zdd„ZdS )ÚIdentityChooserr3   ú
Mapper[_T]Úprimary_keyr   Úlazy_loaded_fromúOptional[InstanceState[Any]]Úexecution_optionsr   Úbind_argumentsr   Úkwr   r8   c               ó   — d S r:   r;   )r<   r3   rG   rH   rJ   rK   rL   s          r=   r>   zIdentityChooser.__call__[   s	   € ð ˆcr?   N©r3   rF   rG   r   rH   rI   rJ   r   rK   r   rL   r   r8   r   r@   r;   r?   r=   rE   rE   Z   s(   € € € € € ð	ð 	ð 	ð 	ð 	ð 	r?   rE   c                  ó,   ‡ — e Zd ZdZdˆ fd„Zdd„Zˆ xZS )r.   a  Query class used with :class:`.ShardedSession`.

    .. legacy:: The :class:`.ShardedQuery` is a subclass of the legacy
       :class:`.Query` class.   The :class:`.ShardedSession` now supports
       2.0 style execution via the :meth:`.ShardedSession.execute` method.

    Úargsr   Úkwargsr8   ÚNonec                óÄ   •—  t          ¦   «         j        |i |¤Ž t          | j        t          ¦  «        sJ ‚| j        j        | _        | j        j        | _        d | _        d S r:   )ÚsuperÚ__init__Ú
isinstanceÚsessionr-   Úidentity_chooserÚexecute_chooserÚ	_shard_id)r<   rP   rQ   Ú	__class__s      €r=   rU   zShardedQuery.__init__p   s\   ø€ Ø�‰ŒÔ˜$Ð) &Ð)Ð)Ð)Ý˜$œ,­Ñ7Ô7Ð7Ð7Ð7à $¤Ô =ˆÔØ#œ|Ô;ˆÔØˆŒˆˆr?   Úshard_idÚShardIdentifierr   c                ó.   — |                       |¬¦  «        S )a•  Return a new query, limited to a single shard ID.

        All subsequent operations with the returned query will
        be against the single shard regardless of other state.

        The shard_id can be passed for a 2.0 style execution to the
        bind_arguments dictionary of :meth:`.Session.execute`::

            results = session.execute(stmt, bind_arguments={"shard_id": "my_shard"})

        )Ú_sa_shard_id)rJ   )r<   r\   s     r=   Ú	set_shardzShardedQuery.set_shardx   s   € ð ×%Ò%°8Ð%Ñ<Ô<Ð<r?   )rP   r   rQ   r   r8   rR   )r\   r]   r8   r   )rA   rB   rC   Ú__doc__rU   r`   Ú__classcell__©r[   s   @r=   r.   r.   g   s[   ø€ € € € € ðð ðð ð ð ð ð ð=ð =ð =ð =ð =ð =ð =ð =r?   c                  ó´   ‡ — e Zd ZU ded<   ded<   ded<   dddefdddœd:ˆ fd„Zdej        dej	        dfd;ˆ fd(„Z
d<d+„Z	 	 	 d=d>d0„Z	 d?dddd1œd@d5„ZdAd9„Zˆ xZS )Br-   r2   Úshard_chooserrE   rX   z*Callable[[ORMExecuteState], Iterable[Any]]rY   N)Ú
id_chooserÚquery_chooserúOptional[IdentityChooser]ú4Optional[Callable[[ORMExecuteState], Iterable[Any]]]ÚshardsúOptional[Dict[str, Any]]Ú	query_clsúType[Query[_T]]rf   ú<Optional[Callable[[Query[_T], Iterable[_T]], Iterable[Any]]]rg   ú/Optional[Callable[[Executable], Iterable[Any]]]rQ   r   r8   rR   c               ó  •‡ ‡‡—  t          ¦   «         j        dd|i|¤Ž t          j        ‰ dt          d¬¦  «         |‰ _        |r&|Št          j        dd¦  «         d ˆˆ fd„}	|	‰ _        n|r|‰ _        nt          j
        d¦  «        ‚|r7|Št          j        dd¦  «         |rt          j
        d¦  «        ‚d!ˆfd„}
|€|
}|€t          j
        d¦  «        ‚|‰ _        i ‰ _        |�!|D ] }‰                      |||         ¦  «         ŒdS dS )"aî  Construct a ShardedSession.

        :param shard_chooser: A callable which, passed a Mapper, a mapped
          instance, and possibly a SQL clause, returns a shard ID.  This id
          may be based off of the attributes present within the object, or on
          some round-robin scheme. If the scheme is based on a selection, it
          should set whatever state on the instance to mark it in the future as
          participating in that shard.

        :param identity_chooser: A callable, passed a Mapper and primary key
         argument, which should return a list of shard ids where this
         primary key might reside.

          .. versionchanged:: 2.0  The ``identity_chooser`` parameter
             supersedes the ``id_chooser`` parameter.

        :param execute_chooser: For a given :class:`.ORMExecuteState`,
          returns the list of shard_ids
          where the query should be issued.  Results from all shards returned
          will be combined together into a single listing.

          .. versionchanged:: 1.4  The ``execute_chooser`` parameter
             supersedes the ``query_chooser`` parameter.

        :param shards: A dictionary of string shard names
          to :class:`~sqlalchemy.engine.Engine` objects.

        rl   Údo_orm_executeT)ÚretvalzLThe ``id_chooser`` parameter is deprecated; please use ``identity_chooser``.z2.0r3   rF   rG   r   rH   rI   rJ   r   rK   r   rL   r   r8   c               ót   •— ‰                      | ¦  «        }|r|                     |¦  «        } ‰||¦  «        S r:   )ÚqueryÚ_set_lazyload_from)	r3   rG   rH   rJ   rK   rL   ÚqÚ_id_chooserr<   s	          €€r=   Ú_legacy_identity_chooserz9ShardedSession.__init__.<locals>._legacy_identity_chooserÇ   sD   ø€ ð —J’J˜vÑ&Ô&�Ø#ð ?Ø×,Ò,Ð-=Ñ>Ô>�AØ"�{ 1 kÑ2Ô2Ð2r?   z*identity_chooser or id_chooser is requiredzNThe ``query_chooser`` parameter is deprecated; please use ``execute_chooser``.z1.4z>Can't pass query_chooser and execute_chooser at the same time.Úorm_contextr(   úIterable[Any]c                ó$   •—  ‰| j         ¦  «        S r:   )Ú	statement)ry   Ú_query_choosers    €r=   Ú_default_execute_chooserz9ShardedSession.__init__.<locals>._default_execute_chooserê   s   ø€ ð &�~ kÔ&;Ñ<Ô<Ð<r?   Nz,execute_chooser or query_chooser is requiredr;   rN   )ry   r(   r8   rz   )rT   rU   r   ÚlistenÚexecute_and_instancesre   r   Úwarn_deprecatedrX   r   ÚArgumentErrorrY   Ú_ShardedSession__shardsÚ
bind_shard)r<   re   rX   rY   rj   rl   rf   rg   rQ   rx   r~   Úkrw   r}   r[   s   `           @@€r=   rU   zShardedSession.__init__Œ   sÊ  øøøø€ ðX 	�‰ŒÔÐ7Ð7 9Ð7°Ð7Ð7Ð7åŒØÐ"Õ$9À$ð	
ñ 	
ô 	
ð 	
ð +ˆÔàð 	Ø$ˆKÝÔ ð3àñô ð ð3ð 3ð 3ð 3ð 3ð 3ð 3ð %=ˆDÔ!Ð!Øð 	Ø$4ˆDÔ!Ð!åÔ#Ø<ñô ð ð ð 	;Ø*ˆNÝÔ ð2àñô ð ð
 ð ÝÔ'ð(ñô ð ð
=ð =ð =ð =ð =ð =ð
 Ð&Ø":�àÐ"ÝÔ#Ø>ñô ð ð  /ˆÔØ=?ˆŒØÐØð .ð .�Ø—’  6¨!¤9Ñ-Ô-Ð-Ð-ð Ðð.ð .r?   r3   ú
Mapper[_O]Úprimary_key_identityúUnion[Any, Tuple[Any, ...]]Úidentity_tokenúOptional[Any]Úpassiver   rH   rI   rJ   r   rK   úOptional[_BindArguments]rL   ú)Union[Optional[_O], LoaderCallableStatus]c           	     óî   •— |� t          ¦   «         j        ||fd|i|¤Ž}	|	S |                      |||||rt          |¦  «        ni ¬¦  «        D ]&}
 t          ¦   «         j        ||f|
|dœ|¤Ž}|�|c S Œ'dS )a_  override the default :meth:`.Session._identity_lookup` method so
        that we search for a given non-token primary key identity across all
        possible identity tokens (e.g. shard ids).

        .. versionchanged:: 1.4  Moved :meth:`.Session._identity_lookup` from
           the :class:`_query.Query` object to the :class:`.Session`.

        Nr‰   )rH   rJ   rK   )r‰   rH   )rT   Ú_identity_lookuprX   Údict)r<   r3   r‡   r‰   r‹   rH   rJ   rK   rL   Úobjr\   Úobj2r[   s               €r=   r�   zShardedSession._identity_lookupü   sç   ø€ ð( Ð%Ø*•%‘'”'Ô*ØØ$ðð ð  .ðð ð	ð ˆCð ˆJà ×1Ò1ØØ$Ø!1Ø"3Ø7EÐM�t NÑ3Ô3Ð3È2ð 2ñ ô ð  ð  �ð 0•u‘w”wÔ/ØØ(ðð $,Ø%5ð	ð ð
 ðð �ð Ð#Ø�K�K�Kð $ð �4r?   úOptional[_EntityBindKey[_O]]r5   c                óÖ   — |�7t          |¦  «        }|j        r|j        d         }|€J ‚|S |j        r|j        S t          |t          ¦  «        sJ ‚ | j        ||fi |¤Ž}|�||_        |S )Nr   )r   Úkeyr‰   rV   r   re   )r<   r3   r5   rL   ÚstateÚtokenr\   s          r=   Ú_choose_shard_and_assignz'ShardedSession._choose_shard_and_assign-  s–   € ð ÐÝ˜HÑ%Ô%ˆEØŒyð ,Øœ	 !œ�ØÐ(Ð(Ð(Ø�ØÔ%ð ,ØÔ+Ð+å˜&¥&Ñ)Ô)Ð)Ð)Ð)Ø%�4Ô% f¨hÐ=Ð=¸"Ð=Ð=ˆØÐØ#+ˆEÔ Øˆr?   r4   r\   úOptional[ShardIdentifier]r   c                ó^  — |€|                       ||¦  «        }|                      ¦   «         r/|                      ¦   «         }|€J ‚|                     ||¬¦  «        S |                      |||¬¦  «        }t          |t          ¦  «        r |j        di |¤ŽS t          |t          ¦  «        sJ ‚|S )zaProvide a :class:`_engine.Connection` to use in the unit of work
        flush process.

        N)r\   )r3   r\   r5   r;   )	r˜   Úin_transactionÚget_transactionÚ
connectionÚget_bindrV   r   Úconnectr   )r<   r3   r5   r\   rL   ÚtransÚbinds          r=   Úconnection_callablez"ShardedSession.connection_callableB  sÏ   € ð ÐØ×4Ò4°V¸XÑFÔFˆHà×ÒÑ Ô ð 	Ø×(Ò(Ñ*Ô*ˆEØÐ$Ð$Ð$Ø×#Ò# F°XÐ#Ñ>Ô>Ð>à—=’=Ø¨¸8ð !ñ ô ˆDõ ˜$¥Ñ'Ô'ð Ø#�t”|Ð)Ð) bÐ)Ð)Ð)å! $­
Ñ3Ô3Ð3Ð3Ð3Ø�r?   )r\   r5   r6   r6   r7   r'   c               óX   — |€|                       |||¬¦  «        }|€J ‚| j        |         S )N)r5   r6   )r˜   rƒ   )r<   r3   r\   r5   r6   rL   s         r=   rž   zShardedSession.get_bind`  sF   € ð ÐØ×4Ò4Ø °&ð 5ñ ô ˆHð Ð'Ð'Ð'ØŒ}˜XÔ&Ð&r?   r]   r¡   úUnion[Engine, OptionEngine]c                ó   — || j         |<   d S r:   )rƒ   )r<   r\   r¡   s      r=   r„   zShardedSession.bind_shardp  s   € ð #'ˆŒ�hÑÐÐr?   )re   r2   rX   rh   rY   ri   rj   rk   rl   rm   rf   rn   rg   ro   rQ   r   r8   rR   )r3   r†   r‡   rˆ   r‰   rŠ   r‹   r   rH   rI   rJ   r   rK   rŒ   rL   r   r8   r�   )r3   r“   r5   r   rL   r   r8   r   )NNN)
r3   r4   r5   rŠ   r\   r™   rL   r   r8   r   r:   )r3   r“   r\   r™   r5   rŠ   r6   r7   rL   r   r8   r'   )r\   r]   r¡   r¤   r8   rR   )rA   rB   rC   Ú__annotations__r.   rU   r   ÚPASSIVE_OFFr   Ú
EMPTY_DICTr�   r˜   r¢   rž   r„   rb   rc   s   @r=   r-   r-   ‡   sN  ø€ € € € € € ØÐÐÑØ%Ð%Ð%Ñ%Ø?Ð?Ð?Ñ?ð
 7;ð Ø+/Ø%1ðn.ð ØIMðn.ð n.ð n.ð n.ð n.ð n.ð n.ð n.ðh )-Ø*Ô6Ø9=Ø8<¼Ø37ð/ð /ð /ð /ð /ð /ð /ðbð ð ð ð. (,Ø"&Ø.2ð	ð ð ð ð ð@ 04ð'ð /3Ø"&Ø*.ð'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'ð 'r?   c                  ó"   — e Zd ZdZdZ	 d
dd„Zd	S )Úset_shard_ida  a loader option for statements to apply a specific shard id to the
    primary query as well as for additional relationship and column
    loaders.

    The :class:`_horizontal.set_shard_id` option may be applied using
    the :meth:`_sql.Executable.options` method of any executable statement::

        stmt = (
            select(MyObject)
            .where(MyObject.name == "some name")
            .options(set_shard_id("shard1"))
        )

    Above, the statement when invoked will limit to the "shard1" shard
    identifier for the primary query as well as for all relationship and
    column loading strategies, including eager loaders such as
    :func:`_orm.selectinload`, deferred column loaders like :func:`_orm.defer`,
    and the lazy relationship loader :func:`_orm.lazyload`.

    In this way, the :class:`_horizontal.set_shard_id` option has much wider
    scope than using the "shard_id" argument within the
    :paramref:`_orm.Session.execute.bind_arguments` dictionary.


    .. versionadded:: 2.0.0

    ©r\   Úpropagate_to_loadersTr\   r]   r¬   Úboolc                ó"   — || _         || _        dS )aH  Construct a :class:`_horizontal.set_shard_id` option.

        :param shard_id: shard identifier
        :param propagate_to_loaders: if left at its default of ``True``, the
         shard option will take place for lazy loaders such as
         :func:`_orm.lazyload` and :func:`_orm.defer`; if False, the option
         will not be propagated to loaded objects. Note that :func:`_orm.defer`
         always limits to the shard_id of the parent row in any case, so the
         parameter only has a net effect on the behavior of the
         :func:`_orm.lazyload` strategy.

        Nr«   )r<   r\   r¬   s      r=   rU   zset_shard_id.__init__•  s   € ð !ˆŒØ$8ˆÔ!Ð!Ð!r?   N)T)r\   r]   r¬   r­   )rA   rB   rC   ra   Ú	__slots__rU   r;   r?   r=   rª   rª   v  sE   € € € € € ðð ð8 5€Ið GKð9ð 9ð 9ð 9ð 9ð 9ð 9r?   rª   ry   r(   r8   ú&Union[Result[_T], IteratorResult[_TP]]c                ó*  ‡ — ‰ j         r‰ j        }n‰ j        s‰ j        r‰ j        }nd }‰ j        }t          |t          ¦  «        sJ ‚d	ˆ fd„}‰ j        D ] }t          |t          ¦  «        r	|j
        } nBŒ!|r|j        �|j        }n0d‰ j        v r‰ j        d         }nd‰ j        v r‰ j        d         }nd }|� ||¦  «        S g }|                     ‰ ¦  «        D ]"} ||¦  «        }|                     |¦  «         Œ# |d         j        |dd …         Ž S )
Nr\   r]   r8   r°   c                óŽ   •— t          ‰j        ¦  «        }| |d<   ‰                     | ¬¦  «         ‰                     |¬¦  «        S )Nr\   )r‰   )rK   )r�   rK   Úupdate_execution_optionsÚinvoke_statement)r\   rK   ry   s     €r=   Úiter_for_shardz-execute_and_instances.<locals>.iter_for_shard¾  sM   ø€ õ ˜kÔ8Ñ9Ô9ˆØ%-ˆ�zÑ"à×,Ò,¸HÐ,ÑEÔEÐEØ×+Ò+¸>Ð+ÑJÔJÐJr?   r_   r   é   )r\   r]   r8   r°   )Ú	is_selectÚload_optionsÚ	is_updateÚ	is_deleteÚupdate_delete_optionsrW   rV   r-   Ú_non_compile_orm_optionsrª   r\   Ú_identity_tokenrJ   rK   rY   ÚappendÚmerge)ry   Úactive_optionsrW   rµ   Úorm_optr\   ÚpartialÚresult_s   `       r=   r€   r€   ¨  s�  ø€ ð Ôð Ø$Ô1ˆˆà	Ô	ð  +Ô"7ð Ø$Ô:ˆˆàˆàÔ!€GÝ�g�~Ñ.Ô.Ð.Ð.Ð.ðKð Kð Kð Kð Kð Kð Ô7ð ð ˆõ �g�|Ñ,Ô,ð 	ØÔ'ˆHØˆEð	ð ð 	˜nÔ<ÐHØ%Ô5ˆHˆHØ˜{Ô<Ð<Ð<Ø"Ô4°^ÔDˆHˆHØ˜;Ô5Ð5Ð5Ø"Ô1°*Ô=ˆHˆHàˆHàÐØˆ~˜hÑ'Ô'Ð'àˆØ×/Ò/°Ñ<Ô<ð 	$ð 	$ˆHØ$�n XÑ.Ô.ˆGØ�NŠN˜7Ñ#Ô#Ð#Ð#Øˆw�qŒzÔ ¨¨¨¤Ð-Ð-r?   N)ry   r(   r8   r°   )Fra   Ú
__future__r   Útypingr   r   r   r   r   r	   r
   r   r   r   Ú r   r   r   r   Úormr   Úorm._typingr   Úorm.interfacesr   Ú
orm.mapperr   Ú	orm.queryr   Úorm.sessionr   r   r   Úutil.typingr   r   Úengine.baser   r   r   Úengine.resultr    r!   r"   r#   Úorm.bulk_persistencer$   Úorm.contextr%   r&   r'   r(   Ú	orm.stater)   Úsqlr*   Úsql._typingr+   Úsql.elementsr,   Ú__all__r/   Ústrr]   r2   rE   r.   r-   rª   r€   r;   r?   r=   ú<module>rØ      s  ððð ð& #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø &Ð &Ð &Ð &Ð &Ð &Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø (Ð (Ð (Ð (Ð (Ð (Ø -Ð -Ð -Ð -Ð -Ð -Ø !Ð !Ð !Ð !Ð !Ð !Ø "Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ð Ð àð -Ø(Ð(Ð(Ð(Ð(Ð(Ø$Ð$Ð$Ð$Ð$Ð$Ø*Ð*Ð*Ð*Ð*Ð*Ø.Ð.Ð.Ð.Ð.Ð.Ø&Ð&Ð&Ð&Ð&Ð&Ø*Ð*Ð*Ð*Ð*Ð*Ø Ð Ð Ð Ð Ð Ø9Ð9Ð9Ð9Ð9Ð9Ø*Ð*Ð*Ð*Ð*Ð*Ø,Ð,Ð,Ð,Ð,Ð,Ø*Ð*Ð*Ð*Ð*Ð*Ø-Ð-Ð-Ð-Ð-Ð-Ø)Ð)Ð)Ð)Ð)Ð)Ø Ð Ð Ð Ð Ð Ø!Ð!Ð!Ð!Ð!Ð!Ø,Ð,Ð,Ð,Ð,Ð,à˜^Ð
,€à€WˆT˜ÐÑÔ€ð €ðð ð ð ð �8ñ ô ð ð
ð 
ð 
ð 
ð 
�hñ 
ô 
ð 
ð=ð =ð =ð =ð =�5˜”9ñ =ô =ð =ð@l'ð l'ð l'ð l'ð l'�Wñ l'ô l'ð l'ð^/9ð /9ð /9ð /9ð /9�9ñ /9ô /9ð /9ðd7.ð 7.ð 7.ð 7.ð 7.ð 7.r?   