hyb
2026-01-30 7657e1b2fa251a2ea372710ad75cb395a3c0e374
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
Ë
Wñúh»Tãó€—dZddlZddlZddlZddlmZddlmZddlm    Z    m
Z
m Z m Z ddl mZmZddlmZdd    lmZe    rdd
lmZ    ddlZ    ddlZddlZd dlmZej0d k(rdndZGd„de«ZGd„de«ZGd„de«Z y#e$rdZej0d k7r    ed «d‚YŒewxYw#e$rdZdZYŒkwxYw)zKerberos Authentication Plugin.éN)Úabstractmethod)ÚPath)Ú TYPE_CHECKINGÚAnyÚOptionalÚTuple)ÚInterfaceErrorÚProgrammingError)Úloggeré)Ú
ERR_STATUS)Ú MySQLSocketÚntzwModule gssapi is required for GSSAPI authentication mechanism but was not found. Unable to authenticate with the serveré)ÚMySQLAuthPluginÚMySQLSSPIKerberosAuthPluginÚMySQLKerberosAuthPlugincó„—eZdZdZedefd„«Zedefd„«Ze    de
e de e
e effd„«Z ddd    e d
ede fd „Zy ) ÚMySQLBaseKerberosAuthPluginz8Base class for the MySQL Kerberos authentication plugin.Úreturncó—y)zPlugin official name.Úauthentication_kerberos_client©©Úselfs úmH:\Change_password\venv_build\Lib\site-packages\mysql/connector/aio/plugins/authentication_kerberos_client.pyÚnamez MySQLBaseKerberosAuthPlugin.nameMs€ð0ócó—y)z'Signals whether or not SSL is required.Frrs rÚ requires_sslz(MySQLBaseKerberosAuthPlugin.requires_sslRs€ðrÚtgt_auth_challengecó—y)á!Continue with the Kerberos TGT service request.
 
        With the TGT authentication service given response generate a TGT
        service request. This method must be invoked sequentially (in a loop)
        until the security context is completed and an empty response needs to
        be send to acknowledge the server.
 
        Args:
            tgt_auth_challenge: the challenge for the negotiation.
 
        Returns:
            tuple (bytearray TGS service request,
            bool True if context is completed otherwise False).
        Nr)rr!s  rÚ auth_continuez)MySQLBaseKerberosAuthPlugin.auth_continueWsrÚsockrÚ    auth_dataÚkwargsc‹óªK—tjd|«|j|fddi|¤Ž}|€ td«‚tjd|t    |««|j |«ƒd{–—†|j «ƒd{–—†}tjd|«|tk7rd}tjd    «tjd
|d|d z«tjd t    |««tjd «d}d}|sÂ|dkr½tjdd|d zd«tjd|«tjd|d|d z«|j||d«\}    }|    r|j |    «ƒd{–—†|rn;|j «ƒd{–—†}tjd|    «|d z }|s|dkrŒ½|std|›d|›«‚tjd|t    |««|j «ƒd{–—†}tjd|«t|«S7ŒØ7ŒÃ7Œ´7Œ›7Œ/­w)aSHandles server's `auth switch request` response.
 
        Args:
            sock: Pointer to the socket connection.
            auth_data: Plugin provided data (extracted from a packet
                       representing an `auth switch request` response).
            kwargs: Custom configuration to be passed to the auth plugin
                    when invoked. The parameters defined here will override the ones
                    defined in the auth plugin itself.
 
        Returns:
            packet: Last server's response after back-and-forth
                    communication.
        z# auth_data: %sÚignore_auth_dataFNzGot a NULL auth responsez# request: %s size: %sz# server response packet: %séz%# Continue with GSSAPI authenticationz# Response header: %srz# Response size: %sz# Negotiate a service requestrz%s Attempt %s %sz--------------------z<< Server response: %sz# Response code: %sz>> Response to server: %sz'Unable to fulfill server request after z! attempts. Last server response: z(Last response from server: %s length: %dz<< Ok packet from server: %s)
