Re: pop up windows

Steven J Abner <[email protected]> Fri, 14 Feb 2025 13:39:34 -0500
Newsgroups gmane.comp.freedesktop.xcb
Message-ID <[email protected]>
--=-BXs3pLQl4e97SJrQz3FO
Content-Type: text/plain; charset=us-ascii; format=flowed

On Fri, Feb 14 2025 at 05:24:22 PM +0000, Steven J Abner 
<[email protected]> wrote:
> only receiving events with button continuously pressed

Crying, sigh... but very thankful for your reply!
I sent you revised code. Has your black window, but extra debug code 
you can use to verify that at least the xcb version of grab pointer 
doesn't work as you describe. I've used all three windows (popup, 
parent, root), sync/async, before and after button release that creates 
the dropdown. It still requires a 'grab' or that button is not released 
for one to receive events. Extra #if0 code was my next logical attempt 
before the, omg have you seen, evdev attempt at getting events. I'm 
really not that bright! Nor do I want to replace X Server. LOL this 
code was to replace the defunct gdk3.
 Ohh I will try Xlib's GrabPointer, I know somewhere I've got the 
header/add on to use both codes :)
 And in main() is example of shutting off debug specific events.
Steve


--=-BXs3pLQl4e97SJrQz3FO
Content-Type: text/x-csrc
Content-Disposition: attachment; filename=xpop.c
Content-Transfer-Encoding: base64

