Re: Decreasing seams in scaled windows

Neil Hodgson <[email protected]> Wed, 17 Jun 2026 13:38:35 +1000
Newsgroups gmane.comp.lib.scintilla.devel
Message-ID <CACWkrTgTr0NNNvL-X2TOz2s9EXKN6+O=4Mz9JYsR--op_c2Mmg@mail.gmail.com>
--00000000000015113306546acc64
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

John Ehresman:

>  to add *F() variants of methods that take or return pixel values =E2=80=
=94 these mimic how Qt works by always working in (possibly fractional) pix=
el units.

Tagging APIs that take or return pixels is good.

Scripts that read Scintilla.iface will need to be updated to
understand 'pixels'. Some of these are in Scintilla
(ScintillaAPIFacer.py, CheckMentioned.py) and SciTE (IFaceTableGen.py)
but some are in external projects.

Since this could cause failures in these projects, I'd like to provide
some transition support. Perhaps by publishing a script that converts
'int' into 'pixels' in Scintilla.iface where appropriate so projects
could update on their own schedule then force the update in a release
or two.

There will be decisions on how to expose this: does ScintillaTypes.h
get a 'using Pixels =3D intptr_t;' with ScintillaCall.h then specifying
'Pixels' in methods? Is the documentation updated or left with 'int'?

> The second patch uses full repaints on macOS because I intermittently see=
 a one pixel of selection color when I select and deselect lines (though I =
can trigger it pretty easily).

Yes, I have seen this too and do not understand it. It would be more
understandable if it happened on line edges where a float to int
rounding could cause a gap in painting but the selection remnant can
appear well inside a line. If it was just an edge truncation then
expanding the rectangle a little up and down would fix it but that
doesn't work.

For PixelAligned scaling, there is a performance cost to redrawing the
whole screen range, so accurate invalidation could be followed by
restricting painting to just the necessary area in the future.

> The patch also fixes the initial tiny text problem and a scroll by lines =
bug.

They look good.

I have applied QtScale-platform-fixes.patch and attached is a combined patc=
h.

Neil

--=20
You received this message because you are subscribed to the Google Groups "=
scintilla-interest" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to [email protected].
To view this discussion visit https://groups.google.com/d/msgid/scintilla-i=
nterest/CACWkrTgTr0NNNvL-X2TOz2s9EXKN6%2BO%3D4Mz9JYsR--op_c2Mmg%40mail.gmai=
l.com.

--00000000000015113306546acc64
Content-Type: text/plain; charset="US-ASCII"; name="QtScaleI.patch"
Content-Disposition: attachment; filename="QtScaleI.patch"
Content-Transfer-Encoding: base64
Content-ID: <f_mqhi5y2p0>
X-Attachment-Id: f_mqhi5y2p0

