a
    còfv|  ã                   @   s€   d Z ddlZddlZddlmZ ddlmZmZmZm	Z	m
Z
 ddlmZmZ ddlmZ ddlmZmZ d	ZG d
d„ deƒZdS )z,Implements the MySQL Client/Server protocol
é    N)ÚDecimalé   )Ú	FieldFlagÚ	ServerCmdÚ	FieldTypeÚ
ClientFlagÚPARAMETER_COUNT_AVAILABLE)ÚerrorsÚutils)Úget_auth_plugin)ÚDatabaseErrorÚget_exceptioné
   c                	   @   s   e Zd ZdZdd„ Zdd„ ZdJdd„Zdd„ ZdKdd„ZdLdd„Z	dMdd„Z
dNdd„Zdd„ Zdd„ Zdd„ Zdd„ ZdOd!d"„Zd#d$„ ZdPd&d'„ZdQd(d)„Zd*d+„ Zd,d-„ ZdRd/d0„Zd1d2„ Zd3d4„ ZdSd5d6„ZdTd7d8„Zd9d:„ Zd;d<„ Zd=d>„ Zd?d@„ ZdAdB„ ZdUdDdE„Z dFdG„ Z!dHdI„ Z"dS )VÚMySQLProtocolzRImplements MySQL client/server protocol

    Create and parses MySQL packets.
    c                 C   s    |t j@ r|r| d¡d S dS )z.Prepare database string for handshake responseÚutf8ó    )r   ZCONNECT_WITH_DBÚencode)ÚselfÚclient_flagsÚdatabase© r   úU/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/mysql/connector/protocol.pyÚ_connect_with_db4   s    zMySQLProtocol._connect_with_dbc              
   C   sš   |sdS z"t |ƒ|||||d�}| ¡ }	W n> ttjfyh }
 z t d t|
ƒ¡¡‚W Y d}
~
n
d}
~
0 0 |tj@ rŽt	|	ƒ}t
 d|¡|	 }n|	d }|S )z#Prepare the authentication responser   )ÚusernameÚpasswordr   Ússl_enabledzFailed authentication: {0}Nú<B)r   Úauth_responseÚ	TypeErrorr	   ÚInterfaceErrorÚformatÚstrr   ÚSECURE_CONNECTIONÚlenÚstructÚpack)r   r   r   r   r   Úauth_pluginÚ	auth_datar   ÚauthZplugin_auth_responseÚexcZresplenr   r   r   r   Ú_auth_response:   s$    ýÿ
zMySQLProtocol._auth_responseNé-   r   é   @Fc              
   C   s  z|d }|	p|d }	W n8 t tfyP } zt d |¡¡‚W Y d}~n
d}~0 0 |sZd}z| d¡}W n ty~   |}Y n0 t djdt	|ƒd	�||||¡}||  
|||||	||¡7 }||  ||¡7 }|tj@ ræ||	 d¡d
 7 }|tj@ �r
|
du�r
||  |
¡7 }|S )z"Make a MySQL Authentication packetr'   r&   ú*Handshake misses authentication info ({0})Nó    r   z<IIH{filler}{usrlen}sxZxxxxxxxxxxxxxxxxxxxxxx)ZfillerÚusrlenr   )r   ÚKeyErrorr	   ÚProgrammingErrorr    r   ÚAttributeErrorr$   r%   r#   r*   r   r   ÚPLUGIN_AUTHÚCONNECT_ARGSÚmake_conn_attrs)r   Ú	handshaker   r   r   Úcharsetr   Úmax_allowed_packetr   r&   Ú
conn_attrsr'   r)   Úusername_bytesÚpacketr   r   r   Ú	make_authQ   s<    ÿ
ÿýý
zMySQLProtocol.make_authc                    s²   ˆ D ]}ˆ | du rdˆ |< qt ‡ fdd„ˆ D ƒƒtˆ  ¡ ƒ tˆ  ¡ ƒ }t d|¡}ˆ D ]P}|t dt|ƒ¡7 }|| d¡7 }|t dtˆ | ƒ¡7 }|ˆ |  d¡7 }q\|S )z Encode the connection attributesNÚ c                    s    g | ]}t |ƒt ˆ | ƒ ‘qS r   )r#   )Ú.0Úx©r9   r   r   Ú
<listcomp>   r.   z1MySQLProtocol.make_conn_attrs.<locals>.<listcomp>r   r   )Úsumr#   ÚkeysÚvaluesr$   r%   r   )r   r9   Ú	attr_nameZconn_attrs_lenZconn_attrs_packetr   r@   r   r5   y   s     

