
    g_                        d Z ddlZddlmZmZ ddlmZmZmZmZm	Z	m
Z
mZmZ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 dd	lmZmZ dd
lmZ ddlmZ 	 ddlZ ddl!m"Z" ddl#m$Z$ ddl%m&Z& ddlm'Z'm(Z(m)Z) n# e*$ rZ+ ede+           e+dZ+[+ww xY w	 ddl,m-Z- dZ.n# e*$ r dZ.Y nw xY wddl/m0Z0 ddl1m2Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8 ddl9m:Z: ddl;m<Z< e j=        j>        Z>e j=        j?        Z?e j=        j@        Z@e j=        jA        ZAe j=        jB        ZBerddlCmDZDmEZE dede)fdZF G d  d!          ZG G d" d#e          ZH G d$ d%e"          ZIdS )&a  Django database Backend using MySQL Connector/Python.

This Django database backend is heavily based on the MySQL backend from Django.

Changes include:
* Support for microseconds (MySQL 5.6.3 and later)
* Using INFORMATION_SCHEMA where possible
* Using new defaults for, for example SQL_AUTO_IS_NULL

Requires and comes with MySQL Connector/Python v8.0.22 and later:
    http://dev.mysql.com/downloads/connector/python/
    N)datetimetime)TYPE_CHECKINGAnyDict	GeneratorIteratorListOptionalSequenceSetTupleUnion)settings)ImproperlyConfigured)IntegrityError)BaseDatabaseWrapper)	dateparsetimezone)cached_property)MySQLConvertibleType)MySQLConverter)
HexLiteral)PooledMySQLConnection)ParamsSequenceOrDictTypeRowType
StrOrBytesz&Error loading mysql.connector module: )datetime_to_mysqlTF   )DatabaseClient)DatabaseCreation)DatabaseFeatures)DatabaseIntrospection)DatabaseOperations)DatabaseSchemaEditor)DatabaseValidation)MySQLConnectionAbstractMySQLCursorAbstractvaluereturnc                    t           j        rt          j        |           rFt	          j        d|  dt                     t          j                    }t          j        | |          } | 	                    t          j
                                      d          } t          rt          |           }|S |                     d          S )zDEquivalent to DateTimeField.get_db_prep_value. Used only by raw SQL.z!MySQL received a naive datetime (z$) while time zone support is active.N)tzinfoz%Y-%m-%d %H:%M:%S.%f)r   USE_TZr   is_naivewarningswarnRuntimeWarningget_default_timezone
make_aware
astimezoneutcreplace	HAVE_CEXTr   strftime)r)   default_timezonemysql_datetimes      g/var/www/html/nodeJS/PythonScripts/venv3.11/lib/python3.11/site-packages/mysql/connector/django/base.py$adapt_datetime_with_timezone_supportr<   i   s     
U## 	AM6E 6 6 6  
  (<>>'/?@@E  ..66 7 
 
   1% 8 8>>0111    c            
          e Zd ZdZdZddZedeee	f         deee	f         fd	            Z
edeee	                  deee	                  fd
            Z	 ddedeeee	         eee	f         f                  deed                  fdZdedeeee	         eee	f         f                  deed                  fdZdedefdZdee         fdZdS )CursorWrapperzWrapper around MySQL Connector/Python's cursor class.

    The cursor class is defined by the options passed to MySQL
    Connector/Python. If buffered option is True in those options,
    MySQLCursorBuffered will be used.
    )i  i  i  i  cursorr(   r*   Nc                     || _         d S N)r@   selfr@   s     r;   __init__zCursorWrapper.__init__   s    -3r=   argsc                     | s| S t          |           }|                                 D ],\  }}t          |t                    rt	          |          ||<   -|S rB   )dictitems