ZGlmZiAtciAwMzNjMzQyZTY2NTYgY2FsbC9TY2ludGlsbGFDYWxsLmN4eAotLS0gYS9jYWxsL1Nj
aW50aWxsYUNhbGwuY3h4CVNhdCBKdW4gMTMgMTE6MDE6NTYgMjAyNiArMTAwMAorKysgYi9jYWxs
L1NjaW50aWxsYUNhbGwuY3h4CVdlZCBKdW4gMTcgMTE6NDk6MjIgMjAyNiArMTAwMApAQCAtMzU1
OSw2ICszNTU5LDE0IEBACiAJQ2FsbFBvaW50ZXIoTWVzc2FnZTo6U2V0SUxleGVyLCAwLCBpbGV4
ZXIpOwogfQogCit2b2lkIFNjaW50aWxsYUNhbGw6OlNldFNjYWxlVGVjaG5pcXVlKFNjaW50aWxs
YTo6U2NhbGVUZWNobmlxdWUgdGVjaG5pcXVlKSB7CisJQ2FsbChNZXNzYWdlOjpTZXRTY2FsZVRl
Y2huaXF1ZSwgc3RhdGljX2Nhc3Q8dWludHB0cl90Pih0ZWNobmlxdWUpKTsKK30KKworU2NhbGVU
ZWNobmlxdWUgU2NpbnRpbGxhQ2FsbDo6U2NhbGVUZWNobmlxdWUoKSB7CisJcmV0dXJuIHN0YXRp
Y19jYXN0PFNjaW50aWxsYTo6U2NhbGVUZWNobmlxdWU+KENhbGwoTWVzc2FnZTo6R2V0U2NhbGVU
ZWNobmlxdWUpKTsKK30KKwogQmlkaXJlY3Rpb25hbCBTY2ludGlsbGFDYWxsOjpCaWRpcmVjdGlv
bmFsKCkgewogCXJldHVybiBzdGF0aWNfY2FzdDxTY2ludGlsbGE6OkJpZGlyZWN0aW9uYWw+KENh
bGwoTWVzc2FnZTo6R2V0QmlkaXJlY3Rpb25hbCkpOwogfQpkaWZmIC1yIDAzM2MzNDJlNjY1NiBk
b2MvU2NpbnRpbGxhRG9jLmh0bWwKLS0tIGEvZG9jL1NjaW50aWxsYURvYy5odG1sCVNhdCBKdW4g
MTMgMTE6MDE6NTYgMjAyNiArMTAwMAorKysgYi9kb2MvU2NpbnRpbGxhRG9jLmh0bWwJV2VkIEp1
biAxNyAxMTo0OToyMiAyMDI2ICsxMDAwCkBAIC01MTA2LDYgKzUxMDYsOCBAQAogICAgIDwvY29k
ZT4KIDxkaXYgIGNsYXNzPSJwcm92aXNpb25hbCI+CiAgICAgPGNvZGU+CisgICAgIDxhIGNsYXNz
PSJtZXNzYWdlIiBocmVmPSIjU0NJX1NFVFNDQUxFVEVDSE5JUVVFIj5TQ0lfU0VUU0NBTEVURUNI
TklRVUUoaW50IHRlY2huaXF1ZSk8L2E+PGJyIC8+CisgICAgIDxhIGNsYXNzPSJtZXNzYWdlIiBo
cmVmPSIjU0NJX0dFVFNDQUxFVEVDSE5JUVVFIj5TQ0lfR0VUU0NBTEVURUNITklRVUUgJnJhcnI7
IGludDwvYT48YnIgLz4KICAgICAgPGEgY2xhc3M9Im1lc3NhZ2UiIGhyZWY9IiNTQ0lfU0VUQklE
SVJFQ1RJT05BTCI+PHNwYW4gY2xhc3M9InByb3Zpc2lvbmFsIj5TQ0lfU0VUQklESVJFQ1RJT05B
TChpbnQgYmlkaXJlY3Rpb25hbCk8L3NwYW4+PC9hPjxiciAvPgogICAgICA8YSBjbGFzcz0ibWVz
c2FnZSIgaHJlZj0iI1NDSV9HRVRCSURJUkVDVElPTkFMIj5TQ0lfR0VUQklESVJFQ1RJT05BTCAm
cmFycjsgaW50PC9hPjxiciAvPgogICAgIDwvY29kZT4KQEAgLTUzNTYsNiArNTM1OCwzNSBAQAog
ICAgICBub3RpZmljYXRpb24gKHdpdGggPGNvZGUgY2xhc3M9InBhcmFtZXRlciI+Y2hhcmFjdGVy
U291cmNlPC9jb2RlPiBzZXQgdG8gPGNvZGU+U0NfQ0hBUkFDVEVSU09VUkNFX1RFTlRBVElWRV9J
TlBVVDwvY29kZT4pIGlzIHNlbnQgZm9yIGVhY2ggY2hhcmFjdGVyLjwvcD4KIAogPGRpdiAgY2xh
c3M9InByb3Zpc2lvbmFsIj4KKyAgIDxwPjxiIGlkPSJTQ0lfU0VUU0NBTEVURUNITklRVUUiPlND
SV9TRVRTQ0FMRVRFQ0hOSVFVRShpbnQgdGVjaG5pcXVlKTwvYj48YnIgLz4KKyAgICAgPGIgaWQ9
IlNDSV9HRVRTQ0FMRVRFQ0hOSVFVRSI+U0NJX0dFVFNDQUxFVEVDSE5JUVVFICZyYXJyOyBpbnQ8
L2I+PGJyIC8+CisgICAgIFRoaXMgc2V0dGluZyBjaGFuZ2VzIHRoZSBpbXBsZW1lbnRhdGlvbiBv
ZiBkaXNwbGF5IHNjYWxpbmcgb24gc29tZSBwbGF0Zm9ybXMuPC9wPgorCisgICAgPHRhYmxlIGNs
YXNzPSJzdGFuZGFyZCIgc3VtbWFyeT0iVGVjaG5vbG9neSBjaG9pY2UiPgorICAgICAgPHRib2R5
IHZhbGlnbj0idG9wIj4KKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0aCBhbGlnbj0ibGVmdCI+
PGNvZGU+U0NBTEVfVEVDSE5JUVVFX0RFRkFVTFQ8L2NvZGU+PC90aD4KKworICAgICAgICAgIDx0
ZD4wPC90ZD4KKworICAgICAgICAgIDx0ZD5EZWZhdWx0IGJlaGF2aW91ciBmb3IgdGhlIHBsYXRm
b3JtLjwvdGQ+CisgICAgICAgIDwvdHI+CisKKyAgICAgICAgPHRyPgorICAgICAgICAgIDx0aCBh
bGlnbj0ibGVmdCI+PGNvZGU+U0NBTEVfVEVDSE5JUVVFX1BJWEVMX0FMSUdORUQ8L2NvZGU+PC90
aD4KKworICAgICAgICAgIDx0ZD4xPC90ZD4KKworICAgICAgICAgIDx0ZD5BbGlnbiB0b3AgYW5k
IGJvdHRvbSBvZiBsaW5lcyB0byBwaHlzaWNhbCBwaXhlbHMgYW5kIGF2b2lkICdzZWFtcycgYmV0
d2VlbiBiYWNrZ3JvdW5kIHJlY3RhbmdsZXMgZm9yIGZyYWN0aW9uYWwgc2NhbGluZy4KKwkgIElt
cGxlbWVudGVkIG9uIFF0LiBUaGlzIG1vZGUgbWF5IGJlIHNsb3dlciB0aGFuIHRoZSBkZWZhdWx0
LjwvdGQ+CisgICAgICAgIDwvdHI+CisKKyAgICAgIDwvdGJvZHk+CisgICAgPC90YWJsZT4KKzwv
ZGl2PgorICAgIDxiciAvPgorCis8ZGl2ICBjbGFzcz0icHJvdmlzaW9uYWwiPgogICAgIDxhIGhy
ZWY9IiNQcm92aXNpb25hbE1lc3NhZ2VzIj5UaGVzZSBiaWRpcmVjdGlvbmFsIGZlYXR1cmVzIGFy
ZSBleHBlcmltZW50YWwgYW5kIGluY29tcGxldGUuPC9hPjxiciAvPgogICAgIDxwPjxiIGlkPSJT
Q0lfU0VUQklESVJFQ1RJT05BTCI+U0NJX1NFVEJJRElSRUNUSU9OQUwoaW50IGJpZGlyZWN0aW9u
YWwpPC9iPjxiciAvPgogICAgICA8YiBpZD0iU0NJX0dFVEJJRElSRUNUSU9OQUwiPlNDSV9HRVRC
SURJUkVDVElPTkFMICZyYXJyOyBpbnQ8L2I+PGJyIC8+CmRpZmYgLXIgMDMzYzM0MmU2NjU2IGlu
Y2x1ZGUvU2NpbnRpbGxhLmgKLS0tIGEvaW5jbHVkZS9TY2ludGlsbGEuaAlTYXQgSnVuIDEzIDEx
OjAxOjU2IDIwMjYgKzEwMDAKKysrIGIvaW5jbHVkZS9TY2ludGlsbGEuaAlXZWQgSnVuIDE3IDEx
OjQ5OjIyIDIwMjYgKzEwMDAKQEAgLTEzMzMsNiArMTMzMywxMCBAQAogI2RlZmluZSBTQ05fTUFS
R0lOUklHSFRDTElDSyAyMDMxCiAjZGVmaW5lIFNDTl9BVVRPQ1NFTEVDVElPTkNIQU5HRSAyMDMy
CiAjaWZuZGVmIFNDSV9ESVNBQkxFX1BST1ZJU0lPTkFMCisjZGVmaW5lIFNDQUxFX1RFQ0hOSVFV
RV9ERUZBVUxUIDAKKyNkZWZpbmUgU0NBTEVfVEVDSE5JUVVFX1BJWEVMX0FMSUdORUQgMQorI2Rl
ZmluZSBTQ0lfU0VUU0NBTEVURUNITklRVUUgMjgyMAorI2RlZmluZSBTQ0lfR0VUU0NBTEVURUNI
TklRVUUgMjgyMQogI2RlZmluZSBTQ19CSURJUkVDVElPTkFMX0RJU0FCTEVEIDAKICNkZWZpbmUg
U0NfQklESVJFQ1RJT05BTF9MMlIgMQogI2RlZmluZSBTQ19CSURJUkVDVElPTkFMX1IyTCAyCmRp
ZmYgLXIgMDMzYzM0MmU2NjU2IGluY2x1ZGUvU2NpbnRpbGxhLmlmYWNlCi0tLSBhL2luY2x1ZGUv
U2NpbnRpbGxhLmlmYWNlCVNhdCBKdW4gMTMgMTE6MDE6NTYgMjAyNiArMTAwMAorKysgYi9pbmNs
dWRlL1NjaW50aWxsYS5pZmFjZQlXZWQgSnVuIDE3IDExOjQ5OjIyIDIwMjYgKzEwMDAKQEAgLTM1
NDIsNiArMzU0MiwxNiBAQAogCiBjYXQgUHJvdmlzaW9uYWwKIAorZW51IFNjYWxlVGVjaG5pcXVl
PVNDQUxFX1RFQ0hOSVFVRV8KK3ZhbCBTQ0FMRV9URUNITklRVUVfREVGQVVMVD0wCit2YWwgU0NB
TEVfVEVDSE5JUVVFX1BJWEVMX0FMSUdORUQ9MQorCisjIFNldCB0aGUgc2NhbGUgdGVjaG5pcXVl
CitzZXQgdm9pZCBTZXRTY2FsZVRlY2huaXF1ZT0yODIwKFNjYWxlVGVjaG5pcXVlIHRlY2huaXF1
ZSwpCisKKyMgR2V0IHRoZSBzY2FsZSB0ZWNobmlxdWUKK2dldCBTY2FsZVRlY2huaXF1ZSBHZXRT
Y2FsZVRlY2huaXF1ZT0yODIxKCwpCisKIGVudSBCaWRpcmVjdGlvbmFsPVNDX0JJRElSRUNUSU9O
QUxfCiB2YWwgU0NfQklESVJFQ1RJT05BTF9ESVNBQkxFRD0wCiB2YWwgU0NfQklESVJFQ1RJT05B
TF9MMlI9MQpkaWZmIC1yIDAzM2MzNDJlNjY1NiBpbmNsdWRlL1NjaW50aWxsYUNhbGwuaAotLS0g
YS9pbmNsdWRlL1NjaW50aWxsYUNhbGwuaAlTYXQgSnVuIDEzIDExOjAxOjU2IDIwMjYgKzEwMDAK
KysrIGIvaW5jbHVkZS9TY2ludGlsbGFDYWxsLmgJV2VkIEp1biAxNyAxMTo0OToyMiAyMDI2ICsx
MDAwCkBAIC05MzUsNiArOTM1LDggQEAKIAlpbnQgRGVzY3JpcHRpb25PZlN0eWxlKGludCBzdHls
ZSwgY2hhciAqZGVzY3JpcHRpb24pOwogCXN0ZDo6c3RyaW5nIERlc2NyaXB0aW9uT2ZTdHlsZShp
bnQgc3R5bGUpOwogCXZvaWQgU2V0SUxleGVyKHZvaWQgKmlsZXhlcik7CisJdm9pZCBTZXRTY2Fs
ZVRlY2huaXF1ZShTY2ludGlsbGE6OlNjYWxlVGVjaG5pcXVlIHRlY2huaXF1ZSk7CisJU2NpbnRp
bGxhOjpTY2FsZVRlY2huaXF1ZSBTY2FsZVRlY2huaXF1ZSgpOwogCVNjaW50aWxsYTo6QmlkaXJl
Y3Rpb25hbCBCaWRpcmVjdGlvbmFsKCk7CiAJdm9pZCBTZXRCaWRpcmVjdGlvbmFsKFNjaW50aWxs
YTo6QmlkaXJlY3Rpb25hbCBiaWRpcmVjdGlvbmFsKTsKIApkaWZmIC1yIDAzM2MzNDJlNjY1NiBp
bmNsdWRlL1NjaW50aWxsYU1lc3NhZ2VzLmgKLS0tIGEvaW5jbHVkZS9TY2ludGlsbGFNZXNzYWdl
cy5oCVNhdCBKdW4gMTMgMTE6MDE6NTYgMjAyNiArMTAwMAorKysgYi9pbmNsdWRlL1NjaW50aWxs
YU1lc3NhZ2VzLmgJV2VkIEp1biAxNyAxMTo0OToyMiAyMDI2ICsxMDAwCkBAIC04MzEsNiArODMx
LDggQEAKIAlUYWdzT2ZTdHlsZSA9IDQwMzEsCiAJRGVzY3JpcHRpb25PZlN0eWxlID0gNDAzMiwK
IAlTZXRJTGV4ZXIgPSA0MDMzLAorCVNldFNjYWxlVGVjaG5pcXVlID0gMjgyMCwKKwlHZXRTY2Fs
ZVRlY2huaXF1ZSA9IDI4MjEsCiAJR2V0QmlkaXJlY3Rpb25hbCA9IDI3MDgsCiAJU2V0QmlkaXJl
Y3Rpb25hbCA9IDI3MDksCiB9OwpkaWZmIC1yIDAzM2MzNDJlNjY1NiBpbmNsdWRlL1NjaW50aWxs
YVR5cGVzLmgKLS0tIGEvaW5jbHVkZS9TY2ludGlsbGFUeXBlcy5oCVNhdCBKdW4gMTMgMTE6MDE6
NTYgMjAyNiArMTAwMAorKysgYi9pbmNsdWRlL1NjaW50aWxsYVR5cGVzLmgJV2VkIEp1biAxNyAx
MTo0OToyMiAyMDI2ICsxMDAwCkBAIC02NTcsNiArNjU3LDExIEBACiAJSW1lUmVzdWx0ID0gMiwK
IH07CiAKK2VudW0gY2xhc3MgU2NhbGVUZWNobmlxdWUgeworCURlZmF1bHQgPSAwLAorCVBpeGVs
QWxpZ25lZCA9IDEsCit9OworCiBlbnVtIGNsYXNzIEJpZGlyZWN0aW9uYWwgewogCURpc2FibGVk
ID0gMCwKIAlMMlIgPSAxLApkaWZmIC1yIDAzM2MzNDJlNjY1NiBxdC9TY2ludGlsbGFFZGl0QmFz
ZS9QbGF0UXQuY3BwCi0tLSBhL3F0L1NjaW50aWxsYUVkaXRCYXNlL1BsYXRRdC5jcHAJU2F0IEp1
biAxMyAxMTowMTo1NiAyMDI2ICsxMDAwCisrKyBiL3F0L1NjaW50aWxsYUVkaXRCYXNlL1BsYXRR
dC5jcHAJV2VkIEp1biAxNyAxMTo0OToyMiAyMDI2ICsxMDAwCkBAIC0xODMsMTMgKzE4MywxNCBA
QAogCiBTdXJmYWNlSW1wbDo6U3VyZmFjZUltcGwoKSA9IGRlZmF1bHQ7CiAKLVN1cmZhY2VJbXBs
OjpTdXJmYWNlSW1wbChpbnQgd2lkdGgsIGludCBoZWlnaHQsIFN1cmZhY2VNb2RlIG1vZGVfKQor
U3VyZmFjZUltcGw6OlN1cmZhY2VJbXBsKGludCB3aWR0aCwgaW50IGhlaWdodCwgU3VyZmFjZU1v
ZGUgbW9kZV8sIHFyZWFsIHNjYWxlXykKIHsKIAlpZiAod2lkdGggPCAxKSB3aWR0aCA9IDE7CiAJ
aWYgKGhlaWdodCA8IDEpIGhlaWdodCA9IDE7CiAJZGV2aWNlT3duZWQgPSB0cnVlOwogCWRldmlj
ZSA9IG5ldyBRUGl4bWFwKHdpZHRoLCBoZWlnaHQpOwogCW1vZGUgPSBtb2RlXzsKKwlzY2FsZSA9
IHNjYWxlXzsKIH0KIAogU3VyZmFjZUltcGw6On5TdXJmYWNlSW1wbCgpCkBAIC0yMTIsMjEgKzIx
Myw0NCBAQAogCXBhaW50ZXJPd25lZCA9IGZhbHNlOwogfQogCitkb3VibGUgU2NhbGVPZldpbmRv
dyhXaW5kb3dJRCB3aWQpCit7CisJY29uc3QgUVdpZGdldCAqd2lkZ2V0ID0gd2luZG93KHdpZCk7
CisJaWYgKCF3aWRnZXQpIHsKKwkJcmV0dXJuIDEuMDsKKwl9CisJY29uc3QgUVZhcmlhbnQgdmFy
aWFudCA9IHdpZGdldC0+cHJvcGVydHkoIlNjaW50aWxsYVNjYWxlIik7CisJcmV0dXJuIHZhcmlh
bnQudG9Eb3VibGUoKTsKK30KKworZG91YmxlIFNjYWxlVG9NdWx0aXBseShXaW5kb3dJRCB3aWQp
Cit7CisJY29uc3QgcXJlYWwgc2NhbGUgPSBTY2FsZU9mV2luZG93KHdpZCk7CisJcmV0dXJuIHNj
YWxlID8gc2NhbGUgOiAxLjA7Cit9CisKIHZvaWQgU3VyZmFjZUltcGw6OkluaXQoV2luZG93SUQg
d2lkKQogewogCVJlbGVhc2UoKTsKLQlkZXZpY2UgPSBzdGF0aWNfY2FzdDxRV2lkZ2V0ICo+KHdp
ZCk7CisJZGV2aWNlID0gd2luZG93KHdpZCk7CisJc2NhbGUgPSBTY2FsZU9mV2luZG93KHdpZCk7
CiB9CiAKIHZvaWQgU3VyZmFjZUltcGw6OkluaXQoU3VyZmFjZUlEIHNpZCwgV2luZG93SUQgLyp3
aWQqLykKIHsKIAlSZWxlYXNlKCk7CiAJZGV2aWNlID0gc3RhdGljX2Nhc3Q8UVBhaW50RGV2aWNl
ICo+KHNpZCk7CisJc2NhbGUgPSAwLjA7CiB9CiAKIHN0ZDo6dW5pcXVlX3B0cjxTdXJmYWNlPiBT
dXJmYWNlSW1wbDo6QWxsb2NhdGVQaXhNYXAoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQogewotCXJl
dHVybiBzdGQ6Om1ha2VfdW5pcXVlPFN1cmZhY2VJbXBsPih3aWR0aCwgaGVpZ2h0LCBtb2RlKTsK
KwlyZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxTdXJmYWNlSW1wbD4od2lkdGgsIGhlaWdodCwgbW9k
ZSwgc2NhbGUpOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8U3VyZmFjZT4gU3VyZmFjZUltcGxfQWxs
b2NhdGVQaXhNYXAoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBTdXJmYWNlTW9kZSBtb2RlLCBxcmVh
bCBzY2FsZSkKK3sKKwlyZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxTdXJmYWNlSW1wbD4od2lkdGgs
IGhlaWdodCwgbW9kZSwgc2NhbGUpOwogfQogCiB2b2lkIFN1cmZhY2VJbXBsOjpTZXRNb2RlKFN1
cmZhY2VNb2RlIG1vZGVfKQpAQCAtMzA5LDcgKzMzMywxMSBAQAogCiBpbnQgU3VyZmFjZUltcGw6
OkRldmljZUhlaWdodEZvbnQoaW50IHBvaW50cykKIHsKLQlyZXR1cm4gcG9pbnRzOworCWlmIChz
Y2FsZSkgeworCQlyZXR1cm4gcG9pbnRzICogc2NhbGU7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHBv
aW50czsKKwl9CiB9CiAKIHZvaWQgU3VyZmFjZUltcGw6OkxpbmVEcmF3KFBvaW50IHN0YXJ0LCBQ
b2ludCBlbmQsIFN0cm9rZSBzdHJva2UpCkBAIC03OTYsNiArODI0LDEwIEBACiAJCXBhaW50ZXIt
PnNldFJlbmRlckhpbnQoUVBhaW50ZXI6OlRleHRBbnRpYWxpYXNpbmcsIHRydWUpOwogCiAJCXBh
aW50ZXItPnNldFJlbmRlckhpbnQoUVBhaW50ZXI6OkFudGlhbGlhc2luZywgdHJ1ZSk7CisKKwkJ
aWYgKHNjYWxlKSB7CisJCQlwYWludGVyLT5zY2FsZSgxLjAgLyBzY2FsZSwgMS4wIC8gc2NhbGUp
OworCQl9CiAJfQogCiAJcmV0dXJuIHBhaW50ZXI7CkBAIC04MTEsMTEgKzg0Myw2IEBACiAKIG5h
bWVzcGFjZSB7CiAKLVFXaWRnZXQgKndpbmRvdyhXaW5kb3dJRCB3aWQpIG5vZXhjZXB0Ci17Ci0J
cmV0dXJuIHN0YXRpY19jYXN0PFFXaWRnZXQgKj4od2lkKTsKLX0KLQogUVJlY3QgU2NyZWVuUmVj
dGFuZ2xlRm9yUG9pbnQoUVBvaW50IHBvc0dsb2JhbCkKIHsKICNpZiBRVF9WRVJTSU9OID49IFFU
X1ZFUlNJT05fQ0hFQ0soNSwgMTAsIDApCkBAIC04NTQsNiArODgxLDggQEAKIAogdm9pZCBXaW5k
b3c6OlNldFBvc2l0aW9uUmVsYXRpdmUoUFJlY3RhbmdsZSByYywgY29uc3QgV2luZG93ICpyZWxh
dGl2ZVRvKQogeworCWNvbnN0IHFyZWFsIHNjYWxlID0gU2NhbGVUb011bHRpcGx5KHJlbGF0aXZl
VG8tPndpZCk7CisJcmMgPSByYyAvIHNjYWxlOwogCVFQb2ludCBvUG9zID0gd2luZG93KHJlbGF0
aXZlVG8tPndpZCktPm1hcFRvR2xvYmFsKFFQb2ludCgwLDApKTsKIAlpbnQgb3ggPSBvUG9zLngo
KTsKIAlpbnQgb3kgPSBvUG9zLnkoKTsKQEAgLTg4NCw3ICs5MTMsOSBAQAogUFJlY3RhbmdsZSBX
aW5kb3c6OkdldENsaWVudFBvc2l0aW9uKCkgY29uc3QKIHsKIAkvLyBUaGUgY2xpZW50IHBvc2l0
aW9uIGlzIHRoZSB3aW5kb3cgcG9zaXRpb24KLQlyZXR1cm4gR2V0UG9zaXRpb24oKTsKKwljb25z
dCBxcmVhbCBzY2FsZSA9IFNjYWxlVG9NdWx0aXBseSh3aWQpOworCWNvbnN0IFBSZWN0YW5nbGUg
cmMgPSBHZXRQb3NpdGlvbigpOworCXJldHVybiByYyAqIHNjYWxlOwogfQogCiB2b2lkIFdpbmRv
dzo6U2hvdyhib29sIHNob3cpCkBAIC05MDEsOCArOTMyLDIzIEBACiAKIHZvaWQgV2luZG93OjpJ
bnZhbGlkYXRlUmVjdGFuZ2xlKFBSZWN0YW5nbGUgcmMpCiB7Ci0JaWYgKHdpZCkKKwlpZiAod2lk
KSB7CisJCWNvbnN0IHFyZWFsIHNjYWxlID0gU2NhbGVPZldpbmRvdyh3aWQpOworCQlpZiAoc2Nh
bGUpIHsKKyNpZiAhZGVmaW5lZChRX09TX1dJTikKKwkJCS8vIFVzaW5nIFgxMSwgV2F5bGFuZCwg
b3IgbWFjT1MuCisJCQlpZiAoc2NhbGUgIT0gMS4wICYmIHNjYWxlICE9IDIuMCkgeworCQkJCS8v
IEZyYWN0aW9uYWwgc2NhbGluZyBsZWF2ZXMgcmVwYWludCBkZWJyaXMsIHNvIHJlZHJhdyBjb21w
bGV0ZWx5CisJCQkJd2luZG93KHdpZCktPnVwZGF0ZSgpOworCQkJCXJldHVybjsKKwkJCX0KKyNl
bmRpZgorCQkJLy8gVXNlIFFSZWN0Rjo6dG9BbGlnbmVkUmVjdCB0byBnZXQgaW50IHJlY3QgdGhh
dCBjb250YWlucyBmbG9hdCByZWN0CisJCQl3aW5kb3cod2lkKS0+dXBkYXRlKFFSZWN0RkZyb21Q
UmVjdChyYyAvIHNjYWxlKS50b0FsaWduZWRSZWN0KCkpOworCQkJcmV0dXJuOworCQl9CiAJCXdp
bmRvdyh3aWQpLT51cGRhdGUoUVJlY3RGcm9tUFJlY3QocmMpKTsKKwl9CiB9CiAKIHZvaWQgV2lu
ZG93OjpTZXRDdXJzb3IoQ3Vyc29yIGN1cnMpCkBAIC05OTksNiArMTA0NSw3IEBACiAJaW50IHZp
c2libGVSb3dzezV9OwogCVFNYXA8aW50LFFQaXhtYXA+IGltYWdlczsKIAlmbG9hdCBpbWFnZVNj
YWxlezEuMH07CisJUVdpZGdldCAqb3duZXIgPSBudWxscHRyOwogfTsKIExpc3RCb3hJbXBsOjpM
aXN0Qm94SW1wbCgpIG5vZXhjZXB0ID0gZGVmYXVsdDsKIApAQCAtMTAxMiw3ICsxMDU5LDEwIEBA
CiAJdW5pY29kZU1vZGUgPSB1bmljb2RlTW9kZV87CiAKIAlRV2lkZ2V0ICpxcGFyZW50ID0gc3Rh
dGljX2Nhc3Q8UVdpZGdldCAqPihwYXJlbnQuR2V0SUQoKSk7CisJb3duZXIgPSBxcGFyZW50Owog
CUxpc3RXaWRnZXQgKmxpc3QgPSBuZXcgTGlzdFdpZGdldChxcGFyZW50KTsKKwljb25zdCBxcmVh
bCBzY2FsZSA9IFNjYWxlT2ZXaW5kb3cocGFyZW50LkdldElEKCkpOworCWxpc3QtPnNldFByb3Bl
cnR5KCJTY2ludGlsbGFTY2FsZSIsIHNjYWxlKTsKIAogI2lmIGRlZmluZWQoUV9PU19XSU4pCiAJ
Ly8gT24gV2luZG93cywgUXQ6OlRvb2xUaXAgY2F1c2VzIGEgY3Jhc2ggd2hlbiB0aGUgbGlzdCBp
cyBjbGlja2VkIG9uCkBAIC0xMDU0LDcgKzExMDQsMTQgQEAKIAlMaXN0V2lkZ2V0ICpsaXN0ID0g
R2V0V2lkZ2V0KCk7CiAJY29uc3QgRm9udEFuZENoYXJhY3RlclNldCAqcGZhY3MgPSBBc0ZvbnRB
bmRDaGFyYWN0ZXJTZXQoZm9udCk7CiAJaWYgKHBmYWNzICYmIHBmYWNzLT5wZm9udCkgewotCQls
aXN0LT5zZXRGb250KCoocGZhY3MtPnBmb250KSk7CisJCVFGb250IGZvbnREZVNjYWxlZCA9ICoo
cGZhY3MtPnBmb250KTsKKwkJY29uc3QgcXJlYWwgc2NhbGVPd25lciA9IFNjYWxlT2ZXaW5kb3co
b3duZXIpOworCQlpZiAoc2NhbGVPd25lcikgeworCQkJY29uc3QgcXJlYWwgc2NhbGUgPSB3aW5k
b3cob3duZXIpLT5kZXZpY2VQaXhlbFJhdGlvRigpOworCQkJcXJlYWwgcG9pbnRTaXplID0gZm9u
dERlU2NhbGVkLnBvaW50U2l6ZUYoKSAvIHNjYWxlOworCQkJZm9udERlU2NhbGVkLnNldFBvaW50
U2l6ZUYocG9pbnRTaXplKTsKKwkJfQorCQlsaXN0LT5zZXRGb250KGZvbnREZVNjYWxlZCk7CiAJ
fQogfQogdm9pZCBMaXN0Qm94SW1wbDo6U2V0QXZlcmFnZUNoYXJXaWR0aChpbnQgLyp3aWR0aCov
KSB7fQpAQCAtMTA4MSwxMCArMTEzOCwxMSBAQAogCVFTdHlsZSAqc3R5bGUgPSBRQXBwbGljYXRp
b246OnN0eWxlKCk7CiAJaW50IHdpZHRoID0gbGlzdC0+c2l6ZUhpbnRGb3JDb2x1bW4oMCkgKyAo
MiAqIGxpc3QtPmZyYW1lV2lkdGgoKSk7CiAJaWYgKExlbmd0aCgpID4gcm93cykgewotCQl3aWR0
aCArPSBzdHlsZS0+cGl4ZWxNZXRyaWMoUVN0eWxlOjpQTV9TY3JvbGxCYXJFeHRlbnQpOworCQl3
aWR0aCArPSBzdHlsZS0+cGl4ZWxNZXRyaWMoUVN0eWxlOjpQTV9TY3JvbGxCYXJFeHRlbnQpICsg
MTsKIAl9CiAKLQlyZXR1cm4gUFJlY3RhbmdsZSgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKwljb25z
dCBxcmVhbCBzY2FsZSA9IFNjYWxlT2ZXaW5kb3cod2lkKTsKKwlyZXR1cm4gUFJlY3RhbmdsZSgw
LCAwLCB3aWR0aCwgaGVpZ2h0KSAqIChzY2FsZSA/IHNjYWxlIDogMS4wKTsKIH0KIGludCBMaXN0
Qm94SW1wbDo6Q2FyZXRGcm9tRWRnZSgpCiB7CmRpZmYgLXIgMDMzYzM0MmU2NjU2IHF0L1NjaW50
aWxsYUVkaXRCYXNlL1BsYXRRdC5oCi0tLSBhL3F0L1NjaW50aWxsYUVkaXRCYXNlL1BsYXRRdC5o
CVNhdCBKdW4gMTMgMTE6MDE6NTYgMjAyNiArMTAwMAorKysgYi9xdC9TY2ludGlsbGFFZGl0QmFz
ZS9QbGF0UXQuaAlXZWQgSnVuIDE3IDExOjQ5OjIyIDIwMjYgKzEwMDAKQEAgLTc0LDYgKzc0LDEz
IEBACiAJcmV0dXJuIFFQb2ludEYocXAueCwgcXAueSk7CiB9CiAKK2lubGluZSBRV2lkZ2V0ICp3
aW5kb3coV2luZG93SUQgd2lkKSBub2V4Y2VwdAoreworCXJldHVybiBzdGF0aWNfY2FzdDxRV2lk
Z2V0ICo+KHdpZCk7Cit9CisKK2RvdWJsZSBTY2FsZU9mV2luZG93KFdpbmRvd0lEIHdpZCk7CisK
IGNsYXNzIFN1cmZhY2VJbXBsIDogcHVibGljIFN1cmZhY2UgewogcHJpdmF0ZToKIAlRUGFpbnRE
ZXZpY2UgKmRldmljZSA9IG51bGxwdHI7CkBAIC04MSw2ICs4OCw3IEBACiAJYm9vbCBkZXZpY2VP
d25lZCA9IGZhbHNlOwogCWJvb2wgcGFpbnRlck93bmVkID0gZmFsc2U7CiAJU3VyZmFjZU1vZGUg
bW9kZTsKKwlxcmVhbCBzY2FsZSA9IDAuMDsKIAljb25zdCBjaGFyICpjb2RlY05hbWUgPSBudWxs
cHRyOwogCVFUZXh0Q29kZWMgKmNvZGVjID0gbnVsbHB0cjsKIApAQCAtODgsNyArOTYsNyBAQAog
CiBwdWJsaWM6CiAJU3VyZmFjZUltcGwoKTsKLQlTdXJmYWNlSW1wbChpbnQgd2lkdGgsIGludCBo
ZWlnaHQsIFN1cmZhY2VNb2RlIG1vZGVfKTsKKwlTdXJmYWNlSW1wbChpbnQgd2lkdGgsIGludCBo
ZWlnaHQsIFN1cmZhY2VNb2RlIG1vZGVfLCBxcmVhbCBzY2FsZV8pOwogCXZpcnR1YWwgflN1cmZh
Y2VJbXBsKCkgb3ZlcnJpZGU7CiAKIAl2b2lkIEluaXQoV2luZG93SUQgd2lkKSBvdmVycmlkZTsK
QEAgLTE2NCw2ICsxNzIsOCBAQAogCVFQYWludGVyICpHZXRQYWludGVyKCk7CiB9OwogCitzdGQ6
OnVuaXF1ZV9wdHI8U3VyZmFjZT4gU3VyZmFjZUltcGxfQWxsb2NhdGVQaXhNYXAoaW50IHdpZHRo
LCBpbnQgaGVpZ2h0LCBTdXJmYWNlTW9kZSBtb2RlLCBxcmVhbCBzY2FsZSk7CisKIH0KIAogI2Vu
ZGlmCmRpZmYgLXIgMDMzYzM0MmU2NjU2IHF0L1NjaW50aWxsYUVkaXRCYXNlL1NjaW50aWxsYUVk
aXRCYXNlLmNwcAotLS0gYS9xdC9TY2ludGlsbGFFZGl0QmFzZS9TY2ludGlsbGFFZGl0QmFzZS5j
cHAJU2F0IEp1biAxMyAxMTowMTo1NiAyMDI2ICsxMDAwCisrKyBiL3F0L1NjaW50aWxsYUVkaXRC
YXNlL1NjaW50aWxsYUVkaXRCYXNlLmNwcAlXZWQgSnVuIDE3IDExOjQ5OjIyIDIwMjYgKzEwMDAK
QEAgLTEyNyw2ICsxMjcsMTMgQEAKIAl9IGVsc2UgaWYgKGV2ZW50LT50eXBlKCkgPT0gUUV2ZW50
OjpIaWRlKSB7CiAJCXNldE1vdXNlVHJhY2tpbmcoZmFsc2UpOwogCQlyZXN1bHQgPSBRQWJzdHJh
Y3RTY3JvbGxBcmVhOjpldmVudChldmVudCk7CisjaWYgUVRfVkVSU0lPTiA+PSBRVF9WRVJTSU9O
X0NIRUNLKDYsIDYsIDApCisJfSBlbHNlIGlmIChldmVudC0+dHlwZSgpID09IFFFdmVudDo6RGV2
aWNlUGl4ZWxSYXRpb0NoYW5nZSkgeworCQkvLyBSZXNldCBjYWNoZWQgZGF0YQorCQlzcXQtPlNl
dFNjYWxlUHJvcGVydHkoKTsKKwkJc3F0LT5JbnZhbGlkYXRlU3R5bGVSZWRyYXcoKTsKKwkJcmVz
dWx0ID0gUUFic3RyYWN0U2Nyb2xsQXJlYTo6ZXZlbnQoZXZlbnQpOworI2VuZGlmCiAJfSBlbHNl
IHsKIAkJcmVzdWx0ID0gUUFic3RyYWN0U2Nyb2xsQXJlYTo6ZXZlbnQoZXZlbnQpOwogCX0KQEAg
LTMxOCw3ICszMjUsNyBAQAogCiB2b2lkIFNjaW50aWxsYUVkaXRCYXNlOjptb3VzZVByZXNzRXZl
bnQoUU1vdXNlRXZlbnQgKmV2ZW50KQogewotCWNvbnN0IFBvaW50IHBvcyA9IFBvaW50RnJvbVFQ
b2ludChldmVudC0+cG9zKCkpOworCWNvbnN0IFBvaW50IHBvcyA9IFBvaW50RnJvbVFQb2ludChl
dmVudC0+cG9zKCkpICogKHNxdC0+SXNQaXhlbEFsaWduZWRTY2FsZSgpID8gZGV2aWNlUGl4ZWxS
YXRpb0YoKSA6IDEuMCk7CiAKIAllbWl0IGJ1dHRvblByZXNzZWQoZXZlbnQpOwogCkBAIC0zNDcs
NyArMzU0LDcgQEAKIAogdm9pZCBTY2ludGlsbGFFZGl0QmFzZTo6bW91c2VSZWxlYXNlRXZlbnQo
UU1vdXNlRXZlbnQgKmV2ZW50KQogewotCWNvbnN0IFFQb2ludCBwb2ludCA9IGV2ZW50LT5wb3Mo
KTsKKwljb25zdCBRUG9pbnQgcG9pbnQgPSBldmVudC0+cG9zKCkgKiAoc3F0LT5Jc1BpeGVsQWxp
Z25lZFNjYWxlKCkgPyBkZXZpY2VQaXhlbFJhdGlvRigpIDogMS4wKTsKIAlpZiAoZXZlbnQtPmJ1
dHRvbigpID09IFF0OjpMZWZ0QnV0dG9uKQogCQlzcXQtPkJ1dHRvblVwV2l0aE1vZGlmaWVycyhQ
b2ludEZyb21RUG9pbnQocG9pbnQpLCBUaW1lT2ZFdmVudCh0aW1lKSwgTW9kaWZpZXJzT2ZLZXli
b2FyZCgpKTsKIApAQCAtMzY3LDcgKzM3NCw3IEBACiAKIHZvaWQgU2NpbnRpbGxhRWRpdEJhc2U6
Om1vdXNlTW92ZUV2ZW50KFFNb3VzZUV2ZW50ICpldmVudCkKIHsKLQljb25zdCBQb2ludCBwb3Mg
PSBQb2ludEZyb21RUG9pbnQoZXZlbnQtPnBvcygpKTsKKwljb25zdCBQb2ludCBwb3MgPSBQb2lu
dEZyb21RUG9pbnQoZXZlbnQtPnBvcygpKSAgKiAoc3F0LT5Jc1BpeGVsQWxpZ25lZFNjYWxlKCkg
PyBkZXZpY2VQaXhlbFJhdGlvRigpIDogMS4wKTsKIAogCWNvbnN0IGJvb2wgc2hpZnQgPSBRQXBw
bGljYXRpb246OmtleWJvYXJkTW9kaWZpZXJzKCkgJiBRdDo6U2hpZnRNb2RpZmllcjsKIAljb25z
dCBib29sIGN0cmwgID0gUUFwcGxpY2F0aW9uOjprZXlib2FyZE1vZGlmaWVycygpICYgUXQ6OkNv
bnRyb2xNb2RpZmllcjsKZGlmZiAtciAwMzNjMzQyZTY2NTYgcXQvU2NpbnRpbGxhRWRpdEJhc2Uv
U2NpbnRpbGxhRWRpdEJhc2UucHJvCi0tLSBhL3F0L1NjaW50aWxsYUVkaXRCYXNlL1NjaW50aWxs
YUVkaXRCYXNlLnBybwlTYXQgSnVuIDEzIDExOjAxOjU2IDIwMjYgKzEwMDAKKysrIGIvcXQvU2Np
bnRpbGxhRWRpdEJhc2UvU2NpbnRpbGxhRWRpdEJhc2UucHJvCVdlZCBKdW4gMTcgMTE6NDk6MjIg
MjAyNiArMTAwMApAQCAtMTAwLDcgKzEwMCw3IEBACiAgICAgREVGSU5FUyArPSBOREVCVUc9MQog
fQogCi1ERVNURElSID0gLi4vLi4vYmluCitERVNURElSID0gJCRfUFJPX0ZJTEVfUFdEXy8uLi8u
Li9iaW4KIAogbWFjeCB7CiAJUU1BS0VfTEZMQUdTX1NPTkFNRSA9IC1XbCwtaW5zdGFsbF9uYW1l
LEBleGVjdXRhYmxlX3BhdGgvLi4vRnJhbWV3b3Jrcy8KZGlmZiAtciAwMzNjMzQyZTY2NTYgcXQv
U2NpbnRpbGxhRWRpdEJhc2UvU2NpbnRpbGxhUXQuY3BwCi0tLSBhL3F0L1NjaW50aWxsYUVkaXRC
YXNlL1NjaW50aWxsYVF0LmNwcAlTYXQgSnVuIDEzIDExOjAxOjU2IDIwMjYgKzEwMDAKKysrIGIv
cXQvU2NpbnRpbGxhRWRpdEJhc2UvU2NpbnRpbGxhUXQuY3BwCVdlZCBKdW4gMTcgMTE6NDk6MjIg
MjAyNiArMTAwMApAQCAtMzMsNiArMzMsNyBAQAogewogCiAJd01haW4gPSBzY3JvbGxBcmVhLT52
aWV3cG9ydCgpOworCXNjcm9sbEFyZWEtPnZpZXdwb3J0KCktPnNldFByb3BlcnR5KCJTY2ludGls
bGFTY2FsZSIsIDAuMCk7CiAKIAlpbWVJbnRlcmFjdGlvbiA9IElNRUludGVyYWN0aW9uOjpJbmxp
bmU7CiAKQEAgLTI3Niw2ICsyNzcsMTEgQEAKIHZvaWQgU2NpbnRpbGxhUXQ6OlNjcm9sbFRleHQo
U2NpOjpMaW5lIGxpbmVzVG9Nb3ZlKQogewogCWludCBkeSA9IHZzLmxpbmVIZWlnaHQgKiAobGlu
ZXNUb01vdmUpOworCWlmIChJc1BpeGVsQWxpZ25lZFNjYWxlKCkpIHsKKwkJLy8gbGluZUhlaWdo
dCBpcyBpbiBkZXZpY2UgcGl4ZWxzLCB2aWV3cG9ydCgpLT5zY3JvbGwoKSBuZWVkcyBsb2dpY2Fs
IHBpeGVscworCQljb25zdCBxcmVhbCBzY2FsZSA9IHdpbmRvdyh3TWFpbi5HZXRJRCgpKS0+ZGV2
aWNlUGl4ZWxSYXRpb0YoKTsKKwkJZHkgPSBxUm91bmQoZHkgLyBzY2FsZSk7CisJfQogCXNjcm9s
bEFyZWEtPnZpZXdwb3J0KCktPnNjcm9sbCgwLCBkeSk7CiB9CiAKQEAgLTcxNSw3ICs3MjEsMTMg
QEAKIAogCWlmICghY3Qud0NhbGxUaXAuQ3JlYXRlZCgpKSB7CiAJCVFXaWRnZXQgKnBDYWxsVGlw
ID0gbmV3IENhbGxUaXBJbXBsKHNjcm9sbEFyZWEtPndpbmRvdygpLT53aW5kb3dIYW5kbGUoKSwg
JmN0KTsKKwkJY29uc3QgcXJlYWwgc2NhbGVEZXZpY2UgPSBTY2FsZU9mV2luZG93KHdNYWluLkdl
dElEKCkpOworCQlwQ2FsbFRpcC0+c2V0UHJvcGVydHkoIlNjaW50aWxsYVNjYWxlIiwKKwkJCXNj
YWxlVGVjaG5pcXVlID09IFNjYWxlVGVjaG5pcXVlOjpQaXhlbEFsaWduZWQgPyBzY2FsZURldmlj
ZSA6IDAuMCk7CisKIAkJY3Qud0NhbGxUaXAgPSBwQ2FsbFRpcDsKKwkJaWYgKHNjYWxlRGV2aWNl
KQorCQkJcmMgPSByYyAqIHNjYWxlRGV2aWNlOwogCQlwQ2FsbFRpcC0+bW92ZShyYy5sZWZ0LCBy
Yy50b3ApOwogCQlwQ2FsbFRpcC0+cmVzaXplKHJjLldpZHRoKCksIHJjLkhlaWdodCgpKTsKIAl9
CkBAIC03NzEsNiArNzgzLDE2IEBACiAJCWNhc2UgTWVzc2FnZTo6R2V0UmVjdGFuZ3VsYXJTZWxl
Y3Rpb25Nb2RpZmllcjoKIAkJCXJldHVybiByZWN0YW5ndWxhclNlbGVjdGlvbk1vZGlmaWVyOwog
CisJCWNhc2UgTWVzc2FnZTo6U2V0U2NhbGVUZWNobmlxdWU6CisJCQlzY2FsZVRlY2huaXF1ZSA9
IHN0YXRpY19jYXN0PFNjYWxlVGVjaG5pcXVlPih3UGFyYW0pOworCQkJLy8gU2NhbGUgcHJvcGVy
dHkgbmVlZHMgdG8gYmUgc2V0IGJlZm9yZSBJbnZhbGlkYXRlU3R5bGVSZWRyYXcoKQorCQkJU2V0
U2NhbGVQcm9wZXJ0eSgpOworCQkJSW52YWxpZGF0ZVN0eWxlUmVkcmF3KCk7CisJCQlicmVhazsK
KworCQljYXNlIE1lc3NhZ2U6OkdldFNjYWxlVGVjaG5pcXVlOgorCQkJcmV0dXJuIHN0YXRpY19j
YXN0PHNwdHJfdD4oc2NhbGVUZWNobmlxdWUpOworCiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gU2Np
bnRpbGxhQmFzZTo6V25kUHJvYyhpTWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwogCQl9CkBAIC04
MDUsMjAgKzgyNyw1NSBAQAogCXJldHVybiByZXR1cm5WYWx1ZTsKIH0KIAordm9pZCBTY2ludGls
bGFRdDo6U2V0U2NhbGVQcm9wZXJ0eSgpCit7CisJcXJlYWwgc2NhbGUgPSAwLjA7CisJaWYgKHNj
YWxlVGVjaG5pcXVlID09IFNjYWxlVGVjaG5pcXVlOjpQaXhlbEFsaWduZWQpIHsKKwkJUVdpZGdl
dCAqd2lkZ2V0ID0gd2luZG93KHdNYWluLkdldElEKCkpOworCQlzY2FsZSA9IHdpZGdldC0+ZGV2
aWNlUGl4ZWxSYXRpb0YoKTsKKwl9CisJc2Nyb2xsQXJlYS0+dmlld3BvcnQoKS0+c2V0UHJvcGVy
dHkoIlNjaW50aWxsYVNjYWxlIiwgc2NhbGUpOworfQorCiAvLyBBZGRpdGlvbnMgdG8gbWVyZ2Ug
aW4gU2NpZW50aWZpYyBUb29sd29ya3Mgd2lkZ2V0IHN0cnVjdHVyZQogCiB2b2lkIFNjaW50aWxs
YVF0OjpQYXJ0aWFsUGFpbnQoY29uc3QgUFJlY3RhbmdsZSAmcmVjdCkKIHsKLQlyY1BhaW50ID0g
cmVjdDsKKwlTZXRTY2FsZVByb3BlcnR5KCk7CisJaWYgKHNjYWxlVGVjaG5pcXVlID09IFNjYWxl
VGVjaG5pcXVlOjpQaXhlbEFsaWduZWQpIHsKKwkJUVdpZGdldCAqd2lkZ2V0ID0gd2luZG93KHdN
YWluLkdldElEKCkpOworCQlyY1BhaW50ID0gcmVjdCAqIHdpZGdldC0+ZGV2aWNlUGl4ZWxSYXRp
b0YoKTsKKwl9IGVsc2UgeworCQlyY1BhaW50ID0gcmVjdDsKKwl9CiAJcGFpbnRTdGF0ZSA9IFBh
aW50U3RhdGU6OnBhaW50aW5nOwogCVBSZWN0YW5nbGUgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0
YW5nbGUoKTsKIAlwYWludGluZ0FsbFRleHQgPSByY1BhaW50LkNvbnRhaW5zKHJjQ2xpZW50KTsK
IAogCUF1dG9TdXJmYWNlIHN1cmZhY2VQYWludCh0aGlzKTsKLQlQYWludChzdXJmYWNlUGFpbnQs
IHJjUGFpbnQpOworCWlmIChzY2FsZVRlY2huaXF1ZSA9PSBTY2FsZVRlY2huaXF1ZTo6UGl4ZWxB
bGlnbmVkKSB7CisJCS8vIENyZWF0ZSBCaXRtYXAgb2YgZXhhY3RseSB3aW5kb3cgc2l6ZSB0aGVu
IGJsaXQgYWZ0ZXIgUGFpbnQgY2FsbAorCQlRV2lkZ2V0ICp3aWRnZXQgPSB3aW5kb3cod01haW4u
R2V0SUQoKSk7CisJCWNvbnN0IHFyZWFsIHNjYWxlID0gd2lkZ2V0LT5kZXZpY2VQaXhlbFJhdGlv
RigpOworCQljb25zdCBRU2l6ZSBzeiA9IHdpZGdldC0+c2l6ZSgpICogc2NhbGU7CisJCWNvbnN0
IGludCB3ID0gc3oud2lkdGgoKTsKKwkJY29uc3QgaW50IGggPSBzei5oZWlnaHQoKTsKKwkJc3Rk
Ojp1bmlxdWVfcHRyPFN1cmZhY2U+IHN1cmZQaXggPSBTdXJmYWNlSW1wbF9BbGxvY2F0ZVBpeE1h
cCh3LCBoLCBDdXJyZW50U3VyZmFjZU1vZGUoKSwgMC4wKTsKKwkJUFJlY3RhbmdsZSByY1NjYWxl
ZCA9IFBSZWN0YW5nbGU6OkZyb21JbnRzKDAsIDAsIHcsIGgpOworCQlQYWludChzdXJmUGl4Lmdl
dCgpLCByY1NjYWxlZCk7CisJCXN1cmZhY2VQYWludC0+Q29weShyY1NjYWxlZCwgUG9pbnQoMCww
KSwgKnN1cmZQaXgpOworCX0gZWxzZSB7CisJCVBhaW50KHN1cmZhY2VQYWludCwgcmNQYWludCk7
CisJfQogCXN1cmZhY2VQYWludC0+UmVsZWFzZSgpOwogCiAJaWYgKHBhaW50U3RhdGUgPT0gUGFp
bnRTdGF0ZTo6YWJhbmRvbmVkKSB7CisJCWlmIChzY2FsZVRlY2huaXF1ZSA9PSBTY2FsZVRlY2hu
aXF1ZTo6UGl4ZWxBbGlnbmVkKSB7CisJCQkvLyBTaG91bGQgdHJ5IG1vcmUgcmVwYWlyIGJ1dCBq
dXN0IHF1ZXVlIGEgZnVsbCByZXBhaW50LgorCQkJc2Nyb2xsQXJlYS0+dmlld3BvcnQoKS0+dXBk
YXRlKCk7CisJCQlwYWludFN0YXRlID0gUGFpbnRTdGF0ZTo6bm90UGFpbnRpbmc7CisJCQlyZXR1
cm47CisJCX0KIAkJLy8gRklYTUU6IEZhaWx1cmUgdG8gcGFpbnQgdGhlIHJlcXVlc3RlZCByZWN0
YW5nbGUgaW4gZWFjaAogCQkvLyBwYWludCBldmVudCBjYXVzZXMgZmxpY2tlciBvbiBzb21lIHBs
YXRmb3JtcyAoTWFjPykKIAkJLy8gUGFpbnQgcmVjdCBpbW1lZGlhdGVseS4KZGlmZiAtciAwMzNj
MzQyZTY2NTYgcXQvU2NpbnRpbGxhRWRpdEJhc2UvU2NpbnRpbGxhUXQuaAotLS0gYS9xdC9TY2lu
dGlsbGFFZGl0QmFzZS9TY2ludGlsbGFRdC5oCVNhdCBKdW4gMTMgMTE6MDE6NTYgMjAyNiArMTAw
MAorKysgYi9xdC9TY2ludGlsbGFFZGl0QmFzZS9TY2ludGlsbGFRdC5oCVdlZCBKdW4gMTcgMTE6
NDk6MjIgMjAyNiArMTAwMApAQCAtMTU2LDYgKzE1NiwxMSBAQAogCXN0YXRpYyBzcHRyX3QgRGly
ZWN0U3RhdHVzRnVuY3Rpb24oc3B0cl90IHB0ciwKIAkJCQkgICAgIHVuc2lnbmVkIGludCBpTWVz
c2FnZSwgdXB0cl90IHdQYXJhbSwgc3B0cl90IGxQYXJhbSwgaW50ICpwU3RhdHVzKTsKIAorCXZv
aWQgU2V0U2NhbGVQcm9wZXJ0eSgpOworCWJvb2wgSXNQaXhlbEFsaWduZWRTY2FsZSgpIGNvbnN0
IG5vZXhjZXB0IHsKKwkJcmV0dXJuIHNjYWxlVGVjaG5pcXVlID09IFNjYWxlVGVjaG5pcXVlOjpQ
aXhlbEFsaWduZWQ7CisJfQorCiBwcm90ZWN0ZWQ6CiAKIAl2b2lkIFBhcnRpYWxQYWludChjb25z
dCBQUmVjdGFuZ2xlICZyZWN0KTsKQEAgLTE3OCw2ICsxODMsOCBAQAogCWJvb2wgZHJhZ1dhc0Ry
b3BwZWQ7CiAJaW50IHJlY3Rhbmd1bGFyU2VsZWN0aW9uTW9kaWZpZXI7CiAKKwlTY2FsZVRlY2hu
aXF1ZSBzY2FsZVRlY2huaXF1ZSA9IFNjYWxlVGVjaG5pcXVlOjpEZWZhdWx0OworCiAJZnJpZW5k
IGNsYXNzIDo6U2NpbnRpbGxhRWRpdEJhc2U7CiB9OwogCmRpZmYgLXIgMDMzYzM0MmU2NjU2IHNy
Yy9HZW9tZXRyeS5oCi0tLSBhL3NyYy9HZW9tZXRyeS5oCVNhdCBKdW4gMTMgMTE6MDE6NTYgMjAy
NiArMTAwMAorKysgYi9zcmMvR2VvbWV0cnkuaAlXZWQgSnVuIDE3IDExOjQ5OjIyIDIwMjYgKzEw
MDAKQEAgLTQ1LDYgKzQ1LDEwIEBACiAJCXJldHVybiBQb2ludCh4IC0gb3RoZXIueCwgeSAtIG90
aGVyLnkpOwogCX0KIAorCWNvbnN0ZXhwciBQb2ludCBvcGVyYXRvciooWFlQT1NJVElPTiBtdWx0
aXBsaWVyKSBjb25zdCBub2V4Y2VwdCB7CisJCXJldHVybiBQb2ludCh4ICogbXVsdGlwbGllciwg
eSAqIG11bHRpcGxpZXIpOworCX0KKwogCS8vIE90aGVyIGF1dG9tYXRpY2FsbHkgZGVmaW5lZCBt
ZXRob2RzIChhc3NpZ25tZW50LCBjb3B5IGNvbnN0cnVjdG9yLCBkZXN0cnVjdG9yKSBhcmUgZmlu
ZQogfTsKIApAQCAtMTAxLDYgKzEwNSwxNSBAQAogCQlyZXR1cm4gKHJjLmxlZnQgPT0gbGVmdCkg
JiYgKHJjLnJpZ2h0ID09IHJpZ2h0KSAmJgogCQkJKHJjLnRvcCA9PSB0b3ApICYmIChyYy5ib3R0
b20gPT0gYm90dG9tKTsKIAl9CisJCisJY29uc3RleHByIFBSZWN0YW5nbGUgb3BlcmF0b3IqKFhZ
UE9TSVRJT04gbXVsdGlwbGllcikgY29uc3Qgbm9leGNlcHQgeworCQlyZXR1cm4gUFJlY3Rhbmds
ZShsZWZ0ICogbXVsdGlwbGllciwgdG9wICogbXVsdGlwbGllciwgcmlnaHQgKiBtdWx0aXBsaWVy
LCBib3R0b20gKiBtdWx0aXBsaWVyKTsKKwl9CisKKwljb25zdGV4cHIgUFJlY3RhbmdsZSBvcGVy
YXRvci8oWFlQT1NJVElPTiBkaXZpc29yKSBjb25zdCBub2V4Y2VwdCB7CisJCXJldHVybiBQUmVj
dGFuZ2xlKGxlZnQgLyBkaXZpc29yLCB0b3AgLyBkaXZpc29yLCByaWdodCAvIGRpdmlzb3IsIGJv
dHRvbSAvIGRpdmlzb3IpOworCX0KKwogCWNvbnN0ZXhwciBib29sIENvbnRhaW5zKFBvaW50IHB0
KSBjb25zdCBub2V4Y2VwdCB7CiAJCXJldHVybiAocHQueCA+PSBsZWZ0KSAmJiAocHQueCA8PSBy
aWdodCkgJiYKIAkJCShwdC55ID49IHRvcCkgJiYgKHB0LnkgPD0gYm90dG9tKTsK
--00000000000015113306546acc64--