[OpenAFS] How to replace pam_krb5 on RHEL 8 systems

Stephan Wonczak a0033@rrz.uni-koeln.de
Mon, 11 Jul 2022 10:30:30 +0200 (CEST)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.

--1602634645-648475257-1657528230=:81066
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8BIT

   Hi Jeffrey,
   Thanks for having a look at the problem.
   However, I obviously did not do a very good job detailing exactly what 
we did ... so here's my next try. Warning: It is going to be lengthy :-)

   First off: We do not use SSSD. And we would like to keep it that way, 
since it caused various massive problems in the past.

   On RHEL-7, everything works perfectly. We are using the RedHat-supplied 
RPM of pam_krb5: pam_krb5-2.4.8-6.el7.x86_64
  Looking at the debug-output of the module, this is what the relevant part 
looks like:

Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: 
pam_unix(sshd:session): session opened for user XXXX by (uid=0)
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: 
default/local realm 'RRZ.UNI-KOELN.DE'
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: 
configured realm 'RRZ.UNI-KOELN.DE'
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: flag: 
debug
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: flag: 
don't always_allow_localname
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: flag: 
no ignore_afs
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: flag: 
no null_afs
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: flag: 
no cred_session
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: flag: 
no ignore_k5login
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: flag: 
user_check
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: will 
try previously set password first
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: will 
ask for a password if that fails
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: will 
let libkrb5 ask questions
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: flag: 
use_shmem
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: flag: 
external
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: flag: 
no multiple_ccaches
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: flag: 
validate
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: flag: 
warn
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: 
banner: Kerberos 5
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: ccache 
dir: /tmp
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: ccname 
template: FILE:%d/krb5cc_%U_XXXXXX
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: 
keytab: FILE:/etc/krb5.keytab
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: token 
strategy: 2b
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: 
removing shared memory segment 3 creator pid 3197
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: 
cleanup function removing shared memory segment 3 belonging to process 
3197
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: 
obtaining afs tokens
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: 
creating new PAG
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: 
obtaining tokens for local cell 'rrz.uni-koeln.de'
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: trying 
with ticket (2b)
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: 
attempting to determine realm for "rrz.uni-koeln.de"
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: file 
server for "/afs/rrz.uni-koeln.de" is 134.95.67.97
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: file 
server for "/afs/rrz.uni-koeln.de" is 134.95.109.81
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: file 
server for "/afs/rrz.uni-koeln.de" is 134.95.109.75
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: file 
server for "/afs/rrz.uni-koeln.de" is 134.95.112.8
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: file 
server 134.95.67.97 has name afs.thp.uni-koeln.de
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: 
afs.thp.uni-koeln.de is in realm "RRZ.UNI-KOELN.DE"
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: 
attempting to obtain tokens for "rrz.uni-koeln.de" 
("afs/rrz.uni-koeln.de@RRZ.UNI-KOELN.DE")
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: got 
tokens for cell "rrz.uni-koeln.de"
Jul  8 10:26:51 cftest.rrz.uni-koeln.de sshd[3197]: pam_krb5[3197]: no 
additional afs cells configured


   We then took the source PRM: pam_krb5-2.4.8-6.el7.src.rpm and did a 
rebuild on a RHEL-8-Machine. This worked without any errors.
   However, when we try to use this to get a token, this happens:

Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_unix(sshd:session): session opened for user a0537 by (uid=0)
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: default/local realm 'RRZ.UNI-KOELN.DE'
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: configured realm 'RRZ.UNI-KOELN.DE'
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: flag: debug
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: flag: don't always_allow_localname
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: flag: no ignore_afs
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: flag: no null_afs
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: flag: no cred_session
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: flag: no ignore_k5login
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: flag: user_check
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: will try previously set password first
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: will ask for a password if that fails
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: will let libkrb5 ask questions
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: flag: use_shmem
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: flag: external
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: flag: no multiple_ccaches
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: flag: validate
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: flag: warn
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: banner: Kerberos 5
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: ccache dir: /tmp
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: ccname template: FILE:%d/krb5cc_%U_XXXXXX
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: keytab: FILE:/etc/krb5.keytab
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: token strategy: 2b
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: removing shared memory segment 29 creator pid 2204130
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: cleanup function removing shared memory segment 29 
belonging to process 2204130
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: obtaining afs tokens
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: creating new PAG
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: obtaining tokens for local cell 'rrz.uni-koeln.de'
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: trying with ticket (2b)
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: attempting to determine realm for "rrz.uni-koeln.de"
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: file server for "/afs/rrz.uni-koeln.de" is 134.95.67.97
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: file server for "/afs/rrz.uni-koeln.de" is 134.95.112.8
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: file server for "/afs/rrz.uni-koeln.de" is 
134.95.109.81
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: file server for "/afs/rrz.uni-koeln.de" is 
134.95.109.75
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: file server 134.95.67.97 has name afs.thp.uni-koeln.de
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: afs.thp.uni-koeln.de is in realm "RRZ.UNI-KOELN.DE"
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: attempting to obtain tokens for "rrz.uni-koeln.de" 
("afs/rrz.uni-koeln.de@RRZ.UNI-KOELN.DE")
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: error obtaining credentials for 
'afs/rrz.uni-koeln.de@RRZ.UNI-KOELN.DE' (enctype=1) on behalf of 
'a0537@RRZ.UNI-KOELN.DE': No credentia
ls found with supported encryption types
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: error obtaining credentials for 
'afs/rrz.uni-koeln.de@RRZ.UNI-KOELN.DE' (enctype=2) on behalf of 
'a0537@RRZ.UNI-KOELN.DE': No credentia
ls found with supported encryption types
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: error obtaining credentials for 
'afs/rrz.uni-koeln.de@RRZ.UNI-KOELN.DE' (enctype=3) on behalf of 
'a0537@RRZ.UNI-KOELN.DE': No credentia
ls found with supported encryption types
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: attempting to obtain tokens for "rrz.uni-koeln.de" 
("afs@RRZ.UNI-KOELN.DE")
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: error obtaining credentials for 'afs@RRZ.UNI-KOELN.DE' 
(enctype=1) on behalf of 'a0537@RRZ.UNI-KOELN.DE': No credentials found 
with supported encryption types
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: error obtaining credentials for 'afs@RRZ.UNI-KOELN.DE' 
(enctype=2) on behalf of 'a0537@RRZ.UNI-KOELN.DE': No credentials found 
with supported encryption types
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: error obtaining credentials for 'afs@RRZ.UNI-KOELN.DE' 
(enctype=3) on behalf of 'a0537@RRZ.UNI-KOELN.DE': No credentials found 
with supported encryption types
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: attempting to obtain tokens for "rrz.uni-koeln.de" 
("afsx/rrz.uni-koeln.de@RRZ.UNI-KOELN.DE")
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: error obtaining credentials for 
'afsx/rrz.uni-koeln.de@RRZ.UNI-KOELN.DE' (enctype=1) on behalf of 
'a0537@RRZ.UNI-KOELN.DE': No credentials found with supported encryption 
types
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: error obtaining credentials for 
'afsx/rrz.uni-koeln.de@RRZ.UNI-KOELN.DE' (enctype=2) on behalf of 
'a0537@RRZ.UNI-KOELN.DE': No credentials found with supported encryption 
types
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: error obtaining credentials for 
'afsx/rrz.uni-koeln.de@RRZ.UNI-KOELN.DE' (enctype=3) on behalf of 
'a0537@RRZ.UNI-KOELN.DE': No credentials found with supported encryption 
types
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: attempting to obtain tokens for "rrz.uni-koeln.de" 
("afsx@RRZ.UNI-KOELN.DE")
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: error obtaining credentials for 'afsx@RRZ.UNI-KOELN.DE' 
(enctype=1) on behalf of 'a0537@RRZ.UNI-KOELN.DE': No credentials found 
with supported encryption types
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: error obtaining credentials for 'afsx@RRZ.UNI-KOELN.DE' 
(enctype=2) on behalf of 'a0537@RRZ.UNI-KOELN.DE': No credentials found 
with supported encryption types
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: error obtaining credentials for 'afsx@RRZ.UNI-KOELN.DE' 
(enctype=3) on behalf of 'a0537@RRZ.UNI-KOELN.DE': No credentials found 
with supported encryption types
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: afslog (2b) failed to "rrz.uni-koeln.de"
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: got error -1 (Unknown code ____ 255) while obtaining 
tokens for rrz.uni-koeln.de
Jul  8 15:14:57 kicktest.rrz.uni-koeln.de sshd[2204130]: 
pam_krb5[2204130]: no additional afs cells configured

   To reiterate: We get both kerberos ticket and AFS-Token on RHEL-7. On 
RHEL-8, we still get a valid kerberos ticket, but getting the AFS-Token 
fails. It -is- possible, however, to get a valid AFS-Token by klog.krb5. 
So -in principle- everything is in place to have this done by pam_afs.
   The problem is: I have no way to determine why it is complaining about 
"no supported encryption types" when other tools have no problems at all!

   Additional infO. Yes, we did rekey our AFS-cell quite a while ago, and 
our afs-Principal has two keys:

kadmin.local:  getprinc afs/rrz.uni-koeln.de
Principal: afs/rrz.uni-koeln.de@RRZ.UNI-KOELN.DE
<snip>
Anzahl der Schlüssel: 2
Key: vno 5, aes256-cts-hmac-sha1-96
Key: vno 4, des-cbc-crc
MKey: vno 1
Attribute: REQUIRES_PRE_AUTH
Richtlinie: [keins]

   Our users have three:

kadmin.local:  getprinc XXXX
Principal: XXXX@RRZ.UNI-KOELN.DE
<snip>
Anzahl der Schlüssel: 3
Key: vno 2, aes256-cts-hmac-sha1-96
Key: vno 2, des-cbc-crc
Key: vno 2, des-cbc-md5:afs3
MKey: vno 1
Attribute: REQUIRES_PRE_AUTH
Richtlinie: [keins]

   Like I said before, I looked at the sources of our version of pam_krb5, 
and the part where it is failing starts at line 775 inside the function 
"minikafs_5log_with_principal" (I'll attach the minikafs.c to this mail 
for reference)

 	/* Try to obtain a suitable credential. */
         for (i = 0; i < n_etypes; i++) {
                 memset(&mcreds, 0, sizeof(mcreds));
                 mcreds.client = client;
                 mcreds.server = server;
                 if (etypes != NULL) {
                         v5_creds_set_etype(ctx, &mcreds, etypes[i]);
                 }
                 new_creds = NULL;
                 tmp = krb5_get_credentials(ctx, 0, ccache,
                                            &mcreds, &new_creds);
                 if (tmp == 0) {
                         if (use_rxk5 &&
                             (minikafs_5settoken2(cell, new_creds, uid) == 
0)) {
                                	krb5_free_creds(ctx, new_creds);
                                 v5_free_unparsed_name(ctx, 
unparsed_client);
                                 krb5_free_principal(ctx, client);
                                 krb5_free_principal(ctx, server);
                                 return 0;
                         } else
                         if (use_v5_2b &&
                             (minikafs_5settoken(cell, new_creds, uid) == 
0)) {
                                 krb5_free_creds(ctx, new_creds);
                                 v5_free_unparsed_name(ctx, 
unparsed_client);
                                 krb5_free_principal(ctx, client);
                                 krb5_free_principal(ctx, server);
                                	return 0;
                         }
                         krb5_free_creds(ctx, new_creds);
                 } else {
                         if (options->debug) {
                                 if (etypes != NULL) {
                                         debug("error obtaining credentials 
for "
                                               "'%s' (enctype=%d) on behalf 
of "
                                               "'%s': %s",
                                               principal, etypes[i],
                                               unparsed_client,
                                               v5_error_message(tmp));
                                	} else {
                                        	debug("error obtaining credentials 
for "
                                               "'%s' on behalf of "
                                               "'%s': %s",
                                               principal,
                                               unparsed_client,
                                               v5_error_message(tmp));
                                 }
                         }
                 }
         }

 	v5_free_unparsed_name(ctx, unparsed_client);
         krb5_free_principal(ctx, client);
         krb5_free_principal(ctx, server);

   If you or anyone else has any ideas how to tackle the problem, any help 
would be greatly appreciated.

   Cheers from Cologne,
   Stephan Wonczak


On Fri, 8 Jul 2022, Jeffrey E Altman wrote:

> 
> Sounds like the version of pam_krb5 you are attempting to build does not
> include support for rxkad-kdf.
> 
>  https://lists.openafs.org/pipermail/afs3-standardization/2013-July/002738.h
> tml
> 
> The version of pam_krb5 that supports rxkad-kdf contains a
> minikafs_kd_derive() function at minikafs.c line 775.
> 
> See https://github.com/frozencemetery/pam_krb5.
> 
> As mentioned in my prior reply pam_krb5 should not be used in conjunction
> with sssd.
> 
> Jeffrey Altman
> 
> On 7/8/2022 8:35 AM, Stephan Wonczak (a0033@rrz.uni-koeln.de) wrote:
>         Hi everyone!
>         (Berthold's colleague here)
>
>         We dug a little deeper and found the part in the
>       pam_krb5-sources where it fails. It is in the file "minikafs.c"
>       starting in line 775. It looks like the call to
>       krb5_get_credentials() gets a non-zero return value, thus making
>       it bail out.
>         The problem is that we (well, at least me!) have no idea which
>       enctype is expected, and which enctypes are actually tried.
>       Debug output is not too helpful here. Any ideas on how to get
>       useful information?
>         (I should mention I am waaay out of depth here with my
>       knowledge of Kerberos, and my C-fu is severely lacking, too ;-)
>       )
>
>         To be absolutley clear: We can ssh-login to the machine
>       running this pam_krb.so-module, and get a valid krb5-ticket. No
>       AFS-token after login, thus no access to AFS. If I do
>       "klog.krb5", I -do- get an AFS-Token without any issues, and
>       AFS-access starts working as it should.
>         It's maddening that only pam_krb5 complains, while other tools
>       work out of the box.
>
>         Any advice would be greatly appreciated!
>
>         Stephan
>
>       On Fri, 8 Jul 2022, Berthold Cogel wrote:
>
>             Am 07.07.22 um 19:04 schrieb Dirk Heinrichs:
>                    Benjamin Kaduk:
>
>                          Are you aware of
>                         pam_afs_session
>                          (https://github.com/rra/pam-afs-session)?
>                         Without knowing more about
>                          what you're using pam_krb5
>                         for it's hard to make
>                         specific suggestions
>                          about what alternatives
>                         might exist.
> 
>
>                    BTW: pam_krb5 != pam_krb5. There are
>                   two different modules with the same
>                    name out there. The one shipped with
>                   RedHat family distributions comes
>                    with integrated AFS support, while the
>                   one shipped with Debian family
>                    distributions doesn't. That's the
>                   reason why Debian also ships
>                    pam_afs_session and RH does not.
>
>                    Bye...
>
>                         Dirk
> 
>
>             We're using the pam_krb5 shipped with Red Hat.
>
>             I've rebuild the module from the RHEL 7 source rpm
>             on RHEL 8. And it seems to work.... for some value
>             of working....
>
>             Supported enctypes in our kdc:
>             aes256-cts-hmac-sha1-96:normal des-cbc-crc:normal
>             des:afs3
>
>             We 'rekeyed' our AFS environment with
>             aes256-cts-hmac-sha1-96:normal to get connections
>             from newer Ubuntu/Debian and Fedora 35 working.
>
>             We get a krb5 ticket and a login, but getting the
>             AFS token gives errors:
>
>             "error obtaining credentials for
>             'afs/rrz.uni-koeln.de@RRZ.UNI-KOELN.DE' (enctype=1)
>             on behalf of ....: No credentials found with
>             supported encryption types"
>
>             Same for two other enctypes.
>
>             So something else changed in RHEL 8, which we
>             haven't found yet.
> 
>
>             Regards
>             Berthold
>             _______________________________________________
>             OpenAFS-info mailing list
>             OpenAFS-info@openafs.org
>             https://lists.openafs.org/mailman/listinfo/openafs-info
> 
>
>           Dipl. Chem. Dr. Stephan Wonczak
>
>               Regionales Rechenzentrum der Universitaet zu Koeln
>       (RRZK)
>               Universitaet zu Koeln, Weyertal 121, 50931 Koeln
>               Tel: +49/(0)221/470-89583, Fax: +49/(0)221/470-89625
> 
> 
>

 	Dipl. Chem. Dr. Stephan Wonczak

         Regionales Rechenzentrum der Universitaet zu Koeln (RRZK)
         Universitaet zu Koeln, Weyertal 121, 50931 Koeln
         Tel: +49/(0)221/470-89583, Fax: +49/(0)221/470-89625
--1602634645-648475257-1657528230=:81066
Content-Type: text/plain; name=minikafs.c
Content-Transfer-Encoding: BASE64
Content-ID: <9498cde7-c995-d224-1fd5-23de3a429e9@rrz.uni-koeln.de>
Content-Description: 
Content-Disposition: attachment; filename=minikafs.c

LyoNCiAqIENvcHlyaWdodCAyMDA0LDIwMDUsMjAwNiwyMDA3LDIwMDgsMjAw
OSwyMDEwIFJlZCBIYXQsIEluYy4NCiAqIENvcHlyaWdodCAyMDA0IEt1bmds
aWdhIFRla25pc2thIEjDtmdza29sYW4NCiAqDQogKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQNCiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucw0KICogYXJlIG1l
dDoNCiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQogKiAgICBub3RpY2UsIGFu
ZCB0aGUgZW50aXJlIHBlcm1pc3Npb24gbm90aWNlIGluIGl0cyBlbnRpcmV0
eSwNCiAqICAgIGluY2x1ZGluZyB0aGUgZGlzY2xhaW1lciBvZiB3YXJyYW50
aWVzLg0KICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQNCiAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUNCiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uDQogKiAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUg
dXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUNCiAqICAgIHByb2R1Y3RzIGRl
cml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJp
b3INCiAqICAgIHdyaXR0ZW4gcGVybWlzc2lvbi4NCiAqDQogKiBBTFRFUk5B
VElWRUxZLCB0aGlzIHByb2R1Y3QgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVy
IHRoZSB0ZXJtcyBvZiB0aGUNCiAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZSwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvdmlzaW9ucyBvZiB0
aGUNCiAqIExHUEwgYXJlIHJlcXVpcmVkIElOU1RFQUQgT0YgdGhlIGFib3Zl
IHJlc3RyaWN0aW9ucy4NCiAqDQogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRA0KICog
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YNCiAqIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTg0KICogTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULA0KICogSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUDQogKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
Rg0KICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTg0KICogQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQNCiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRg0KICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCiAqLw0KDQogLyoNCiAg
KiBBIG1pbmlhdHVyZSBhZnNsb2cgaW1wbGVtZW50YXRpb24uICBSZXF1aXJl
cyBjZWxscyBzZXJ2ZWQgYnkgT3BlbkFGUyAxLjIuOA0KICAqIG9yIGxhdGVy
IGluIGNvbWJpbmF0aW9uIHdpdGggTUlUIEtlcmJlcm9zIDEuMi42IG9yIGxh
dGVyLg0KICAqDQogICogUmVmZXJlbmNlczoNCiAgKiAgIGh0dHA6Ly9ncmFu
ZC5jZW50cmFsLm9yZy9udW1iZXJzL3Bpb2N0bHMuaHRtbA0KICAqICAgaHR0
cDovL3d3dy5hZnNpZy5zZS9hZnNpZy9zcGFjZS9yeGdrLWNsaWVudC1pbnRl
Z3JhdGlvbg0KICAqICAgYXV0aC9hZnNfdG9rZW4ueGcNCiAgKi8NCg0KI2lu
Y2x1ZGUgIi4uL2NvbmZpZy5oIg0KDQojaW5jbHVkZSA8c3lzL3R5cGVzLmg+
DQojaW5jbHVkZSA8c3lzL2lvY3RsLmg+DQojaW5jbHVkZSA8c3lzL3N5c2Nh
bGwuaD4NCiNpZmRlZiBIQVZFX1NZU19JT0NDT01fSA0KI2luY2x1ZGUgPHN5
cy9pb2Njb20uaD4NCiNlbmRpZg0KI2luY2x1ZGUgPGN0eXBlLmg+DQojaW5j
bHVkZSA8ZXJybm8uaD4NCiNpbmNsdWRlIDxmY250bC5oPg0KI2lmZGVmIEhB
VkVfSU5UVFlQRVNfSA0KI2luY2x1ZGUgPGludHR5cGVzLmg+DQojZW5kaWYN
CiNpbmNsdWRlIDxsaW1pdHMuaD4NCiNpbmNsdWRlIDxuZXRkYi5oPg0KI2lu
Y2x1ZGUgPHNpZ25hbC5oPg0KI2luY2x1ZGUgPHN0ZGlvLmg+DQojaWZkZWYg
SEFWRV9TVERJTlRfSA0KI2luY2x1ZGUgPHN0ZGludC5oPg0KI2VuZGlmDQoj
aW5jbHVkZSA8c3RkbGliLmg+DQojaW5jbHVkZSA8c3RyaW5nLmg+DQojaW5j
bHVkZSA8dW5pc3RkLmg+DQoNCiNpZmRlZiBIQVZFX1NFQ1VSSVRZX1BBTV9B
UFBMX0gNCiNpbmNsdWRlIDxzZWN1cml0eS9wYW1fYXBwbC5oPg0KI2VuZGlm
DQoNCiNpZmRlZiBIQVZFX1NFQ1VSSVRZX1BBTV9NT0RVTEVTX0gNCiNpbmNs
dWRlIDxzZWN1cml0eS9wYW1fbW9kdWxlcy5oPg0KI2VuZGlmDQogDQojaW5j
bHVkZSBLUkI1X0gNCg0KI2luY2x1ZGUgImluaXQuaCINCiNpbmNsdWRlICJs
b2cuaCINCiNpbmNsdWRlICJtaW5pa2Fmcy5oIg0KI2luY2x1ZGUgInY1Lmgi
DQojaW5jbHVkZSAieHN0ci5oIg0KDQojaWZuZGVmIEtSQl9USUNLRVRfR1JB
TlRJTkdfVElDS0VUDQojaWZkZWYgS1JCNV9UR1NfTkFNRQ0KI2RlZmluZSBL
UkJfVElDS0VUX0dSQU5USU5HX1RJQ0tFVCBLUkI1X1RHU19OQU1FDQojZWxz
ZQ0KI2RlZmluZSBLUkJfVElDS0VUX0dSQU5USU5HX1RJQ0tFVCAia3JidGd0
Ig0KI2VuZGlmDQojZW5kaWYNCg0KI2RlZmluZSBIT1NUTkFNRV9TSVpFIE5J
X01BWEhPU1QNCg0KI2RlZmluZSBPUEVOQUZTX0FGU19JT0NUTF9GSUxFICAi
L3Byb2MvZnMvb3BlbmFmcy9hZnNfaW9jdGwiDQojZGVmaW5lIEFSTEFfQUZT
X0lPQ1RMX0ZJTEUgICAgICIvcHJvYy9mcy9ubnBmcy9hZnNfaW9jdGwiDQoN
CiNpZmRlZiBzdW4NCiNpZm5kZWYgX19OUl9hZnNfc3lzY2FsbA0KI2RlZmlu
ZSBfX05SX2Fmc19zeXNjYWxsIDY1DQojZW5kaWYNCiNlbmRpZg0KDQovKiBH
bG9iYWwoISkgY29udGFpbmluZyB0aGUgcGF0aCB0byB0aGUgZmlsZS9kZXZp
Y2Uvd2hhdGV2ZXIgaW4gL3Byb2Mgd2hpY2ggd2UNCiAqIGNhbiB1c2UgdG8g
Z2V0IHRoZSBlZmZlY3Qgb2YgdGhlIEFGUyBzeXNjYWxsLiAgSWYgd2UgZXZl
ciBuZWVkIHRvIGJlDQogKiB0aHJlYWQtc2FmZSwgd2UnbGwgaGF2ZSB0byBs
b2NrIGFyb3VuZCBhY2Nlc3NlcyB0byB0aGlzLiAqLw0Kc3RhdGljIGNvbnN0
IGNoYXIgKm1pbmlrYWZzX3Byb2NwYXRoID0gTlVMTDsNCg0KI2RlZmluZSBW
SU9DVExfU1lTQ0FMTCAoKHVuc2lnbmVkIGludCkgX0lPVygnQycsIDEsIHZv
aWQgKikpDQojZGVmaW5lIFZJT0NUTF9GTihpZCkgICgodW5zaWduZWQgaW50
KSBfSU9XKCdWJywgKGlkKSwgc3RydWN0IG1pbmlrYWZzX2lvYmxvY2spKQ0K
I2RlZmluZSBDSU9DVExfRk4oaWQpICAoKHVuc2lnbmVkIGludCkgX0lPVygn
QycsIChpZCksIHN0cnVjdCBtaW5pa2Fmc19pb2Jsb2NrKSkNCiNkZWZpbmUg
T0lPQ1RMX0ZOKGlkKSAgKCh1bnNpZ25lZCBpbnQpIF9JT1coJ08nLCAoaWQp
LCBzdHJ1Y3QgbWluaWthZnNfaW9ibG9jaykpDQojZGVmaW5lIEFJT0NUTF9G
TihpZCkgICgodW5zaWduZWQgaW50KSBfSU9XKCdBJywgKGlkKSwgc3RydWN0
IG1pbmlrYWZzX2lvYmxvY2spKQ0KDQovKiBBIHN0cnVjdHVyZSBzcGVjaWZ5
aW5nIHBhcmFtZXRlcnMgdG8gdGhlIFZJT0NUTF9TWVNDQUxMIGlvY3RsLiAg
QW4gYXJyYXkNCiAqIHdvdWxkIGRvIGFzIHdlbGwsIGJ1dCB0aGlzIG1ha2Vz
IHRoZSBvcmRlciBvZiBpdGVtcyBjbGVhcmVyLiAqLw0Kc3RydWN0IG1pbmlr
YWZzX3Byb2NkYXRhIHsNCglsb25nIHBhcmFtNDsNCglsb25nIHBhcmFtMzsN
Cglsb25nIHBhcmFtMjsNCglsb25nIHBhcmFtMTsNCglsb25nIGZ1bmN0aW9u
Ow0KfTsNCg0KLyogQSBzdHJ1Y3R1cmUgc3BlY2lmeWluZyBpbnB1dC9vdXRw
dXQgYnVmZmVycyB0byBwaW9jdGwgZnVuY3Rpb25zLiAqLw0Kc3RydWN0IG1p
bmlrYWZzX2lvYmxvY2sgew0KCWNoYXIgKmluLCAqb3V0Ow0KCXVpbnQxNl90
IGluc2l6ZSwgb3V0c2l6ZTsNCn07DQoNCi8qIFRoZSBwb3J0aW9uIG9mIGEg
dG9rZW4gd2hpY2ggaW5jbHVkZXMgb3VyIG93biBrZXkgYW5kIG90aGVyIGJv
b2trZWVwaW5nDQogKiBzdHVmZi4gIEFsb25nIHdpdGggYSBtYWdpYyBibG9i
IHVzZWQgYnkgcnhrYWQsIHRoZSBndXRzIG9mIHJ4a2FkIHRva2Vucy4gKi8N
CnN0cnVjdCBtaW5pa2Fmc19wbGFpbl90b2tlbiB7DQoJdWludDMyX3Qga3Zu
bzsNCgljaGFyIGtleVs4XTsNCgl1aW50MzJfdCB1aWQ7DQoJdWludDMyX3Qg
c3RhcnQsIGVuZDsgLyogbXVzdCBiZSBvZGQgKD8pICovDQp9Ow0KDQovKiBG
dW5jdGlvbnMgY2FsbGVkIHRocm91Z2ggbWluaWthZnNfc3lzY2FsbCgpLiAg
TWlnaHQgbm90IHBvcnQgdG8geW91ciBzeXN0ZW0uICovDQplbnVtIG1pbmlr
YWZzX3N1YnN5cyB7DQoJbWluaWthZnNfc3Vic3lzX3Bpb2N0bCA9IDIwLA0K
CW1pbmlrYWZzX3N1YnN5c19zZXRwYWcgPSAyMSwNCn07DQoNCi8qIFN1YmZ1
bmN0aW9ucyBjYWxsZWQgdGhyb3VnaCBtaW5pa2Fmc19waW9jdGwoKS4gKi8N
CmVudW0gbWluaWthZnNfcGlvY3RsX2ZuIHsNCgltaW5pa2Fmc19waW9jdGxf
Ym9ndXMgPSBWSU9DVExfRk4oMCksDQoJbWluaWthZnNfcGlvY3RsX3NldHRv
a2VuID0gVklPQ1RMX0ZOKDMpLA0KCW1pbmlrYWZzX3Bpb2N0bF9mbHVzaCA9
IFZJT0NUTF9GTig2KSwNCgltaW5pa2Fmc19waW9jdGxfZ2V0dG9rZW4gPSBW
SU9DVExfRk4oOCksDQoJbWluaWthZnNfcGlvY3RsX3VubG9nID0gVklPQ1RM
X0ZOKDkpLA0KCW1pbmlrYWZzX3Bpb2N0bF93aGVyZWlzID0gVklPQ1RMX0ZO
KDE0KSwNCgltaW5pa2Fmc19waW9jdGxfdW5wYWcgPSBWSU9DVExfRk4oMjEp
LA0KCW1pbmlrYWZzX3Bpb2N0bF9nZXRjZWxsb2ZmaWxlID0gVklPQ1RMX0ZO
KDMwKSwNCgltaW5pa2Fmc19waW9jdGxfZ2V0d3NjZWxsID0gVklPQ1RMX0ZO
KDMxKSwNCgltaW5pa2Fmc19waW9jdGxfZ2V0dG9rZW4yID0gQ0lPQ1RMX0ZO
KDcpLA0KCW1pbmlrYWZzX3Bpb2N0bF9zZXR0b2tlbjIgPSBDSU9DVExfRk4o
OCksDQoJbWluaWthZnNfcGlvY3RsX2dldHByb3AgPSBDSU9DVExfRk4oMTAp
LA0KCW1pbmlrYWZzX3Bpb2N0bF9zZXRwcm9wID0gQ0lPQ1RMX0ZOKDExKSwN
Cn07DQoNCi8qIEZvcndhcmQgZGVjbGFyYXRpb25zLiAqLw0Kc3RhdGljIGlu
dCBtaW5pa2Fmc181c2V0dG9rZW4yKGNvbnN0IGNoYXIgKmNlbGwsIGtyYjVf
Y3JlZHMgKmNyZWRzLCBpbnQzMl90IGlkKTsNCg0KLyogQ2FsbCBBRlMgdXNp
bmcgYW4gaW9jdGwuIE1pZ2h0IG5vdCBwb3J0IHRvIHlvdXIgc3lzdGVtLiAq
Lw0Kc3RhdGljIGludA0KbWluaWthZnNfaW9jdGxjYWxsKGxvbmcgZnVuY3Rp
b24sIGxvbmcgYXJnMSwgbG9uZyBhcmcyLCBsb25nIGFyZzMsIGxvbmcgYXJn
NCkNCnsNCglpbnQgZmQsIHJldCwgc2F2ZWRfZXJybm87DQoJc3RydWN0IG1p
bmlrYWZzX3Byb2NkYXRhIGRhdGE7DQoJZmQgPSBvcGVuKG1pbmlrYWZzX3By
b2NwYXRoLCBPX1JEV1IpOw0KCWlmIChmZCA9PSAtMSkgew0KCQllcnJubyA9
IEVJTlZBTDsNCgkJcmV0dXJuIC0xOw0KCX0NCglkYXRhLmZ1bmN0aW9uID0g
ZnVuY3Rpb247DQoJZGF0YS5wYXJhbTEgPSBhcmcxOw0KCWRhdGEucGFyYW0y
ID0gYXJnMjsNCglkYXRhLnBhcmFtMyA9IGFyZzM7DQoJZGF0YS5wYXJhbTQg
PSBhcmc0Ow0KCXJldCA9IGlvY3RsKGZkLCBWSU9DVExfU1lTQ0FMTCwgJmRh
dGEpOw0KCXNhdmVkX2Vycm5vID0gZXJybm87DQoJY2xvc2UoZmQpOw0KCWVy
cm5vID0gc2F2ZWRfZXJybm87DQoJcmV0dXJuIHJldDsNCn0NCg0KLyogQ2Fs
bCB0aGUgQUZTIHN5c2NhbGwuIE1pZ2h0IG5vdCBwb3J0IHRvIHlvdXIgc3lz
dGVtLiAqLw0Kc3RhdGljIGludA0KbWluaWthZnNfc3lzY2FsbChsb25nIGZ1
bmN0aW9uLCBsb25nIGFyZzEsIGxvbmcgYXJnMiwgbG9uZyBhcmczLCBsb25n
IGFyZzQpDQp7DQojaWZkZWYgX19OUl9hZnNfc3lzY2FsbA0KCXJldHVybiBz
eXNjYWxsKF9fTlJfYWZzX3N5c2NhbGwsIGZ1bmN0aW9uLCBhcmcxLCBhcmcy
LCBhcmczLCBhcmc0KTsNCiNlbHNlDQoJZXJybm8gPSBFTk9TWVM7DQoJcmV0
dXJuIC0xOw0KI2VuZGlmDQp9DQoNCi8qIENhbGwgaW50byBBRlMsIHNvbWVo
b3cuICovDQpzdGF0aWMgaW50DQptaW5pa2Fmc19jYWxsKGxvbmcgZnVuY3Rp
b24sIGxvbmcgYXJnMSwgbG9uZyBhcmcyLCBsb25nIGFyZzMsIGxvbmcgYXJn
NCkNCnsNCglpZiAobWluaWthZnNfcHJvY3BhdGggIT0gTlVMTCkgew0KCQly
ZXR1cm4gbWluaWthZnNfaW9jdGxjYWxsKGZ1bmN0aW9uLCBhcmcxLCBhcmcy
LCBhcmczLCBhcmc0KTsNCgl9DQoJcmV0dXJuIG1pbmlrYWZzX3N5c2NhbGwo
ZnVuY3Rpb24sIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpOw0KfQ0KDQovKiBN
YWtlIGFuIEFGUyBwaW9jdGwuIE1pZ2h0IG5vdCBwb3J0IHRvIHlvdXIgc3lz
dGVtLiAqLw0Kc3RhdGljIGludA0KbWluaWthZnNfcGlvY3RsKGNoYXIgKmZp
bGUsIGVudW0gbWluaWthZnNfcGlvY3RsX2ZuIHN1YmZ1bmN0aW9uLA0KCQlz
dHJ1Y3QgbWluaWthZnNfaW9ibG9jayAqaW9iKQ0Kew0KCXJldHVybiBtaW5p
a2Fmc19jYWxsKG1pbmlrYWZzX3N1YnN5c19waW9jdGwsIChsb25nKSBmaWxl
LA0KCQkJICAgICBzdWJmdW5jdGlvbiwgKGxvbmcpIGlvYiwgMCk7DQp9DQoN
Ci8qIERldGVybWluZSBpbiB3aGljaCBjZWxsIGEgZ2l2ZW4gZmlsZSByZXNp
ZGVzLiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MuICovDQppbnQNCm1pbmlrYWZz
X2NlbGxfb2ZfZmlsZShjb25zdCBjaGFyICpmaWxlLCBjaGFyICpjZWxsLCBz
aXplX3QgbGVuZ3RoKQ0Kew0KCXN0cnVjdCBtaW5pa2Fmc19pb2Jsb2NrIGlv
YjsNCgljaGFyICp3ZmlsZTsNCglpbnQgaTsNCg0KCXdmaWxlID0geHN0cmR1
cChmaWxlID8gZmlsZSA6ICIvYWZzIik7DQoNCgltZW1zZXQoJmlvYiwgMCwg
c2l6ZW9mKGlvYikpOw0KCWlvYi5pbiA9IHdmaWxlOw0KCWlvYi5pbnNpemUg
PSBzdHJsZW4od2ZpbGUpICsgMTsNCglpb2Iub3V0ID0gY2VsbDsNCglpb2Iu
b3V0c2l6ZSA9IGxlbmd0aDsNCg0KCWkgPSBtaW5pa2Fmc19waW9jdGwod2Zp
bGUsIG1pbmlrYWZzX3Bpb2N0bF9nZXRjZWxsb2ZmaWxlLCAmaW9iKTsNCg0K
CXhzdHJmcmVlKHdmaWxlKTsNCglyZXR1cm4gaTsNCn0NCg0KLyogRG8gbWlu
aWthZnNfY2VsbF9vZl9maWxlLCBidXQgaWYgd2UgY2FuJ3QgZmluZCBvdXQs
IHdhbGsgdXAgdGhlIGZpbGVzeXN0ZW0NCiAqIHRyZWUgdW50aWwgd2UgZWl0
aGVyIGdldCBhbiBhbnN3ZXIgb3IgaGl0IHRoZSByb290IGRpcmVjdG9yeS4g
Ki8NCmludA0KbWluaWthZnNfY2VsbF9vZl9maWxlX3dhbGtfdXAoY29uc3Qg
Y2hhciAqZmlsZSwgY2hhciAqY2VsbCwgc2l6ZV90IGxlbmd0aCkNCnsNCglj
aGFyICpwLCBkaXJbUEFUSF9NQVggKyAxXTsNCglpbnQgaTsNCg0KCXNucHJp
bnRmKGRpciwgc2l6ZW9mKGRpciksICIlcyIsIGZpbGUpOw0KCWRvIHsNCgkJ
bWVtc2V0KGNlbGwsICdcMCcsIGxlbmd0aCk7DQoJCWkgPSBtaW5pa2Fmc19j
ZWxsX29mX2ZpbGUoZGlyLCBjZWxsLCBsZW5ndGgpOw0KCQlpZiAoaSAhPSAw
KSB7DQoJCQlwID0gc3RycmNocihkaXIsICcvJyk7DQoJCQlpZiAocCAhPSBO
VUxMKSB7DQoJCQkJKnAgPSAnXDAnOw0KCQkJfSBlbHNlIHsNCgkJCQlzdHJj
cHkoZGlyLCAiIik7DQoJCQl9DQoJCX0NCgl9IHdoaWxlICgoaSAhPSAwKSAm
JiAoc3RybGVuKGRpcikgPiAwKSk7DQoJcmV0dXJuIGk7DQp9DQoNCi8qIERl
dGVybWluZSBpZiBBRlMgaXMgcnVubmluZy4gVW5saWtlIG1vc3Qgb3RoZXIg
ZnVuY3Rpb25zLCByZXR1cm4gMCBvbg0KICogRkFJTFVSRS4gKi8NCmludA0K
bWluaWthZnNfaGFzX2Fmcyh2b2lkKQ0Kew0KCWNoYXIgY2VsbFtQQVRIX01B
WF07DQoJaW50IGZkLCBpLCByZXQ7DQoJc3RydWN0IHNpZ2FjdGlvbiBuZXdz
LCBvbGRzOw0KDQoJZmQgPSAtMTsNCg0KI2lmZGVmIE9QRU5BRlNfQUZTX0lP
Q1RMX0ZJTEUNCglpZiAoZmQgPT0gLTEpIHsNCgkJZmQgPSBvcGVuKE9QRU5B
RlNfQUZTX0lPQ1RMX0ZJTEUsIE9fUkRXUik7DQoJCWlmIChmZCAhPSAtMSkg
ew0KCQkJbWluaWthZnNfcHJvY3BhdGggPSBPUEVOQUZTX0FGU19JT0NUTF9G
SUxFOw0KCQkJY2xvc2UoZmQpOw0KCQkJcmV0dXJuIDE7DQoJCX0NCgl9DQoj
ZW5kaWYNCiNpZmRlZiBBUkxBX0FGU19JT0NUTF9GSUxFDQoJaWYgKGZkID09
IC0xKSB7DQoJCWZkID0gb3BlbihBUkxBX0FGU19JT0NUTF9GSUxFLCBPX1JE
V1IpOw0KCQlpZiAoZmQgIT0gLTEpIHsNCgkJCW1pbmlrYWZzX3Byb2NwYXRo
ID0gQVJMQV9BRlNfSU9DVExfRklMRTsNCgkJCWNsb3NlKGZkKTsNCgkJCXJl
dHVybiAxOw0KCQl9DQoJfQ0KI2VuZGlmDQoJaWYgKGZkID09IC0xKSB7DQoJ
CXJldHVybiAwOw0KCX0NCg0KCW1lbXNldCgmbmV3cywgMCwgc2l6ZW9mKG5l
d3MpKTsNCgluZXdzLnNhX2hhbmRsZXIgPSBTSUdfSUdOOw0KCWkgPSBzaWdh
Y3Rpb24oU0lHU1lTLCAmbmV3cywgJm9sZHMpOw0KCWlmIChpICE9IDApIHsN
CgkJcmV0dXJuIDA7DQoJfQ0KDQoJcmV0ID0gMDsNCglpID0gbWluaWthZnNf
Y2VsbF9vZl9maWxlKE5VTEwsIGNlbGwsIHNpemVvZihjZWxsKSk7DQoJaWYg
KChpID09IDApIHx8ICgoaSA9PSAtMSkgJiYgKGVycm5vICE9IEVOT1NZUykp
KSB7DQoJCXJldCA9IDE7DQoJfQ0KDQoJc2lnYWN0aW9uKFNJR1NZUywgJm9s
ZHMsIE5VTEwpOw0KDQoJcmV0dXJuIHJldDsNCn0NCg0KLyogRGV0ZXJtaW5l
IGluIHdoaWNoIHJlYWxtIGEgY2VsbCBleGlzdHMuICBXZSBkbyB0aGlzIGJ5
IG9idGFpbmluZyB0aGUgYWRkcmVzcw0KICogb2YgdGhlIGZpbGVzZXJ2ZXIg
d2hpY2ggaG9sZHMgL2Fmcy9jZWxsbmFtZSAoYXNzdW1pbmcgdGhhdCB0aGUg
cm9vdC5jZWxsDQogKiB2b2x1bWUgZnJvbSB0aGUgY2VsbCBpcyBtb3VudGVk
IHRoZXJlKSwgY29udmVydGluZyB0aGUgYWRkcmVzcyB0byBhIGhvc3QNCiAq
IG5hbWUsIGFuZCB0aGVuIGFza2luZyBsaWJrcmI1IHRvIHRlbGwgdXMgdG8g
d2hpY2ggcmVhbG0gdGhlIGhvc3QgYmVsb25ncy4gKi8NCnN0YXRpYyBpbnQN
Cm1pbmlrYWZzX3JlYWxtX29mX2NlbGxfd2l0aF9jdHgoa3JiNV9jb250ZXh0
IGN0eCwNCgkJCQlzdHJ1Y3QgX3BhbV9rcmI1X29wdGlvbnMgKm9wdGlvbnMs
DQoJCQkJY29uc3QgY2hhciAqY2VsbCwNCgkJCQljaGFyICpyZWFsbSwgc2l6
ZV90IGxlbmd0aCkNCnsNCglzdHJ1Y3QgbWluaWthZnNfaW9ibG9jayBpb2I7
DQoJc3RydWN0IHNvY2thZGRyX2luIHNpbjsNCglpbl9hZGRyX3QgKmFkZHJl
c3M7DQoJa3JiNV9jb250ZXh0IHVzZV9jdHg7DQoJY2hhciAqcGF0aCwgaG9z
dFtIT1NUTkFNRV9TSVpFXSwgKipyZWFsbXM7DQoJaW50IGksIG5fYWRkcmVz
c2VzLCByZXQ7DQoNCglpZiAoY2VsbCkgew0KCQlwYXRoID0gbWFsbG9jKHN0
cmxlbihjZWxsKSArIDYpOw0KCX0gZWxzZSB7DQoJCXBhdGggPSBtYWxsb2Mo
NSk7DQoJfQ0KCWlmIChwYXRoID09IE5VTEwpIHsNCgkJcmV0dXJuIC0xOw0K
CX0NCglpZiAoY2VsbCkgew0KCQlzcHJpbnRmKHBhdGgsICIvYWZzLyVzIiwg
Y2VsbCk7DQoJfSBlbHNlIHsNCgkJc3ByaW50ZihwYXRoLCAiL2FmcyIpOw0K
CX0NCg0KCW5fYWRkcmVzc2VzID0gMTY7DQoJZG8gew0KCQkvKiBhbGxvY2F0
ZSB0aGUgb3V0cHV0IGJ1ZmZlciBmb3IgdGhlIGFkZHJlc3MgW2xpc3RdICov
DQoJCWFkZHJlc3MgPSBtYWxsb2Mobl9hZGRyZXNzZXMgKiBzaXplb2YoYWRk
cmVzc1swXSkpOw0KCQlpZiAoYWRkcmVzcyA9PSBOVUxMKSB7DQoJCQlyZXQg
PSAtMTsNCgkJCWJyZWFrOw0KCQl9DQoJCW1lbXNldChhZGRyZXNzLCAwLCBu
X2FkZHJlc3NlcyAqIHNpemVvZihhZGRyZXNzWzBdKSk7DQoJCW1lbXNldCgm
aW9iLCAwLCBzaXplb2YoaW9iKSk7DQoJCWlvYi5pbiA9IHBhdGg7DQoJCWlv
Yi5pbnNpemUgPSBzdHJsZW4ocGF0aCkgKyAxOw0KCQlpb2Iub3V0ID0gKGNo
YXIqKSAmYWRkcmVzc1swXTsNCgkJaW9iLm91dHNpemUgPSBuX2FkZHJlc3Nl
cyAqIHNpemVvZihhZGRyZXNzWzBdKTsNCgkJcmV0ID0gbWluaWthZnNfcGlv
Y3RsKHBhdGgsIG1pbmlrYWZzX3Bpb2N0bF93aGVyZWlzLCAmaW9iKTsNCgkJ
LyogaWYgd2UgZmFpbGVkLCBmcmVlIHRoZSBhZGRyZXNzIFtsaXN0XSwgYW5k
IGlmIHRoZSBlcnJvciB3YXMNCgkJICogRTJCSUcsIGluY3JlYXNlIHRoZSBz
aXplIHdlJ2xsIHVzZSBuZXh0IHRpbWUsIHVwIHRvIGENCgkJICogaGFyZC1j
b2RlZCBsaW1pdCAqLw0KCQlpZiAocmV0ICE9IDApIHsNCgkJCWlmIChvcHRp
b25zLT5kZWJ1Zykgew0KCQkJCWRlYnVnKCJlcnJvciBkdXJpbmcgd2hlcmVp
cyBwaW9jdGw6ICVzIiwNCgkJCQkgICAgICBzdHJlcnJvcihlcnJubykpOw0K
CQkJfQ0KCQkJZnJlZShhZGRyZXNzKTsNCgkJCWFkZHJlc3MgPSBOVUxMOw0K
CQkJaWYgKGVycm5vID09IEUyQklHKSB7DQoJCQkJaWYgKG5fYWRkcmVzc2Vz
ID4gMjU2KSB7DQoJCQkJCWlmIChvcHRpb25zLT5kZWJ1Zykgew0KCQkJCQkJ
ZGVidWcoImdpdmluZyB1cCIpOw0KCQkJCQl9DQoJCQkJCWJyZWFrOw0KCQkJ
CX0NCgkJCQlpZiAob3B0aW9ucy0+ZGVidWcpIHsNCgkJCQkJZGVidWcoInJl
dHJ5aW5nIik7DQoJCQkJfQ0KCQkJCW5fYWRkcmVzc2VzICo9IDI7DQoJCQl9
DQoJCX0NCgl9IHdoaWxlICgocmV0ICE9IDApICYmIChlcnJubyA9PSBFMkJJ
RykpOw0KDQoJaWYgKHJldCAhPSAwKSB7DQoJCWlmIChvcHRpb25zLT5kZWJ1
Zykgew0KCQkJZGVidWcoImdvdCBlcnJvciAlZCAoJXMpIGRldGVybWluaW5n
IGZpbGUgc2VydmVyIGZvciAiDQoJCQkgICAgICAiXCIlc1wiIiwgZXJybm8s
IHY1X2Vycm9yX21lc3NhZ2UoZXJybm8pLCBwYXRoKTsNCgkJfQ0KCQlmcmVl
KHBhdGgpOw0KCQlyZXR1cm4gcmV0Ow0KCX0NCglmcmVlKHBhdGgpOw0KDQoJ
c2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOw0KCWlmIChvcHRpb25zLT5kZWJ1
Zykgew0KCQlmb3IgKGkgPSAwOyAoaSA8IG5fYWRkcmVzc2VzKSAmJiAoYWRk
cmVzc1tpXSAhPSAwKTsgaSsrKSB7DQoJCQlkZWJ1ZygiZmlsZSBzZXJ2ZXIg
Zm9yIFwiL2Fmcy8lc1wiIGlzICV1LiV1LiV1LiV1IiwNCgkJCSAgICAgIGNl
bGwsDQoJCQkgICAgICAoYWRkcmVzc1tpXSA+PiAgMCkgJiAweGZmLA0KCQkJ
ICAgICAgKGFkZHJlc3NbaV0gPj4gIDgpICYgMHhmZiwNCgkJCSAgICAgIChh
ZGRyZXNzW2ldID4+IDE2KSAmIDB4ZmYsDQoJCQkgICAgICAoYWRkcmVzc1tp
XSA+PiAyNCkgJiAweGZmKTsNCgkJfQ0KCX0NCg0KCWlmIChjdHggPT0gTlVM
TCkgew0KCQlpZiAoX3BhbV9rcmI1X2luaXRfY3R4KCZ1c2VfY3R4LCAwLCBO
VUxMKSAhPSAwKSB7DQoJCQlmcmVlKGFkZHJlc3MpOw0KCQkJcmV0dXJuIC0x
Ow0KCQl9DQoJfSBlbHNlIHsNCgkJdXNlX2N0eCA9IGN0eDsNCgl9DQoNCglm
b3IgKGkgPSAwOyAoaSA8IG5fYWRkcmVzc2VzKSAmJiAoYWRkcmVzc1tpXSAh
PSAwKTsgaSsrKSB7DQoJCW1lbWNweSgmc2luLnNpbl9hZGRyLCAmYWRkcmVz
c1tpXSwgc2l6ZW9mKGFkZHJlc3NbaV0pKTsNCgkJaWYgKGdldG5hbWVpbmZv
KChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIqKSAmc2luLCBzaXplb2Yoc2luKSwN
CgkJCQlob3N0LCBzaXplb2YoaG9zdCksIE5VTEwsIDAsDQoJCQkJTklfTkFN
RVJFUUQpID09IDApIHsNCgkJCWlmIChvcHRpb25zLT5kZWJ1Zykgew0KCQkJ
CWRlYnVnKCJmaWxlIHNlcnZlciAlZC4lZC4lZC4lZCBoYXMgbmFtZSAlcyIs
DQoJCQkJICAgICAgKGFkZHJlc3NbaV0gPj4gIDApICYgMHhmZiwNCgkJCQkg
ICAgICAoYWRkcmVzc1tpXSA+PiAgOCkgJiAweGZmLA0KCQkJCSAgICAgIChh
ZGRyZXNzW2ldID4+IDE2KSAmIDB4ZmYsDQoJCQkJICAgICAgKGFkZHJlc3Nb
aV0gPj4gMjQpICYgMHhmZiwNCgkJCQkgICAgICBob3N0KTsNCgkJCX0NCgkJ
CWlmIChrcmI1X2dldF9ob3N0X3JlYWxtKHVzZV9jdHgsIGhvc3QsICZyZWFs
bXMpID09IDApIHsNCgkJCQlzdHJuY3B5KHJlYWxtLCByZWFsbXNbMF0sIGxl
bmd0aCAtIDEpOw0KCQkJCXJlYWxtW2xlbmd0aCAtIDFdID0gJ1wwJzsNCgkJ
CQlrcmI1X2ZyZWVfaG9zdF9yZWFsbSh1c2VfY3R4LCByZWFsbXMpOw0KCQkJ
CWlmIChvcHRpb25zLT5kZWJ1Zykgew0KCQkJCQlkZWJ1ZygiJXMgaXMgaW4g
cmVhbG0gXCIlc1wiIiwNCgkJCQkJICAgICAgaG9zdCwgcmVhbG0pOw0KCQkJ
CX0NCgkJCQlpID0gMDsNCgkJCQlicmVhazsNCgkJCX0NCgkJfSBlbHNlIHsN
CgkJCWlmIChvcHRpb25zLT5kZWJ1Zykgew0KCQkJCWRlYnVnKCJlcnJvciAl
ZCglcykgZGV0ZXJtaW5pbmcgcmVhbG0gZm9yICVzIiwNCgkJCQkgICAgICBp
LCB2NV9lcnJvcl9tZXNzYWdlKGkpLCBob3N0KTsNCgkJCX0NCgkJfQ0KCX0N
Cg0KCWlmICh1c2VfY3R4ICE9IGN0eCkgew0KCQlfcGFtX2tyYjVfZnJlZV9j
dHgodXNlX2N0eCk7DQoJfQ0KDQoJZnJlZShhZGRyZXNzKTsNCg0KCXJldHVy
biBpOw0KfQ0KDQovKiBDcmVhdGUgYSBuZXcgUEFHLiAqLw0KaW50DQptaW5p
a2Fmc19zZXRwYWcodm9pZCkNCnsNCglyZXR1cm4gbWluaWthZnNfY2FsbCht
aW5pa2Fmc19zdWJzeXNfc2V0cGFnLCAwLCAwLCAwLCAwKTsNCn0NCg0KI2lm
IDANCi8qIExlYXZlIGFueSBQQUcuIEl0IHR1cm5zIG91dCB0aGlzIHJlc3Vs
dHMgaW4gYW4gdW5sb2coKSwgd2hpY2ggaXMgbm90IHdoYXQgd2UNCiAqIHdh
bnRlZCBoZXJlLiAqLw0Kc3RhdGljIGludA0KbWluaWthZnNfdW5wYWcodm9p
ZCkNCnsNCglzdHJ1Y3QgbWluaWthZnNfaW9ibG9jayBpb2I7DQoJY2hhciB3
ZmlsZVtdID0gIi9hZnMiOw0KCWludCBpOw0KDQoJbWVtc2V0KCZpb2IsIDAs
IHNpemVvZihpb2IpKTsNCglpb2IuaW4gPSB3ZmlsZTsNCglpb2IuaW5zaXpl
ID0gc2l6ZW9mKHdmaWxlKTsNCglpb2Iub3V0ID0gd2ZpbGU7DQoJaW9iLm91
dHNpemUgPSBzaXplb2Yod2ZpbGUpOw0KDQoJaSA9IG1pbmlrYWZzX3Bpb2N0
bCh3ZmlsZSwgbWluaWthZnNfcGlvY3RsX3VucGFnLCAmaW9iKTsNCglyZXR1
cm4gaTsNCn0NCiNlbmRpZg0KDQovKiBEZXRlcm1pbmUgd2hpY2ggY2VsbCBp
cyB0aGUgZGVmYXVsdCBvbiB0aGlzIHdvcmtzdGF0aW9uLiAqLw0KaW50DQpt
aW5pa2Fmc193c19jZWxsKGNoYXIgKmNlbGwsIHNpemVfdCBsZW5ndGgpDQp7
DQoJc3RydWN0IG1pbmlrYWZzX2lvYmxvY2sgaW9iOw0KCWNoYXIgd2ZpbGVb
XSA9ICIvYWZzIjsNCglpbnQgaTsNCg0KCW1lbXNldCgmaW9iLCAwLCBzaXpl
b2YoaW9iKSk7DQoJaW9iLmluID0gd2ZpbGU7DQoJaW9iLmluc2l6ZSA9IHN0
cmxlbih3ZmlsZSkgKyAxOw0KCWlvYi5vdXQgPSBjZWxsOw0KCWlvYi5vdXRz
aXplID0gbGVuZ3RoIC0gMTsNCgltZW1zZXQoY2VsbCwgJ1wwJywgbGVuZ3Ro
KTsNCg0KCWkgPSBtaW5pa2Fmc19waW9jdGwod2ZpbGUsIG1pbmlrYWZzX3Bp
b2N0bF9nZXR3c2NlbGwsICZpb2IpOw0KCQ0KCXJldHVybiBpOw0KfQ0KDQov
KiBTdHVmZiBhIHRpY2tldCBhbmQgREVTIGtleSBpbnRvIHRoZSBrZXJuZWwu
ICovDQpzdGF0aWMgaW50DQptaW5pa2Fmc19zZXR0b2tlbihjb25zdCB2b2lk
ICp0aWNrZXQsIHVpbnQzMl90IHRpY2tldF9zaXplLA0KCQkgIGludCBrdm5v
LCBjb25zdCB1bnNpZ25lZCBjaGFyICprZXksDQoJCSAgdWludDMyX3QgdWlk
LCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgZW5kLCB1aW50MzJfdCBmbGFn
cywNCgkJICBjb25zdCBjaGFyICpjZWxsKQ0Kew0KCWNoYXIgKmJ1ZmZlcjsN
CglzdHJ1Y3QgbWluaWthZnNfcGxhaW5fdG9rZW4gcGxhaW5fdG9rZW47DQoJ
c3RydWN0IG1pbmlrYWZzX2lvYmxvY2sgaW9iOw0KCXVpbnQzMl90IHNpemU7
DQoJaW50IGk7DQoNCgkvKiBBbGxvY2F0ZSB0aGUgaW5wdXQgYnVmZmVyLiAq
Lw0KCWJ1ZmZlciA9IG1hbGxvYyg0ICsgdGlja2V0X3NpemUgKw0KCQkJNCAr
IHNpemVvZihzdHJ1Y3QgbWluaWthZnNfcGxhaW5fdG9rZW4pICsNCgkJCTQg
Kw0KCQkJc3RybGVuKGNlbGwpICsgMSk7DQoJaWYgKGJ1ZmZlciA9PSBOVUxM
KSB7DQoJCXJldHVybiAtMTsNCgl9DQoNCgkvKiB0aGVpciBjb3B5IG9mIHRo
ZSBzZXNzaW9uIGtleSwgZW5jcnlwdGVkIHdpdGggdGhlaXIga2V5ICovDQoJ
c2l6ZSA9IHRpY2tldF9zaXplOw0KCW1lbWNweShidWZmZXIsICZzaXplLCA0
KTsNCgltZW1jcHkoYnVmZmVyICsgNCwgdGlja2V0LCBzaXplKTsNCg0KCS8q
IG91ciBjb3B5IG9mIHRoZSBzZXNzaW9uIGtleSwgcGx1cyBob3VzZWtlZXBp
bmcgKi8NCglwbGFpbl90b2tlbi5rdm5vID0ga3ZubzsNCgltZW1jcHkoJnBs
YWluX3Rva2VuLmtleSwga2V5LCA4KTsNCglwbGFpbl90b2tlbi51aWQgPSB1
aWQ7DQoJcGxhaW5fdG9rZW4uc3RhcnQgPSBzdGFydDsNCglwbGFpbl90b2tl
bi5lbmQgPSBlbmQ7DQoJaWYgKCgoZW5kIC0gc3RhcnQpICUgMikgIT0gMCkg
ew0KCQlwbGFpbl90b2tlbi5lbmQtLTsNCgl9DQoNCglzaXplID0gc2l6ZW9m
KHBsYWluX3Rva2VuKTsNCgltZW1jcHkoYnVmZmVyICsgNCArIHRpY2tldF9z
aXplLCAmc2l6ZSwgNCk7DQoJbWVtY3B5KGJ1ZmZlciArIDQgKyB0aWNrZXRf
c2l6ZSArIDQsICZwbGFpbl90b2tlbiwgc2l6ZSk7DQoNCgkvKiBmbGFncyAq
Lw0KCXNpemUgPSBmbGFnczsNCgltZW1jcHkoYnVmZmVyICsgNCArIHRpY2tl
dF9zaXplICsgNCArIHNpemVvZihwbGFpbl90b2tlbiksICZzaXplLCA0KTsN
Cg0KCS8qIHRoZSBuYW1lIG9mIHRoZSBjZWxsICovDQoJbWVtY3B5KGJ1ZmZl
ciArIDQgKyB0aWNrZXRfc2l6ZSArIDQgKyBzaXplb2YocGxhaW5fdG9rZW4p
ICsgNCwNCgkgICAgICAgY2VsbCwgc3RybGVuKGNlbGwpICsgMSk7DQoNCgkv
KiB0aGUgcmVndWxhciBzdHVmZiAqLw0KCW1lbXNldCgmaW9iLCAwLCBzaXpl
b2YoaW9iKSk7DQoJaW9iLmluID0gYnVmZmVyOw0KCWlvYi5pbnNpemUgPSA0
ICsgdGlja2V0X3NpemUgKw0KCQkgICAgIDQgKyBzaXplb2Yoc3RydWN0IG1p
bmlrYWZzX3BsYWluX3Rva2VuKSArDQoJCSAgICAgNCArIHN0cmxlbihjZWxs
KSArIDE7DQoJaW9iLm91dCA9IE5VTEw7DQoJaW9iLm91dHNpemUgPSAwOw0K
DQoJaSA9IG1pbmlrYWZzX3Bpb2N0bChOVUxMLCBtaW5pa2Fmc19waW9jdGxf
c2V0dG9rZW4sICZpb2IpOw0KCWZyZWUoYnVmZmVyKTsNCglyZXR1cm4gaTsN
Cn0NCg0KLyogU3R1ZmYgdGhlIHRpY2tldCBhbmQga2V5IGZyb20gYSBjcmVk
ZW50aWFscyBzdHJ1Y3R1cmUgaW50byB0aGUga2VybmVsLiAqLw0Kc3RhdGlj
IGludA0KbWluaWthZnNfNXNldHRva2VuKGNvbnN0IGNoYXIgKmNlbGwsIGty
YjVfY3JlZHMgKmNyZWRzLCB1aWRfdCB1aWQpDQp7DQoJLyogQXNzdW1lIHRo
YXQgdGhlIG9ubHkgOC1ieXRlIGtleXMgYXJlIERFUyBrZXlzLCBhbmQgc2Fu
aXR5LWNoZWNrLiAqLw0KCWlmICh2NV9jcmVkc19rZXlfbGVuZ3RoKGNyZWRz
KSAhPSA4KSB7DQoJCXJldHVybiAtMTsNCgl9DQoJcmV0dXJuIG1pbmlrYWZz
X3NldHRva2VuKGNyZWRzLT50aWNrZXQuZGF0YSwNCgkJCQkgY3JlZHMtPnRp
Y2tldC5sZW5ndGgsDQoJCQkJIDB4MTAwLCAvKiBtYWdpYyBudW1iZXIsIHNp
Z25hbHMgT3BlbkFGUw0KCQkJCQkgKiAxLjIuOCBhbmQgbGF0ZXIgdGhhdCB0
aGUgdGlja2V0DQoJCQkJCSAqIGlzIGFjdHVhbGx5IGEgdjUgdGlja2V0ICov
DQoJCQkJIHY1X2NyZWRzX2tleV9jb250ZW50cyhjcmVkcyksDQoJCQkJIHVp
ZCwNCgkJCQkgY3JlZHMtPnRpbWVzLnN0YXJ0dGltZSwNCgkJCQkgY3JlZHMt
PnRpbWVzLmVuZHRpbWUsDQoJCQkJIDAsDQoJCQkJIGNlbGwpOw0KfQ0KDQov
KiBDbGVhciBvdXIgdG9rZW5zLiAqLw0KaW50DQptaW5pa2Fmc191bmxvZyh2
b2lkKQ0Kew0KCXJldHVybiBtaW5pa2Fmc19waW9jdGwoTlVMTCwgbWluaWth
ZnNfcGlvY3RsX3VubG9nLCBOVUxMKTsNCn0NCg0KLyogQXNrIHRoZSBrZXJu
ZWwgd2hpY2ggY2lwaGVycyBpdCBzdXBwb3J0cyBmb3IgdXNlIHdpdGggcnhr
NS4gKi8NCnN0YXRpYyBpbnQNCm1pbmlrYWZzX2dldF9wcm9wZXJ0eShjb25z
dCBjaGFyICpwcm9wZXJ0eSwgY2hhciAqdmFsdWUsIGludCBsZW5ndGgpDQp7
DQoJc3RydWN0IG1pbmlrYWZzX2lvYmxvY2sgaW9iOw0KCWludCBpOw0KDQoJ
aW9iLmluID0gcHJvcGVydHkgPyAoY2hhciAqKSBwcm9wZXJ0eSA6ICIqIjsN
Cglpb2IuaW5zaXplID0gc3RybGVuKHByb3BlcnR5KSArIDE7DQoJaW9iLm91
dCA9IHZhbHVlOw0KCWlvYi5vdXRzaXplID0gbGVuZ3RoOw0KCWkgPSBtaW5p
a2Fmc19waW9jdGwoTlVMTCwgbWluaWthZnNfcGlvY3RsX2dldHByb3AsICZp
b2IpOw0KCXJldHVybiBpOw0KfQ0KDQpzdGF0aWMgaW50DQptaW5pa2Fmc19n
ZXRfcnhrNV9lbmN0eXBlcyhrcmI1X2VuY3R5cGUgKmV0eXBlcywgaW50IG5f
ZXR5cGVzKQ0Kew0KCWludCBuOw0KCXVpbnQzMl90IGk7DQoJbG9uZyBsOw0K
CWNvbnN0IGNoYXIgKnByb3BlcnR5ID0gInJ4azUuZW5jdHlwZXMiLCAqcCwg
KnY7DQoJY2hhciBlbmN0eXBlc1sxMDI0XSwgKnE7DQoJbiA9IC0xOw0KCW1l
bXNldChlbmN0eXBlcywgJ1wwJywgc2l6ZW9mKGVuY3R5cGVzKSk7DQoJaWYg
KG1pbmlrYWZzX2dldF9wcm9wZXJ0eShwcm9wZXJ0eSwNCgkJCQkgIGVuY3R5
cGVzLCBzaXplb2YoZW5jdHlwZXMpIC0gMSkgPT0gMCkgew0KCQlwID0gZW5j
dHlwZXM7DQoJCW4gPSAwOw0KCQl3aGlsZSAoKHAgIT0gTlVMTCkgJiYgKCpw
ICE9ICdcMCcpICYmIChuIDwgbl9ldHlwZXMpKSB7DQoJCQl2ID0gcCArIHN0
cmxlbihwKSArIDE7DQoJCQlpZiAoc3RyY21wKHAsIHByb3BlcnR5KSA9PSAw
KSB7DQoJCQkJcCA9IHY7DQoJCQkJd2hpbGUgKChwICE9IE5VTEwpICYmICgq
cCAhPSAnXDAnKSAmJg0KCQkJCSAgICAgICAobiA8IG5fZXR5cGVzKSkgew0K
CQkJCQlsID0gc3RydG9sKHAsICZxLCAxMCk7DQoJCQkJCWlmICgocSAhPSBO
VUxMKSAmJg0KCQkJCQkgICAgKCgqcSA9PSAnICcpIHx8ICgqcSA9PSAnXDAn
KSkpIHsNCgkJCQkJCWkgPSBsICYgMHhmZmZmZmZmZjsNCgkJCQkJCWlmIChp
ICE9IDApIHsNCgkJCQkJCQlldHlwZXNbbisrXSA9IGk7DQoJCQkJCQl9DQoJ
CQkJCQlwID0gcSArIHN0cmNzcG4ocSwNCgkJCQkJCQkJIjAxMjM0NTY3ODki
KTsNCgkJCQkJfSBlbHNlIHsNCgkJCQkJCWJyZWFrOw0KCQkJCQl9DQoJCQkJ
fQ0KCQkJfQ0KCQkJcCA9IHYgKyBzdHJsZW4odikgKyAxOw0KCQl9DQoJfQ0K
CXJldHVybiBuOw0KfQ0KDQovKiBUcnkgdG8gc2V0IGEgdG9rZW4gZm9yIHRo
ZSBnaXZlbiBjZWxsIHVzaW5nIGNyZWRzIGZvciB0aGUgbmFtZWQgcHJpbmNp
cGFsLiAqLw0Kc3RhdGljIGludA0KbWluaWthZnNfNWxvZ193aXRoX3ByaW5j
aXBhbChrcmI1X2NvbnRleHQgY3R4LA0KCQkJICAgICBzdHJ1Y3QgX3BhbV9r
cmI1X29wdGlvbnMgKm9wdGlvbnMsDQoJCQkgICAgIGtyYjVfY2NhY2hlIGNj
YWNoZSwNCgkJCSAgICAgY29uc3QgY2hhciAqY2VsbCwNCgkJCSAgICAgY29u
c3QgY2hhciAqcHJpbmNpcGFsLA0KCQkJICAgICB1aWRfdCB1aWQsDQoJCQkg
ICAgIGludCB1c2VfcnhrNSwNCgkJCSAgICAgaW50IHVzZV92NV8yYikNCnsN
CglrcmI1X3ByaW5jaXBhbCBzZXJ2ZXIsIGNsaWVudDsNCglrcmI1X2NyZWRz
IG1jcmVkcywgY3JlZHMsICpuZXdfY3JlZHM7DQoJY2hhciAqdW5wYXJzZWRf
Y2xpZW50Ow0KCWtyYjVfZW5jdHlwZSB2NV8yYl9ldHlwZXNbXSA9IHsNCgkJ
RU5DVFlQRV9ERVNfQ0JDX0NSQywNCgkJRU5DVFlQRV9ERVNfQ0JDX01ENCwN
CgkJRU5DVFlQRV9ERVNfQ0JDX01ENSwNCgl9Ow0KCWtyYjVfZW5jdHlwZSBy
eGs1X2VuY3R5cGVzWzE2XTsNCglrcmI1X2VuY3R5cGUgKmV0eXBlczsNCglp
bnQgaSwgbl9ldHlwZXM7DQoJaW50IHRtcDsNCg0KCW1lbXNldCgmY2xpZW50
LCAwLCBzaXplb2YoY2xpZW50KSk7DQoJbWVtc2V0KCZzZXJ2ZXIsIDAsIHNp
emVvZihzZXJ2ZXIpKTsNCglpZiAodXNlX3J4azUpIHsNCgkJbl9ldHlwZXMg
PSBtaW5pa2Fmc19nZXRfcnhrNV9lbmN0eXBlcyhyeGs1X2VuY3R5cGVzLA0K
CQkJCQkJICAgICAgc2l6ZW9mKHJ4azVfZW5jdHlwZXMpIC8NCgkJCQkJCSAg
ICAgIHNpemVvZihyeGs1X2VuY3R5cGVzWzBdKSAtDQoJCQkJCQkgICAgICAx
KTsNCiNpZiAxDQoJCW5fZXR5cGVzID0gMDsNCiNlbmRpZg0KCQlpZiAobl9l
dHlwZXMgPiAwKSB7DQoJCQlldHlwZXMgPSByeGs1X2VuY3R5cGVzOw0KCQkJ
cnhrNV9lbmN0eXBlc1tuX2V0eXBlc10gPSAwOw0KCQl9IGVsc2Ugew0KCQkJ
ZXR5cGVzID0gTlVMTDsNCgkJCW5fZXR5cGVzID0gMTsgLyogaGFjazogd2Ug
d2FudCB0byB0cnkgYXQgbGVhc3Qgb25jZSAqLw0KCQl9DQoJfSBlbHNlIHsN
CgkJZXR5cGVzID0gdjVfMmJfZXR5cGVzOw0KCQluX2V0eXBlcyA9IHNpemVv
Zih2NV8yYl9ldHlwZXMpIC8gc2l6ZW9mKHY1XzJiX2V0eXBlc1swXSk7DQoj
aWZkZWYgSEFWRV9LUkI1X0FMTE9XX1dFQUtfQ1JZUFRPDQoJCWlmIChrcmI1
X2FsbG93X3dlYWtfY3J5cHRvKGN0eCwgVFJVRSkgIT0gMCkgeyAvKiBYWFgg
Ki8NCgkJCXdhcm4oImVycm9yIGVuYWJsaW5nIHdlYWsgY3J5cHRvIChERVMp
LCBjb250aW51aW5nIik7DQoJCX0NCiNlbmRpZg0KCX0NCg0KCWlmIChrcmI1
X2NjX2dldF9wcmluY2lwYWwoY3R4LCBjY2FjaGUsICZjbGllbnQpICE9IDAp
IHsNCgkJaWYgKG9wdGlvbnMtPmRlYnVnKSB7DQoJCQlkZWJ1ZygiZXJyb3Ig
ZGV0ZXJtaW5pbmcgZGVmYXVsdCBwcmluY2lwYWwgbmFtZSAiDQoJCQkgICAg
ICAiZm9yIGNjYWNoZSIpOw0KCQl9DQoJCXJldHVybiAtMTsNCgl9DQoJdW5w
YXJzZWRfY2xpZW50ID0gTlVMTDsNCglpZiAoa3JiNV91bnBhcnNlX25hbWUo
Y3R4LCBjbGllbnQsICZ1bnBhcnNlZF9jbGllbnQpICE9IDApIHsNCgkJd2Fy
bigiZXJyb3IgdW5wYXJzaW5nIGNsaWVudCBwcmluY2lwYWwgbmFtZSBmcm9t
IGNjYWNoZSIpOw0KCQlrcmI1X2ZyZWVfcHJpbmNpcGFsKGN0eCwgY2xpZW50
KTsNCgkJcmV0dXJuIC0xOw0KCX0NCglpZiAodjVfcGFyc2VfbmFtZShjdHgs
IG9wdGlvbnMsIHByaW5jaXBhbCwgJnNlcnZlcikgIT0gMCkgew0KCQl3YXJu
KCJlcnJvciBwYXJzaW5nIHByaW5jaXBhbCBuYW1lICclcyciLCBwcmluY2lw
YWwpOw0KCQl2NV9mcmVlX3VucGFyc2VkX25hbWUoY3R4LCB1bnBhcnNlZF9j
bGllbnQpOw0KCQlrcmI1X2ZyZWVfcHJpbmNpcGFsKGN0eCwgY2xpZW50KTsN
CgkJcmV0dXJuIC0xOw0KCX0NCg0KCS8qIENoZWNrIGlmIHdlIGFscmVhZHkg
aGF2ZSBhIHN1aXRhYmxlIGNyZWRlbnRpYWwuICovDQoJZm9yIChpID0gMDsg
aSA8IG5fZXR5cGVzOyBpKyspIHsNCgkJbWVtc2V0KCZtY3JlZHMsIDAsIHNp
emVvZihtY3JlZHMpKTsNCgkJbWVtc2V0KCZjcmVkcywgMCwgc2l6ZW9mKGNy
ZWRzKSk7DQoJCW1jcmVkcy5jbGllbnQgPSBjbGllbnQ7DQoJCW1jcmVkcy5z
ZXJ2ZXIgPSBzZXJ2ZXI7DQoJCWlmIChldHlwZXMgIT0gTlVMTCkgew0KI2lm
ZGVmIEhBVkVfS1JCNV9FTkNUWVBFX0VOQUJMRQ0KCQkJaWYgKGtyYjVfZW5j
dHlwZV9lbmFibGUoY3R4LCBldHlwZXNbaV0pICE9IDApIHsNCgkJCQljaGFy
IGV0eXBlWzMyXTsNCgkJCQkvKiBXaGV0aGVyIG9yIG5vdCBlbmN0eXBlX3Rv
X3N0cmluZw0KCQkJCSAqIG51bC10ZXJtaW5hdGVzIHZhcmllcyBiZXR3ZWVu
DQoJCQkJICogaW1wbGVtZW50YXRpb25zIGFuZCB2ZXJzaW9ucy4gKi8NCgkJ
CQltZW1zZXQoZXR5cGUsICdcMCcsIHNpemVvZihldHlwZSkpOw0KCQkJCWlm
ICh2NV9lbmN0eXBlX3RvX3N0cmluZyhjdHgsIGV0eXBlc1tpXSwgZXR5cGUs
DQoJCQkJCQkJIHNpemVvZihldHlwZSkgLSAxKSAhPSAwKSB7DQoJCQkJCXdh
cm4oImVycm9yIGVuYWJsaW5nIGVuY3R5cGUgJWQsICINCgkJCQkJICAgICAi
Y29udGludWluZyIsIGV0eXBlc1tpXSk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJ
d2FybigiZXJyb3IgZW5hYmxpbmcgZW5jdHlwZSAlcyAiDQoJCQkJCSAgICAg
ImNvbnRpbnVpbmciLCBldHlwZSk7DQoJCQkJfQ0KCQkJfQ0KI2VuZGlmDQoJ
CQl2NV9jcmVkc19zZXRfZXR5cGUoY3R4LCAmbWNyZWRzLCBldHlwZXNbaV0p
Ow0KCQl9DQoJCWlmIChrcmI1X2NjX3JldHJpZXZlX2NyZWQoY3R4LCBjY2Fj
aGUsIHY1X2NjX3JldHJpZXZlX21hdGNoKCksDQoJCQkJCSAgJm1jcmVkcywg
JmNyZWRzKSA9PSAwKSB7DQoJCQlpZiAodXNlX3J4azUgJiYNCgkJCSAgICAo
bWluaWthZnNfNXNldHRva2VuMihjZWxsLCAmY3JlZHMsIHVpZCkgPT0gMCkp
IHsNCgkJCQlrcmI1X2ZyZWVfY3JlZF9jb250ZW50cyhjdHgsICZjcmVkcyk7
DQoJCQkJdjVfZnJlZV91bnBhcnNlZF9uYW1lKGN0eCwgdW5wYXJzZWRfY2xp
ZW50KTsNCgkJCQlrcmI1X2ZyZWVfcHJpbmNpcGFsKGN0eCwgY2xpZW50KTsN
CgkJCQlrcmI1X2ZyZWVfcHJpbmNpcGFsKGN0eCwgc2VydmVyKTsNCgkJCQly
ZXR1cm4gMDsNCgkJCX0gZWxzZQ0KCQkJaWYgKHVzZV92NV8yYiAmJg0KCQkJ
ICAgIChtaW5pa2Fmc181c2V0dG9rZW4oY2VsbCwgJmNyZWRzLCB1aWQpID09
IDApKSB7DQoJCQkJa3JiNV9mcmVlX2NyZWRfY29udGVudHMoY3R4LCAmY3Jl
ZHMpOw0KCQkJCXY1X2ZyZWVfdW5wYXJzZWRfbmFtZShjdHgsIHVucGFyc2Vk
X2NsaWVudCk7DQoJCQkJa3JiNV9mcmVlX3ByaW5jaXBhbChjdHgsIGNsaWVu
dCk7DQoJCQkJa3JiNV9mcmVlX3ByaW5jaXBhbChjdHgsIHNlcnZlcik7DQoJ
CQkJcmV0dXJuIDA7DQoJCQl9DQoJCQlrcmI1X2ZyZWVfY3JlZF9jb250ZW50
cyhjdHgsICZjcmVkcyk7DQoJCX0NCgl9DQoNCgkvKiBUcnkgdG8gb2J0YWlu
IGEgc3VpdGFibGUgY3JlZGVudGlhbC4gKi8NCglmb3IgKGkgPSAwOyBpIDwg
bl9ldHlwZXM7IGkrKykgew0KCQltZW1zZXQoJm1jcmVkcywgMCwgc2l6ZW9m
KG1jcmVkcykpOw0KCQltY3JlZHMuY2xpZW50ID0gY2xpZW50Ow0KCQltY3Jl
ZHMuc2VydmVyID0gc2VydmVyOw0KCQlpZiAoZXR5cGVzICE9IE5VTEwpIHsN
CgkJCXY1X2NyZWRzX3NldF9ldHlwZShjdHgsICZtY3JlZHMsIGV0eXBlc1tp
XSk7DQoJCX0NCgkJbmV3X2NyZWRzID0gTlVMTDsNCgkJdG1wID0ga3JiNV9n
ZXRfY3JlZGVudGlhbHMoY3R4LCAwLCBjY2FjaGUsDQoJCQkJCSAgICZtY3Jl
ZHMsICZuZXdfY3JlZHMpOw0KCQlpZiAodG1wID09IDApIHsNCgkJCWlmICh1
c2VfcnhrNSAmJg0KCQkJICAgIChtaW5pa2Fmc181c2V0dG9rZW4yKGNlbGws
IG5ld19jcmVkcywgdWlkKSA9PSAwKSkgew0KCQkJCWtyYjVfZnJlZV9jcmVk
cyhjdHgsIG5ld19jcmVkcyk7DQoJCQkJdjVfZnJlZV91bnBhcnNlZF9uYW1l
KGN0eCwgdW5wYXJzZWRfY2xpZW50KTsNCgkJCQlrcmI1X2ZyZWVfcHJpbmNp
cGFsKGN0eCwgY2xpZW50KTsNCgkJCQlrcmI1X2ZyZWVfcHJpbmNpcGFsKGN0
eCwgc2VydmVyKTsNCgkJCQlyZXR1cm4gMDsNCgkJCX0gZWxzZQ0KCQkJaWYg
KHVzZV92NV8yYiAmJg0KCQkJICAgIChtaW5pa2Fmc181c2V0dG9rZW4oY2Vs
bCwgbmV3X2NyZWRzLCB1aWQpID09IDApKSB7DQoJCQkJa3JiNV9mcmVlX2Ny
ZWRzKGN0eCwgbmV3X2NyZWRzKTsNCgkJCQl2NV9mcmVlX3VucGFyc2VkX25h
bWUoY3R4LCB1bnBhcnNlZF9jbGllbnQpOw0KCQkJCWtyYjVfZnJlZV9wcmlu
Y2lwYWwoY3R4LCBjbGllbnQpOw0KCQkJCWtyYjVfZnJlZV9wcmluY2lwYWwo
Y3R4LCBzZXJ2ZXIpOw0KCQkJCXJldHVybiAwOw0KCQkJfQ0KCQkJa3JiNV9m
cmVlX2NyZWRzKGN0eCwgbmV3X2NyZWRzKTsNCgkJfSBlbHNlIHsNCgkJCWlm
IChvcHRpb25zLT5kZWJ1Zykgew0KCQkJCWlmIChldHlwZXMgIT0gTlVMTCkg
ew0KCQkJCQlkZWJ1ZygiZXJyb3Igb2J0YWluaW5nIGNyZWRlbnRpYWxzIGZv
ciAiDQoJCQkJCSAgICAgICInJXMnIChlbmN0eXBlPSVkKSBvbiBiZWhhbGYg
b2YgIg0KCQkJCQkgICAgICAiJyVzJzogJXMiLA0KCQkJCQkgICAgICBwcmlu
Y2lwYWwsIGV0eXBlc1tpXSwNCgkJCQkJICAgICAgdW5wYXJzZWRfY2xpZW50
LA0KCQkJCQkgICAgICB2NV9lcnJvcl9tZXNzYWdlKHRtcCkpOw0KCQkJCX0g
ZWxzZSB7DQoJCQkJCWRlYnVnKCJlcnJvciBvYnRhaW5pbmcgY3JlZGVudGlh
bHMgZm9yICINCgkJCQkJICAgICAgIiclcycgb24gYmVoYWxmIG9mICINCgkJ
CQkJICAgICAgIiclcyc6ICVzIiwNCgkJCQkJICAgICAgcHJpbmNpcGFsLA0K
CQkJCQkgICAgICB1bnBhcnNlZF9jbGllbnQsDQoJCQkJCSAgICAgIHY1X2Vy
cm9yX21lc3NhZ2UodG1wKSk7DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KDQoJ
djVfZnJlZV91bnBhcnNlZF9uYW1lKGN0eCwgdW5wYXJzZWRfY2xpZW50KTsN
CglrcmI1X2ZyZWVfcHJpbmNpcGFsKGN0eCwgY2xpZW50KTsNCglrcmI1X2Zy
ZWVfcHJpbmNpcGFsKGN0eCwgc2VydmVyKTsNCg0KCXJldHVybiAtMTsNCn0N
Cg0KLyogVHJ5IHRvIG9idGFpbiB0b2tlbnMgZm9yIHRoZSBuYW1lZCBjZWxs
IHVzaW5nIHRoZSBkZWZhdWx0IGNjYWNoZSBhbmQNCiAqIGNvbmZpZ3VyYXRp
b24gc2V0dGluZ3MuICovDQpzdGF0aWMgaW50DQptaW5pa2Fmc181bG9nKGty
YjVfY29udGV4dCBjb250ZXh0LCBrcmI1X2NjYWNoZSBjY2FjaGUsDQoJICAg
ICAgc3RydWN0IF9wYW1fa3JiNV9vcHRpb25zICpvcHRpb25zLA0KCSAgICAg
IGNvbnN0IGNoYXIgKmNlbGwsIGNvbnN0IGNoYXIgKmhpbnRfcHJpbmNpcGFs
LA0KCSAgICAgIHVpZF90IHVpZCwgaW50IHVzZV9yeGs1LCBpbnQgdXNlX3Y1
XzJiKQ0Kew0KCWtyYjVfY29udGV4dCBjdHg7DQoJa3JiNV9jY2FjaGUgdXNl
X2NjYWNoZTsNCglpbnQgcmV0Ow0KCXVuc2lnbmVkIGludCBpOw0KCWNoYXIg
KnByaW5jaXBhbCwgKmRlZmF1bHRyZWFsbSwgcmVhbG1bUEFUSF9NQVhdOw0K
CXNpemVfdCBwcmluY2lwYWxfc2l6ZSwgYmFzZV9zaXplOw0KCWNvbnN0IGNo
YXIgKmJhc2VfcnhrYWRbXSA9IHsiYWZzIiwgImFmc3gifTsNCgljb25zdCBj
aGFyICpiYXNlX3J4azVbXSA9IHsiYWZzLWs1In07DQoJY29uc3QgY2hhciAq
KmJhc2U7DQoNCglpZiAoY29udGV4dCA9PSBOVUxMKSB7DQoJCWlmIChfcGFt
X2tyYjVfaW5pdF9jdHgoJmN0eCwgMCwgTlVMTCkgIT0gMCkgew0KCQkJcmV0
dXJuIC0xOw0KCQl9DQoJfSBlbHNlIHsNCgkJY3R4ID0gY29udGV4dDsNCgl9
DQoNCglpZiAodXNlX3J4azUpIHsNCgkJYmFzZSA9IGJhc2VfcnhrNTsNCgkJ
YmFzZV9zaXplID0gc2l6ZW9mKGJhc2VfcnhrNSkgLyBzaXplb2YoYmFzZV9y
eGs1WzBdKTsNCgl9IGVsc2Ugew0KCQliYXNlID0gYmFzZV9yeGthZDsNCgkJ
YmFzZV9zaXplID0gc2l6ZW9mKGJhc2VfcnhrYWQpIC8gc2l6ZW9mKGJhc2Vf
cnhrYWRbMF0pOw0KCX0NCg0KCW1lbXNldCgmdXNlX2NjYWNoZSwgMCwgc2l6
ZW9mKHVzZV9jY2FjaGUpKTsNCglpZiAoY2NhY2hlICE9IE5VTEwpIHsNCgkJ
dXNlX2NjYWNoZSA9IGNjYWNoZTsNCgl9IGVsc2Ugew0KCQlpZiAoa3JiNV9j
Y19kZWZhdWx0KGN0eCwgJnVzZV9jY2FjaGUpICE9IDApIHsNCgkJCWlmIChj
dHggIT0gY29udGV4dCkgew0KCQkJCV9wYW1fa3JiNV9mcmVlX2N0eChjdHgp
Ow0KCQkJfQ0KCQkJcmV0dXJuIC0xOw0KCQl9DQoJfQ0KDQoJLyogSWYgd2Ug
d2VyZSBnaXZlbiBhIHByaW5jaXBhbCBuYW1lLCB0cnkgaXQuICovDQoJaWYg
KChoaW50X3ByaW5jaXBhbCAhPSBOVUxMKSAmJiAoc3RybGVuKGhpbnRfcHJp
bmNpcGFsKSA+IDApKSB7DQoJCWlmIChvcHRpb25zLT5kZWJ1Zykgew0KCQkJ
ZGVidWcoImF0dGVtcHRpbmcgdG8gb2J0YWluIHRva2VucyBmb3IgXCIlc1wi
ICINCgkJCSAgICAgICIoaGludCBcIiVzXCIpIiwNCgkJCSAgICAgIGNlbGws
IGhpbnRfcHJpbmNpcGFsKTsNCgkJfQ0KCQlyZXQgPSBtaW5pa2Fmc181bG9n
X3dpdGhfcHJpbmNpcGFsKGN0eCwgb3B0aW9ucywgdXNlX2NjYWNoZSwNCgkJ
CQkJCSAgIGNlbGwsIGhpbnRfcHJpbmNpcGFsLCB1aWQsDQoJCQkJCQkgICB1
c2VfcnhrNSwgdXNlX3Y1XzJiKTsNCgkJaWYgKHJldCA9PSAwKSB7DQoJCQlp
ZiAodXNlX2NjYWNoZSAhPSBjY2FjaGUpIHsNCgkJCQlrcmI1X2NjX2Nsb3Nl
KGN0eCwgdXNlX2NjYWNoZSk7DQoJCQl9DQoJCQlpZiAoY3R4ICE9IGNvbnRl
eHQpIHsNCgkJCQlfcGFtX2tyYjVfZnJlZV9jdHgoY3R4KTsNCgkJCX0NCgkJ
CXJldHVybiAwOw0KCQl9DQoJfQ0KDQoJZGVmYXVsdHJlYWxtID0gTlVMTDsN
CglpZiAoa3JiNV9nZXRfZGVmYXVsdF9yZWFsbShjdHgsICZkZWZhdWx0cmVh
bG0pICE9IDApIHsNCgkJZGVmYXVsdHJlYWxtID0gTlVMTDsNCgl9DQoNCglp
ZiAob3B0aW9ucy0+ZGVidWcpIHsNCgkJZGVidWcoImF0dGVtcHRpbmcgdG8g
ZGV0ZXJtaW5lIHJlYWxtIGZvciBcIiVzXCIiLCBjZWxsKTsNCgl9DQoJaWYg
KG1pbmlrYWZzX3JlYWxtX29mX2NlbGxfd2l0aF9jdHgoY3R4LCBvcHRpb25z
LCBjZWxsLA0KCQkJCQkgICAgcmVhbG0sIHNpemVvZihyZWFsbSkpICE9IDAp
IHsNCgkJc3RybmNweShyZWFsbSwgY2VsbCwgc2l6ZW9mKHJlYWxtKSk7DQoJ
CXJlYWxtW3NpemVvZihyZWFsbSkgLSAxXSA9ICdcMCc7DQoJCWZvciAoaSA9
IDA7IGkgPCBzaXplb2YocmVhbG0pOyBpKyspIHsNCgkJCXJlYWxtW2ldID0g
dG91cHBlcihyZWFsbVtpXSk7DQoJCX0NCgl9DQoNCglwcmluY2lwYWxfc2l6
ZSA9IHN0cmxlbigiL0AiKSArIDE7DQoJcmV0ID0gLTE7DQoJZm9yIChpID0g
MDsgKHJldCAhPSAwKSAmJiAoaSA8IGJhc2Vfc2l6ZSk7IGkrKykgew0KCQlw
cmluY2lwYWxfc2l6ZSArPSBzdHJsZW4oYmFzZVtpXSk7DQoJfQ0KCXByaW5j
aXBhbF9zaXplICs9IHN0cmxlbihjZWxsKTsNCglwcmluY2lwYWxfc2l6ZSAr
PSBzdHJsZW4ocmVhbG0pOw0KCWlmIChkZWZhdWx0cmVhbG0gIT0gTlVMTCkg
ew0KCQlwcmluY2lwYWxfc2l6ZSArPSBzdHJsZW4oZGVmYXVsdHJlYWxtKTsN
Cgl9DQoJcHJpbmNpcGFsID0gbWFsbG9jKHByaW5jaXBhbF9zaXplKTsNCglp
ZiAocHJpbmNpcGFsID09IE5VTEwpIHsNCgkJaWYgKHVzZV9jY2FjaGUgIT0g
Y2NhY2hlKSB7DQoJCQlrcmI1X2NjX2Nsb3NlKGN0eCwgdXNlX2NjYWNoZSk7
DQoJCX0NCgkJaWYgKGRlZmF1bHRyZWFsbSAhPSBOVUxMKSB7DQoJCQl2NV9m
cmVlX2RlZmF1bHRfcmVhbG0oY3R4LCBkZWZhdWx0cmVhbG0pOw0KCQl9DQoJ
CWlmIChjdHggIT0gY29udGV4dCkgew0KCQkJX3BhbV9rcmI1X2ZyZWVfY3R4
KGN0eCk7DQoJCX0NCgkJcmV0dXJuIC0xOw0KCX0NCg0KCWZvciAoaSA9IDA7
IChyZXQgIT0gMCkgJiYgKGkgPCBiYXNlX3NpemUpOyBpKyspIHsNCgkJLyog
SWYgdGhlIHJlYWxtIG5hbWUgYW5kIGNlbGwgbmFtZSBhcmUgc2ltaWxhciwg
YW5kIG51bGxfYWZzDQoJCSAqIGlzIHNldCwgdHJ5IHRoZSBOVUxMIGluc3Rh
bmNlLiAqLw0KCQlpZiAoKHN0cmNhc2VjbXAocmVhbG0sIGNlbGwpID09IDAp
ICYmIG9wdGlvbnMtPm51bGxfYWZzX2ZpcnN0KSB7DQoJCQlzbnByaW50Zihw
cmluY2lwYWwsIHByaW5jaXBhbF9zaXplLCAiJXNAJXMiLA0KCQkJCSBiYXNl
W2ldLCByZWFsbSk7DQoJCQlpZiAob3B0aW9ucy0+ZGVidWcpIHsNCgkJCQlk
ZWJ1ZygiYXR0ZW1wdGluZyB0byBvYnRhaW4gdG9rZW5zIGZvciBcIiVzXCIg
Ig0KCQkJCSAgICAgICIoXCIlc1wiKSIsIGNlbGwsIHByaW5jaXBhbCk7DQoJ
CQl9DQoJCQlyZXQgPSBtaW5pa2Fmc181bG9nX3dpdGhfcHJpbmNpcGFsKGN0
eCwgb3B0aW9ucywNCgkJCQkJCQkgICB1c2VfY2NhY2hlLA0KCQkJCQkJCSAg
IGNlbGwsIHByaW5jaXBhbCwgdWlkLA0KCQkJCQkJCSAgIHVzZV9yeGs1LCB1
c2VfdjVfMmIpOw0KCQl9DQoJCWlmIChyZXQgPT0gMCkgew0KCQkJYnJlYWs7
DQoJCX0NCgkJLyogVHJ5IHRoZSBjZWxsIGluc3RhbmNlIGluIHRoZSBjZWxs
J3MgcmVhbG0uICovDQoJCXNucHJpbnRmKHByaW5jaXBhbCwgcHJpbmNpcGFs
X3NpemUsICIlcy8lc0AlcyIsDQoJCQkgYmFzZVtpXSwgY2VsbCwgcmVhbG0p
Ow0KCQlpZiAob3B0aW9ucy0+ZGVidWcpIHsNCgkJCWRlYnVnKCJhdHRlbXB0
aW5nIHRvIG9idGFpbiB0b2tlbnMgZm9yIFwiJXNcIiAoXCIlc1wiKSIsDQoJ
CQkgICAgICBjZWxsLCBwcmluY2lwYWwpOw0KCQl9DQoJCXJldCA9IG1pbmlr
YWZzXzVsb2dfd2l0aF9wcmluY2lwYWwoY3R4LCBvcHRpb25zLCB1c2VfY2Nh
Y2hlLA0KCQkJCQkJICAgY2VsbCwgcHJpbmNpcGFsLCB1aWQsDQoJCQkJCQkg
ICB1c2VfcnhrNSwgdXNlX3Y1XzJiKTsNCgkJaWYgKHJldCA9PSAwKSB7DQoJ
CQlicmVhazsNCgkJfQ0KCQkvKiBJZiB0aGUgcmVhbG0gbmFtZSBhbmQgY2Vs
bCBuYW1lIGFyZSBzaW1pbGFyLCBhbmQgbnVsbF9hZnMNCgkJICogaXMgbm90
IHNldCwgdHJ5IHRoZSBOVUxMIGluc3RhbmNlLiAqLw0KCQlpZiAoKHN0cmNh
c2VjbXAocmVhbG0sIGNlbGwpID09IDApICYmDQoJCSAgICAhb3B0aW9ucy0+
bnVsbF9hZnNfZmlyc3QpIHsNCgkJCXNucHJpbnRmKHByaW5jaXBhbCwgcHJp
bmNpcGFsX3NpemUsICIlc0AlcyIsDQoJCQkJIGJhc2VbaV0sIHJlYWxtKTsN
CgkJCWlmIChvcHRpb25zLT5kZWJ1Zykgew0KCQkJCWRlYnVnKCJhdHRlbXB0
aW5nIHRvIG9idGFpbiB0b2tlbnMgZm9yIFwiJXNcIiAiDQoJCQkJICAgICAg
IihcIiVzXCIpIiwgY2VsbCwgcHJpbmNpcGFsKTsNCgkJCX0NCgkJCXJldCA9
IG1pbmlrYWZzXzVsb2dfd2l0aF9wcmluY2lwYWwoY3R4LCBvcHRpb25zLA0K
CQkJCQkJCSAgIHVzZV9jY2FjaGUsDQoJCQkJCQkJICAgY2VsbCwgcHJpbmNp
cGFsLCB1aWQsDQoJCQkJCQkJICAgdXNlX3J4azUsIHVzZV92NV8yYik7DQoJ
CX0NCgkJaWYgKHJldCA9PSAwKSB7DQoJCQlicmVhazsNCgkJfQ0KCQkvKiBS
ZXBlYXQgdGhlIGxhc3QgdHdvIGF0dGVtcHRzLCBidXQgdXNpbmcgdGhlIGRl
ZmF1bHQgcmVhbG0uICovDQoJCWlmICgoZGVmYXVsdHJlYWxtICE9IE5VTEwp
ICYmDQoJCSAgICAoc3RyY21wKGRlZmF1bHRyZWFsbSwgcmVhbG0pICE9IDAp
KSB7DQoJCQkvKiBJZiB0aGUgZGVmYXVsdCByZWFsbSBuYW1lIGFuZCBjZWxs
IG5hbWUgYXJlIHNpbWlsYXIsDQoJCQkgKiBhbmQgbnVsbF9hZnMgaXMgc2V0
LCB0cnkgdGhlIE5VTEwgaW5zdGFuY2UuICovDQoJCQlpZiAoKHN0cmNhc2Vj
bXAoZGVmYXVsdHJlYWxtLCBjZWxsKSA9PSAwKSAmJg0KCQkJICAgIG9wdGlv
bnMtPm51bGxfYWZzX2ZpcnN0KSB7DQoJCQkJc25wcmludGYocHJpbmNpcGFs
LCBwcmluY2lwYWxfc2l6ZSwgIiVzQCVzIiwNCgkJCQkJIGJhc2VbaV0sIGRl
ZmF1bHRyZWFsbSk7DQoJCQkJaWYgKG9wdGlvbnMtPmRlYnVnKSB7DQoJCQkJ
CWRlYnVnKCJhdHRlbXB0aW5nIHRvIG9idGFpbiB0b2tlbnMgZm9yICINCgkJ
CQkJICAgICAgIlwiJXNcIiAoXCIlc1wiKSIsDQoJCQkJCSAgICAgIGNlbGws
IHByaW5jaXBhbCk7DQoJCQkJfQ0KCQkJCXJldCA9IG1pbmlrYWZzXzVsb2df
d2l0aF9wcmluY2lwYWwoY3R4LCBvcHRpb25zLA0KCQkJCQkJCQkgICB1c2Vf
Y2NhY2hlLA0KCQkJCQkJCQkgICBjZWxsLA0KCQkJCQkJCQkgICBwcmluY2lw
YWwsDQoJCQkJCQkJCSAgIHVpZCwNCgkJCQkJCQkJICAgdXNlX3J4azUsDQoJ
CQkJCQkJCSAgIHVzZV92NV8yYik7DQoJCQl9DQoJCQlpZiAocmV0ID09IDAp
IHsNCgkJCQlicmVhazsNCgkJCX0NCgkJCS8qIFRyeSB0aGUgY2VsbCBpbnN0
YW5jZSBpbiB0aGUgZGVmYXVsdCByZWFsbS4gKi8NCgkJCXNucHJpbnRmKHBy
aW5jaXBhbCwgcHJpbmNpcGFsX3NpemUsICIlcy8lc0AlcyIsDQoJCQkJIGJh
c2VbaV0sIGNlbGwsIGRlZmF1bHRyZWFsbSk7DQoJCQlpZiAob3B0aW9ucy0+
ZGVidWcpIHsNCgkJCQlkZWJ1ZygiYXR0ZW1wdGluZyB0byBvYnRhaW4gdG9r
ZW5zIGZvciBcIiVzXCIgIg0KCQkJCSAgICAgICIoXCIlc1wiKSIsIGNlbGws
IHByaW5jaXBhbCk7DQoJCQl9DQoJCQlyZXQgPSBtaW5pa2Fmc181bG9nX3dp
dGhfcHJpbmNpcGFsKGN0eCwgb3B0aW9ucywNCgkJCQkJCQkgICB1c2VfY2Nh
Y2hlLA0KCQkJCQkJCSAgIGNlbGwsIHByaW5jaXBhbCwgdWlkLA0KCQkJCQkJ
CSAgIHVzZV9yeGs1LCB1c2VfdjVfMmIpOw0KCQkJaWYgKHJldCA9PSAwKSB7
DQoJCQkJYnJlYWs7DQoJCQl9DQoJCQkvKiBJZiB0aGUgZGVmYXVsdCByZWFs
bSBuYW1lIGFuZCBjZWxsIG5hbWUgYXJlIHNpbWlsYXIsDQoJCQkgKiBhbmQg
bnVsbF9hZnMgaXNuJ3Qgc2V0LCB0cnkgdGhlIE5VTEwgaW5zdGFuY2UuICov
DQoJCQlpZiAoKHN0cmNhc2VjbXAoZGVmYXVsdHJlYWxtLCBjZWxsKSA9PSAw
KSAmJg0KCQkJICAgICFvcHRpb25zLT5udWxsX2Fmc19maXJzdCkgew0KCQkJ
CXNucHJpbnRmKHByaW5jaXBhbCwgcHJpbmNpcGFsX3NpemUsICIlc0AlcyIs
DQoJCQkJCSBiYXNlW2ldLCBkZWZhdWx0cmVhbG0pOw0KCQkJCWlmIChvcHRp
b25zLT5kZWJ1Zykgew0KCQkJCQlkZWJ1ZygiYXR0ZW1wdGluZyB0byBvYnRh
aW4gdG9rZW5zIGZvciAiDQoJCQkJCSAgICAgICJcIiVzXCIgKFwiJXNcIiki
LA0KCQkJCQkgICAgICBjZWxsLCBwcmluY2lwYWwpOw0KCQkJCX0NCgkJCQly
ZXQgPSBtaW5pa2Fmc181bG9nX3dpdGhfcHJpbmNpcGFsKGN0eCwgb3B0aW9u
cywNCgkJCQkJCQkJICAgdXNlX2NjYWNoZSwNCgkJCQkJCQkJICAgY2VsbCwN
CgkJCQkJCQkJICAgcHJpbmNpcGFsLA0KCQkJCQkJCQkgICB1aWQsDQoJCQkJ
CQkJCSAgIHVzZV9yeGs1LA0KCQkJCQkJCQkgICB1c2VfdjVfMmIpOw0KCQkJ
fQ0KCQkJaWYgKHJldCA9PSAwKSB7DQoJCQkJYnJlYWs7DQoJCQl9DQoJCX0N
Cgl9DQoNCglpZiAodXNlX2NjYWNoZSAhPSBjY2FjaGUpIHsNCgkJa3JiNV9j
Y19jbG9zZShjdHgsIHVzZV9jY2FjaGUpOw0KCX0NCglpZiAoZGVmYXVsdHJl
YWxtICE9IE5VTEwpIHsNCgkJdjVfZnJlZV9kZWZhdWx0X3JlYWxtKGN0eCwg
ZGVmYXVsdHJlYWxtKTsNCgl9DQoJaWYgKGN0eCAhPSBjb250ZXh0KSB7DQoJ
CV9wYW1fa3JiNV9mcmVlX2N0eChjdHgpOw0KCX0NCglmcmVlKHByaW5jaXBh
bCk7DQoNCglyZXR1cm4gcmV0Ow0KfQ0KDQovKiBUcnkgdG8gZ2V0IHRva2Vu
cyBmb3IgdGhlIG5hbWVkIGNlbGwgdXNpbmcgZXZlcnkgYXZhaWxhYmxlIG1l
Y2hhbmlzbS4gKi8NCmludA0KbWluaWthZnNfbG9nKGtyYjVfY29udGV4dCBj
dHgsIGtyYjVfY2NhY2hlIGNjYWNoZSwNCgkgICAgIHN0cnVjdCBfcGFtX2ty
YjVfb3B0aW9ucyAqb3B0aW9ucywNCgkgICAgIGNvbnN0IGNoYXIgKmNlbGws
IGNvbnN0IGNoYXIgKmhpbnRfcHJpbmNpcGFsLA0KCSAgICAgdWlkX3QgdWlk
LCBjb25zdCBpbnQgKm1ldGhvZHMsIGludCBuX21ldGhvZHMpDQp7DQoJaW50
IGksIG1ldGhvZDsNCglpZiAobl9tZXRob2RzID09IC0xKSB7DQoJCWZvciAo
aSA9IDA7IG1ldGhvZHNbaV0gIT0gMDsgaSsrKSB7DQoJCQljb250aW51ZTsN
CgkJfQ0KCQluX21ldGhvZHMgPSBpOw0KCX0NCglmb3IgKG1ldGhvZCA9IDA7
IG1ldGhvZCA8IG5fbWV0aG9kczsgbWV0aG9kKyspIHsNCgkJaSA9IC0xOw0K
CQlzd2l0Y2ggKG1ldGhvZHNbbWV0aG9kXSkgew0KCQljYXNlIE1JTklLQUZT
X01FVEhPRF9WNV8yQjoNCgkJCWlmIChvcHRpb25zLT5kZWJ1Zykgew0KCQkJ
CWRlYnVnKCJ0cnlpbmcgd2l0aCB0aWNrZXQgKDJiKSIpOw0KCQkJfQ0KCQkJ
aSA9IG1pbmlrYWZzXzVsb2coY3R4LCBjY2FjaGUsIG9wdGlvbnMsIGNlbGws
DQoJCQkJCSAgaGludF9wcmluY2lwYWwsIHVpZCwgMCwgMSk7DQoJCQlpZiAo
aSAhPSAwKSB7DQoJCQkJaWYgKG9wdGlvbnMtPmRlYnVnKSB7DQoJCQkJCWRl
YnVnKCJhZnNsb2cgKDJiKSBmYWlsZWQgdG8gXCIlc1wiIiwNCgkJCQkJICAg
ICAgY2VsbCk7DQoJCQkJfQ0KCQkJfQ0KCQkJYnJlYWs7DQoJCWNhc2UgTUlO
SUtBRlNfTUVUSE9EX1JYSzU6DQoJCQlpZiAob3B0aW9ucy0+ZGVidWcpIHsN
CgkJCQlkZWJ1ZygidHJ5aW5nIHdpdGggdGlja2V0IChyeGs1KSIpOw0KCQkJ
fQ0KCQkJaSA9IG1pbmlrYWZzXzVsb2coY3R4LCBjY2FjaGUsIG9wdGlvbnMs
IGNlbGwsDQoJCQkJCSAgaGludF9wcmluY2lwYWwsIHVpZCwgMSwgMCk7DQoJ
CQlpZiAoaSAhPSAwKSB7DQoJCQkJaWYgKG9wdGlvbnMtPmRlYnVnKSB7DQoJ
CQkJCWRlYnVnKCJhZnNsb2cgKHJ4azUpIGZhaWxlZCB0byBcIiVzXCIiLA0K
CQkJCQkgICAgICBjZWxsKTsNCgkJCQl9DQoJCQl9DQoJCQlicmVhazsNCgkJ
ZGVmYXVsdDoNCgkJCWJyZWFrOw0KCQl9DQoJCWlmIChpID09IDApIHsNCgkJ
CWJyZWFrOw0KCQl9DQoJfQ0KCWlmIChtZXRob2QgPCBuX21ldGhvZHMpIHsN
CgkJaWYgKG9wdGlvbnMtPmRlYnVnKSB7DQoJCQlkZWJ1ZygiZ290IHRva2Vu
cyBmb3IgY2VsbCBcIiVzXCIiLCBjZWxsKTsNCgkJfQ0KCQlyZXR1cm4gMDsN
Cgl9IGVsc2Ugew0KCQlyZXR1cm4gLTE7DQoJfQ0KfQ0KDQovKiBXZSBkbyB0
aGUgWERSIGhlcmUgdG8gYXZvaWQgZGVwcyBvbiB3aGF0IG1pZ2h0IG5vdCBi
ZSBhIHN0YW5kYXJkIHBhcnQgb2YNCiAqIGdsaWJjLCBhbmQgd2UgZG9uJ3Qg
bmVlZCB0aGUgZGVjb2RlIG9yIGZyZWUgZnVuY3Rpb25hbGl0eS4gKi8NCnN0
YXRpYyBpbnQNCmVuY29kZV9pbnQzMihjaGFyICpidWZmZXIsIGludDMyX3Qg
bnVtKQ0Kew0KCWludDMyX3QgbmV0Ow0KCWlmIChidWZmZXIpIHsNCgkJbmV0
ID0gbnRvaGwobnVtKTsNCgkJbWVtY3B5KGJ1ZmZlciwgJm5ldCwgNCk7DQoJ
fQ0KCXJldHVybiA0Ow0KfQ0Kc3RhdGljIGludA0KZW5jb2RlX2Jvb2xlYW4o
Y2hhciAqYnVmZmVyLCBrcmI1X2Jvb2xlYW4gYikNCnsNCglyZXR1cm4gZW5j
b2RlX2ludDMyKGJ1ZmZlciwgYiA/IDEgOiAwKTsNCn0NCnN0YXRpYyBpbnQN
CmVuY29kZV91aW50NjQoY2hhciAqYnVmZmVyLCB1aW50NjRfdCBudW0pDQp7
DQoJaW50MzJfdCBuZXQ7DQoJaWYgKGJ1ZmZlcikgew0KCQluZXQgPSBudG9o
bChudW0gPj4gMzIpOw0KCQltZW1jcHkoYnVmZmVyICsgMCwgJm5ldCwgNCk7
DQoJCW5ldCA9IG50b2hsKG51bSAmIDB4ZmZmZmZmZmYpOw0KCQltZW1jcHko
YnVmZmVyICsgNCwgJm5ldCwgNCk7DQoJfQ0KCXJldHVybiA4Ow0KfQ0Kc3Rh
dGljIGludA0KZW5jb2RlX2J5dGVzKGNoYXIgKmJ1ZmZlciwgY29uc3QgY2hh
ciAqYnl0ZXMsIGludDMyX3QgbnVtKQ0Kew0KCWludDMyX3QgcGFkOw0KCXBh
ZCA9IChudW0gJSA0KSA/ICg0IC0gKG51bSAlIDQpKSA6IDA7DQoJaWYgKGJ1
ZmZlcikgew0KCQlpZiAoYnl0ZXMgJiYgbnVtKSB7DQoJCQltZW1jcHkoYnVm
ZmVyLCBieXRlcywgbnVtKTsNCgkJCW1lbXNldChidWZmZXIgKyBudW0sIDAs
IHBhZCk7DQoJCX0NCgl9DQoJcmV0dXJuIG51bSArIHBhZDsNCn0NCnN0YXRp
YyBpbnQNCmVuY29kZV91Ynl0ZXMoY2hhciAqYnVmZmVyLCBjb25zdCB1bnNp
Z25lZCBjaGFyICpieXRlcywgaW50MzJfdCBudW0pDQp7DQoJaW50MzJfdCBw
YWQ7DQoJcGFkID0gKG51bSAlIDQpID8gKDQgLSAobnVtICUgNCkpIDogMDsN
CglpZiAoYnVmZmVyKSB7DQoJCWlmIChieXRlcyAmJiBudW0pIHsNCgkJCW1l
bWNweShidWZmZXIsIGJ5dGVzLCBudW0pOw0KCQkJbWVtc2V0KGJ1ZmZlciAr
IG51bSwgMCwgcGFkKTsNCgkJfQ0KCX0NCglyZXR1cm4gbnVtICsgcGFkOw0K
fQ0KI2RlZmluZSBlbmNvZGVfZml4ZWQoX29wLCBfYnVmZmVyLCBfaXRlbSkg
XA0KCXsgXA0KCQlpbnQgX2xlbmd0aDsgXA0KCQlfbGVuZ3RoID0gX29wKF9i
dWZmZXIsIF9pdGVtKTsgXA0KCQlpZiAoX2J1ZmZlcikgeyBcDQoJCQlfYnVm
ZmVyICs9IF9sZW5ndGg7IFwNCgkJfSBcDQoJCXRvdGFsICs9IF9sZW5ndGg7
IFwNCgl9DQojZGVmaW5lIGVuY29kZV9maXhlZF93aXRoX2FyZyhfb3AsIF9i
dWZmZXIsIF9pdGVtLCBfc2l6ZSkgXA0KCXsgXA0KCQlpbnQgX2xlbmd0aDsg
XA0KCQlfbGVuZ3RoID0gX29wKF9idWZmZXIsIF9pdGVtLCBfc2l6ZSk7IFwN
CgkJaWYgKF9idWZmZXIpIHsgXA0KCQkJX2J1ZmZlciArPSBfbGVuZ3RoOyBc
DQoJCX0gXA0KCQl0b3RhbCArPSBfbGVuZ3RoOyBcDQoJfQ0KI2RlZmluZSBl
bmNvZGVfdmFyaWFibGUoX29wLCBfYnVmZmVyLCBfaXRlbSwgX3NpemUpIFwN
Cgl7IFwNCgkJaW50IF9sZW5ndGg7IFwNCgkJX2xlbmd0aCA9IF9vcChfYnVm
ZmVyLCBfaXRlbSwgX3NpemUpOyBcDQoJCWlmIChfYnVmZmVyKSB7IFwNCgkJ
CV9idWZmZXIgKz0gX2xlbmd0aDsgXA0KCQl9IFwNCgkJdG90YWwgKz0gX2xl
bmd0aDsgXA0KCX0NCiNkZWZpbmUgZW5jb2RlX29wYXF1ZShfb3AsIF9idWZm
ZXIsIF9pdGVtLCBfc2l6ZSkgXA0KCWVuY29kZV9maXhlZChlbmNvZGVfaW50
MzIsIF9idWZmZXIsIF9zaXplKSBcDQoJZW5jb2RlX3ZhcmlhYmxlKF9vcCwg
X2J1ZmZlciwgX2l0ZW0sIF9zaXplKQ0Kc3RhdGljIGludA0KZW5jb2RlX2Rh
dGEoY2hhciAqYnVmZmVyLCBrcmI1X2RhdGEgKmRhdGEpDQp7DQoJaW50MzJf
dCB0b3RhbCA9IDA7DQoJZW5jb2RlX29wYXF1ZShlbmNvZGVfYnl0ZXMsIGJ1
ZmZlciwgZGF0YS0+ZGF0YSwgZGF0YS0+bGVuZ3RoKTsNCglyZXR1cm4gdG90
YWw7DQp9DQpzdGF0aWMgaW50DQplbmNvZGVfc3RyaW5nKGNoYXIgKmJ1ZmZl
ciwgY29uc3QgY2hhciAqc3RyaW5nLCBzc2l6ZV90IGxlbmd0aCkNCnsNCglp
bnQzMl90IHRvdGFsID0gMDsNCglpZiAobGVuZ3RoID09IC0xKSB7DQoJCWxl
bmd0aCA9IHN0cmxlbihzdHJpbmcpOw0KCX0NCgllbmNvZGVfb3BhcXVlKGVu
Y29kZV9ieXRlcywgYnVmZmVyLCBzdHJpbmcsIGxlbmd0aCk7DQoJcmV0dXJu
IHRvdGFsOw0KfQ0Kc3RhdGljIGludA0KZW5jb2RlX2NyZWRzX2tleWJsb2Nr
KGNoYXIgKmJ1ZmZlciwga3JiNV9jcmVkcyAqY3JlZHMpDQp7DQoJaW50MzJf
dCB0b3RhbCA9IDA7DQoJZW5jb2RlX2ZpeGVkKGVuY29kZV9pbnQzMiwgYnVm
ZmVyLCB2NV9jcmVkc19nZXRfZXR5cGUoY3JlZHMpKTsNCgllbmNvZGVfb3Bh
cXVlKGVuY29kZV91Ynl0ZXMsIGJ1ZmZlciwgdjVfY3JlZHNfa2V5X2NvbnRl
bnRzKGNyZWRzKSwNCgkJICAgICAgdjVfY3JlZHNfa2V5X2xlbmd0aChjcmVk
cykpOw0KCXJldHVybiB0b3RhbDsNCn0NCnN0YXRpYyBpbnQNCmVuY29kZV9w
cmluY2lwYWwoY2hhciAqYnVmZmVyLCBrcmI1X3ByaW5jaXBhbCBwcmluYykN
CnsNCglpbnQzMl90IHRvdGFsID0gMDsNCglpbnQgaTsNCgllbmNvZGVfZml4
ZWQoZW5jb2RlX2ludDMyLCBidWZmZXIsIHY1X3ByaW5jX2NvbXBvbmVudF9j
b3VudChwcmluYykpOw0KCWZvciAoaSA9IDA7IGkgPCB2NV9wcmluY19jb21w
b25lbnRfY291bnQocHJpbmMpOyBpKyspIHsNCgkJZW5jb2RlX29wYXF1ZShl
bmNvZGVfYnl0ZXMsIGJ1ZmZlciwNCgkJCSAgICAgIHY1X3ByaW5jX2NvbXBv
bmVudF9jb250ZW50cyhwcmluYywgaSksDQoJCQkgICAgICB2NV9wcmluY19j
b21wb25lbnRfbGVuZ3RoKHByaW5jLCBpKSk7DQoJfQ0KCWVuY29kZV9vcGFx
dWUoZW5jb2RlX2J5dGVzLCBidWZmZXIsDQoJCSAgICAgIHY1X3ByaW5jX3Jl
YWxtX2NvbnRlbnRzKHByaW5jKSwNCgkJICAgICAgdjVfcHJpbmNfcmVhbG1f
bGVuZ3RoKHByaW5jKSk7DQoJcmV0dXJuIHRvdGFsOw0KfQ0Kc3RhdGljIGlu
dA0KZW5jb2RlX3Rva2VuX3J4a2FkKGNoYXIgKmJ1ZmZlciwga3JiNV9jcmVk
cyAqY3JlZHMsIGludDMyX3QgdmljZWlkKQ0Kew0KCWludDMyX3QgdG90YWwg
PSAwOw0KDQoJZW5jb2RlX2ZpeGVkKGVuY29kZV9pbnQzMiwgYnVmZmVyLCB2
aWNlaWQpOw0KCWVuY29kZV9maXhlZChlbmNvZGVfaW50MzIsIGJ1ZmZlciwg
MHgxMDAgLSAweDJiKTsNCgllbmNvZGVfb3BhcXVlKGVuY29kZV91Ynl0ZXMs
IGJ1ZmZlciwgdjVfY3JlZHNfa2V5X2NvbnRlbnRzKGNyZWRzKSwNCgkJICAg
ICAgdjVfY3JlZHNfa2V5X2xlbmd0aChjcmVkcykpOw0KCWVuY29kZV9maXhl
ZChlbmNvZGVfaW50MzIsIGJ1ZmZlciwgY3JlZHMtPnRpbWVzLnN0YXJ0dGlt
ZSk7DQoJZW5jb2RlX2ZpeGVkKGVuY29kZV9pbnQzMiwgYnVmZmVyLCBjcmVk
cy0+dGltZXMuZW5kdGltZSk7DQoJZW5jb2RlX2ZpeGVkKGVuY29kZV9ib29s
ZWFuLCBidWZmZXIsIDApOw0KCWVuY29kZV9maXhlZChlbmNvZGVfZGF0YSwg
YnVmZmVyLCAmY3JlZHMtPnRpY2tldCk7DQoJcmV0dXJuIHRvdGFsOw0KfQ0K
c3RhdGljIGludA0KZW5jb2RlX3Rva2VuX3J4azUoY2hhciAqYnVmZmVyLCBr
cmI1X2NyZWRzICpjcmVkcykNCnsNCglpbnQzMl90IHRvdGFsID0gMDsNCglp
bnQgaTsgDQoNCgllbmNvZGVfZml4ZWQoZW5jb2RlX3ByaW5jaXBhbCwgYnVm
ZmVyLCBjcmVkcy0+Y2xpZW50KTsNCgllbmNvZGVfZml4ZWQoZW5jb2RlX3By
aW5jaXBhbCwgYnVmZmVyLCBjcmVkcy0+c2VydmVyKTsNCgllbmNvZGVfZml4
ZWQoZW5jb2RlX2NyZWRzX2tleWJsb2NrLCBidWZmZXIsIGNyZWRzKTsNCgll
bmNvZGVfZml4ZWQoZW5jb2RlX3VpbnQ2NCwgYnVmZmVyLCBjcmVkcy0+dGlt
ZXMuYXV0aHRpbWUpOw0KCWVuY29kZV9maXhlZChlbmNvZGVfdWludDY0LCBi
dWZmZXIsIGNyZWRzLT50aW1lcy5zdGFydHRpbWUpOw0KCWVuY29kZV9maXhl
ZChlbmNvZGVfdWludDY0LCBidWZmZXIsIGNyZWRzLT50aW1lcy5lbmR0aW1l
KTsNCgllbmNvZGVfZml4ZWQoZW5jb2RlX3VpbnQ2NCwgYnVmZmVyLCBjcmVk
cy0+dGltZXMucmVuZXdfdGlsbCk7DQoJZW5jb2RlX2ZpeGVkKGVuY29kZV9i
b29sZWFuLCBidWZmZXIsIHY1X2NyZWRzX2dldF9pc19za2V5KGNyZWRzKSk7
DQoJZW5jb2RlX2ZpeGVkKGVuY29kZV9pbnQzMiwgYnVmZmVyLCB2NV9jcmVk
c19nZXRfZmxhZ3MoY3JlZHMpKTsNCg0KCWVuY29kZV9maXhlZChlbmNvZGVf
aW50MzIsIGJ1ZmZlciwgdjVfY3JlZHNfYWRkcmVzc19jb3VudChjcmVkcykp
Ow0KCWZvciAoaSA9IDA7IGkgPCB2NV9jcmVkc19hZGRyZXNzX2NvdW50KGNy
ZWRzKTsgaSsrKSB7DQoJCWVuY29kZV9maXhlZChlbmNvZGVfaW50MzIsIGJ1
ZmZlciwNCgkJCSAgICAgdjVfY3JlZHNfYWRkcmVzc190eXBlKGNyZWRzLCBp
KSk7DQoJCWVuY29kZV9vcGFxdWUoZW5jb2RlX3VieXRlcywgYnVmZmVyLA0K
CQkJICAgICAgdjVfY3JlZHNfYWRkcmVzc19jb250ZW50cyhjcmVkcywgaSks
DQoJCQkgICAgICB2NV9jcmVkc19hZGRyZXNzX2xlbmd0aChjcmVkcywgaSkp
Ow0KCX0NCg0KCWVuY29kZV9maXhlZChlbmNvZGVfZGF0YSwgYnVmZmVyLCAm
Y3JlZHMtPnRpY2tldCk7DQoJZW5jb2RlX2ZpeGVkKGVuY29kZV9kYXRhLCBi
dWZmZXIsICZjcmVkcy0+c2Vjb25kX3RpY2tldCk7DQoNCgllbmNvZGVfZml4
ZWQoZW5jb2RlX2ludDMyLCBidWZmZXIsIHY1X2NyZWRzX2F1dGhkYXRhX2Nv
dW50KGNyZWRzKSk7DQoJZm9yIChpID0gMDsgaSA8IHY1X2NyZWRzX2F1dGhk
YXRhX2NvdW50KGNyZWRzKTsgaSsrKSB7DQoJCWVuY29kZV9maXhlZChlbmNv
ZGVfaW50MzIsIGJ1ZmZlciwNCgkJCSAgICAgdjVfY3JlZHNfYXV0aGRhdGFf
dHlwZShjcmVkcywgaSkpOw0KCQllbmNvZGVfb3BhcXVlKGVuY29kZV91Ynl0
ZXMsIGJ1ZmZlciwNCgkJCSAgICAgIHY1X2NyZWRzX2F1dGhkYXRhX2NvbnRl
bnRzKGNyZWRzLCBpKSwNCgkJCSAgICAgIHY1X2NyZWRzX2F1dGhkYXRhX2xl
bmd0aChjcmVkcywgaSkpOw0KCX0NCglyZXR1cm4gdG90YWw7DQp9DQojZGVm
aW5lIEFGU1RPS0VOX1VOSU9OX05PQVVUSAkwDQojZGVmaW5lIEFGU1RPS0VO
X1VOSU9OX05PTkUJQUZTVE9LRU5fVU5JT05fTk9BVVRIDQojZGVmaW5lIEFG
U1RPS0VOX1VOSU9OX0tBRAkyDQojZGVmaW5lIEFGU1RPS0VOX1VOSU9OX1JY
S0FECUFGU1RPS0VOX1VOSU9OX0tBRA0KI2RlZmluZSBBRlNUT0tFTl9VTklP
Tl9SWEdLCTQNCiNkZWZpbmUgQUZTVE9LRU5fVU5JT05fR0sJQUZTVE9LRU5f
VU5JT05fUlhHSw0KI2RlZmluZSBBRlNUT0tFTl9VTklPTl9SWEs1CTUNCiNk
ZWZpbmUgQUZTVE9LRU5fVU5JT05fSzUJQUZTVE9LRU5fVU5JT05fUlhLNQ0K
c3RhdGljIGludA0KZW5jb2RlX3Rva2VuX3VuaW9uKGNoYXIgKmJ1ZmZlciwg
a3JiNV9jcmVkcyAqY3JlZHMsIGludCB0b2tlbl91bmlvbl90eXBlLA0KCQkg
ICBpbnQzMl90IHVpZCkNCnsNCglpbnQzMl90IHRvdGFsID0gMDsNCgllbmNv
ZGVfZml4ZWQoZW5jb2RlX2ludDMyLCBidWZmZXIsIHRva2VuX3VuaW9uX3R5
cGUpOw0KCXN3aXRjaCAodG9rZW5fdW5pb25fdHlwZSkgew0KCWNhc2UgQUZT
VE9LRU5fVU5JT05fUlhLQUQ6DQoJCWVuY29kZV9maXhlZF93aXRoX2FyZyhl
bmNvZGVfdG9rZW5fcnhrYWQsIGJ1ZmZlciwgY3JlZHMsIHVpZCk7DQoJCWJy
ZWFrOw0KCWNhc2UgQUZTVE9LRU5fVU5JT05fUlhLNToNCgkJZW5jb2RlX2Zp
eGVkKGVuY29kZV90b2tlbl9yeGs1LCBidWZmZXIsIGNyZWRzKTsNCgkJYnJl
YWs7DQoJZGVmYXVsdDoNCgkJYnJlYWs7DQoJfQ0KCXJldHVybiB0b3RhbDsN
Cn0NCg0KLyogU3R1ZmYgYSB0aWNrZXQgYW5kIGtleWJsb2NrIGludG8gdGhl
IGtlcm5lbC4gKi8NCiNkZWZpbmUgQUZTVE9LRU5fRVhfU0VUUEFHCTB4MDAw
MDAwMDEgLyogbm90IHN1cHBvcnRlZCAqLw0KI2RlZmluZSBBRlNUT0tFTl9F
WF9BREQJCTB4MDAwMDAwMDINCnN0YXRpYyBpbnQNCm1pbmlrYWZzXzVzZXR0
b2tlbjIoY29uc3QgY2hhciAqY2VsbCwga3JiNV9jcmVkcyAqY3JlZHMsIGlu
dDMyX3QgdWlkKQ0Kew0KCXN0cnVjdCBtaW5pa2Fmc19pb2Jsb2NrIGlvYjsN
CglpbnQgaSwgYnVmc2l6ZSwgdG9rZW5fdW5pb25fc2l6ZTsNCgljaGFyICpi
dWZmZXIsICpidWZwdHI7DQoNCgl0b2tlbl91bmlvbl9zaXplID0gZW5jb2Rl
X3Rva2VuX3VuaW9uKE5VTEwsIGNyZWRzLCBBRlNUT0tFTl9VTklPTl9LNSwN
CgkJCQkJICAgICAgdWlkKTsNCglidWZzaXplID0gZW5jb2RlX2ludDMyKE5V
TEwsIDApICsNCgkJICBlbmNvZGVfc3RyaW5nKE5VTEwsIGNlbGwsIC0xKSAr
DQoJCSAgZW5jb2RlX2ludDMyKE5VTEwsIDEpICsNCgkJICBlbmNvZGVfaW50
MzIoTlVMTCwgdG9rZW5fdW5pb25fc2l6ZSkgKw0KCQkgIHRva2VuX3VuaW9u
X3NpemU7DQoJYnVmZmVyID0gbWFsbG9jKGJ1ZnNpemUpOw0KCWkgPSAtMTsN
CglpZiAoYnVmZmVyICE9IE5VTEwpIHsNCgkJYnVmcHRyID0gYnVmZmVyOw0K
CQlidWZwdHIgKz0gZW5jb2RlX2ludDMyKGJ1ZnB0ciwgMCk7IC8qIGZsYWdz
IC0gQUZTVE9LRU5fRVhfLi4uICovDQoJCWJ1ZnB0ciArPSBlbmNvZGVfc3Ry
aW5nKGJ1ZnB0ciwgY2VsbCwgLTEpOyAvKiBjZWxsICovDQoJCWJ1ZnB0ciAr
PSBlbmNvZGVfaW50MzIoYnVmcHRyLCAxKTsgLyogbnVtYmVyIG9mIHRva2Vu
cyAqLw0KCQlidWZwdHIgKz0gZW5jb2RlX2ludDMyKGJ1ZnB0ciwgdG9rZW5f
dW5pb25fc2l6ZSk7IC8qIHNpemUgb2YgdG9rZW4gKi8NCgkJYnVmcHRyICs9
IGVuY29kZV90b2tlbl91bmlvbihidWZwdHIsIGNyZWRzLCBBRlNUT0tFTl9V
TklPTl9LNSwNCgkJCQkJICAgICB1aWQpOyAvKiB0b2tlbiAqLw0KCQlpb2Iu
aW4gPSBidWZmZXI7DQoJCWlvYi5pbnNpemUgPSBidWZwdHIgLSBidWZmZXI7
DQoJCWlvYi5vdXQgPSBOVUxMOw0KCQlpb2Iub3V0c2l6ZSA9IDA7DQoJCWkg
PSBtaW5pa2Fmc19waW9jdGwoTlVMTCwgbWluaWthZnNfcGlvY3RsX3NldHRv
a2VuMiwgJmlvYik7DQoJCWZyZWUoYnVmZmVyKTsNCgl9DQoJcmV0dXJuIGk7
DQp9DQo=

--1602634645-648475257-1657528230=:81066--