r ÚdebugÚ auth_responser    ÚlenÚwriteÚreadr r$Úbytes)
rr%r&r'ÚresponseÚpacketÚ
rcode_sizeÚcompleteÚtriesÚtokens
          rÚauth_switch_responsez0MySQLBaseKerberosAuthPlugin.auth_switch_responsejs#èø€ô"     ‰ Ð&¨    Ô2Ø%4×%Ñ% iÑRÀ%ÐRÈ6ÑRˆØ Ð Ü Ð!;Ó<Ð <ä ‰ Ð-¨x¼¸X»ÔG؏j‰j˜Ó"×"Ð"à—y‘y“{×"ˆÜ ‰ Ð3°VÔ<à ”ZÓ ØˆJÜ L‰LÐ@Ô AÜ L‰LÐ0°&Ð9I¸:ȹ>Ð2JÔ KÜ L‰LÐ.´°F³ Ô <Ü L‰LÐ8Ô 9؈H؈Eá 5¨1¢9Ü— ‘ Ð/°¸5À1¹9ÀhÔOÜ— ‘ Ð5°vÔ>Ü— ‘ Ð2°FÐ;K¸ZÈ!¹^Ð4LÔMØ"&×"4Ñ"4°V¸J¸KÐ5HÓ"I‘xÙØŸ*™* UÓ+×+Ð+ÙØØ#Ÿy™y›{×*ä— ‘ Ð8¸%Ô@ؘ‘
ñ 5¨1£9ñÜ$Ø=¸e¸WðE7Ø7=°hð@óðô
L‰LØ:ØÜF“ ô ð Ÿ9™9›;×&ˆFÜ L‰LÐ7¸Ô @äV‹}ÐðY    #ùà"ùð$,øð+øð$'úsb‚A-IÁ/IÁ0IÂI
ÂDIÆI ÆIÆ3IÆ4&IÇAIÈ!IÈ"&IÉ
IÉ IÉIÉIN)Ú__name__Ú
__module__Ú __qualname__Ú__doc__ÚpropertyÚstrrÚboolr rrr0rr$rr7rrrrrJs™„ÙBà ð0cò0óð0ðð˜dòóððð Ø"*¨5¡/ð à    ˆx˜‰ Ð$Ñ    %ò óð ð$CØ!ðCØ.3ðCØ?BðCà    ôCrrcó0—eZdZUdZdZeejed<e    de
fd„«Z e    de fd„«Z de
dejjj fd„Ze    d    edee
e
ffd
„«Z    dd eed edeefd „Zdeedeeeeffd„Zdedefd„Zy)rz3Implement the MySQL Kerberos authentication plugin.NÚcontextrcó2—    tjd¬«}t|j«}|j    d«dk7r|j dd«\}}|S#tj jj$rtj«cYSwxYw)z(Get user from credentials without realm.Úinitiate©Úusageú@éÿÿÿÿr) ÚgssapiÚ Credentialsr=rÚfindÚsplitÚrawÚmiscÚGSSErrorÚgetpassÚgetuser)ÚcredsÚuserÚ_s   rÚget_user_from_credentialsz1MySQLKerberosAuthPlugin.get_user_from_credentials¶sw€ð    %Ü×&Ñ&¨ZÔ8ˆEܐu—z‘z“?ˆD؏y‰y˜‹~ Ò#ØŸ*™* S¨!Ó,‘a؈KøÜz‰z‰×'Ñ'ò    %Ü—?‘?Ó$Ò $ð    %ús‚AAÁ;BÂBcó<—tjjdtjdk(rdtj«›nt d«j d««}|s td«‚tjd|«dd    |›jd
«i}|S) zäGet a credentials store dictionary.
 
        Returns:
            dict: Credentials store dictionary with the krb5 ccache name.
 
        Raises:
            InterfaceError: If 'KRB5CCNAME' environment variable is empty.
        Ú