ÿ
ÿÿzMySQLProtocol.make_conn_attrsc                 C   s"   t  |¡t  |¡ t  |¡ d S )z Make a SSL authentication packets                         ©r
   Ú	int4storeÚ	int2store)r   r7   r   r8   r   r   r   Úmake_auth_sslŠ   s    ÿþýzMySQLProtocol.make_auth_sslc                 C   s   t  |¡}|dur||7 }|S )z(Make a MySQL packet containing a commandN)r
   Ú	int1store)r   ÚcommandÚargumentÚdatar   r   r   Úmake_command’   s    
zMySQLProtocol.make_commandr   c                 C   s   t  |¡t  |¡ S )z0Make a MySQL packet with Fetch Statement command)r
   rG   )r   Ústatement_idÚrowsr   r   r   Úmake_stmt_fetch™   s    zMySQLProtocol.make_stmt_fetchc
              
   C   s  z|d }
|p|d }W n8 t tfyP } zt d |¡¡‚W Y d}~n
d}~0 0 |sZd}z| d¡}W n ty~   |}Y n0 t djt	|ƒd�t
j|¡}||  ||||||
|¡7 }||  ||¡7 }|t d	|¡7 }|tj@ rò|| d¡d
 7 }|tj@ �r|	du�r||  |	¡7 }|S )z0Make a MySQL packet with the Change User commandr'   r&   r-   Nr.   r   z<B{usrlen}sx)r/   ú<Hr   )r   r0   r	   r1   r    r   r2   r$   r%   r#   r   ZCHANGE_USERr*   r   r   r3   r4   r5   )r   r6   r   r   r   r7   r   r   r&   r9   r'   r)   r:   r;   r   r   r   Úmake_change_user�   s8    ÿ
ÿý
zMySQLProtocol.make_change_userc           
   	   C   sŽ  i }t  d|dd… ¡d |d< |d tkr@td |d t¡ƒ‚tj|dd… dd�\}|d	< t  d
|dd… ¡\|d< }}|d< |d< }}|d	  ¡ |d	< |dd… }t || ¡}d}|t	j
@ �r|rØtd|d ƒnd}	|d|	… }||	d… }|d dk�r|dd… }|t	j@ �rnd|v�rD|d	  d¡�rDd| }|d< ntj|dd�\}|d< |d  d¡|d< nd|d< || |d< ||d< |S )zParse a MySQL Handshake-packetú<xxxxBr   é   Úprotocolz;Protocol mismatch; server version = {}, client version = {}Nr   ©ÚendZserver_version_originalz<I8sx2sBH2sBxxxxxxxxxxé   Zserver_threadidr7   Zserver_statusr.   é   é   éÿÿÿÿz5.5.8r&   úutf-8Zmysql_native_passwordr'   Úcapabilities)r$   ÚunpackÚPROTOCOL_VERSIONr   r    r
   Úread_stringÚdecodeZintreadr   r"   Úminr3   Ú
startswith)
r   r;   ÚresZ
auth_data1Zcapabilities1Zcapabilities2Zauth_data_lengthr^   Z
auth_data2Úsizer   r   r   Úparse_handshakeÄ   sR    þÿ
ù
ÿÿzMySQLProtocol.parse_handshakec                 C   sB   t  |d¡\}}|dks"t d¡‚t j|dd�\}}|| d¡fS )z$Parse a MySQL AuthNextFactor packet.r   é   z.Failed parsing AuthNextFactor packet (invalid)r   rW   r]   )r
   Úread_intr	   r   ra   rb   )r   r;   Ústatusr&   r   r   r   Úparse_auth_next_factorô   s    ÿz$MySQLProtocol.parse_auth_next_factorc                 C   sÜ   |d dkst  d¡‚i }z t d|dd… ¡d |d< t |dd… ¡\}|d< t |¡\}|d	< t d
|dd… ¡\|d< |d< |dd… }|r¸t |¡\}|d< |d  d¡|d< W n tyÖ   t  d¡‚Y n0 |S )zParse a MySQL OK-packeté   r   z#Failed parsing OK packet (invalid).rT   rU   Zfield_countNZaffected_rowsZ	insert_idz<HHÚstatus_flagÚwarning_countZinfo_msgr]   zFailed parsing OK packet.)	r	   r   r$   r_   r
   Úread_lc_intÚread_lc_stringrb   Ú