isinstancer   r<   )rF   new_argskeyr)   s       r;   _adapt_execute_args_dictz&CursorWrapper._adapt_execute_args_dict   sc      	K::**,, 	L 	LJC%** L DU K Kr=   c                     | s| S t          |           }t          |           D ],\  }}t          |t                    rt	          |          ||<   -t          |          S rB   )list	enumeraterJ   r   r<   tuple)rF   rK   iargs       r;   _adapt_execute_argsz!CursorWrapper._adapt_execute_args   sh      	K::oo 	H 	HFAs#x(( HB3GGXr=   query)r(   NNc                 X   d}t          |t                    r|                     |          }n|                     |          }	 | j                            ||          S # t          j        j        $ r6}|j	        d         | j
        v rt          t          |j	                   d d}~ww xY w)zExecutes the given operation

        This wrapper method around the execute()-method of the cursor is
        mainly needed to re-raise using different exceptions.
        Nr   )rJ   rH   rM   rT   r@   executemysql	connectorOperationalErrorrF   codes_for_integrityerrorr   rQ   )rD   rU   rF   rK   excs        r;   rW   zCursorWrapper.execute   s     8<dD!! 	644T::HH//55H	;&&uh777/ 	 	 	x{d;;;$eCHoo6D@	s   A B)31B$$B)c                     	 | j                             ||          S # t          j        j        $ r6}|j        d         | j        v rt          t          |j                   d d}~ww xY w)zExecutes the given operation

        This wrapper method around the executemany()-method of the cursor is
        mainly needed to re-raise using different exceptions.
        r   N)	r@   executemanyrX   rY   rZ   rF   r[   r   rQ   )rD   rU   rF   r\   s       r;   r^   zCursorWrapper.executemany   so    	;**5$777/ 	 	 	x{d;;;$eCHoo6D@	s    A'1A""A'attrc                 ,    t          | j        |          S )z%Return an attribute of wrapped cursor)getattrr@   rD   r_   s     r;   __getattr__zCursorWrapper.__getattr__   s    t{D)))r=   c                 *    t          | j                  S )z&Return an iterator over wrapped cursor)iterr@   rD   s    r;   __iter__zCursorWrapper.__iter__   s    DK   r=   )r@   r(   r*   NrB   )__name__
