
    -hB                     `   S r SSKrSSKrSSKJr  SSKJr  SSK	J
r
  SSK	Jr  SSK	Jr  SS	K	Jr  SS
K	Jr  SSK	Jr  SSK	Jr  SSK	Jr  SSK	Jr  SSK	Jr  SSK	Jr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKJr   " S S\R@                  5      r! " S S\!5      r" " S S\5      r# " S S \5      r$ " S! S"\R*                  RJ                  5      r& " S# S$\R*                  RN                  5      r( " S% S&\R*                  RR                  5      r* " S' S(\5      r+ " S) S*\5      r, " S+ S,\5      r- " S- S.\5      r. " S/ S0\R^                  5      r0 " S1 S2\Rb                  5      r2 " S3 S4\Rf                  5      r4 " S5 S6\Rj                  5      r6 " S7 S8\Rn                  5      r8 " S9 S:\Rr                  5      r: " S; S<\Rv                  5      r< " S= S>\5      r=\R|                  " 5       r? " S? S@\5      r@ " SA SB5      rA " SC SD\5      rB " SE SF\5      rC " SG SH\5      rD\DrEg)Ia	  
.. dialect:: postgresql+pg8000
    :name: pg8000
    :dbapi: pg8000
    :connectstring: postgresql+pg8000://user:password@host:port/dbname[?key=value&key=value...]
    :url: https://pypi.org/project/pg8000/

.. versionchanged:: 1.4  The pg8000 dialect has been updated for version
   1.16.6 and higher, and is again part of SQLAlchemy's continuous integration
   with full feature support.

.. _pg8000_unicode:

Unicode
-------

pg8000 will encode / decode string values between it and the server using the
PostgreSQL ``client_encoding`` parameter; by default this is the value in
the ``postgresql.conf`` file, which often defaults to ``SQL_ASCII``.
Typically, this can be changed to ``utf-8``, as a more useful default::

    #client_encoding = sql_ascii # actually, defaults to database
                                 # encoding
    client_encoding = utf8

The ``client_encoding`` can be overridden for a session by executing the SQL:

SET CLIENT_ENCODING TO 'utf8';

SQLAlchemy will execute this SQL on all new connections based on the value
passed to :func:`_sa.create_engine` using the ``client_encoding`` parameter::

    engine = create_engine(
        "postgresql+pg8000://user:pass@host/dbname", client_encoding='utf8')

.. _pg8000_ssl:

SSL Connections
---------------

pg8000 accepts a Python ``SSLContext`` object which may be specified using the
:paramref:`_sa.create_engine.connect_args` dictionary::

    import ssl
    ssl_context = ssl.create_default_context()
    engine = sa.create_engine(
        "postgresql+pg8000://scott:tiger@192.168.0.199/test",
        connect_args={"ssl_context": ssl_context},
    )

If the server uses an automatically-generated certificate that is self-signed
or does not match the host name (as seen from the client), it may also be
necessary to disable hostname checking::

    import ssl
    ssl_context = ssl.create_default_context()
    ssl_context.check_hostname = False
    ssl_context.verify_mode = ssl.CERT_NONE
    engine = sa.create_engine(
        "postgresql+pg8000://scott:tiger@192.168.0.199/test",
        connect_args={"ssl_context": ssl_context},
    )

.. _pg8000_isolation_level:

pg8000 Transaction Isolation Level
-------------------------------------

The pg8000 dialect offers the same isolation level settings as that
of the :ref:`psycopg2 <psycopg2_isolation_level>` dialect:

* ``READ COMMITTED``
* ``READ UNCOMMITTED``
* ``REPEATABLE READ``
* ``SERIALIZABLE``
* ``AUTOCOMMIT``

.. seealso::

    :ref:`postgresql_isolation_level`

    :ref:`psycopg2_isolation_level`


    N)UUID   )ARRAY
_ColonCast)_DECIMAL_TYPES)_FLOAT_TYPES)
_INT_TYPES)ENUMINTERVAL)
PGCompiler)	PGDialect)PGExecutionContext)PGIdentifierPreparerJSONJSONB)JSONPathType   )exc)
processors)types)util)quoted_namec                       \ rS rSrS rSrg)
_PGNumericv   c                    U R                   (       ag  U[        ;   a/  [        R                  " [        R
                  U R                  5      $ U[        ;   d
  U[        ;   a  g [        R                  " SU-  5      eU[        ;   a  g U[        ;   d
  U[        ;   a  [        R                  $ [        R                  " SU-  5      e)NzUnknown PG numeric type: %d)	asdecimalr	   r   to_decimal_processor_factorydecimalDecimal_effective_decimal_return_scaler   r
   r   InvalidRequestErrorto_floatselfdialectcoltypes      zC:\Users\ROHAN GUPTA\OneDrive\Desktop\mathbuddy-assessment\venv\Lib\site-packages\sqlalchemy/dialects/postgresql/pg8000.pyresult_processor_PGNumeric.result_processorw   s    >>,&!>>OOT%I%I  N*g.C--1G;  ,&N*g.C!***--1G;      N)__name__
__module____qualname____firstlineno__r-   __static_attributes__r0   r/   r,   r   r   v   s    r/   r   c                       \ rS rSrS rSrg)_PGNumericNoBind   c                     g Nr0   )r)   r*   s     r,   bind_processor_PGNumericNoBind.bind_processor       r/   r0   N)r1   r2   r3   r4   r;   r5   r0   r/   r,   r7   r7          r/   r7   c                        \ rS rSrS rS rSrg)_PGJSON   c                     g r:   r0   r(   s      r,   r-   _PGJSON.result_processor   r=   r/   c                     UR                   $ r:   r   r)   dbapis     r,   get_dbapi_type_PGJSON.get_dbapi_type       zzr/   r0   Nr1   r2   r3   r4   r-   rG   r5   r0   r/   r,   r@   r@      s    r/   r@   c                        \ rS rSrS rS rSrg)_PGJSONB   c                     g r:   r0   r(   s      r,   r-   _PGJSONB.result_processor   r=   r/   c                     UR                   $ r:   r   rE   s     r,   rG   _PGJSONB.get_dbapi_type   s    {{r/   r0   NrJ   r0   r/   r,   rL   rL      s    r/   rL   c                       \ rS rSrS rSrg)_PGJSONIndexType   c                     [        S5      e)Nzshould not be here)NotImplementedErrorrE   s     r,   rG   _PGJSONIndexType.get_dbapi_type   s    !"677r/   r0   Nr1   r2   r3   r4   rG   r5   r0   r/   r,   rS   rS      s    8r/   rS   c                       \ rS rSrS rSrg)_PGJSONIntIndexType   c                     UR                   $ r:   INTEGERrE   s     r,   rG   "_PGJSONIntIndexType.get_dbapi_type       }}r/   r0   NrX   r0   r/   r,   rZ   rZ          r/   rZ   c                       \ rS rSrS rSrg)_PGJSONStrIndexType   c                     UR                   $ r:   )STRINGrE   s     r,   rG   "_PGJSONStrIndexType.get_dbapi_type   s    ||r/   r0   NrX   r0   r/   r,   rc   rc      s    r/   rc   c                       \ rS rSrS rSrg)_PGJSONPathType   c                     g)Ni  r0   rE   s     r,   rG   _PGJSONPathType.get_dbapi_type   r=   r/   r0   NrX   r0   r/   r,   ri   ri      r>   r/   ri   c                        \ rS rSrS rS rSrg)_PGUUID   c                 0    U R                   (       d  S nU$ g )Nc                 "    U b  [        U 5      n U $ r:   )_python_UUIDvalues    r,   process'_PGUUID.bind_processor.<locals>.process   s    $(/Er/   as_uuid)r)   r*   ru   s      r,   r;   _PGUUID.bind_processor       ||
 N r/   c                 0    U R                   (       d  S nU$ g )Nc                 "    U b  [        U 5      n U $ r:   )strrs   s    r,   ru   )_PGUUID.result_processor.<locals>.process   s    $JEr/   rw   )r)   r*   r+   ru   s       r,   r-   _PGUUID.result_processor   rz   r/   r0   N)r1   r2   r3   r4   r;   r-   r5   r0   r/   r,   rn   rn      s    r/   rn   c                       \ rS rSrS rSrg)_PGEnum   c                     UR                   $ r:   )UNKNOWNrE   s     r,   rG   _PGEnum.get_dbapi_type   r`   r/   r0   NrX   r0   r/   r,   r   r      ra   r/   r   c                   *    \ rS rSrS r\S 5       rSrg)_PGInterval   c                     UR                   $ r:   r   rE   s     r,   rG   _PGInterval.get_dbapi_type       ~~r/   c                 (    [        UR                  S9$ )N)	precision)r   second_precision)clsintervalkws      r,   adapt_emulated_to_native$_PGInterval.adapt_emulated_to_native   s    X%>%>??r/   r0   N)r1   r2   r3   r4   rG   classmethodr   r5   r0   r/   r,   r   r      s     @ @r/   r   c                       \ rS rSrS rSrg)_PGTimeStamp   c                 (    U R                   (       a  gg)Ni  iZ  )timezonerE   s     r,   rG   _PGTimeStamp.get_dbapi_type   s    == r/   r0   NrX   r0   r/   r,   r   r      s    r/   r   c                       \ rS rSrS rSrg)_PGTime   c                     UR                   $ r:   )TIMErE   s     r,   rG   _PGTime.get_dbapi_type   rI   r/   r0   NrX   r0   r/   r,   r   r      s    r/   r   c                       \ rS rSrS rSrg)