ValueError)r   r;   Z	ok_packetr   r   r   Úparse_okÿ   s"    
ÿzMySQLProtocol.parse_okc              	   C   sD   zt  |dd… ¡d }|W S  tjtfy>   t d¡‚Y n0 dS )z=Parse a MySQL packet with the number of columns in result setrl   Nr   zFailed parsing column count)r
   ro   r$   Úerrorrq   r	   r   )r   r;   Úcountr   r   r   Úparse_column_count  s
    z MySQLProtocol.parse_column_countr]   c              	   C   sº   t  |dd… ¡\}}t  |¡\}}t  |¡\}}t  |¡\}}t  |¡\}}t  |¡\}}zt d|¡\}}}}}W n tjy”   t d¡‚Y n0 | |¡|dddd| tj	@ ||f	S )zParse a MySQL column-packetrl   Nz	<xHIBHBxxz!Failed parsing column information)
r
   rp   r$   r_   rs   r	   r   rb   r   ZNOT_NULL)r   r;   ÚencodingÚ_Únamer7   Zcolumn_typeÚflagsr   r   r   Úparse_column  s6    
úû
÷zMySQLProtocol.parse_columnc                 C   sŒ   |d dkr|   |¡S d}i }zt d|¡}W n tjyL   t |¡‚Y n0 |d dkrft|ƒdkspt |¡‚|d |d	< |d
 |d< |S )zParse a MySQL EOF-packetrl   r   zFailed parsing EOF packet.z<xxxBBHHr   éþ   é	   rh   rn   é   rm   )rr   r$   r_   rs   r	   r   r#   )r   r;   Úerr_msgre   Úunpackedr   r   r   Ú	parse_eof;  s    

zMySQLProtocol.parse_eofTc           	      C   sÎ   d}i }|r |dd…   d¡}n
|  d¡}|D ]š}zdd„ |  dd¡D ƒ\}}W n   t |¡‚Y n0 | d	¡}zt|ƒ||< W q.   zt| d	¡ƒ||< W n    t d
 |||¡¡‚Y n0 Y q.0 q.|S )zParse the statistics packetz)Failed getting COM_STATISTICS informationrl   Ns     c                 S   s   g | ]}|  ¡ ‘qS r   )Ústrip)r>   Úvr   r   r   rA   Z  r.   z2MySQLProtocol.parse_statistics.<locals>.<listcomp>ó   :rh   r]   z{0} ({1}:{2}).)Úsplitr	   r   rb   Úintr   r    )	r   r;   Zwith_headerÚerrmsgre   ÚpairsÚpairZlblÚvalr   r   r   Úparse_statisticsO  s*    

ÿzMySQLProtocol.parse_statisticsc           
      C   s  g }d}d}d}|s||kr �q|  ¡ }| d¡r–|dd… g}	|  ¡ }| d¡rn|	 |dd… ¡ |  ¡ }qH|	 |dd… ¡ t tdƒ |	¡¡}n>|d dkr¾|d dk r¾|  |¡}d}nd}t |dd… ¡}|du rð|durð| |¡ n|du �r|du �rt|ƒ‚|d7 }q||fS )	z¶Read MySQL text result

        Reads all or given number of rows from the socket.

        Returns a tuple with 2 elements: a list with all rows and
        the EOF packet.
        Nr   s   ÿÿÿrl   r.   r{   é   r   )	Úrecvrd   Úappendr
   Zread_lc_string_listÚ	bytearrayÚjoinr€   r   )
r   ÚsockÚversionrt   rP   ÚeofZrowdataÚir;   Zdatasr   r   r   Úread_text_resultj  s4    