I2luY2x1ZGUgPHhjYi94Y2IuaD4gIC8qIGhhcyBjb3JyZWN0IHN5cy90eXBlcyAqLwojaW5jbHVk
ZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNs
dWRlIDxzdGRib29sLmg+CiNpbmNsdWRlIDxpbnR0eXBlcy5oPgojaW5jbHVkZSA8bGltaXRzLmg+
CiNpbmNsdWRlIDxwb2xsLmg+CgovKiBnY2MgLWFuc2kgLXBlZGFudGljIC1XYWxsIC1Xbm8tdW5r
bm93bi1wcmFnbWFzIC1nIC1vIHhwb3AgeHBvcC5jIC1seGNiICovCgp0eXBlZGVmIHN0cnVjdCBf
UGh4SW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaHhJbnRlcmZhY2U7CnR5
cGVkZWYgc3RydWN0IF9QaHhSZWN0YW5nbGUgeyBpbnQxNl90IHgsIHksIHcsIGg7IH0gICAgIFBo
eFJlY3RhbmdsZTsKCmJvb2wgICAgICAgICAgX3dpbmRvd19pc190cmFuc2llbnQoeGNiX3dpbmRv
d190IHdpbmRvdyk7CnhjYl93aW5kb3dfdCAgdWlfZHJvcGRvd25fY3JlYXRlKFBoeFJlY3Rhbmds
ZSBjb25maWd1cmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhjYl93aW5kb3df
dCB0cmFuc2llbnRfZm9yX3dpbmRvdyk7CgoKeGNiX2Nvbm5lY3Rpb25fdCAgICAgKmNvbm5lY3Rp
b24gPSBOVUxMOwp4Y2JfYXRvbV90IFdNX1BST1RPQ09MUzsKeGNiX2F0b21fdCBXTV9ERUxFVEVf
V0lORE9XOwoKc3RydWN0IF9QaHhJbnRlcmZhY2UgewogYm9vbCAgICAgICAgICBtYXBwZWQ7CiBQ
aHhSZWN0YW5nbGUgIG1ldGVfYm94OwogeGNiX3dpbmRvd190ICB3aW5kb3c7Cn0gaWZhY2UwID0g
eyBmYWxzZSwgezB9LCAwIH0sIGlmYWNlMSA9IHsgZmFsc2UsIHswfSwgMCB9OwoKYm9vbCBTQklU
X0ZPQ1VTX0NMSUNLID0gZmFsc2U7CmJvb2wgU0JJVF9SRUxFQVNFX0lHTk9SRSA9IGZhbHNlOwpQ
aHhJbnRlcmZhY2UgKmhhc19mb2N1cyA9IE5VTEw7CgojaWYgKF9fU1REQ19WRVJTSU9OX18gPD0g
MTk5OTAxTCkKICNkZWZpbmUgUkVDVEFOR0xFKGEsYixjLGQsZSkgXAogIGEueCA9IGIsIGEueSA9
IGMsIGEudyA9IGQsIGEuaCA9IGUKI2Vsc2UKICNkZWZpbmUgUkVDVEFOR0xFKGEsYixjLGQsZSkg
XAogIGEgPSAoUGh4UmVjdGFuZ2xlKXsgYiwgYywgZCwgZSB9CiNlbmRpZgoKI2RlZmluZSBERUJV
RyhhLGIpIFwKICBwcmludGYoIiVkICVzXG4iLCBhLCBiKTsKCi8qIHNldCBhbGwgZXZlbnRzIG9u
ICovCnVpbnQ2NF90IGRlYnVnX2ZsYWdzID0gKHVpbnQ2NF90KTB4RkZGRkZGRkZGRkZGRkZGRjsK
c3RhdGljIHZvaWQKX2RlYnVnX2V2ZW50KHhjYl9nZW5lcmljX2V2ZW50X3QgKm52dCkgewoKICB1
aW50OF90IHJlc3BvbnNlID0gbnZ0LT5yZXNwb25zZV90eXBlICYgKHVpbnQ4X3QpfjB4MDgwOwog
IHVpbnQ2NF90IG9uX2JpdCA9ICh1aW50NjRfdCkxIDw8IHJlc3BvbnNlOwogIGlmICgoZGVidWdf
ZmxhZ3MgJiBvbl9iaXQpID09IDApICByZXR1cm47CgogIHN3aXRjaCAocmVzcG9uc2UpIHsKICAg
IGNhc2UgWENCX0tFWV9QUkVTUzogeyAgICAgICAgIC8qIHJlc3BvbnNlX3R5cGUgMiAqLwogICAg
ICB4Y2Jfa2V5X3ByZXNzX2V2ZW50X3QgKmtwID0gKHhjYl9rZXlfcHJlc3NfZXZlbnRfdCopbnZ0
OwogICAgICBERUJVRyhrcC0+ZXZlbnQsICJLRVlfUFJFU1MiKTsKICAgICAgYnJlYWs7CiAgICB9
CiAgICBjYXNlIFhDQl9LRVlfUkVMRUFTRTogeyAgICAgICAvKiByZXNwb25zZV90eXBlIDMgKi8K
ICAgICAgeGNiX2tleV9wcmVzc19ldmVudF90ICprcCA9ICh4Y2Jfa2V5X3ByZXNzX2V2ZW50X3Qq
KW52dDsKICAgICAgREVCVUcoa3AtPmV2ZW50LCAiS0VZX1JFTEVBU0UiKTsKICAgICAgYnJlYWs7
CiAgICB9CiAgICBjYXNlIFhDQl9CVVRUT05fUFJFU1M6IHsgICAgICAvKiByZXNwb25zZV90eXBl
IDQgKi8KICAgICAgeGNiX2J1dHRvbl9wcmVzc19ldmVudF90ICpicDsKICAgICAgYnAgPSAoeGNi
X2J1dHRvbl9wcmVzc19ldmVudF90KiludnQ7CiAgICAgIERFQlVHKGJwLT5ldmVudCwgIkJVVFRP
Tl9QUkVTUyIpOwogICAgICBicmVhazsKICAgIH0KICAgIGNhc2UgWENCX0JVVFRPTl9SRUxFQVNF
OiB7ICAgIC8qIHJlc3BvbnNlX3R5cGUgNSAqLwogICAgICB4Y2JfYnV0dG9uX3ByZXNzX2V2ZW50
X3QgKmJwOwogICAgICBicCA9ICh4Y2JfYnV0dG9uX3ByZXNzX2V2ZW50X3QqKW52dDsKICAgICAg
REVCVUcoYnAtPmV2ZW50LCAiQlVUVE9OX1JFTEVBU0UiKTsKICAgIH0KICAgIGNhc2UgWENCX01P
VElPTl9OT1RJRlk6IHsgICAgIC8qIHJlc3BvbnNlX3R5cGUgNiAqLwogICAgICB4Y2JfbW90aW9u
X25vdGlmeV9ldmVudF90ICptb3Rpb24KICAgICAgICA9ICh4Y2JfbW90aW9uX25vdGlmeV9ldmVu
dF90KiludnQ7CiAgICAgIERFQlVHKG1vdGlvbi0+ZXZlbnQsICJNT1RJT05fTk9USUZZIik7CiAg
ICAgIGJyZWFrOwogICAgfQogICAgY2FzZSBYQ0JfRU5URVJfTk9USUZZOiB7ICAgICAgLyogcmVz
cG9uc2VfdHlwZSA3ICovCiAgICAgIHhjYl9lbnRlcl9ub3RpZnlfZXZlbnRfdCAqeGluZwogICAg
ICAgID0gKHhjYl9lbnRlcl9ub3RpZnlfZXZlbnRfdCopbnZ0OwogICAgICBERUJVRyh4aW5nLT5l
dmVudCwgIkVOVEVSX05PVElGWSIpOwogICAgICBicmVhazsKICAgIH0KICAgIGNhc2UgWENCX0xF
QVZFX05PVElGWTogeyAgICAgIC8qIHJlc3BvbnNlX3R5cGUgOCAqLwogICAgICB4Y2JfZW50ZXJf
bm90aWZ5X2V2ZW50X3QgKnhpbmcKICAgICAgICA9ICh4Y2JfZW50ZXJfbm90aWZ5X2V2ZW50X3Qq
KW52dDsKICAgICAgREVCVUcoeGluZy0+ZXZlbnQsICJMRUFWRV9OT1RJRlkiKTsKICAgICAgYnJl
YWs7CiAgICB9CiAgICBjYXNlIFhDQl9GT0NVU19JTjogeyAgICAgICAgICAvKiByZXNwb25zZV90
eXBlIDkgKi8KICAgICAgeGNiX2ZvY3VzX2luX2V2ZW50X3QgKmZvY3VzID0gKHhjYl9mb2N1c19p
bl9ldmVudF90KiludnQ7CiAgICAgIERFQlVHKGZvY3VzLT5ldmVudCwgIkZPQ1VTX0lOIik7CiAg
ICAgIGJyZWFrOwogICAgfQogICAgY2FzZSBYQ0JfRk9DVVNfT1VUOiB7ICAgICAgICAgLyogcmVz
cG9uc2VfdHlwZSAxMCAqLwogICAgICB4Y2JfZm9jdXNfaW5fZXZlbnRfdCAqZm9jdXMgPSAoeGNi
X2ZvY3VzX2luX2V2ZW50X3QqKW52dDsKICAgICAgREVCVUcoZm9jdXMtPmV2ZW50LCAiRk9DVVNf
T1VUIik7CiAgICAgIGJyZWFrOwogICAgfQogICAgY2FzZSBYQ0JfRVhQT1NFOiB7ICAgICAgICAg
ICAgLyogcmVzcG9uc2VfdHlwZSAxMiAqLwogICAgICB4Y2JfZXhwb3NlX2V2ZW50X3QgKmV4cG9z
ZSA9ICh4Y2JfZXhwb3NlX2V2ZW50X3QqKW52dDsKICAgICAgREVCVUcoZXhwb3NlLT53aW5kb3cs
ICJFWFBPU0UiKTsKICAgICAgYnJlYWs7CiAgICB9CiAgICBjYXNlIFhDQl9WSVNJQklMSVRZX05P
VElGWTogeyAvKiByZXNwb25zZV90eXBlIDE1ICovCiAgICAgIHhjYl92aXNpYmlsaXR5X25vdGlm
eV9ldmVudF90ICpzZWVuCiAgICAgICAgPSAoeGNiX3Zpc2liaWxpdHlfbm90aWZ5X2V2ZW50X3Qq
KW52dDsKICAgICAgREVCVUcoc2Vlbi0+d2luZG93LCAiVklTSUJJTElUWV9OT1RJRlkiKTsKICAg
ICAgYnJlYWs7CiAgICB9CiAgICBjYXNlIFhDQl9ERVNUUk9ZX05PVElGWTogeyAgICAvKiByZXNw
b25zZV90eXBlICAxNyAqLwogICAgICAgIC8qIGFzc3VtZSBhIGtpbGwsIGRlbGV0ZSBhbGwgd2lu
ZG93cyAoZG8gdGhlaXIgdGhpbmcpCiAgICAgICAgICAgc2VuZCBmYWxzZSB0byBleGl0IGxvb3Ag
Ki8KICAgICAgeGNiX2Rlc3Ryb3lfbm90aWZ5X2V2ZW50X3QgKmRlc3Ryb3kKICAgICAgICA9ICh4
Y2JfZGVzdHJveV9ub3RpZnlfZXZlbnRfdCopbnZ0OwogICAgICBERUJVRyhkZXN0cm95LT53aW5k
b3csICJYQ0JfREVTVFJPWV9OT1RJRlkiKTsKICAgICAgYnJlYWs7CiAgICB9CiAgICBjYXNlIFhD
Ql9VTk1BUF9OT1RJRlk6IHsgICAgICAvKiByZXNwb25zZV90eXBlIDE4ICovCiAgICAgIHhjYl91
bm1hcF9ub3RpZnlfZXZlbnRfdCAqdW5tYXAKICAgICAgICA9ICh4Y2JfdW5tYXBfbm90aWZ5X2V2
ZW50X3QqKW52dDsKICAgICAgREVCVUcodW5tYXAtPndpbmRvdywgIlhDQl9VTk1BUF9OT1RJRlki
KTsKICAgICAgYnJlYWs7CiAgICB9CiAgICBjYXNlIFhDQl9NQVBfTk9USUZZOiB7ICAgICAgICAv
KiByZXNwb25zZV90eXBlIDE5ICovCiAgICAgIHhjYl9tYXBfbm90aWZ5X2V2ZW50X3QgKm1hcAog
ICAgICAgID0gKHhjYl9tYXBfbm90aWZ5X2V2ZW50X3QqKW52dDsKICAgICAgIERFQlVHKG1hcC0+
d2luZG93LCAiWENCX01BUF9OT1RJRlkiKTsKICAgICAgYnJlYWs7CiAgICB9CiAgICBjYXNlIFhD
Ql9SRVBBUkVOVF9OT1RJRlk6IHsgICAvKiByZXNwb25zZV90eXBlIDIxICovCiAgICAgIHhjYl9y
ZXBhcmVudF9ub3RpZnlfZXZlbnRfdCAqcnAKICAgICAgICA9ICh4Y2JfcmVwYXJlbnRfbm90aWZ5
X2V2ZW50X3QqKW52dDsKICAgICAgREVCVUcocnAtPndpbmRvdywgIlhDQl9SRVBBUkVOVF9OT1RJ
RlkiKTsKICAgICAgYnJlYWs7CiAgICB9CiAgICBjYXNlIFhDQl9DT05GSUdVUkVfTk9USUZZOiB7
ICAvKiByZXNwb25zZV90eXBlIDIyICovCiAgICAgIHhjYl9jb25maWd1cmVfbm90aWZ5X2V2ZW50
X3QgKmNvbmZpZ3VyZQogICAgICAgID0gKHhjYl9jb25maWd1cmVfbm90aWZ5X2V2ZW50X3QqKW52
dDsKICAgICAgREVCVUcoY29uZmlndXJlLT5ldmVudCwgIkNPTkZJR1VSRV9OT1RJRlkiKTsKICAg
ICAgYnJlYWs7CiAgICB9CiAgICBjYXNlIFhDQl9QUk9QRVJUWV9OT1RJRlk6IHsgICAvKiByZXNw
b25zZV90eXBlIDI4ICovCiAgICAgIHhjYl9wcm9wZXJ0eV9ub3RpZnlfZXZlbnRfdCAqcHJvcAog
ICAgICAgID0gKHhjYl9wcm9wZXJ0eV9ub3RpZnlfZXZlbnRfdCopbnZ0OwogICAgICBERUJVRyhw
cm9wLT53aW5kb3csICJYQ0JfUFJPUEVSVFlfTk9USUZZIik7CiAgICAgIGJyZWFrOwogICAgfQog
ICAgY2FzZSBYQ0JfU0VMRUNUSU9OX0NMRUFSOiB7ICAgLyogcmVzcG9uc2VfdHlwZSAyOSAqLwog
ICAgICB4Y2Jfc2VsZWN0aW9uX2NsZWFyX2V2ZW50X3QgKmNsZWFyCiAgICAgICAgPSAoeGNiX3Nl
bGVjdGlvbl9jbGVhcl9ldmVudF90KiludnQ7CiAgICAgIERFQlVHKGNsZWFyLT5vd25lciwgIlhD
Ql9TRUxFQ1RJT05fQ0xFQVIiKTsKICAgICAgYnJlYWs7CiAgICB9CiAgICBjYXNlIFhDQl9TRUxF
Q1RJT05fUkVRVUVTVDogeyAvKiByZXNwb25zZV90eXBlIDMwICovCiAgICAgIHhjYl9zZWxlY3Rp
b25fcmVxdWVzdF9ldmVudF90ICpyZXF1ZXN0CiAgICAgICAgPSAoeGNiX3NlbGVjdGlvbl9yZXF1
ZXN0X2V2ZW50X3QqKW52dDsKICAgICAgREVCVUcocmVxdWVzdC0+b3duZXIsICJYQ0JfU0VMRUNU
SU9OX1JFUVVFU1QiKTsKICAgICAgYnJlYWs7CiAgICB9CiAgICBjYXNlIFhDQl9TRUxFQ1RJT05f
Tk9USUZZOiB7ICAvKiByZXNwb25zZV90eXBlIDMxICovCiAgICAgIHhjYl9zZWxlY3Rpb25fbm90
aWZ5X2V2ZW50X3QgKnNlbGVjdGlvbgogICAgICAgID0gKHhjYl9zZWxlY3Rpb25fbm90aWZ5X2V2
ZW50X3QqKW52dDsKICAgICAgREVCVUcoc2VsZWN0aW9uLT5yZXF1ZXN0b3IsICJYQ0JfU0VMRUNU
SU9OX05PVElGWSIpOwogICAgICBicmVhazsKICAgIH0KICAgIGNhc2UgWENCX0NMSUVOVF9NRVNT
QUdFOiB7ICAgIC8qIHJlc3BvbnNlX3R5cGUgMzMgKi8KICAgICAgeGNiX2NsaWVudF9tZXNzYWdl
X2V2ZW50X3QgKm1lc3NhZ2UKICAgICAgICA9ICh4Y2JfY2xpZW50X21lc3NhZ2VfZXZlbnRfdCop
bnZ0OwogICAgICBERUJVRyhtZXNzYWdlLT53aW5kb3csICJYQ0JfQ0xJRU5UX01FU1NBR0UiKTsK
ICAgICAgYnJlYWs7CiAgICB9CiAgICBkZWZhdWx0OgogICAgICBpZiAobnZ0LT5yZXNwb25zZV90
eXBlID09IDApIHsKICAgICAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICplcnIgPSAoeGNiX2dlbmVy
aWNfZXJyb3JfdCopbnZ0OwogICAgICAgIGlmIChlcnItPmVycm9yX2NvZGUgPT0gKHVpbnQ4X3Qp
MTQzKQogICAgICAgICAgcHV0cygiU0lHVEVSTSByZWNlaXZlZCIpOwogICAgICAgIGVsc2UKICAg
ICAgICAgIHByaW50ZigiZXJyb3I6ICUiUFJJdTgiXG4iLCBlcnItPmVycm9yX2NvZGUpOwogICAg
ICAgIGJyZWFrOwogICAgICB9CiAgICAgICAgLyogVW5rbm93biBldmVudCB0eXBlLCB1c2UgdG8g
dHJhY2sgY29kaW5nIHByb2JsZW1zICovCiAgICAgIHByaW50ZigiVW5rbm93biBldmVudDogJSJQ
Ukl1OCJcbiIsIG52dC0+cmVzcG9uc2VfdHlwZSk7CiAgICAgIGJyZWFrOwogIH0KfQoKClBoeElu
dGVyZmFjZSAqCl9pbnRlcmZhY2VfZm9yKHhjYl93aW5kb3dfdCB3aW5kb3cpIHsKICBpZiAoaWZh
Y2UwLndpbmRvdyA9PSB3aW5kb3cpCiAgICByZXR1cm4gJmlmYWNlMDsKICByZXR1cm4gJmlmYWNl
MTsKfQoKc3RhdGljIGJvb2wKX2V2ZW50X21vdXNlKHhjYl9nZW5lcmljX2V2ZW50X3QgKm52dCkg
ewoKICBib29sIGxvY3VzID0gKChudnQtPnJlc3BvbnNlX3R5cGUgJiAodWludDhfdCl+MHg4MCkg
PT0gWENCX0JVVFRPTl9QUkVTUyk7CiAgeGNiX2J1dHRvbl9wcmVzc19ldmVudF90ICptb3VzZSA9
ICh4Y2JfYnV0dG9uX3ByZXNzX2V2ZW50X3QqKW52dDsKICBQaHhJbnRlcmZhY2UgKmlmYWNlID0g
X2ludGVyZmFjZV9mb3IobW91c2UtPmV2ZW50KTsKCiAgaWYgKCFsb2N1cykgewogICAgICAvKiBm
aXJzdCBjbGljayBpbiB1bmZvY3VzZWQgd2luZG93IHVzZWQgdG8gYnJpbmcgQUJPVkUgYW5kIGZv
Y3VzICovCiAgICBpZiAoU0JJVF9GT0NVU19DTElDSykgewogICAgICBTQklUX0ZPQ1VTX0NMSUNL
ID0gZmFsc2U7CiAgICAgIHByaW50ZigiICAgICAgICVkLCBTQklUX0ZPQ1VTX0NMSUNLIHJlc2V0
LlxuIiwgaWZhY2UtPndpbmRvdyk7CiAgICAgIFNCSVRfUkVMRUFTRV9JR05PUkUgPSBmYWxzZTsK
ICAgICAgcHJpbnRmKCIgICAgICAgJWQsIFNCSVRfUkVMRUFTRV9JR05PUkUgcmVzZXQuXG4iLCBp
ZmFjZS0+d2luZG93KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CnB1dHMoImdyYWIgcG9pbnRl
ciIpOwp4Y2JfZ3JhYl9wb2ludGVyKGNvbm5lY3Rpb24sCjEsCmlmYWNlLT53aW5kb3csCih1aW50
MTZfdCkweEZGRkUsClhDQl9HUkFCX01PREVfQVNZTkMsClhDQl9HUkFCX01PREVfQVNZTkMsIFhD
Ql9OT05FLApYQ0JfTk9ORSwgWENCX0NVUlJFTlRfVElNRSk7CiAgICAgIC8qIGNvZGUgZm9yIGJ1
dHRvbiByZWxlYXNlLCBkcmFnIGNhc2VzICovCiAgICAgIC8qIGNhc2VzIHdoZXJlIGJ1dHRvbiBy
ZWxlYXNlIHNob3VsZCBiZSBpZ25vcmVkLiAqLwogICAgaWYgKFNCSVRfUkVMRUFTRV9JR05PUkUp
IHsKICAgICAgU0JJVF9SRUxFQVNFX0lHTk9SRSA9IGZhbHNlOwogICAgICBwcmludGYoIiAgICAg
ICAlZCwgU0JJVF9SRUxFQVNFX0lHTk9SRSByZXNldC5cbiIsIGlmYWNlLT53aW5kb3cpOwogICAg
ICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgICAgLyogY29kZSBmb3IgYnV0dG9uIHJlbGVhc2UsIG5v
bi1kcmFnIHJlbGF0ZWQgKi8KICB9IGVsc2UgewogICAgaWYgKGhhc19mb2N1cy0+d2luZG93ICE9
IG1vdXNlLT5ldmVudCkgewogICAgICB4Y2JfdW5tYXBfd2luZG93KGNvbm5lY3Rpb24sIGlmYWNl
MS53aW5kb3cpOwogICAgICBpZmFjZTEubWFwcGVkID0gZmFsc2U7CiAgICAgIFNCSVRfUkVMRUFT
RV9JR05PUkUgPSB0cnVlOwogICAgICBwcmludGYoIiAgICAgICAlZCwgU0JJVF9SRUxFQVNFX0lH
Tk9SRSBzZXQuXG4iLCBpZmFjZTAud2luZG93KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAg
ICAgIC8qIGNvZGUgZm9yIGJ1dHRvbiBwcmVzcyAqLwogICAgICAvKiBTdG9wIHByb2Nlc3Npbmcg
bW91c2UsIHdhcyB3aW5kb3cgYmVpbmcgZm9jdXNlZCBieSBjbGljayBpbiBjb250ZW50LiAqLwog
ICAgaWYgKFNCSVRfRk9DVVNfQ0xJQ0spIHsKICAgICAgcHV0cygiIGlnbm9yZSBidXR0b24gcHJl
c3MgU0JJVF9GT0NVU19DTElDSyIpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgICAgLyog
YnV0dG9uIHByZXNzIGluIGZvY3VzZWQgY29udGVudCAqLwogICAgaWYgKCFpZmFjZTEubWFwcGVk
KSB7CiAgICAgIHVpbnQzMl90IHZhbHVlc1syXTsKICAgICAgUGh4UmVjdGFuZ2xlIHB1cF9ib3gg
PSB7IDc1LCA3NSwgMjUwLCAyNTAgfTsKICAgICAgaWYgKGlmYWNlMS53aW5kb3cgPT0gMCkgewog
ICAgICAgIGlmYWNlMS53aW5kb3cgPSB1aV9kcm9wZG93bl9jcmVhdGUocHVwX2JveCwgaWZhY2Ut
PndpbmRvdyk7CiAgICAgIH0KICAgICAgdmFsdWVzWzBdID0gcHVwX2JveC54ICsgaWZhY2UwLm1l
dGVfYm94Lng7CiAgICAgIHZhbHVlc1sxXSA9IHB1cF9ib3gueSArIGlmYWNlMC5tZXRlX2JveC55
OwogICAgICB4Y2JfY29uZmlndXJlX3dpbmRvdyhjb25uZWN0aW9uLCBpZmFjZTEud2luZG93LAog
ICAgICAgICAgICAgICAgICAgWENCX0NPTkZJR19XSU5ET1dfWCB8IFhDQl9DT05GSUdfV0lORE9X
X1ksIHZhbHVlcyk7CiAgICAgIHhjYl9tYXBfd2luZG93KGNvbm5lY3Rpb24sIGlmYWNlMS53aW5k
b3cpOwogICAgICBpZmFjZTEubWFwcGVkID0gdHJ1ZTsKICAgICAgU0JJVF9SRUxFQVNFX0lHTk9S
RSA9IHRydWU7CiAgICAgIHByaW50ZigiICAgICAgICVkLCBTQklUX1JFTEVBU0VfSUdOT1JFIHNl
dC5cbiIsIGlmYWNlMC53aW5kb3cpOwogICAgfQogIH0KICAgIC8qIGNvbW1vbiBtb3VzZSBjb2Rl
ICovCiAgcmV0dXJuIHRydWU7Cn0KCnN0YXRpYyBib29sCl9ldmVudF9sZWF2ZSh4Y2JfZ2VuZXJp
Y19ldmVudF90ICpudnQpIHsKCiNpZiAwCiAgeGNiX2VudGVyX25vdGlmeV9ldmVudF90ICp4aW5n
ID0gKHhjYl9lbnRlcl9ub3RpZnlfZXZlbnRfdCopbnZ0OwoKICAgICAgICAgIC8qIE5vdGUgb24g
ZGlhbG9ncyB0aGlzIGxvb3Agc2hvdWxkbid0IHJ1biAqLwoKICBpZiAoeGluZy0+ZXZlbnQgPT0g
aWZhY2UxLndpbmRvdykgewogICAgZG8gewogICAgICB4Y2JfcXVlcnlfcG9pbnRlcl9jb29raWVf
dCBjMAogICAgICAgID0geGNiX3F1ZXJ5X3BvaW50ZXIoY29ubmVjdGlvbiwgeGluZy0+ZXZlbnQp
OwogICAgICB4Y2JfcXVlcnlfcG9pbnRlcl9yZXBseV90ICpyMAogICAgICAgID0geGNiX3F1ZXJ5
X3BvaW50ZXJfcmVwbHkoY29ubmVjdGlvbiwgYzAsIE5VTEwpOwogICAgICBpZiAoIChyMC0+d2lu
X3ggPj0gMCkgJiYgKHIwLT53aW5feCA8IGlmYWNlMS5tZXRlX2JveC53KQogICAgICAgICAgJiYg
KHIwLT53aW5feSA+PSAwKSAmJiAocjAtPndpbl95IDwgaWZhY2UxLm1ldGVfYm94LmgpICkgewog
ICAgICAgICAgLyogcmUtZW50ZXJlZCBvdXIgZHJvcGRvd24sIGRvIG5vdGhpbmcgKi8KICAgICAg
ICBmcmVlKHIwKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAoKHIwLT5tYXNrICYg
WENCX0tFWV9CVVRfTUFTS19CVVRUT05fMSkgIT0gMCkgewogICAgICAgICAgLyogc2VuZCBhIGZv
Y3VzIGluIGV2ZW50IHRvIHBhcmVudD8gb3Igb3V0IHRvIGRyb3Bkb3duPyAqLwogICAgICAgICAg
Lyogb3IgYnV0dG9uIHJlbGVhc2UgPyAqLwogICAgICAgIGZyZWUocjApOwogICAgICAgIGJyZWFr
OwogICAgICB9CiAgICAgICAgLyogb24gZWFjaCBwYXNzIHJlbW92ZSBYU2VydmVyIGV2ZW50PyAq
LwogICAgICBmcmVlKHIwKTsKICAgIH0gd2hpbGUgKDEpOwogIH0KI2VuZGlmCiAgcmV0dXJuIHRy
dWU7Cn0KCnN0YXRpYyBib29sCl9ldmVudF9mb2N1cyh4Y2JfZ2VuZXJpY19ldmVudF90ICpudnQp
IHsKCiAgYm9vbCBsb2N1cyA9ICgobnZ0LT5yZXNwb25zZV90eXBlICYgKHVpbnQ4X3QpfjB4ODAp
ID09IFhDQl9GT0NVU19JTik7CiAgeGNiX2ZvY3VzX2luX2V2ZW50X3QgKmZvY3VzID0gKHhjYl9m
b2N1c19pbl9ldmVudF90KiludnQ7CgogIGlmIChsb2N1cykgewogICAgeGNiX3F1ZXJ5X3BvaW50
ZXJfY29va2llX3QgYzAKICAgICAgPSB4Y2JfcXVlcnlfcG9pbnRlcihjb25uZWN0aW9uLCBmb2N1
cy0+ZXZlbnQpOwogICAgeGNiX3F1ZXJ5X3BvaW50ZXJfcmVwbHlfdCAqcjAKICAgICAgPSB4Y2Jf
cXVlcnlfcG9pbnRlcl9yZXBseShjb25uZWN0aW9uLCBjMCwgTlVMTCk7CgojaWYgMAogICAgaWYg
KGZvY3VzLT5ldmVudCA9PSBpZmFjZTEud2luZG93KSB7CiAgICAgIGlmICggKHIwLT53aW5feCA+
PSAwKSAmJiAocjAtPndpbl94IDwgaWZhY2UwLm1ldGVfYm94LncpCiAgICAgICAgICAmJiAocjAt
Pndpbl95ID49IDApICYmIChyMC0+d2luX3kgPCBpZmFjZTAubWV0ZV9ib3guaCkgKSB7CiAgICAg
ICAgcmV0dXJuIHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvKiBzZW5kIGxlYXZlIGV2
ZW50ICovCiAgICAgIH0KICAgIH0KI2VuZGlmCgogICAgaWYgKCAocjAtPndpbl94ID49IDApICYm
IChyMC0+d2luX3ggPCBpZmFjZTAubWV0ZV9ib3gudykKICAgICAgICAmJiAocjAtPndpbl95ID49
IDApICYmIChyMC0+d2luX3kgPCBpZmFjZTAubWV0ZV9ib3guaCkgKSB7CiAgICAgIGlmICgocjAt
Pm1hc2sgJiBYQ0JfS0VZX0JVVF9NQVNLX0JVVFRPTl8xKSAhPSAwKSB7CiAgICAgICAgU0JJVF9G
T0NVU19DTElDSyA9IHRydWU7CiAgICAgICAgcHJpbnRmKCIgICAgICAgJWQsIFNCSVRfRk9DVVNf
Q0xJQ0sgc2V0LlxuIiwgZm9jdXMtPmV2ZW50KTsKICAgICAgfQogICAgfQogICAgZnJlZShyMCk7
CiAgICBoYXNfZm9jdXMgPSBfaW50ZXJmYWNlX2Zvcihmb2N1cy0+ZXZlbnQpOwogIH0gZWxzZSB7
CiAgICBpZiAoIChfd2luZG93X2lzX3RyYW5zaWVudChmb2N1cy0+ZXZlbnQpKSAmJiAoaWZhY2Ux
Lm1hcHBlZCkgKSB7CiAgICAgIHhjYl91bm1hcF93aW5kb3coY29ubmVjdGlvbiwgaWZhY2UxLndp
bmRvdyk7CiAgICAgIGlmYWNlMS5tYXBwZWQgPSBmYWxzZTsKICAgIH0KICAgIGhhc19mb2N1cyA9
IE5VTEw7CiAgfQogIHJldHVybiB0cnVlOwp9Cgpib29sCl9ldmVudF9leHBvc2UoeGNiX2dlbmVy
aWNfZXZlbnRfdCAqbnZ0KSB7CiAgcmV0dXJuIHRydWU7Cn0Kc3RhdGljIGJvb2wKX2V2ZW50X2Nv
bmZpZ3VyZSh4Y2JfZ2VuZXJpY19ldmVudF90ICpudnQpIHsKCiAgeGNiX2NvbmZpZ3VyZV9ub3Rp
ZnlfZXZlbnRfdCAqY29uZmlndXJlCiAgICA9ICh4Y2JfY29uZmlndXJlX25vdGlmeV9ldmVudF90
KiludnQ7CiAgeGNiX3dpbmRvd190IHdpbmRvdyA9IGNvbmZpZ3VyZS0+ZXZlbnQ7CiAgUGh4SW50
ZXJmYWNlICppZmFjZSA9IF9pbnRlcmZhY2VfZm9yKHdpbmRvdyk7CgogIGlmICgqKHVpbnQ2NF90
KikmaWZhY2UtPm1ldGVfYm94LnggPT0gKih1aW50NjRfdCopJmNvbmZpZ3VyZS0+eCkKICAgIHJl
dHVybiB0cnVlOwoKICAgIC8qIERvIGludGVybmFsIGNvbmZpZ3VyYXRpb24gKi8KCiAgICAvKiBT
ZXQgbWV0ZV9ib3ggaWYgbW92ZSBvY2N1cnJlZCAqLwogIGlmICgoY29uZmlndXJlLT54IHwgY29u
ZmlndXJlLT55KSAhPSAwKSB7CiAgICBpZiAoIChpZmFjZS0+bWV0ZV9ib3gueCAhPSBjb25maWd1
cmUtPngpCiAgICAgICAgfHwgKGlmYWNlLT5tZXRlX2JveC55ICE9IGNvbmZpZ3VyZS0+eSkgKSB7
CiAgICAgICAgLyogTmVlZGVkLCBpZiB3YW50IGFjY3VyYXRlIHBvc2l0aW9uaW5nLiBXTSBpcyB1
bnJlbGlhYmxlICovCiAgICAgIHhjYl9zY3JlZW5fdCAqc2NyZWVuCiAgICAgICAgPSB4Y2Jfc2V0
dXBfcm9vdHNfaXRlcmF0b3IoeGNiX2dldF9zZXR1cChjb25uZWN0aW9uKSkuZGF0YTsKICAgICAg
eGNiX3RyYW5zbGF0ZV9jb29yZGluYXRlc19yZXBseV90ICpjZmcKICAgICAgICA9IHhjYl90cmFu
c2xhdGVfY29vcmRpbmF0ZXNfcmVwbHkoY29ubmVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAg
ICAgICB4Y2JfdHJhbnNsYXRlX2Nvb3JkaW5hdGVzKGNvbm5lY3Rpb24sCiAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LCBzY3JlZW4tPnJvb3QsIDAsIDApLCBOVUxM
KTsKICAgICAgaWZhY2UtPm1ldGVfYm94LnggPSBjZmctPmRzdF94OwogICAgICBpZmFjZS0+bWV0
ZV9ib3gueSA9IGNmZy0+ZHN0X3k7CiAgICAgIGZyZWUoY2ZnKTsKICAgIH0KICB9CiAgcmV0dXJu
IHRydWU7Cn0KCnN0YXRpYyBpbnQzMl90Cl9wcm9jZXNzX3RpbWVycyh2b2lkKSB7CiAgcmV0dXJu
IElOVF9NQVg7Cn0KCnN0YXRpYyBib29sCl9wcm9jZXNzX2V2ZW50KHhjYl9nZW5lcmljX2V2ZW50
X3QgKm52dCkgewoKX2RlYnVnX2V2ZW50KG52dCk7CgogIHN3aXRjaCAobnZ0LT5yZXNwb25zZV90
eXBlICYgKHVpbnQ4X3QpfjB4ODApIHsKCiAgICBjYXNlIFhDQl9LRVlfUFJFU1M6ICAgICAgICAg
ICAvKiByZXNwb25zZV90eXBlIDIgKi8KICAgIGNhc2UgWENCX0tFWV9SRUxFQVNFOiB7ICAgICAg
IC8qIHJlc3BvbnNlX3R5cGUgMyAqLwogICAgICBicmVhazsKICAgIH0KCiAgICBjYXNlIFhDQl9C
VVRUT05fUFJFU1M6ICAgICAgICAvKiByZXNwb25zZV90eXBlIDQgKi8KICAgIGNhc2UgWENCX0JV
VFRPTl9SRUxFQVNFOiB7ICAgIC8qIHJlc3BvbnNlX3R5cGUgNSAqLwogICAgICBfZXZlbnRfbW91
c2UobnZ0KTsKICAgICAgYnJlYWs7CiAgICB9CgogICAgY2FzZSBYQ0JfTU9USU9OX05PVElGWTog
eyAgICAgLyogcmVzcG9uc2VfdHlwZSA2ICovCiAgICBjYXNlIFhDQl9FTlRFUl9OT1RJRlk6ICAg
ICAgICAvKiByZXNwb25zZV90eXBlIDcgKi8KICAgICAgYnJlYWs7CiAgICB9CgogICAgY2FzZSBY
Q0JfTEVBVkVfTk9USUZZOiB7ICAgICAgLyogcmVzcG9uc2VfdHlwZSA4ICovCiAgICAgIF9ldmVu
dF9sZWF2ZShudnQpOwogICAgICBicmVhazsKICAgIH0KCiAgICBjYXNlIFhDQl9GT0NVU19JTjog
ICAgICAgICAgICAvKiByZXNwb25zZV90eXBlIDkgKi8KICAgIGNhc2UgWENCX0ZPQ1VTX09VVDog
eyAgICAgICAgIC8qIHJlc3BvbnNlX3R5cGUgMTAgKi8KICAgICAgX2V2ZW50X2ZvY3VzKG52dCk7
CiAgICAgIGJyZWFrOwogICAgfQoKICAgIGNhc2UgWENCX0VYUE9TRTogeyAgICAgICAgICAgIC8q
IHJlc3BvbnNlX3R5cGUgMTIgKi8KICAgICAgYnJlYWs7CiAgICB9CgogICAgY2FzZSBYQ0JfVklT
SUJJTElUWV9OT1RJRlk6IHsgLyogcmVzcG9uc2VfdHlwZSAxNSAqLwogICAgICB4Y2JfdmlzaWJp
bGl0eV9ub3RpZnlfZXZlbnRfdCAqc2VlbgogICAgICAgID0gKHhjYl92aXNpYmlsaXR5X25vdGlm
eV9ldmVudF90KiludnQ7CiAgICAgIGlmIChfd2luZG93X2lzX3RyYW5zaWVudChzZWVuLT53aW5k
b3cpKSB7CiAgICAgICAgeGNiX3NldF9pbnB1dF9mb2N1cyhjb25uZWN0aW9uLCBYQ0JfSU5QVVRf
Rk9DVVNfUEFSRU5ULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZW4tPndp
bmRvdywgWENCX0NVUlJFTlRfVElNRSk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICB9CgogICAg
Y2FzZSBYQ0JfREVTVFJPWV9OT1RJRlk6IHsgICAgLyogcmVzcG9uc2VfdHlwZSAxNyAqLwogICAg
ICAgIC8qIGFzc3VtZSBhIGtpbGwsIGRlbGV0ZSBhbGwgd2luZG93cyAoZG8gdGhlaXIgdGhpbmcp
CiAgICAgICAgICAgc2VuZCBmYWxzZSB0byBleGl0IGxvb3AgKi8KICAgICAgeGNiX2Rlc3Ryb3lf
bm90aWZ5X2V2ZW50X3QgKmRlc3Ryb3kKICAgICAgICA9ICh4Y2JfZGVzdHJveV9ub3RpZnlfZXZl
bnRfdCopbnZ0OwogICAgICAgaWYgKCFfd2luZG93X2lzX3RyYW5zaWVudChkZXN0cm95LT53aW5k
b3cpKSB7CiAgICAgICAgZnJlZShudnQpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQog
ICAgICBicmVhazsKICAgIH0KICAgICAgLyogdGhlc2UgNCBiZWNhdXNlIG9mIFhDQl9FVkVOVF9N
QVNLX1NUUlVDVFVSRV9OT1RJRlkgKi8KICAgIGNhc2UgWENCX1VOTUFQX05PVElGWTogeyAgICAg
IC8qIHJlc3BvbnNlX3R5cGUgMTggKi8KICAgIGNhc2UgWENCX01BUF9OT1RJRlk6ICAgICAgICAg
IC8qIHJlc3BvbnNlX3R5cGUgMTkgKi8KICAgICAgYnJlYWs7CiAgICB9CiAgICBjYXNlIFhDQl9S
RVBBUkVOVF9OT1RJRlk6IHsgICAvKiByZXNwb25zZV90eXBlIDIxICovCiAgICAgICAgLyogcG9z
aXRpb24gYWZ0ZXIgbWFwLCB0byBkZXNpZ24gdXNlciByZXF1ZXN0ZWQgb2Ygd2luZG93CiAgICAg
ICAgICogc2V0IG9uY2UgYW5kIHdoZW4gd2luZG93IG1hbmFnZXIgYXNrcyB0byByZXBhcmVudAog
ICAgICAgICAqIGRvbnQgbmVlZCBkdXJpbmcgaWNvbi9kZWljb25pZnkKICAgICAgICAgKiBkb2Vz
bnQgc3RvcCBXTSBjb25maWd1cmVzLCBidXQgd2lsbCBiZSBzZW50IGFmdGVyIG1hcCBub3RpZnkg
Ki8KICAgICAgeGNiX3JlcGFyZW50X25vdGlmeV9ldmVudF90ICpycAogICAgICAgID0gKHhjYl9y
ZXBhcmVudF9ub3RpZnlfZXZlbnRfdCopbnZ0OwogICAgICBQaHhJbnRlcmZhY2UgKmlmYWNlID0g
X2ludGVyZmFjZV9mb3IocnAtPndpbmRvdyk7CiAgICAgIHVpbnQzMl90IHZhbHVlc1syXTsKICAg
ICAgdmFsdWVzWzBdID0gaWZhY2UtPm1ldGVfYm94Lng7CiAgICAgIHZhbHVlc1sxXSA9IGlmYWNl
LT5tZXRlX2JveC55OwogICAgICB4Y2JfY29uZmlndXJlX3dpbmRvdyhjb25uZWN0aW9uLCBpZmFj
ZS0+d2luZG93LAogICAgICAgICAgICAgICAgICAgWENCX0NPTkZJR19XSU5ET1dfWCB8IFhDQl9D
T05GSUdfV0lORE9XX1ksIHZhbHVlcyk7CiAgICAgIGJyZWFrOwogICAgfQogICAgY2FzZSBYQ0Jf
Q09ORklHVVJFX05PVElGWTogeyAgLyogcmVzcG9uc2VfdHlwZSAyMiAqLwogICAgICBfZXZlbnRf
Y29uZmlndXJlKG52dCk7CiAgICAgIGJyZWFrOwogICAgfQoKICAgIGNhc2UgWENCX1BST1BFUlRZ
X05PVElGWTogeyAgIC8qIHJlc3BvbnNlX3R5cGUgMjggKi8KICAgIGNhc2UgWENCX1NFTEVDVElP
Tl9DTEVBUjogICAgIC8qIHJlc3BvbnNlX3R5cGUgMjkgKi8KICAgIGNhc2UgWENCX1NFTEVDVElP
Tl9SRVFVRVNUOiAgIC8qIHJlc3BvbnNlX3R5cGUgMzAgKi8KICAgIGNhc2UgWENCX1NFTEVDVElP
Tl9OT1RJRlk6ICAgIC8qIHJlc3BvbnNlX3R5cGUgMzEgKi8KICAgICAgYnJlYWs7CiAgICB9Cgog
ICAgY2FzZSBYQ0JfQ0xJRU5UX01FU1NBR0U6IHsgICAgLyogcmVzcG9uc2VfdHlwZSAzMyAqLwog
ICAgICB4Y2JfY2xpZW50X21lc3NhZ2VfZXZlbnRfdCAqY20KICAgICAgICA9ICh4Y2JfY2xpZW50
X21lc3NhZ2VfZXZlbnRfdCopbnZ0OwogICAgICBpZiAoY20tPnR5cGUgIT0gV01fUFJPVE9DT0xT
KSAgZ290byByZXBvcnQ7CiAgICAgIGlmIChfd2luZG93X2lzX3RyYW5zaWVudChjbS0+d2luZG93
KSkgewogICAgICAgIHB1dHMoInVuZXhwZWN0ZWQiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBp
ZiAoaWZhY2UxLndpbmRvdyAhPSAwKSB7CiAgICAgICAgICB4Y2JfdW5tYXBfd2luZG93KGNvbm5l
Y3Rpb24sIGlmYWNlMS53aW5kb3cpOwogICAgICAgICAgeGNiX2Rlc3Ryb3lfd2luZG93KGNvbm5l
Y3Rpb24sIGlmYWNlMS53aW5kb3cpOwogICAgICAgIH0KICAgICAgICB4Y2JfdW5tYXBfd2luZG93
KGNvbm5lY3Rpb24sIGlmYWNlMC53aW5kb3cpOwogICAgICAgIHhjYl9kZXN0cm95X3dpbmRvdyhj
b25uZWN0aW9uLCBpZmFjZTAud2luZG93KTsKICAgICAgfQogICAgICBicmVhazsKICAgIH0KCiAg
ICBkZWZhdWx0OgogICAgICBpZiAobnZ0LT5yZXNwb25zZV90eXBlID09IDApIHsKICAgICAgICB4
Y2JfZ2VuZXJpY19lcnJvcl90ICplcnIgPSAoeGNiX2dlbmVyaWNfZXJyb3JfdCopbnZ0OwogICAg
ICAgIHByaW50ZigiZXJyb3I6ICUiUFJJdTgiXG4iLCBlcnItPmVycm9yX2NvZGUpOwogICAgICAg
IGJyZWFrOwogICAgICB9CnJlcG9ydDoKICAgICAgICAvKiBVbmtub3duIGV2ZW50IHR5cGUsIHVz
ZSB0byB0cmFjayBjb2RpbmcgcHJvYmxlbXMgKi8KICAgICAgcHJpbnRmKCJVbmtub3duIGV2ZW50
OiAlIlBSSXU4IlxuIiwgbnZ0LT5yZXNwb25zZV90eXBlKTsKICAgICAgYnJlYWs7CgogIH0gLyog
ZW5kIHN3aXRjaChyZXNwb25zZV90eXBlKSAqLwogICAgLyogbnZ0IG5vIGxvbmdlciBuZWVkZWQg
Ki8KICBmcmVlKG52dCk7CiAgICAvKiBjcml0aWNhbCEgb3RoZXJ3aXNlIHdvbnQgcHJvY2VzcyBh
bnl0aGluZyBkb25lICovCiAgeGNiX2ZsdXNoKGNvbm5lY3Rpb24pOwogIHJldHVybiB0cnVlOwp9
CgpzdGF0aWMgdm9pZAp4Y2JfbWFpbih2b2lkKSB7CgogICAgLyogc2V0IGFsbCBiZWZvcmUgdGhy
b3VnaCB0byBYc2VydmVyICovCiAgeGNiX2ZsdXNoKGNvbm5lY3Rpb24pOwoKICBkbyB7CiAgICBp
bnQgdGltZW91dDsKICAgIHhjYl9nZW5lcmljX2V2ZW50X3QgKmV2ZW50OwogICAgd2hpbGUgKChl
dmVudCA9IHhjYl9wb2xsX2Zvcl9ldmVudChjb25uZWN0aW9uKSkgIT0gTlVMTCkKICAgICAgICAv
KiBfcHJvY2Vzc19ldmVudCgpIHJldHVybnMgJ3J1bm5pbmcnIGZvciBtYWluIGxvb3AuICovCiAg
ICAgIGlmIChfcHJvY2Vzc19ldmVudChldmVudCkgPT0gZmFsc2UpICBnb3RvIGNsZWFudXA7CiAg
ICBkbyB7CiAgICAgICAgLyogX3Byb2Nlc3NfdGltZXJzKCkgcnVucyBhbnkgdGltZXJzIHRoYXQg
YXJlIGltbWVkaWF0ZWx5IHBlbmRpbmcsCiAgICAgICAgICAgYW5kIHJldHVybnMgdGhlIG51bWJl
ciBvZiBtaWxsaXNlY29uZHMgdW50aWwgdGhlIG5leHQgdGltZXIKICAgICAgICAgICBpbiB0aGUg
cXVldWUgaXMgcmVhZHkuCiAgICAgICAgICAgX3Byb2Nlc3NfdGltZXJzKCkgcmV0dXJucyBJTlRf
TUFYIGlmIHRoZXJlIGFyZSBubyB0aW1lcnMuICovCiAgICAgICAgLyogX3Byb2Nlc3NfdGltZXJz
KCkgYWxzbyByZW1vdmVzIGZyb20gdGltZW91dCBpdHMgcnVuIHRpbWUuICovCiAgICAgIHRpbWVv
dXQgPSBfcHJvY2Vzc190aW1lcnMoKTsKICAgICAgaWYgKChldmVudCA9IHhjYl9wb2xsX2Zvcl9x
dWV1ZWRfZXZlbnQoY29ubmVjdGlvbikpID09IE5VTEwpICBicmVhazsKICAgICAgICBpZiAoX3By
b2Nlc3NfZXZlbnQoZXZlbnQpID09IGZhbHNlKSAgZ290byBjbGVhbnVwOwogICAgfSB3aGlsZSAo
MSk7CiAgICBpZiAodGltZW91dCA+IDYpIHsKICAgICAgc3RydWN0IHBvbGxmZCBwZmRbMV07CiAg
ICAgIHBmZC0+ZmQgPSB4Y2JfZ2V0X2ZpbGVfZGVzY3JpcHRvcihjb25uZWN0aW9uKTsKICAgICAg
cGZkLT5ldmVudHMgPSBQT0xMSU47CiAgICAgIHBmZC0+cmV2ZW50cyA9IFBPTExPVVQ7CiAgICAg
IHBvbGwocGZkLCAxLCB0aW1lb3V0KTsKICAgIH0KICB9IHdoaWxlICgxKTsKICAgIC8qIHJlY2Vp
dmVkIFhDQl9ERVNUUk9ZX05PVElGWSAqLwpjbGVhbnVwOgogIHJldHVybjsKfQoKdm9pZAp1aV93
aW5kb3dfbmFtZSh4Y2Jfd2luZG93X3Qgd2luZG93KSB7CgogIHhjYl9pbnRlcm5fYXRvbV9jb29r
aWVfdCBjb29raWUKICAgID0geGNiX2ludGVybl9hdG9tKGNvbm5lY3Rpb24sIDEsIDcsICJXTV9O
QU1FIik7CiAgeGNiX2ludGVybl9hdG9tX3JlcGx5X3QgKnJlcGx5CiAgICA9IHhjYl9pbnRlcm5f
YXRvbV9yZXBseShjb25uZWN0aW9uLCBjb29raWUsIE5VTEwpOwogIHhjYl9pbnRlcm5fYXRvbV9j
b29raWVfdCBjb29raWUyCiAgICA9IHhjYl9pbnRlcm5fYXRvbShjb25uZWN0aW9uLCAwLCA2LCAi
U1RSSU5HIik7CiAgeGNiX2ludGVybl9hdG9tX3JlcGx5X3QgKnJlcGx5MgogICAgPSB4Y2JfaW50
ZXJuX2F0b21fcmVwbHkoY29ubmVjdGlvbiwgY29va2llMiwgTlVMTCk7CgogIGNoYXIgdGl0bGVb
MTZdOwogIHNwcmludGYodGl0bGUsICIlZCIsIHdpbmRvdyk7CiAgeGNiX2NoYW5nZV9wcm9wZXJ0
eShjb25uZWN0aW9uLCBYQ0JfUFJPUF9NT0RFX1JFUExBQ0UsIHdpbmRvdywKICAgICAgICAgICAg
ICAgICAgICAgICByZXBseS0+YXRvbSwgcmVwbHkyLT5hdG9tLCA4LAogICAgICAgICAgICAgICAg
ICAgICAgIHN0cmxlbih0aXRsZSksIHRpdGxlKTsKICBmcmVlKHJlcGx5KTsKICBmcmVlKHJlcGx5
Mik7Cn0KCmJvb2wKX3dpbmRvd19pc190cmFuc2llbnQoeGNiX3dpbmRvd190IHdpbmRvdykgewoK
ICB4Y2JfZ2V0X3Byb3BlcnR5X2Nvb2tpZV90IGNvb2tpZQogICAgPSB4Y2JfZ2V0X3Byb3BlcnR5
KGNvbm5lY3Rpb24sIDAsIHdpbmRvdywKICAgICAgICAgICAgICAgICAgICAgICBYQ0JfQVRPTV9X
TV9UUkFOU0lFTlRfRk9SLCBYQ0JfQVRPTV9XSU5ET1csIDAsIDEpOwogIHhjYl9nZXRfcHJvcGVy
dHlfcmVwbHlfdCAqcmVwbHkKICAgID0geGNiX2dldF9wcm9wZXJ0eV9yZXBseShjb25uZWN0aW9u
LCBjb29raWUsIE5VTEwpOwogIGJvb2wgdHJhbnNpZW50ID0gZmFsc2U7CiAgaWYgKHJlcGx5ICE9
IE5VTEwpIHsKICAgIGlmICggKHJlcGx5LT50eXBlID09IFhDQl9BVE9NX1dJTkRPVykKICAgICAg
ICAmJiAocmVwbHktPmZvcm1hdCA9PSAzMikKICAgICAgICAmJiAocmVwbHktPmxlbmd0aCAhPSAw
KSApIHsKICAgICAgdHJhbnNpZW50ID0gdHJ1ZTsKICAgIH0KICAgIGZyZWUocmVwbHkpOwogIH0K
ICByZXR1cm4gdHJhbnNpZW50Owp9CgpzdGF0aWMgdm9pZApfd2luZG93X2V2ZW50X2RlbGV0ZSh4
Y2JfY29ubmVjdGlvbl90ICpjb25uZWN0aW9uLCB4Y2Jfd2luZG93X3Qgd2luZG93KSB7CgogICAg
LyogYWxsb3cgZGVsZXRlIHdpbmRvdyBzbyBjYW4gcXVpdCBhcHBsaWNhdGlvbi4gQXZvaWQgXkMu
ICovCiAgeGNiX2NoYW5nZV9wcm9wZXJ0eShjb25uZWN0aW9uLCBYQ0JfUFJPUF9NT0RFX1JFUExB
Q0UsIHdpbmRvdywKICAgICAgICAgICAgICAgICAgICAgIFdNX1BST1RPQ09MUywgWENCX0FUT01f
QVRPTSwgMzIsIDEsCiAgICAgICAgICAgICAgICAgICAgICAmV01fREVMRVRFX1dJTkRPVyk7Cn0K
CnN0YXRpYyB4Y2Jfd2luZG93X3QKX3dpbmRvd19jcmVhdGUoUGh4UmVjdGFuZ2xlIGNvbmZpZ3Vy
ZSkgewoKICB4Y2Jfc2NyZWVuX3QgKnNjcmVlbjsKICB4Y2Jfd2luZG93X3Qgd2luZG93OwogIHVp
bnQzMl90IG1hc2s7CiAgdWludDMyX3QgdmFsdWVzWzJdOwoKICBpZiAoY29ubmVjdGlvbiA9PSBO
VUxMKSB7CiAgICB4Y2JfaW50ZXJuX2F0b21fY29va2llX3QgYzAsIGMxOwogICAgeGNiX2ludGVy
bl9hdG9tX3JlcGx5X3QgKnIwLCAqcjE7CiAgICBjb25uZWN0aW9uID0geGNiX2Nvbm5lY3QoTlVM
TCwgTlVMTCk7CiAgICBjMCA9IHhjYl9pbnRlcm5fYXRvbShjb25uZWN0aW9uLCAwLCAxMiwgIldN
X1BST1RPQ09MUyIpOwogICAgYzEgPSB4Y2JfaW50ZXJuX2F0b20oY29ubmVjdGlvbiwgMCwgMTYs
ICJXTV9ERUxFVEVfV0lORE9XIik7CiAgICByMCA9IHhjYl9pbnRlcm5fYXRvbV9yZXBseShjb25u
ZWN0aW9uLCBjMCwgTlVMTCk7CiAgICByMSA9IHhjYl9pbnRlcm5fYXRvbV9yZXBseShjb25uZWN0
aW9uLCBjMSwgTlVMTCk7CiAgICBXTV9QUk9UT0NPTFMgICAgID0gcjAtPmF0b207ICBmcmVlKCh2
b2lkKilyMCk7CiAgICBXTV9ERUxFVEVfV0lORE9XID0gcjEtPmF0b207ICBmcmVlKCh2b2lkKily
MSk7CiAgfQoKICBzY3JlZW4gPSB4Y2Jfc2V0dXBfcm9vdHNfaXRlcmF0b3IoeGNiX2dldF9zZXR1
cChjb25uZWN0aW9uKSkuZGF0YTsKICAgIC8qIENyZWF0ZSB0aGUgd2luZG93ICovCiAgd2luZG93
ID0geGNiX2dlbmVyYXRlX2lkKGNvbm5lY3Rpb24pOwoKICBtYXNrICAgICAgPSBYQ0JfQ1dfQkFD
S19QSVhFTCB8IFhDQl9DV19FVkVOVF9NQVNLOwogIHZhbHVlc1swXSA9IHNjcmVlbi0+d2hpdGVf
cGl4ZWw7CiAgdmFsdWVzWzFdID0gWENCX0VWRU5UX01BU0tfRVhQT1NVUkUgICAgICAgfCBYQ0Jf
RVZFTlRfTUFTS19CVVRUT05fUFJFU1MgICB8CiAgICAgICAgICAgICAgWENCX0VWRU5UX01BU0tf
QlVUVE9OX1JFTEVBU0UgfCBYQ0JfRVZFTlRfTUFTS19QT0lOVEVSX01PVElPTiB8CiAgICAgICAg
ICAgICAgWENCX0VWRU5UX01BU0tfRU5URVJfV0lORE9XICAgfCBYQ0JfRVZFTlRfTUFTS19MRUFW
RV9XSU5ET1cgICB8CiAgICAgICAgICAgICAgWENCX0VWRU5UX01BU0tfS0VZX1BSRVNTICAgICAg
fCBYQ0JfRVZFTlRfTUFTS19LRVlfUkVMRUFTRSAgICB8CiAgICAgICAgICAgICAgWENCX0VWRU5U
X01BU0tfRk9DVVNfQ0hBTkdFICAgfCBYQ0JfRVZFTlRfTUFTS19TVFJVQ1RVUkVfTk9USUZZIHwK
ICAgICAgICAgICAgICBYQ0JfRVZFTlRfTUFTS19WSVNJQklMSVRZX0NIQU5HRTsKCiAgICAvKiBp
Z25vcmVzIHgsIHksIGJvcmRlcl93aWR0aCAodmlydXMpICovCiAgeGNiX2NyZWF0ZV93aW5kb3co
Y29ubmVjdGlvbiwKICAgICAgICAgICAgICAgICAgICBzY3JlZW4tPnJvb3RfZGVwdGgsICAgICAg
ICAgICAgLyogZGVwdGggICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICB3aW5kb3csICAg
ICAgICAgICAgICAgICAgICAgICAgLyogZ2VuZXJhdGVkIGlkICAgKi8KICAgICAgICAgICAgICAg
ICAgICBzY3JlZW4tPnJvb3QsICAgICAgICAgICAgICAgICAgLyogcGFyZW50IHdpbmRvdyAgKi8K
ICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUueCwgICAgICAgICAgICAgICAgICAgLyogeCwg
eSAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUueSwKICAgICAgICAg
ICAgICAgICAgICBjb25maWd1cmUudywgICAgICAgICAgICAgICAgICAgLyogd2lkdGgsIGhlaWdo
dCAgKi8KICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUuaCwKICAgICAgICAgICAgICAgICAg
ICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYm9yZGVyX3dpZHRoICAgKi8KICAg
ICAgICAgICAgICAgICAgICBYQ0JfV0lORE9XX0NMQVNTX0lOUFVUX09VVFBVVCwgLyogY2xhc3Mg
ICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBzY3JlZW4tPnJvb3RfdmlzdWFsLCAgICAg
ICAgICAgLyogdmlzdWFsICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBtYXNrLCB2YWx1
ZXMpOyAgICAgICAgICAgICAgICAgLyogbWFza3MgKi8KICBfd2luZG93X2V2ZW50X2RlbGV0ZShj
b25uZWN0aW9uLCB3aW5kb3cpOwogIHJldHVybiB3aW5kb3c7Cn0KCnhjYl93aW5kb3dfdAp1aV93
aW5kb3dfY3JlYXRlKFBoeFJlY3RhbmdsZSBjb25maWd1cmUpIHsKCiAgeGNiX3dpbmRvd190IHdp
bmRvdyA9IF93aW5kb3dfY3JlYXRlKGNvbmZpZ3VyZSk7CiAgaWYgKHdpbmRvdyA9PSAwKSAgcmV0
dXJuIDA7CgogIGlmYWNlMC5tZXRlX2JveCA9IGNvbmZpZ3VyZTsKICBpZmFjZTAud2luZG93ID0g
d2luZG93OwogIHJldHVybiB3aW5kb3c7Cn0KCnhjYl93aW5kb3dfdAp1aV9kcm9wZG93bl9jcmVh
dGUoUGh4UmVjdGFuZ2xlIGNvbmZpZ3VyZSwgeGNiX3dpbmRvd190IHRyYW5zaWVudF9mb3Jfd2lu
ZG93KSB7CgogIHhjYl9zY3JlZW5fdCAqc2NyZWVuCiAgICA9IHhjYl9zZXR1cF9yb290c19pdGVy
YXRvcih4Y2JfZ2V0X3NldHVwKGNvbm5lY3Rpb24pKS5kYXRhOwogIHVpbnQzMl90IHZhbHVlc1sy
XTsKICB4Y2Jfd2luZG93X3Qgd2luZG93ID0gX3dpbmRvd19jcmVhdGUoY29uZmlndXJlKTsKICBp
ZiAod2luZG93ID09IDApICByZXR1cm4gMDsKCiAgdmFsdWVzWzBdID0gc2NyZWVuLT5ibGFja19w
aXhlbDsKICB2YWx1ZXNbMV0gPSB0cnVlOwogIHhjYl9jaGFuZ2Vfd2luZG93X2F0dHJpYnV0ZXMo
Y29ubmVjdGlvbiwgd2luZG93LAogICAgICAgICAgICAgICAgICAgICAgICBYQ0JfQ1dfQkFDS19Q
SVhFTCB8IFhDQl9DV19PVkVSUklERV9SRURJUkVDVCwgdmFsdWVzKTsKCiAgeGNiX2NoYW5nZV9w
cm9wZXJ0eShjb25uZWN0aW9uLCBYQ0JfUFJPUF9NT0RFX1JFUExBQ0UsIHdpbmRvdywKICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBYQ0JfQVRPTV9XTV9UUkFOU0lFTlRfRk9SLCBYQ0JfQVRP
TV9XSU5ET1csIDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsICZ0cmFuc2llbnRf
Zm9yX3dpbmRvdyk7CgogIGlmYWNlMS5tZXRlX2JveCA9IGNvbmZpZ3VyZTsKICBpZmFjZTEud2lu
ZG93ID0gd2luZG93OwogIHJldHVybiB3aW5kb3c7Cn0KCmludAptYWluKGludCBhcmdjLCBjaGFy
ICphcmd2W10pIHsKCiAgeGNiX3dpbmRvd190IHdpbmRvdzsKCiAgICAvKiB3aW5kb3cgc2l6ZSBh
bmQgcG9zaXRpb24gKi8KICBQaHhSZWN0YW5nbGUgY29uZmlndXJlID0geyA4MDAsIDIwMCwgMzAw
LCAyMDAgfTsKCiAgICAvKiB0dXJuIG9mZiB0aGVzZSBmcm9tIHJlcG9ydGluZwogIGRlYnVnX2Zs
YWdzICY9IH4oKHVpbnQ2NF90KTEgPDwgWENCX01PVElPTl9OT1RJRlkpOyAqLwogIGRlYnVnX2Zs
YWdzICY9IH4oKHVpbnQ2NF90KTEgPDwgWENCX1BST1BFUlRZX05PVElGWSk7CiAgZGVidWdfZmxh
Z3MgJj0gfigodWludDY0X3QpMSA8PCBYQ0JfQ09ORklHVVJFX05PVElGWSk7CiAgZGVidWdfZmxh
Z3MgJj0gfigodWludDY0X3QpMSA8PCBYQ0JfRVhQT1NFKTsKCiAgICAvKiBBICd0b3Btb3N0JyBk
ZWNvcmF0ZWQgd2luZG93ICovCiAgd2luZG93ID0gdWlfd2luZG93X2NyZWF0ZShjb25maWd1cmUp
OwogIGlmICh3aW5kb3cgPT0gMCkgIGV4aXQoRVhJVF9GQUlMVVJFKTsKCiAgdWlfd2luZG93X25h
bWUod2luZG93KTsKCiAgICAvKiBNYXAgdGhlIHdpbmRvdyBvbiB0aGUgc2NyZWVuICovCiAgeGNi
X21hcF93aW5kb3coY29ubmVjdGlvbiwgd2luZG93KTsKICBpZmFjZTAubWFwcGVkID0gdHJ1ZTsK
CiAgICAvKiBSdW4gZXZlbnQgbG9vcCAqLwogIHhjYl9tYWluKCk7CgogIHJldHVybiBFWElUX1NV
Q0NFU1M7Cn0K

--=-BXs3pLQl4e97SJrQz3FO--