_PGInteger   c                     UR                   $ r:   r]   rE   s     r,   rG   _PGInteger.get_dbapi_type   r`   r/   r0   NrX   r0   r/   r,   r   r      ra   r/   r   c                       \ rS rSrS rSrg)_PGSmallInteger   c                     UR                   $ r:   r]   rE   s     r,   rG   _PGSmallInteger.get_dbapi_type   r`   r/   r0   NrX   r0   r/   r,   r   r      ra   r/   r   c                       \ rS rSrS rSrg)_PGNullType   c                     UR                   $ r:   )NULLTYPErE   s     r,   rG   _PGNullType.get_dbapi_type   r   r/   r0   NrX   r0   r/   r,   r   r      s    r/   r   c                       \ rS rSrS rSrg)_PGBigInteger   c                     UR                   $ r:   )
BIGINTEGERrE   s     r,   rG   _PGBigInteger.get_dbapi_type   s    r/   r0   NrX   r0   r/   r,   r   r      s     r/   r   c                       \ rS rSrS rSrg)
_PGBoolean   c                     UR                   $ r:   )BOOLEANrE   s     r,   rG   _PGBoolean.get_dbapi_type  r`   r/   r0   NrX   r0   r/   r,   r   r      ra   r/   r   c                       \ rS rSrS rSrg)_PGARRAYi  c                     [        X5      $ r:   r   )r)   	bindvalues     r,   bind_expression_PGARRAY.bind_expression  s    )**r/   r0   N)r1   r2   r3   r4   r   r5   r0   r/   r,   r   r     s    +r/   r   c                        \ rS rSrS rS rSrg)PGExecutionContext_pg8000i  c                     S[        [        U 5      5      SS  < S[        [        5       5      SS  < 3n[        U R                  R                  5       U5      $ )Nc_   _)hexid_server_side_idServerSideCursor_dbapi_connectioncursor)r)   idents     r,   create_server_side_cursor3PGExecutionContext_pg8000.create_server_side_cursor  sF     D]12.O4E0Fqr0JK 6 6 = = ?GGr/   c                 (    U R                   (       d  g g r:   )compiledr)   s    r,   pre_exec"PGExecutionContext_pg8000.pre_exec  s    }} r/   r0   N)r1   r2   r3   r4   r   r   r5   r0   r/   r,   r   r     s    Hr/   r   c                       \ rS rSrSrS r\S 5       r\S 5       r\S 5       r	SS jr
S	 rS
 rSS jrS rS rS rSS jrSrg)r   i  Tc                     X l         Xl        g r:   )r   r   )r)   r   r   s      r,   __init__ServerSideCursor.__init__  s    
r/   c                 .    U R                   R                  $ r:   )r   
connectionr   s    r,   r   ServerSideCursor.connection  s    {{%%%r/   c                 .    U R                   R                  $ r:   )r   rowcountr   s    r,   r   ServerSideCursor.rowcount"  s    {{###r/   c                 .    U R                   R                  $ r:   )r   descriptionr   s    r,   r   ServerSideCursor.description&  s    {{&&&r/   Nc                 d    SU R                   -   S-   U-   nU R                  R                  XBUS9  U $ )NzDECLARE z NO SCROLL CURSOR FOR )stream)r   r   execute)r)   	operationargsr   ops        r,   r   ServerSideCursor.execute*  s7    $**$'??)KBV4r/   c                 <    U R                   R                  X5        U $ r:   )r   executemany)r)   r   
param_setss      r,   r   ServerSideCursor.executemany/  s    	6r/   c                     U R                   R                  SU R                  -   5        U R                   R                  5       $ )NzFETCH FORWARD 1 FROM )r   r   r   fetchoner   s    r,   r   ServerSideCursor.fetchone3  s1    3djj@A{{##%%r/   c                     Uc  U R                  5       $ U R                  R                  S[        [	        U5      5      -   S-   U R
                  -   5        U R                  R                  5       $ )NzFETCH FORWARD z FROM )fetchallr   r   r}   intr   )r)   nums     r,   	fetchmanyServerSideCursor.fetchmany7  sX    ;==?"KK 3s3x=08;djjH ;;''))r/   c                     U R                   R                  SU R                  -   5        U R                   R                  5       $ )NzFETCH FORWARD ALL FROM )r   r   r   r   r   s    r,   r   ServerSideCursor.fetchall@  s1    5

BC{{##%%r/   c                     U R                   R                  SU R                  -   5        U R                   R                  5         g )NzCLOSE )r   r   r   closer   s    r,   r   ServerSideCursor.closeD  s-    Htzz12r/   c                 6    U R                   R                  " U6   g r:   )r   setinputsizes)r)   sizess     r,   r   ServerSideCursor.setinputsizesH  s    !!5)r/   c                     g r:   r0   )r)   sizecolumns      r,   setoutputsizeServerSideCursor.setoutputsizeK  s    r/   )r   r   )r0   Nr:   )r1   r2   r3   r4   server_sider   propertyr   r   r   r   r   r   r   r   r   r   r  r5   r0   r/   r,   r   r     sp    K & & $ $ ' '
&*&*r/   r   c                       \ rS rSrS rSrg)PGCompiler_pg8000iO  c                 ~    U R                   " UR                  40 UD6S-   U R                   " UR                  40 UD6-   $ )Nz %% )ru   leftright)r)   binaryoperatorr   s       r,   visit_mod_binary"PGCompiler_pg8000.visit_mod_binaryP  s>    LL++ll6<<.2./	
r/   r0   N)r1   r2   r3   r4   r  r5   r0   r/   r,   r	  r	  O  s    
r/   r	  c                       \ rS rSrS rSrg)PGIdentifierPreparer_pg8000iX  c                 F    [         R                  " U /UQ70 UD6  SU l        g )NF)r   r   _double_percents)r)   r   kwargss      r,   r   $PGIdentifierPreparer_pg8000.__init__Y  s"    %%d<T<V< %r/   )r  N)r1   r2   r3   r4   r   r5   r0   r/   r,   r  r  X  s    &r/   r  c            
       <   \ rS rSrSrSrSrSrSrSr	\
r\r\rSrSrSr\R(                  " \R,                  0 \R0                  \_\R4                  \_\R8                  \_\R<                  \_\R@                  \!_\"\#_\R8                  RH                  \%_\R8                  RL                  \'_\R8                  RP                  \)_\R8                  RT                  \+_\,\-_\R\                  \/_\0\/_\Rb                  \2_\Rf                  \4_\Rj                  \6_\Rn                  \8_\Rr                  \:\Rv                  \<\Rz                  \>0E5      rSS jr?\R                  S 5       rA\BS 5       rCS	 rDS
 rES rFS rGS rHS rIS rJS rKS rLS rMS rN SS jrO SS jrPS rQS rRSrSg)PGDialect_pg8000i^  pg8000TformatNc                 t    [         R                  " U 40 UD6  Xl        U R                  S:  a  [	        S5      eg )N)r         z$pg8000 1.16.6 or greater is required)r   r   client_encoding_dbapi_versionrV   )r)   r  r  s      r,   r   PGDialect_pg8000.__init__  s:    4*6*.+%&LMM ,r/   c                    U R                   (       ai  [        U R                   S5      (       aN  [        [        R                  " SU R                   R
                  5       Vs/ s H  n[        U5      PM     sn5      $ gs  snf )N__version__z(\d+)(?:[-\.]?|$))c   r#  r#  )rF   hasattrtuplerefindallr"  r   )r)   xs     r,   r  PGDialect_pg8000._dbapi_version  sm    ::'$**m<<  ZZ,djj.D.D F   s   A<c                     [        S5      $ )Nr  )
__import__)r   s    r,   rF   PGDialect_pg8000.dbapi  s    (##r/   c                     UR                  SS9nSU;   a  [        US   5      US'   UR                  UR                  5        / U4$ )Nuser)usernameport)translate_connect_argsr   updatequery)r)   urloptss      r,   create_connect_args$PGDialect_pg8000.create_connect_args  sH    ))6):T>tF|,DLCIIDzr/   c                     [        XR                  R                  5      (       a  S[        U5      ;   a  gS[        U5      ;   $ )Nznetwork errorTzconnection is closed)
isinstancerF   InterfaceErrorr}   )r)   er   r   s       r,   is_disconnectPGDialect_pg8000.is_disconnect  s?    a22333L
 9
  &Q//r/   c           
         UR                  SS5      n[        US5      (       a  UR                  nUS:X  a  SUl        g X R                  ;   aM  SUl        UR                  5       nUR                  SU-  5        UR                  S5        UR                  5         g [        R                  " S	U< S
U R                  < SSR                  U R                  5      < S35      e)Nr    dbapi_connection
AUTOCOMMITTFz=SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL %sCOMMITzInvalid value 'z2' for isolation_level. Valid isolation levels for z are z, z or AUTOCOMMIT)replacer$  r@  
autocommit_isolation_lookupr   r   r   r   ArgumentErrornamejoin)r)   r   levelr   s       r,   set_isolation_level$PGDialect_pg8000.set_isolation_level  s    c3' :122#44JL $(J!,,,$)J!&&(FNN%',- NN8$LLN## $))TYYt/E/E%FH r/   c                     UR                  5       n UR                  SU(       a  SOS-  5        UR                  S5        UR                  5         g ! UR                  5         f = f)N-SET SESSION CHARACTERISTICS AS TRANSACTION %sz	READ ONLYz
READ WRITErB  r   r   r   r)   r   rt   r   s       r,   set_readonlyPGDialect_pg8000.set_readonly  sQ    ""$	NN?"';\; NN8$LLNFLLN   .A A#c                     UR                  5       n UR                  S5        UR                  5       S   nUR                  5         US:H  $ ! UR                  5         f = f)Nzshow transaction_read_onlyr   onr   r   r   r   r)   r   r   vals       r,   get_readonlyPGDialect_pg8000.get_readonly  sS    ""$	NN78//#A&CLLNd{ LLN   $A Ac                     UR                  5       n UR                  SU(       a  SOS-  5        UR                  S5        UR                  5         g ! UR                  5         f = f)NrM  
DEFERRABLEzNOT DEFERRABLErB  rN  rO  s       r,   set_deferrablePGDialect_pg8000.set_deferrable  sS    ""$	NN?#(<.>@ NN8$LLNFLLNrR  c                     UR                  5       n UR                  S5        UR                  5       S   nUR                  5         US:H  $ ! UR                  5         f = f)Nzshow transaction_deferrabler   rT  rU  rV  s       r,   get_deferrablePGDialect_pg8000.get_deferrable  sS    ""$	NN89//#A&CLLNd{ LLNrZ  c                     [        US5      (       a  UR                  nUR                  5       nUR                  SU-   S-   5        UR                  S5        UR	                  5         g )Nr@  zSET CLIENT_ENCODING TO ''rB  )r$  r@  r   r   r   )r)   r   r  r   s       r,   set_client_encoding$PGDialect_pg8000.set_client_encoding  sU    :122#44J""$1OCcIJx r/   c                     U R                   (       a'  UR                  " U VVVs/ s H  u  pEoePM	     snnn6   g UR                  " S0 U VVVs0 s H  u  pEnU(       d  M  XE_M     snnnD6  g s  snnnf s  snnnf )Nr0   )
positionalr   )r)   r   list_of_tuplescontextkeydbtypesqltypes          r,   do_set_input_sizes#PGDialect_pg8000.do_set_input_sizes  sw    ??  5CD^1S'&^D     1?0>,W  CK0> Es   A-A4A4c                 @    UR                   R                  SUS45        g Nr    )r   	tpc_beginr)   r   xids      r,   do_begin_twophase"PGDialect_pg8000.do_begin_twophase  s    ''C5r/   c                 8    UR                   R                  5         g r:   )r   tpc_preparers  s      r,   do_prepare_twophase$PGDialect_pg8000.do_prepare_twophase  s    ))+r/   c                 @    UR                   R                  SUS45        g rp  )r   tpc_rollbackr)   r   rt  is_preparedrecovers        r,   do_rollback_twophase%PGDialect_pg8000.do_rollback_twophase  s     	**AsB<8r/   c                 @    UR                   R                  SUS45        g rp  )r   
tpc_commitr}  s        r,   do_commit_twophase#PGDialect_pg8000.do_commit_twophase  s     	((!S"6r/   c                 f    UR                   R                  5        Vs/ s H  o"S   PM	     sn$ s  snf )Nr   )r   tpc_recover)r)   r   rows      r,   do_recover_twophase$PGDialect_pg8000.do_recover_twophase#  s-    ","7"7"C"C"EF"E3A"EFFFs   .c                 B  ^ ^ / mS nTR                  U5        T R                  b  U 4S jnTR                  U5        T R                  b  U 4S jnTR                  U5        T R                  (       a  U 4S jnTR                  U5        [	        T5      S:  a  U4S jnU$ g )Nc                 `    U R                   [        R                     U R                   [        '   g r:   )py_typesr   	text_typer   )conns    r,   
on_connect/PGDialect_pg8000.on_connect.<locals>.on_connect)  s    )-t~~)FDMM+&r/   c                 >   > TR                  U TR                  5        g r:   )rd  r  r  r)   s    r,   r  r  0      ((t/C/CDr/   c                 >   > TR                  U TR                  5        g r:   )rJ  isolation_levelr  s    r,   r  r  7  r  r/   c                 v   > U R                  STR                  5        U R                  STR                  5        g )Nr   i  )register_in_adapter_json_deserializerr  s    r,   r  r  >  s1    ((d.E.EF ((t/F/FGr/   r   c                 (   > T H  nU" U 5        M     g r:   r0   )r  fnfnss     r,   r  r  I  s    BtH r/   )appendr  r  r  len)r)   r  r  s   ` @r,   r  PGDialect_pg8000.on_connect&  s    	G 	

:+E JJz"+E JJz"""H JJz"s8a< r/   )r  r:   )TF)Tr1   r2   r3   r4   driversupports_statement_cachesupports_unicode_statementssupports_unicode_bindsdefault_paramstylesupports_sane_multi_rowcountr   execution_ctx_clsr	  statement_compilerr  preparersupports_server_side_cursorsuse_setinputsizesdescription_encodingr   update_copyr   colspecssqltypesNumericr7   Floatr   r   r@   Booleanr   NullTyper   r   rL   r   ri   JSONIndexTyperS   JSONIntIndexTyperZ   JSONStrIndexTyperc   r   rn   Intervalr   r   DateTimer   Timer   Integerr   SmallIntegerr   
BigIntegerr   Enumr   r   r   r   memoized_propertyr  r   rF   r6  r<  rJ  rP  rX  r]  r`  rd  rm  ru  ry  r  r  r  r  r5   r0   r/   r,   r  r  ^  sB   F#"&!!#' 1**H#'    	
.	
NNJ	
 MM7	
 j		

 {	
 8	
 MM&&	
 MM'')9	
 MM**,?	
 MM**,?	
 '	
 {	
 k	
 |	
 MM7	
  j!	
" !!?#	
$ MM7NNH)	
H4N 
    $ $02		6, :?9 :?7
G)r/   r  )F__doc__r#   r&  uuidr   rr   arrayr   PGARRAYbaser   r   r	   r
   r   r   r   r   r   r   jsonr   r   r   rq  r   r   r   r  r   sql.elementsr   r  r   r7   r@   rL   r  rS   r  rZ   r  rc   ri   rn   r   r   r  r   r  r   r  r   r  r   r  r   r  r   r  r   r   counterr   r   r   r	  r  r  r*   r0   r/   r,   <module>r     s  Tj  	 % #          $ &       !  '!! 4z 
d u 8x}}22 8
(--88 
(--88 
l 
d ,d 
@( @8$$ hmm 
!! 
h++ 
(## 
 H''  
!! 
+w +
 ,,. 2 5 5p

 
&"6 &qy qh r/   