KRB5CCNAMEÚposixz /tmp/krb5cc_z%TEMP%Úkrb5ccz5The 'KRB5CCNAME' environment variable is set to emptyzUsing krb5 ccache name: FILE:%ssccachezFILE:úutf-8) ÚosÚenvironÚgetrÚgetuidrÚjoinpathr    r r+Úencode)Ú
krb5ccnameÚstores  rÚ    get_storez!MySQLKerberosAuthPlugin.get_storeÂs’€ô—Z‘Z—^‘^Ø ô—7‘7˜gÒ%ðœrŸy™y›{˜mÑ,ä˜(“^×,Ñ,¨XÓ6ó 
ˆ
ñÜ ØGóð ô     ‰ Ð6¸
ÔCؘe J <Ð0×7Ñ7¸Ó@ÐAˆØˆ rÚupncó0—tjd«tj|tjj
«}|j jd«}    tjj||d¬«}|j}tjj|j«|tjjdd¬«|S#tjjj $r}t#d|›«|‚d}~wwxYw)    zÆAcquire and store credentials through provided password.
 
        Args:
            upn (str): User Principal Name.
 
        Returns:
            gssapi.raw.creds.Creds: GSSAPI credentials.
        z8Attempt to acquire credentials through provided passwordrXrBrCT)rPÚmechÚ    overwriteÚ set_defaultz7Unable to acquire credentials with the given password: N)r r+rGÚNameÚNameTyperQÚ    _passwordr^rKÚacquire_cred_with_passwordrPÚstore_cred_intoraÚMechTypeÚkerberosrLrMr
)rrbrQÚpasswordÚacquire_cred_resultrPÚerrs       rÚ_acquire_cred_with_passwordz3MySQLKerberosAuthPlugin._acquire_cred_with_passwordÜsë€ô     ‰ ÐOÔP܏{‰{˜3¤§¡× 4Ñ 4Ó5ˆØ—>‘>×(Ñ(¨Ó1ˆð    Ü"(§*¡*×"GÑ"Gؐh jð#Hó#Ð ð(×-Ñ-ˆEÜ J‰J× &Ñ &Ø—‘Ó ØÜ—_‘_×-Ñ-ØØ ð 'ô ðˆ øô    z‰z‰×'Ñ'ò    Ü"ØIÈ#ÈÐOóàð ûð    úsÁ A8CÃ'DÄDÄDr2cóF—tjd|dd«d}|dd}tjd|›d|d|«d}||d}tjd|dd«d}tjd|›d|dd«d}|j«|j«fS©aYParse authentication data.
 
        Get the SPN and REALM from the authentication data packet.
 
        Format:
            SPN string length two bytes <B1> <B2> +
            SPN string +
            UPN realm string length two bytes <B1> <B2> +
            UPN realm string
 
        Returns:
            tuple: With 'spn' and 'realm'.
        z<HNr rú<Ús©ÚstructÚunpackÚdecode©r2Úspn_lenÚspnÚ    realm_lenÚrealms     rÚ_parse_auth_dataz(MySQLKerberosAuthPlugin._parse_auth_dataûó°€ô—-‘-  f¨R¨a jÓ1°!Ñ4ˆØ˜˜ˆäm‰m˜a ˜y¨˜N¨F°8°GÐ,<Ó=¸aÑ@ˆØ˜˜Ð!ˆä—M‘M $¨¨r°¨
Ó3°AÑ6ˆ    Ü— ‘   ) ¨AÐ.°°q°r°
Ó;¸AÑ>ˆàz‰z‹|˜UŸ\™\›^Ð+Ð+rr&r'c ó®—d}d}|r'|jdd«s    |j|«\}}|€|j
j «dzS|jr|j›d|›nd}tjd|«tjd|«    tjd    ¬
«}t|j«}tjd «tjd |«|jd«d k7r|jdd«\}    }
n|}    d}
|jr|j›d|›n|}|jrA|j|    k7r2tjd«|j
|j!|«}|
r"|
|k7r|j
|j!|«}tj.j0tj.j2tj.j4f} tj6|tj8j:¬«} | j=tj>j@«} tjB| |tE| «d    ¬«|_#    |jFjI«}tjd|«|S#tj$r}t    d|›«|‚d}~wwxYw#tj"j$j&$r:}|r|j
|j!|«}nt)d|›«|‚Yd}~Œ…d}~wtj"j*j,$r:}|r|j
|j!|«}nt)d|›«|‚Yd}~Œäd}~wwxYw#tj"j*j,$r}t)d|›«|‚d}~wwxYw)z(Prepare the first message to the server.Nr)TúInvalid authentication data: órEúService Principal: %sú    Realm: %srBrCzCached credentials foundzCached credentials UPN: %srFrzBThe user from cached credentials doesn't match with the given userzCredentials has expired: z-Unable to retrieve cached credentials error: )Ú    name_type)rrPÚflagsrDú%Unable to initiate security context: úInitial client token: %s)%r[rrwÚerrorÚInterruptedErrorrir^Ú    _usernamer r+rGrHr=rrIrJrqrKÚ
exceptionsÚExpiredCredentialsErrorr    rLrMÚRequirementFlagÚmutual_authenticationÚextended_errorÚdelegate_to_peerrgrhÚkerberos_principalÚ canonicalizerlrmÚSecurityContextÚsumr@Ústep)rr&r'r|r~rprbrPÚ    creds_upnÚ
creds_userÚ creds_realmr‡rÚcnameÚinitial_client_tokens               rr,z%MySQLKerberosAuthPlugin.auth_responsesR€ðˆØˆá ˜VŸZ™ZÐ(:¸DÔAð WØ!×2Ñ2°9Ó=‘
Uð ˆ;Ø—>‘>×(Ñ(Ó*¨WÑ4Ð 4à-1¯^ª^—‘Р  % Ñ)Àˆä ‰ Ð,¨cÔ2܏ ‰ [ %Ô(ð&    ä×+Ñ+°*Ô=ˆEܘEŸJ™J›ˆIä L‰LÐ3Ô 4Ü L‰LÐ5°yÔ Að~‰~˜cÓ" bÒ(Ø*3¯/©/¸#¸qÓ*AÑ'
™Kà&
Ø" à15·²T—^‘^Ð$ A e WÑ-ÀYˆCð~Š~ $§.¡.°JÒ">Ü— ‘ ð!ôð—>‘>Ð-Ø ×<Ñ<¸SÓAEÙ˜{¨eÒ3¸¿¹Ð8RØ×8Ñ8¸Ó=ô × "Ñ "× 8Ñ 8Ü × "Ñ "× 1Ñ 1Ü × "Ñ "× 3Ñ 3ð
ˆô
{‰{˜3¬&¯/©/×*LÑ*LÔMˆØ×!Ñ!¤&§/¡/×":Ñ":Ó;ˆÜ×-Ñ-ؘe¬3¨u«:¸Zô
ˆŒ ð    YØ48·L±L×4EÑ4EÓ4GÐ  ô     ‰ Ð/Ð1EÔFØ#Ð#øôI—<‘<ò WÜ&Ð)FÀsÀeÐ'LÓMÐSVÐVûð WûôLz‰z×$Ñ$×<Ñ<ò    Qِt—~‘~Ð1Ø×8Ñ8¸Ó=‘ä$Ð'@ÀÀÐ%FÓGÈSÐPõûôz‰z‰×'Ñ'ò    Ùt—~‘~Ð1Ø×8Ñ8¸Ó=‘ä$ØCÀCÀ5ÐIóàðõûð    ûô*z‰z‰×'Ñ'ò    YÜ Ð#HÈÈÐ!NÓOÐUXÐ Xûð    YúsTšJ,ÂDKÉ:NÊ,KÊ?KËKË'NË=/L2Ì2*NÍ/NÎNÎ'OÏOÏOr!có—tjd|«|jj|«}tjd|«tjd|jj«||jjfS)r#útgt_auth challenge: %szContext step response: %súContext completed?: %s)r r+r@r—r4)rr!Úresps   rr$z%MySQLKerberosAuthPlugin.auth_continueesf€ô"     ‰ Ð-Ð/AÔBà $§ ¡ × 1Ñ 1Ð2DÓ Eˆä ‰ Ð0°$Ô7܏ ‰ Ð-¨t¯|©|×/DÑ/DÔEàT—\‘\×*Ñ*Ð*Ð*rÚmessagecóÜ—|jjs td«‚tjd|«tjd|jj
«    |jj |«}tjd|«tjd|«td    «}tjd
|«|jj|d ¬ «}tjd |dt|d««|jS#tjjj$r*}tjd|«td|›«|‚d}~wwxYw)a_Accept handshake and generate closing handshake message for server.
 
        This method verifies the server authenticity from the given message
        and included signature and generates the closing handshake for the
        server.
 
        When this method is invoked the security context is already established
        and the client and server can send GSSAPI formated secure messages.
 
        To finish the authentication handshake the server sends a message
        with the security layer availability and the maximum buffer size.
 
        Since the connector only uses the GSSAPI authentication mechanism to
        authenticate the user with the server, the server will verify clients
        message signature and terminate the GSSAPI authentication and send two
        messages; an authentication acceptance b'' and a
        OK packet (that must be received after sent the returned message from
        this method).
 
        Args:
            message: a wrapped gssapi message from the server.
 
        Returns:
            bytearray (closing handshake message to be send to the server).
        z!Security context is not completedzServer message: %szGSSAPI flags in use: %sz Unwraped: %sz#Unable to unwrap server message: %sz!Unable to unwrap server message: NzUnwrapped server message: %sszMessage response: %sF)Úencryptz(Wrapped message response: %s, length: %dr)r@r4r
r r+Ú actual_flagsÚunwraprGrKrÚ BadMICErrorr    Ú    bytearrayÚwrapr-r¡)rr¡Úunwrapedrpr1Úwrapeds      rÚauth_accept_close_handshakez3MySQLKerberosAuthPlugin.auth_accept_close_handshakes)€ð4|‰|×$Ò$Ü"Ð#FÓGÐ G܏ ‰ Ð)¨7Ô3܏ ‰ Ð.°· ± ×0IÑ0IÔJð    UØ—|‘|×*Ñ*¨7Ó3ˆHÜ L‰L˜¨Ô 2ô
     ‰ Ð3°XÔ>ô
Ð/Ó0ˆä ‰ Ð+¨XÔ6Ø—‘×"Ñ" 8°UÐ"Ó;ˆÜ ‰ Ø 6Ø 1‰IÜ q‘    ‹Nô    
ð ~‰~Ðøô'z‰z×$Ñ$×0Ñ0ò    UÜ L‰LÐ>ÀÔ DÜ Ð#DÀSÀEÐ!JÓKÐQTÐ Tûð    UúsÁ#1DÄ'E+Å%E&Å&E+©N)r8r9r:r;r@rrGr•Ú__annotations__Ú staticmethodr=rSÚdictrarKrPÚCredsrqr0rrrr,r>r$r«rrrrr±s…Ù=à04€GˆXf×,Ñ,Ñ -Ó4àð    % sò    %óð    %ððtòóðð2¨sð°v·z±z×7GÑ7G×7MÑ7Móð>ð, ð,¨5°°c°©?ò,óð,ð4,0ñN$Ø! %™ðN$Ø;>ðN$à    %‰óN$ð`+Ø"*¨5¡/ð+à    ˆx˜‰ Ð$Ñ    %ó+ð44°5ð4¸Uô4rcóœ—eZdZUdZdZeed<dZeed<ede    de
e e ffd„«Z     d de e    d    ede e    fd
„Zd e e    de
e e    effd „Zy)rzDImplement the MySQL Kerberos authentication plugin with Windows SSPINr@Ú
clientauthr2rcóF—tjd|dd«d}|dd}tjd|›d|d|«d}||d}tjd|dd«d}tjd|›d|dd«d}|j«|j«fSrsrvrzs     rrz,MySQLSSPIKerberosAuthPlugin._parse_auth_data¼r€rr&r'c ó¤—tjd«d}d}|r'|jdd«s    |j|«\}}tjd|«tjd|«tt€ td«‚tjtjf}|jr&|jr|j||jf}nd}|}tjd    |«tjd
|du«tjd ||t|«tj ¬ «|_    d}    |j"j%|    «\}}
tjd |«tjd|
«tjd|j"j&«|
dj(} tjd|j"j*«tjd| «| S#tj
$r}t d|›«|‚d}~wwxYw#t,$r}t/d|›«|‚d}~wwxYw)z©Prepare the first message to the server.
 
        Args:
            kwargs:
                ignore_auth_data (bool): if True, the provided auth data is ignored.
        zauth_response for sspiNr)Tr‚r„r…zKPackage "pywin32" (Python for Win32 (pywin32) extensions) is not installed.z targetspn: %sz_auth_info is None: %sÚ    Negotiate)Ú    targetspnÚ    auth_infoÚscflagsÚdatarepúContext step err: %súContext step out_buf: %srŸrz pkg_info: %srˆr‰)r r+r[rrwrŠr‹ÚsspiconÚsspir
ÚISC_REQ_MUTUAL_AUTHÚISC_REQ_DELEGATErŒriÚ
ClientAuthr–ÚSECURITY_NETWORK_DREPr²Ú    authorizeÚ authenticatedÚBufferÚpkg_infoÚ    Exceptionr    ) rr&r'r|r~rpr‡Ú
_auth_infor¶ÚdataÚout_bufrœs             rr,z)MySQLSSPIKerberosAuthPlugin.auth_responseÖs€ô     ‰ Ð-Ô.ØˆØˆá ˜VŸZ™ZÐ(:¸DÔAð WØ!×2Ñ2°9Ó=‘
Uô     ‰ Ð,¨cÔ2܏ ‰ [ %Ô(ä ˆ?œd˜lÜ"ð%óð ô
×,Ñ,¬g×.FÑ.FÐGˆà >Š>˜dŸnšnØŸ.™.¨%°·±Ð@‰JàˆJàˆ    Ü ‰ _ iÔ0܏ ‰ Ð-¨z¸TÐ/AÔBô*Ÿ/™/Ø ØØ Ü˜“JÜ×1Ñ1ô 
ˆŒð        Y؈DØŸ?™?×4Ñ4°TÓ:‰LˆCÜ L‰LÐ/°Ô 5Ü L‰LÐ3°WÔ =Ü L‰LÐ1°4·?±?×3PÑ3PÔ QØ#*¨1¡:×#4Ñ#4Ð  Ü L‰L˜¨¯©×)AÑ)AÔ Bô     ‰ Ð/Ð1EÔFØ#Ð#øô}—<‘<ò WÜ&Ð)FÀsÀeÐ'LÓMÐSVÐVûð Wûôtò    YÜ Ð#HÈÈÐ!NÓOÐUXÐ Xûð    Yús0¯HÅB/H2ÈH/ÈH*È*H/È2    IÈ;I
Ir!có—tjd|«|jj|«\}}tjd|«tjd|«|dj}tjd|«tjd|jj
«||jj
fS)r#ržrºr»rzContext step resp: %srŸ)r r+r²rÂrÄrÃ)rr!rprÉr s     rr$z)MySQLSSPIKerberosAuthPlugin.auth_continue&s—€ô"     ‰ Ð-Ð/AÔBà—‘×0Ñ0Ð1CÓD‰ ˆˆWä ‰ Ð+¨SÔ1܏ ‰ Ð/°Ô9ؐq‰z× Ñ ˆÜ ‰ Ð,¨dÔ3܏ ‰ Ð-¨t¯©×/LÑ/LÔMàT—_‘_×2Ñ2Ð2Ð2rr¬)r8r9r:r;r@rr­r²r®r0rr=rrr,r>r$rrrrr¶s—…ÙNà€GˆSÓØ€JÓàð, ð,¨5°°c°©?ò,óð,ð4,0ñN$Ø! %™ðN$Ø;>ðN$à    %‰óN$ð`3Ø"*¨5¡/ð3à    ˆx˜‰ Ð$Ñ    %ô3r)!r;rNrYrwÚabcrÚpathlibrÚtypingrrrrÚmysql.connector.errorsr    r
Úmysql.connector.loggerr Úauthenticationr ÚnetworkrrGÚ ImportErrorrr½r¼ÚrÚAUTHENTICATION_PLUGIN_CLASSrrrrrrú<module>rÕsäðñ>&ãÛ    Û åÝß6Ó6çCÝ)å'áÝ%ð    ÛðÛÛõ
ð&(§W¡W°¢_Ñ!Ð:Sðô
c /ôcôNBÐ9ôBôJK3Ð"=õK3øðG òØ €FØ    ‡ww$‚Ùð ó
ðð        ñðûðòØ €DØ‚Gðús$ÁB Á    B1 B.Â-B.Â1    B=Â<B=