__module____qualname____doc__r[   rE   staticmethodr   strr   rM   r   r   rT   r   r   rW   r^   r   rc   r	   r   rg    r=   r;   r?   r?   ~   s         4 4 4 4 
3,,-
	c''	(
 
 
 \
 
x 456
	(/0	1
 
 
 \
"   (/0$s<P7P2QQR
 
)=>	?   0 (/0$s<P7P2QQR
 
)=>	?   &* * * * * *!(7+ ! ! ! ! ! !r=   r?   c                   ,    e Zd ZU dZdZi ddddddd	d
ddddddddddddddddddddddddd d!d
dd"d#d$dd%d&d'd(d)d*Zd+Zd,d-d.d-d/d0d1d2d3d4d.d.d-d-d5Zd6Zd7d8d9d:d;d<d=Z	d>Z
ee         ed?<   h d@Zej        ZeZeZeZeZeZeZeZdAe dBe dCd>f fdDZ!dEedCe"fdFZ#dCe$ee f         fdGZ%dHe$ee f         dCe&e'dIf         fdJZ(d^dKZ)d_dLe dCe*fdMZ+d^dNZ,dOe"dCd>fdPZ-dCe"fdQZ.d^dRZ/d_dSee0e                  dCd>fdTZ1dCe"fdUZ2e3e4dCefdV                        Z5e3dCe$eef         fdW            Z6e3dCe$ee f         fdX            Z7e3dCe fdY            Z8e3dCe9e:dZf         fd[            Z;e3dCe<e         fd\            Z=e>dCe"fd]            Z? xZ@S )`DatabaseWrapperz Represent a database connection.rX   	AutoFieldzinteger AUTO_INCREMENTBigAutoFieldzbigint AUTO_INCREMENTBinaryFieldlongblobBooleanFieldbool	CharFieldzvarchar(%(max_length)s)	DateFielddateDateTimeFieldzdatetime(6)DecimalFieldz+numeric(%(max_digits)s, %(decimal_places)s)DurationFieldbigint	FileFieldFilePathField
FloatFieldzdouble precisionIntegerFieldintegerBigIntegerFieldIPAddressFieldzchar(15)GenericIPAddressFieldzchar(39)	JSONFieldjsonzbigint UNSIGNEDzinteger UNSIGNEDzsmallint UNSIGNEDzsmallint AUTO_INCREMENTsmallintlongtextztime(6)zchar(32))NullBooleanFieldOneToOneFieldPositiveBigIntegerFieldPositiveIntegerFieldPositiveSmallIntegerField	SlugFieldSmallAutoFieldSmallIntegerField	TextField	TimeField	UUIDField)	tinyblobblob
mediumblobrt   tinytexttext
mediumtextr   r   z= %szLIKE %szLIKE BINARY %szREGEXP BINARY %sz	REGEXP %sz> %sz>= %sz< %sz<= %s)exactiexactcontains	icontainsregexiregexgtgteltlte
startswithendswithistartswith	iendswithzCREPLACE(REPLACE(REPLACE({}, '\\', '\\\\'), '%%', '\%%'), '_', '\_')z"LIKE BINARY CONCAT('%%', {}, '%%')zLIKE CONCAT('%%', {}, '%%')zLIKE BINARY CONCAT({}, '%%')zLIKE CONCAT({}, '%%')zLIKE BINARY CONCAT('%%', {})zLIKE CONCAT('%%', {}))r   r   r   r   r   r   Nisolation_level>   read committedrepeatable readread uncommittedserializablerF   kwargsr*   c                     t                      j        |i | | j                            d          }|rq|                    dt                     | _        |                    dt                    }t          |t                    st          d           |            | _	        d S t                      | _	        t           | _        d S )NOPTIONSuse_pureconverter_classzXConverter class should be a subclass of mysql.connector.django.base.DjangoMySQLConverter)
superrE   settings_dictgetr7   	_use_pureDjangoMySQLConverter
issubclassProgrammingError	converter)rD   rF   r   optionsr   	__class__s        r;   rE   zDatabaseWrapper.__init__K  s    $)&)))$((33 	+$[[]CCDN%kk!$ O o/CDD &G   -_..DNNN133DN!*]DNNNr=   r_   c                 >    |                     d          rdS t          )Nmysql_isF)r   AttributeErrorrb   s     r;   rc   zDatabaseWrapper.__getattr___  s!    ??:&& 	5r=   c                    ddddd}| j         }|d         r|d         |d<   |d         r|d         |d<   |d	         r|d	         |d
<   |d                             d          r|d         |d<   n|d         r|d         |d<   |d         rt          |d                   |d<   |                    di                               d          r|d         d         |d<   t          j        |d<   t          j        j        j	        j
        g|d<   	 |d                                         }|                    dd           }|rd|                                }|| j        vrGd                    d t!          | j                  D                       }t#          d| d| d          || _        |                    |           n# t(          $ r Y nw xY w|S )Nutf8TF)charsetuse_unicodebufferedconsume_resultsUSERuserNAMEdatabasePASSWORDpasswdHOST/unix_sockethostPORTportr   init_commandraise_on_warningsclient_flagsr   z, c              3   "   K   | ]
}d | d V  dS )'Nrn   ).0levels     r;   	<genexpr>z8DatabaseWrapper.get_connection_params.<locals>.<genexpr>  s;       - -).E- - - - - -r=   z%Invalid transaction isolation level 'z' specified.
Use one of z
, or None.)r   r   intr   r   DEBUGrX   rY   	constants
ClientFlag
FOUND_ROWScopypoplowerisolation_levelsjoinsortedr   r   updateKeyError)rD   r   r   r   r   valid_levelss         r;   get_connection_paramsz%DatabaseWrapper.get_connection_paramsd  s[   #	
 
 *  	3*62F6N  	7!.v!6F:$ 	9,Z8F8 ++C00 	3$1&$9F=!!6" 	3*62F6N  	8 v!677F6NY++//?? 	N%29%=n%MF>" '/n"# O%0;"
~
	#I.3355G%kk*;TBBO 	"1"7"7"9"9"$*???#'99 - -289N2O2O- - - $ $L /K K K2>K K K   $3D MM'"""" 	 	 	D	 s   B2F> >
G
Gconn_paramsr'   c                 N    d|vr
t           |d<   t          j        j        di |}|S )Nr   rn   )r   rX   rY   connect)rD   r   cnxs      r;   get_new_connectionz"DatabaseWrapper.get_new_connection  s7     K//-AK)*o%4444
r=   c                    g }| j         j        r|                    d           | j        r/|                    d| j                                                    |rT|                                 5 }|                    d                    |                     d d d            n# 1 swxY w Y   d| j        v rT	 | 	                    | j        d                    d S # t          $ r$ |                     | j        d                    Y d S w xY wd S )NzSET SQL_AUTO_IS_NULL = 0z(SET SESSION TRANSACTION ISOLATION LEVEL z; 
AUTOCOMMIT)featuresis_sql_auto_is_null_enabledappendr   upperr@   rW   r   r   set_autocommitr   _set_autocommit)rD   assignmentsr@   s      r;   init_connection_statez%DatabaseWrapper.init_connection_state  s{   =4 	;
 9::: 	2'--//2 2  
  	7 7&tyy556667 7 7 7 7 7 7 7 7 7 7 7 7 7 7 4---G##D$6|$DEEEEE! G G G$$T%7%EFFFFFFG .-s$   0)B%%B),B): C *D
	D
namec                 R    | j                                         }t          |          S rB   )
connectionr@   r?   )rD   r   r@   s      r;   create_cursorzDatabaseWrapper.create_cursor  s#    ''))V$$$r=   c                 R    	 t          j        |            d S # t          $ r Y d S w xY wrB   )r   	_rollbackNotSupportedErrorrf   s    r;   r   zDatabaseWrapper._rollback  s@    	)$/////  	 	 	DD	s    
&&
autocommitc                 ^    | j         5  || j        _        d d d            d S # 1 swxY w Y   d S rB   )wrap_database_errorsr   r   )rD   r   s     r;   r   zDatabaseWrapper._set_autocommit  sy    & 	4 	4)3DO&	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4 	4s   "&&c                     |                                  5 }|                    d           ddd           n# 1 swxY w Y   dS )z
        Disable foreign key checks, primarily for use in adding rows with
        forward references. Always return True to indicate constraint checks
        need to be re-enabled.
        zSET foreign_key_checks=0NT)r@   rW   rC   s     r;   disable_constraint_checkingz+DatabaseWrapper.disable_constraint_checking  s|     [[]] 	7fNN5666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7ts   7;;c                     d| j         c| _         }	 |                                 5 }|                    d           ddd           n# 1 swxY w Y   || _         dS # || _         w xY w)zM
        Re-enable foreign key checks after they have been disabled.
        FzSET foreign_key_checks=1N)needs_rollbackr@   rW   )rD   r  r@   s      r;   enable_constraint_checkingz*DatabaseWrapper.enable_constraint_checking  s     /4T5H+^	1 ;&9:::; ; ; ; ; ; ; ; ; ; ; ; ; ; ; #1D.D0000s-   A AA AA AA 	A$table_namesc                    |                                  5 }|| j                            |          }|D ]}| j                            ||          }|s | j                            ||          }|D ]{\  }}}|                    d| d| d| d| d| d| d| d	| d
           |                                D ]2}	t          d| d|	d          d| d| d|	d          d| d| d          |	 ddd           dS # 1 swxY w Y   dS )a]  
        Check each table name in `table_names` for rows with invalid foreign
        key references. This method is intended to be used in conjunction with
        `disable_constraint_checking()` and `enable_constraint_checking()`, to
        determine if rows with invalid references were entered while constraint
        checks were off.
        Nz+
                        SELECT REFERRING.`z&`,
                        REFERRING.`z `
                        FROM `z2` as REFERRING
                        LEFT JOIN `zR` as REFERRED
                        ON (
                            REFERRING.`z*` =
                            REFERRED.`zE`
                        )
                        WHERE REFERRING.`z4` IS NOT NULL
                        AND REFERRED.`z"` IS NULL
                        zThe row in table 'z' with primary key 'r   z' has an invalid foreign key: .z contains a value 'r   z.' that does not have a corresponding value in )r@   introspectionr  get_primary_key_columnget_key_columnsrW   fetchallr   )