zMySQLProtocol.read_text_resultc                 C   sž   |d t jkrd}d}nL|d t jkr0d}d}n4|d t jt jfv rNd}d}n|d t jkrdd}d}|d	 tj@ rz| ¡ }||d
… t	 
||d|… ¡d fS )z%Parse an integer from a binary packetr   ú<bú<hrh   ú<irl   ú<qr[   r‹   Nr   )r   ÚTINYÚSHORTÚINT24ÚLONGÚLONGLONGr   ZUNSIGNEDÚupperr$   r_   )r   r;   ÚfieldÚformat_Úlengthr   r   r   Ú_parse_binary_integer�  s    z#MySQLProtocol._parse_binary_integerc                 C   sD   |d t jkrd}d}nd}d}||d… t ||d|… ¡d fS )z)Parse a float/double from a binary packetr   r[   ú<drl   z<fNr   )r   ÚDOUBLEr$   r_   )r   r;   rŸ   r¡   r    r   r   r   Ú_parse_binary_float£  s    z!MySQLProtocol._parse_binary_floatr   c                 C   s    t  |¡\}}|t| |¡ƒfS )z(Parse a New Decimal from a binary packet)r
   rp   r   rb   )r   r;   r7   Úvaluer   r   r   Ú_parse_binary_new_decimal®  s    z'MySQLProtocol._parse_binary_new_decimalc              	   C   sÆ   |d }d}|dkrBt jt d|dd… ¡d |d |d d�}np|dkr²d}|d	krrt d
|d|d … ¡d }t j t d|dd… ¡d |d |d |d |d |d |d�}||d d… |fS )z&Parse a timestamp from a binary packetr   Nrl   rR   r   r}   )ÚyearÚmonthÚdayr‹   é   ú<Ir[   rU   é   )r¨   r©   rª   ÚhourÚminuteÚsecondÚmicrosecond)ÚdatetimeÚdater$   r_   )r   r;   rŸ   r¡   r¦   Úmcsr   r   r   Ú_parse_binary_timestamp³  s,    ýù	z%MySQLProtocol._parse_binary_timestampc                 C   sœ   |d }|d|d … }d}|dkr<t  d|dd… ¡d }t  d|dd… ¡d }|d dkrh|d9 }tj||d ||d	 |d d
�}||d d… |fS )z'Parse a time value from a binary packetr   r   r[   r¬   NrU   r\   r‹   r­   )ÚdaysÚsecondsÚmicrosecondsÚminutesÚhours)r$   r_   r²   Ú	timedelta)r   r;   rŸ   r¡   rM   r´   r¶   Útmpr   r   r   Ú_parse_binary_timeË  s    üz MySQLProtocol._parse_binary_timec           
      C   s   t |ƒd d d }dd„ |d|… D ƒ}||d… }g }t|ƒD �]R\}}|t|d d ƒ d|d d > @ r~| d¡ qBqB|d tjtjtjtjtj	fv rº|  
||¡\}}	| |	¡ qB|d tjtjfv rê|  ||¡\}}	| |	¡ qB|d tjk�r|  ||¡\}}	| |	¡ qB|d tjtjtjfv �rL|  ||¡\}}	| |	¡ qB|d tjk�rx|  ||¡\}}	| |	¡ qBt |¡\}}	| |	 |¡¡ qBt|ƒS )	z(Parse values from a binary result packetr‹   rh   r[   c                 S   s   g | ]}t |ƒ‘qS r   )r…   )r>   r“   r   r   r   rA   à  r.   z6MySQLProtocol._parse_binary_values.<locals>.<listcomp>r   Nr   )r#   Ú	enumerater…   r�   r   r™   rš   r›   rœ   r�   r¢   r¤   ÚFLOATr¥   Z
NEWDECIMALr§   ÚDATETIMEÚDATEÚ	TIMESTAMPrµ   ÚTIMEr½   r
   rp   rb   Útuple)
r   Úfieldsr;   r7   Znull_bitmap_lengthÚnull_bitmaprD   ÚposrŸ   r¦   r   r   r   Ú_parse_binary_valuesÝ  s>    $
þÿz"MySQLProtocol._parse_binary_valuesc           
      C   s´   g }d}d}d}|durq¬||kr$q¬|  ¡ }	|	d dkrH|  |	¡}d}n&|	d dkrnd}|  ||	dd… |¡}|du rŠ|durŠ| |¡ n|du r¢|du r¢t|	ƒ‚|d7 }q||fS )zwRead MySQL binary protocol result

        Reads all or given number of binary resultset rows from the socket.
        Nr   rl   r{   rU   r   )rŒ   r€   rÈ   r�   r   )
r   r�   Úcolumnsrt   r7   rP   r’   rD   r“   r;   r   r   r   Úread_binary_result   s*    