rD   r  r@   
table_nameprimary_key_column_namekey_columnscolumn_namereferenced_table_namereferenced_column_namebad_rows
             r;   check_constraintsz!DatabaseWrapper.check_constraints  sE    [[]] (	f""0<<VDD) % %
*.*<*S*SJ+ +' / "0@@J  !	  )*NN+B $/   *  %:	  )4  (>  +6  (>     $*??#4#4 	 	,9 9 9$+AJ9 9)9 9,79 9 !(
9 9
  59 9  69 9 9  	'%(	 (	 (	 (	 (	 (	 (	 (	 (	 (	 (	 (	 (	 (	 (	 (	 (	 (	s   CC<<D D c                 ^    	 | j                                          n# t          $ r Y dS w xY wdS )NFT)r   pingErrorrf   s    r;   	is_usablezDatabaseWrapper.is_usable  sE    	O  """" 	 	 	55	ts    
**c                      dS )zDisplay name.MySQLrn   rn   r=   r;   display_namezDatabaseWrapper.display_name  s	     wr=   c                 .    | j         j        rdddd}|S i S )z<Mapping of Field objects to their SQL for CHECK constraints.z`%(column)s` >= 0)r   r   r   )r   !supports_column_check_constraints)rD   r  s     r;   data_type_check_constraintsz+DatabaseWrapper.data_type_check_constraints  s4     =: 	%+>(;-@! !
 %$	r=   c           	      T   |                                  5 }|                    d           |                                }ddd           n# 1 swxY w Y   |d         |d         |d         t          |d                   t          |d                   t          |d                   d	S )
zReturn MySQL server data.a2  
                SELECT VERSION(),
                       @@sql_mode,
                       @@default_storage_engine,
                       @@sql_auto_is_null,
                       @@lower_case_table_names,
                       CONVERT_TZ('2001-01-01 01:00:00', 'UTC', 'UTC') IS NOT NULL
            Nr   r               )versionsql_modedefault_storage_enginesql_auto_is_nulllower_case_table_nameshas_zoneinfo_database)temporary_connectionrW   fetchonerv   )rD   r@   rows      r;   mysql_server_dataz!DatabaseWrapper.mysql_server_data+  s     &&(( 	$F NN	 	 	 //##C	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$  1vA&)!f $SV&*3q6ll%)#a&\\
 
 	
   *AAAc                     |                                  5 }|                    d           |                                d         cddd           S # 1 swxY w Y   dS )Return MySQL version.zSELECT VERSION()r   N)r+  rW   r,  rC   s     r;   mysql_server_infoz!DatabaseWrapper.mysql_server_infoF  s     &&(( 	(FNN-...??$$Q'	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(s   /AAA.c                     |                                  }t          j        j        di |5 }|                                }ddd           n# 1 swxY w Y   |S )r1  Nrn   )r   rX   rY   r   get_server_version)rD   configconnserver_versions       r;   mysql_versionzDatabaseWrapper.mysql_versionM  s     ++--_$..v.. 	H$.2.E.E.G.GN	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	Hs   AAAc                    |                                  5 }|                    d           |                                }ddd           n# 1 swxY w Y   t          |r|d                             d          nd          S )zReturn SQL mode.zSELECT @@sql_modeNr   ,rn   )r@   rW   r,  setsplit)rD   r@   r&  s      r;   r&  zDatabaseWrapper.sql_modeU  s     [[]] 	)fNN.///((H	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) X=8A;$$S)))2>>>r/  c                     | j         }|S )z1Return True if pure Python version is being used.)r   )rD   anss     r;   r   zDatabaseWrapper.use_pure]  s     N
r=   )r*   NrB   )Arh   ri   rj   rk   vendor
data_types_limited_data_types	operatorspattern_escpattern_opsr   r   rm   __annotations__r   rX   rY   Databaser%   SchemaEditorClassr    client_classr!   creation_classr"   features_classr#   introspection_classr$   	ops_classr&   validation_classr   rE   rv   rc   r   r   r   r   r   r   r?   r   r   r   r  r  r
   r  r  r   rl   r  r  r.  r2  r   r   r8  r   r&  propertyr   __classcell__)r   s   @r;   rp   rp      s        **F