z MySQLProtocol.read_binary_resultc                 C   s¤   |d dkst  d¡‚i }zht |dd… d¡\}|d< t |d¡\}|d< t |d¡\}|d	< |d
d… }t |d¡\}|d< W n tyž   t  d¡‚Y n0 |S )z'Parse a MySQL Binary Protocol OK packetrl   r   zFailed parsing Binary OK packetrU   NrO   rh   Znum_columnsZ
num_paramsr   rn   )r	   r   r
   ri   rq   )r   r;   Zok_pktr   r   r   Úparse_binary_prepare_ok  s    
z%MySQLProtocol.parse_binary_prepare_okc                 C   s´   d}d}|dk rX|dkr$d}t j}q¢|dkr8d}t j}q¢|dkrLd}t j}q¢d	}t j}nJd
}|dkrpd}t j}n2|dkr„d}t j}n|dkr˜d}t j}n
t j}d}t ||¡||fS )z0Prepare an integer for the MySQL binary protocolNr   i€ÿÿÿr•   i €ÿÿr–   i   €r—   r˜   é€   éÿ   r   iÿÿ  rR   l   ÿÿ r¬   z<Q)r   r™   rš   rœ   r�   r$   r%   )r   r¦   Ú
field_typery   r    r   r   r   Ú_prepare_binary_integer-  s6    z%MySQLProtocol._prepare_binary_integerc                 C   s¼   t |tjƒrtj}nt |tjƒr(tj}ntdƒ‚t |j	¡t 
|j¡ t 
|j¡ }t |tjƒr¢|t 
|j¡ t 
|j¡ t 
|j¡ }|jdkr¢|t |j¡7 }t 
t|ƒ¡| }||fS )aƒ  Prepare a timestamp object for the MySQL binary protocol

        This method prepares a timestamp of type datetime.datetime or
        datetime.date for sending over the MySQL binary protocol.
        A tuple is returned with the prepared value and field type
        as elements.

        Raises ValueError when the argument value is of invalid type.

        Returns a tuple.
        z2Argument must a datetime.datetime or datetime.dater   )Ú
isinstancer²   r   rÀ   r³   rÁ   rq   r
   rH   r¨   rJ   r©   rª   r®   r¯   r°   r±   rG   r#   )r   r¦   rÎ   Úpackedr   r   r   Ú_prepare_binary_timestampN  s,    ÿ

ÿ
þ
ÿ
þ
z'MySQLProtocol._prepare_binary_timestampc           
      C   s  t |tjtjfƒstdƒ‚tj}d}d}d}t |tjƒrž|jdk rFd}t|j	dƒ\}}t|dƒ\}}	|t
 t|jƒ¡t
 |¡ t
 |¡ t
 |	¡ 7 }|j}n8|t
 d¡t
 |j¡ t
 |j¡ t
 |j¡ 7 }|j}|rè|t
 |¡7 }t
 |¡| }t
 t|ƒ¡| }||fS )a�  Prepare a time object for the MySQL binary protocol

        This method prepares a time object of type datetime.timedelta or
        datetime.time for sending over the MySQL binary protocol.
        A tuple is returned with the prepared value and field type
        as elements.

        Raises ValueError when the argument value is of invalid type.

        Returns a tuple.
        z3Argument must a datetime.timedelta or datetime.timer   Nr.   r   i  é<   )rÐ   r²   r»   Útimerq   r   rÃ   r¶   Údivmodr·   r
   rG   ÚabsrJ   r¸   r®   r¯   r°   r±   r#   )
r   r¦   rÎ   Únegativer´   rÑ   rº   Ú	remainderZminsZsecsr   r   r   Ú_prepare_binary_timep  sD    ÿ
ÿþý

ÿ
þ
ýz"MySQLProtocol._prepare_binary_timec                 C   s   t  |¡t  |¡ | }|S )zMPrepare long data for prepared statements

        Returns a string.
        rF   )r   Z	statementÚparamrM   r;   r   r   r   Ú_prepare_stmt_send_long_data�  s    ÿþÿz*MySQLProtocol._prepare_stmt_send_long_datar   c	              	   C   s  d}	dgt |ƒd d  }