-/ 	z 		
 	. 	V 	 	E 	 	. 	2 	( 		 	8 	*  	 !" 	V#$ #"#4 2%8.3'9  JH
 $#&$  I2 YK824.2, K &*OXc])))   H,!L%N%N/"I)+c +S +T + + + + + +(     
3tCH~ 3 3 3 3jS>	$&??	@   G G G G2% %# % % % % %   4$ 44 4 4 4 4T    1 1 1 10 0Xd3i-@ 0D 0 0 0 0d4     #    \ _ 	T#s(^ 	 	 	 _	 
4S> 
 
 
 _
4 (3 ( ( ( _( uS#X    _ ?#c( ? ? ? _? $    X    r=   rp   c            	           e Zd ZdZeddededee         fd            Z	eddededee
         fd            Zdedeeef         fdZdedeeef         fd	Zdedefd
ZdS )r   zCustom converter for Django.Nr)   dscr*   c                 P    t          j        |                     d                    S )zXReturn MySQL TIME data type as datetime.time()

        Returns datetime.time()
        zutf-8)r   
parse_timedecoder)   rQ  s     r;   _time_to_pythonz$DjangoMySQLConverter._time_to_pythoni  s!     #ELL$9$9:::r=   c                 2    | rt          j        |           ndS )ao  Connector/Python always returns naive datetime.datetime

        Connector/Python always returns naive timestamps since MySQL has
        no time zone support.

        - A naive datetime is a datetime that doesn't know its own timezone.

        Django needs a non-naive datetime, but in this method we don't need
        to make a datetime value time zone aware since Django itself at some
        point will make it aware (at least in versions 3.2.16 and 4.1.2) when
        USE_TZ=True. This may change in a future release, we need to keep an
        eye on this behaviour.

        Returns datetime.datetime()
        N)r   _datetime_to_pythonrU  s     r;   rX  z(DjangoMySQLConverter._datetime_to_pythonq  s     " =BK~1%888tKr=   c                 ,    |                      |          S rB   _str_to_mysqlrD   r)   s     r;   _safestring_to_mysqlz)DjangoMySQLConverter._safestring_to_mysql      !!%(((r=   c                 ,    |                      |          S rB   rZ  r\  s     r;   _safetext_to_mysqlz'DjangoMySQLConverter._safetext_to_mysql  r^  r=   c                 ,    |                      |          S rB   )_bytes_to_mysqlr\  s     r;   _safebytes_to_mysqlz(DjangoMySQLConverter._safebytes_to_mysql  s    ##E***r=   rB   )rh   ri   rj   rk   rl   bytesr   r   r   rV  r   rX  rm   r   r   r]  r`  rc  rn   r=   r;   r   r   d  s       && ; ;u ;3 ;(4. ; ; ; \; L L5 Ls Lhx>P L L L \L()# )%z8I2J ) ) ) )) )eZ6G0H ) ) ) )+ +5 + + + + + +r=   r   )Jrk   r/   r   r   typingr   r   r   r   r	   r
   r   r   r   r   r   django.confr   django.core.exceptionsr   	django.dbr   django.db.backends.base.baser   django.utilsr   r   django.utils.functionalr   mysql.connector.typesr   mysql.connectorrX   mysql.connector.conversionr   mysql.connector.custom_typesr   mysql.connector.poolingr   r   r   r   ImportErrorerr_mysql_connectorr   r7   clientr    creationr!   r   r"   r
  r#   
operationsr$   schemar%   
validationr&   rY   r  DatabaseErrorr   rZ   r   mysql.connector.abstractsr'   r(   r<   r?   rp   r   rn   r=   r;   <module>r{     s  >   # # # # # # # #                          !           7 7 7 7 7 7 $ $ $ $ $ $ < < < < < < , , , , , , , , 3 3 3 3 3 3 6 6 6 6 6 6X999999777777======SSSSSSSSSSS X X X

MMM
N
NTWWX222222 II    III
 # " " " " " & & & & & & & & & & & & 0 0 0 0 0 0 * * * * * * ( ( ( ( ( ( * * * * * *-O5 ?3 ?3  WVVVVVVVV2 2Z 2 2 2 2*]! ]! ]! ]! ]! ]! ]! ]!@C C C C C) C C CL)+ )+ )+ )+ )+> )+ )+ )+ )+ )+s*    A7 7B<BBB B'&B'