g }g }d}t |ƒ}g }|s:|n|t }|dkrNd}|du rZi }|r”t|ƒ}|D ]\}}| |¡ qjdgt |ƒd d  }
|sž|�r:|t |ƒkr´t d	¡‚t|ƒD �]z\}}|| }d}|du �r|
|d   d|d > O  < | t t	j
¡t |¡ ¡ q¼�nÆ||v �rD|| d �r:t	j}nt	j}�nœt|tƒ�rn|  |¡\}}}| |¡ �nrt|tƒ�r¦| |¡}| t t |ƒ¡| ¡ t	j}�n:t|tƒ�rÔ| t t |ƒ¡| ¡ t	j}�nt|tƒ�r| t t t|ƒ |¡ƒ¡t|ƒ |¡ ¡ t	j}nÌt|tƒ�r:| t d
|¡¡ t	j}n¦t|tjtjfƒ�rh|  |¡\}}| |¡ nxt|tjtjfƒ�r–|   |¡\}}| |¡ nJ|�rÊt|ƒ |¡}| t t |ƒ¡| ¡ t	j}nt !dj"|j#j$d�¡‚| t |¡t |¡ ¡ |r¼|d |kr¼|||  d  |¡}| t t |ƒ¡| ¡ q¼t %|¡t |¡ t %|	¡ }|du�rp|t |ƒ }n|}|�r|du�r’|t |¡7 }|d &dd„ |
D ƒ¡t d¡ 7 }d}|D ]H}||7 }|du�rú|d |k�rò||||  7 }n|d7 }|d7 }�q¼|D ]}||7 }�q
|S )z6Make a MySQL packet with the Statement Execute commandr   r   r‹   r[   r.   Zutf8mb4r   NzTFailed executing prepared statement: data values does not match number of parametersr£   z:MySQL binary protocol can not handle '{classname}' objects)Ú	classnamec                 S   s   g | ]}t  d |¡‘qS )ÚB)r$   r%   )r>   Úbitr   r   r   rA     r.   z3MySQLProtocol.make_stmt_execute.<locals>.<listcomp>r   )'r#   r   Úlistr�   r	   r   r¾   r
   rJ   r   ZNULLZBLOBÚSTRINGrÐ   r…   rÏ   r!   r   Zlc_intZVARCHARÚbytesr   ZDECIMALÚfloatr$   r%   r¤   r²   r³   rÒ   r»   rÔ   rÙ   r1   r    Ú	__class__Ú__name__rG   r�   )r   rO   rM   Ú
parametersry   Zlong_data_usedr7   Zquery_attrsZconverter_str_fallbackZiteration_countrÆ   rD   ÚtypesrÑ   Údata_lenZquery_attr_namesrw   Zattr_valrÇ   r¦   Ú_flagsrÎ   rx   r;   Zparameter_countrt   Úa_typeZa_valuer   r   r   Úmake_stmt_execute¨  sà    
ÿ
ÿ

ÿ


ÿÿÿÿþÿÿÿÿþÿ

ÿÿ
zMySQLProtocol.make_stmt_executec                 C   sZ   |d dkst  d¡‚tj|dd… dd�\}}|rL|d d	krL|dd… }| d
¡|fS )z&Parse a MySQL AuthSwitchRequest-packetrl   r{   z'Failed parsing AuthSwitchRequest packetrU   Nr   rW   r\   r   r   )r	   r   r
   ra   rb   )r   r;   Zplugin_namer   r   r   Úparse_auth_switch_request   s    ÿz'MySQLProtocol.parse_auth_switch_requestc                 C   s"   |d dkst  d¡‚|dd… S )z!Parse a MySQL AuthMoreData-packetrl   r   z"Failed parsing AuthMoreData packetrU   N)r	   r   )r   r;   r   r   r   Úparse_auth_more_data,  s
    ÿz"MySQLProtocol.parse_auth_more_data)	NNNr+   r   r,   FNN)r+   r   r,   )N)r   )NNNr+   r   FNN)r]   )T)r   )r   )r]   )r   r]   )r   r   r   Nr   NF)#rä   Ú
__module__Ú__qualname__Ú__doc__r   r*   r<   r5   rI   rN   rQ   rS   rg   rk   rr   ru   rz   r€   rŠ   r”   r¢   r¥   r§   rµ   r½   rÈ   rÊ   rË   rÏ   rÒ   rÙ   rÛ   rê   rë   rì   r   r   r   r   r   .   sX       ý
(  ÿ


   þ
'0
 

%

#
!"-   þ
xr   )rï   r$   r²   Údecimalr   Ú	constantsr   r   r   r   r   r=   r	   r
   Zauthenticationr   r   r   r`   Úobjectr   r   r   r   r   Ú<module>   s   