Re: [PATCH] emoji on TUI emacs
Kai Ma <[email protected]> Sun, 2 Aug 2026 02:46:51 +0200
| Newsgroups | gmane.emacs.devel |
|---|---|
| Message-ID | <[email protected]> |
This is a multi-part message in MIME format.
--------------rmdN6IDiG0QTWkda9VwZ3h4m
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
Thanks for the review. The revised patch is attached. Individual
comments below.
On 8/1/2026 12:37 PM, Eli Zaretskii wrote:
>> FWIW, I also ran a quick analysis on an emoji catalog I'm maintaining:
>>
>> - Total number of unique emojis: ~11704 (many are variations or
>> combinations)
>>
>> - string-width=1: ~824
> What does CHARACTER_WIDTH produce for the first codepoint of this
> group of Emoji? does it produce 1 or a larger value?
The character width is always 1.
>> - string-width=2: ~2886
>>
>> - string-width=2 and has fe0f: 553
> And here, does the first codepoint always produce 2 as
> CHARACTER_WIDTH?
Unfortunately, no. I found 11 exceptions, and all of them have ZWJ or
Emoji_Modifier. For example, ⛹️♀️ (string-width=2):
- U+26F9 PERSON WITH BALL (character width = 1!)
- U+FE0F VS16
- U+200D ZWJ
- U+2640 FEMALE SIGN
- U+FE0F VS16
Currently on TUI Emacs it's composed as two composite glyphs [ 26f9 vs16
zwj ] [ 2640 fe0f ] (two glyphs), so the whole sequence has string-width=2.
BTW, I experimentally hacked composite.el to compose ZWJ and emoji
modifiers, and the result is quite promising -- TUI Emacs works almost
always correctly on my emoji catalog file using a modern terminal
emulator. I'll test more and send a separate follow-up patch soon.
>> --- a/src/term.c
>> +++ b/src/term.c
>> @@ -567,6 +567,13 @@ encode_terminal_code (struct glyph *src, int src_len,
>> nchars = 0;
>> while (src < src_end)
>> {
>> + /* We must skip glyphs to be padded for a wide character. */
>> + if (CHAR_GLYPH_PADDING_P (*src))
>> + {
>> + src++;
>> + continue;
>> + }
>> +
>> if (src->type == COMPOSITE_GLYPH)
>> {
>> struct composition *cmp;
>> @@ -632,8 +639,7 @@ encode_terminal_code (struct glyph *src, int src_len,
>> nchars++;
>> }
>> }
>> - /* We must skip glyphs to be padded for a wide character. */
>> - else if (! CHAR_GLYPH_PADDING_P (*src))
>> + else
>> {
> Is this part really needed? AFAICT, it doesn't change anything,
> because the loop already unconditionally increments 'src', for the
> padding and non-padding cases alike. Or what am I missing?
The padding glyphs constructed for COMPOSITE_GLYPH also has type
COMPOSITE_GLYPH, so we have to check padding_p before that branch.
I also changed 'while' to 'for' to make the code look better.
> Finally, there's one problem I see after applying the patch:
> displaying sequences like "\x2699\xfe0f" produce incorrect cursor
> movement, because Emacs thinks the resulting Emoji is 1-column wide,
> whereas what the terminal here shows is a 2-column Emoji. So maybe we
> need a special treatment for Emoji produced by appending #xFE0F to a
> 1-column character: consider that to produce a 2-column Emoji. WDYT?
IMO this is the correct way. According to Unicode 15's UAX #11 [1],
> /emoji presentation sequences/ behave as though they were /East Asian
Wide/,
> regardless of their assigned East_Asian_Width property value.
This explicit wording is removed in Unicode 16 [2], but the wording of
Unicode 16 and 17 strongly suggests the emoji sequences should behave
like this:
> Some variation sequences may specify a narrow or wide presentation
behaviour. (This can be true for sequences defined in
StandardizedVariants.txt in the [UCD] or in
emoji-variation-sequences.txt in [UTS51].) For such sequences, the width
behaviour specified by a variation sequence can differ from the
East_Asian_Width property of the base character of that variation sequence.
And in Unicode 17 TR 51 [3]:
> They will typically have about the same vertical placement and
advance width as CJK ideographs.
So yes, this approach is actually more standard-compliant. The revised
patch uses this approach. The current version uses a simple heuristic
that checks whether the second glyph is Emoji_Modifier or VS16. I added
Emoji_Modifier because ⛹🏻♀️ is one example where the second character
is not FE0F -- it is [26F9, 1F3FB, 200D, 2640, FE0F].
Some terminal emulators (e.g. WezTerm) show them using only 1 column,
but now I think that's their problem. :)
[1] https://www.unicode.org/reports/tr11/tr11-40.html
[2] https://www.unicode.org/reports/tr11/tr11-42.html
[3] https://unicode.org/reports/tr51/
--------------rmdN6IDiG0QTWkda9VwZ3h4m
Content-Type: text/plain; charset=UTF-8;
name="0001-Produce-padding-glyphs-for-composite-glyphs.patch"
Content-Disposition: attachment;
filename="0001-Produce-padding-glyphs-for-composite-glyphs.patch"
Content-Transfer-Encoding: base64
RnJvbSBjNWQwNzVlZWVhNDVmMmE0ZmVjMjExMDM1MGYzN2M5Y2IwMGRkZmI4IE1vbiBTZXAg
MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBLYWkgTWEgPGp1c3Rrc3FzZkBnbWFpbC5jb20+CkRh
dGU6IFRodSwgMzAgSnVsIDIwMjYgMTY6MjQ6MjggKzAyMDAKU3ViamVjdDogW1BBVENIXSBQ
cm9kdWNlIHBhZGRpbmcgZ2x5cGhzIGZvciBjb21wb3NpdGUgZ2x5cGhzLgoKKiBzcmMvdGVy
bS5jIChhcHBlbmRfY29tcG9zaXRlX2dseXBoKTogQWRkIGBwYWRkaW5nJyBhcmd1bWVudC4K
KHByb2R1Y2VfY29tcG9zaXRlX2dseXBoKTogUmVxdWVzdCBvbmUgcGFkZGluZyBnbHlwaCBp
ZiB0aGUgY29tcG9zaXRlCmdseXBoIGhhcyBwaXhlbF93aWR0aCA+PSAyIGFuZCB0aGUgZmly
c3QgY2hhcmFjdGVyIGhhcyB3aWR0aCA+PSAyLCBvciBpdAppcyBjb21wb3NlZCBmb3IgYW4g
ZW1vamkuCihlbmNvZGVfdGVybWluYWxfY29kZSk6IFNraXAgcGFkZGluZyBnbHlwaHMgZmly
c3QuCihjb21wb3NpdGVfZ2x5cGhfaXNfZW1vamkpOiBBZGQuCi0tLQogc3JjL3Rlcm0uYyB8
IDE0MSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0t
LS0tLQogMSBmaWxlIGNoYW5nZWQsIDk0IGluc2VydGlvbnMoKyksIDQ3IGRlbGV0aW9ucygt
KQoKZGlmZiAtLWdpdCBhL3NyYy90ZXJtLmMgYi9zcmMvdGVybS5jCmluZGV4IDUyYWU0ZjYx
ODE0Li42M2ZhY2I2Zjg2NyAxMDA2NDQKLS0tIGEvc3JjL3Rlcm0uYworKysgYi9zcmMvdGVy
bS5jCkBAIC01NjUsOSArNTY1LDEyIEBAIGVuY29kZV90ZXJtaW5hbF9jb2RlIChzdHJ1Y3Qg
Z2x5cGggKnNyYywgaW50IHNyY19sZW4sCiAKICAgYnVmID0gZW5jb2RlX3Rlcm1pbmFsX3Ny
YzsKICAgbmNoYXJzID0gMDsKLSAgd2hpbGUgKHNyYyA8IHNyY19lbmQpCisgIGZvciAoOyBz
cmMgPCBzcmNfZW5kOyBzcmMgKyspCiAgICAgewotICAgICAgaWYgKHNyYy0+dHlwZSA9PSBD
T01QT1NJVEVfR0xZUEgpCisgICAgICAvKiBXZSBtdXN0IHNraXAgZ2x5cGhzIHRvIGJlIHBh
ZGRlZCBmb3IgYSB3aWRlIGNoYXJhY3Rlci4gICovCisgICAgICBpZiAoQ0hBUl9HTFlQSF9Q
QURESU5HX1AgKCpzcmMpKQorCWNvbnRpbnVlOworICAgICAgZWxzZSBpZiAoc3JjLT50eXBl
ID09IENPTVBPU0lURV9HTFlQSCkKIAl7CiAJICBzdHJ1Y3QgY29tcG9zaXRpb24gKmNtcDsK
IAkgIExpc3BfT2JqZWN0IGdzdHJpbmcgVU5JTklUOwpAQCAtNjMyLDggKzYzNSw3IEBAIGVu
Y29kZV90ZXJtaW5hbF9jb2RlIChzdHJ1Y3QgZ2x5cGggKnNyYywgaW50IHNyY19sZW4sCiAJ
CW5jaGFycysrOwogCSAgICAgIH0KIAl9Ci0gICAgICAvKiBXZSBtdXN0IHNraXAgZ2x5cGhz
IHRvIGJlIHBhZGRlZCBmb3IgYSB3aWRlIGNoYXJhY3Rlci4gICovCi0gICAgICBlbHNlIGlm
ICghIENIQVJfR0xZUEhfUEFERElOR19QICgqc3JjKSkKKyAgICAgIGVsc2UKIAl7CiAJICBH
TFlQSCBnOwogCSAgaW50IGMgVU5JTklUOwpAQCAtNzExLDcgKzcxMyw2IEBAIGVuY29kZV90
ZXJtaW5hbF9jb2RlIChzdHJ1Y3QgZ2x5cGggKnNyYywgaW50IHNyY19sZW4sCiAJICAgICAg
bmNoYXJzICs9IFNDSEFSUyAoc3RyaW5nKTsKIAkgICAgfQogCX0KLSAgICAgIHNyYysrOwog
ICAgIH0KIAogICBpZiAobmNoYXJzID09IDApCkBAIC0xNTI4LDcgKzE1MjksNyBAQCAjZGVm
aW5lIENPTkRJVElPTkFMX1JFQVNTSUdOKGNhcDEsIGNhcDIsIHN5bSkJCQkJXAogICAgYXZh
aWxhYmxlIGZyb20gdGhlIGluaXRpYWwgZnJhbWUgYXMgaW4gYmF0Y2ggbW9kZS4gICovCiAK
IHN0YXRpYyB2b2lkIGFwcGVuZF9nbHlwaCAoc3RydWN0IGl0ICopOwotc3RhdGljIHZvaWQg
YXBwZW5kX2NvbXBvc2l0ZV9nbHlwaCAoc3RydWN0IGl0ICopOworc3RhdGljIHZvaWQgYXBw
ZW5kX2NvbXBvc2l0ZV9nbHlwaCAoc3RydWN0IGl0ICosIGludCBwYWRkaW5nKTsKIHN0YXRp
YyB2b2lkIHByb2R1Y2VfY29tcG9zaXRlX2dseXBoIChzdHJ1Y3QgaXQgKik7CiBzdGF0aWMg
dm9pZCBhcHBlbmRfZ2x5cGhsZXNzX2dseXBoIChzdHJ1Y3QgaXQgKiwgaW50LCBjb25zdCBj
aGFyICopOwogc3RhdGljIHZvaWQgcHJvZHVjZV9nbHlwaGxlc3NfZ2x5cGggKHN0cnVjdCBp
dCAqLCBMaXNwX09iamVjdCk7CkBAIC0xNzc1LDkgKzE3NzYsMTAgQEAgcHJvZHVjZV9nbHlw
aHMgKHN0cnVjdCBpdCAqaXQpCiAgICBmYWNlLiAgKi8KIAogc3RhdGljIHZvaWQKLWFwcGVu
ZF9jb21wb3NpdGVfZ2x5cGggKHN0cnVjdCBpdCAqaXQpCithcHBlbmRfY29tcG9zaXRlX2ds
eXBoIChzdHJ1Y3QgaXQgKml0LCBpbnQgcGFkZGluZykKIHsKLSAgc3RydWN0IGdseXBoICpn
bHlwaDsKKyAgc3RydWN0IGdseXBoICpnbHlwaCwgKmVuZDsKKyAgaW50IGksIHdpZHRoID0g
MSArIHBhZGRpbmc7CiAKICAgZWFzc2VydCAoaXQtPmdseXBoX3Jvdyk7CiAgIGdseXBoID0g
aXQtPmdseXBoX3Jvdy0+Z2x5cGhzW2l0LT5hcmVhXSArIGl0LT5nbHlwaF9yb3ctPnVzZWRb
aXQtPmFyZWFdOwpAQCAtMTc4OSw3NCArMTc5MSwxMTQgQEAgYXBwZW5kX2NvbXBvc2l0ZV9n
bHlwaCAoc3RydWN0IGl0ICppdCkKICAgICAmJiAhaXQtPmdseXBoX3Jvdy0+ZnVsbF93aWR0
aF9wCiAgICAgJiYgIVdJTkRPV19SSUdIVE1PU1RfUCAoaXQtPncpCiAgICAgJiYgV0lORE9X
X1JJR0hUX01BUkdJTl9XSURUSCAoaXQtPncpID09IDA7Ci0gIGlmIChnbHlwaCA8IGl0LT5n
bHlwaF9yb3ctPmdseXBoc1sxICsgaXQtPmFyZWFdIC0gcmVzZXJ2ZV9sYXN0KQorICBlbmQg
PSBpdC0+Z2x5cGhfcm93LT5nbHlwaHNbMSArIGl0LT5hcmVhXSAtIHJlc2VydmVfbGFzdDsK
KyAgaWYgKGdseXBoIDwgZW5kKQogICAgIHsKICAgICAgIC8qIElmIHRoZSBnbHlwaCByb3cg
aXMgcmV2ZXJzZWQsIHdlIG5lZWQgdG8gcHJlcGVuZCB0aGUgZ2x5cGgKIAkgcmF0aGVyIHRo
YW4gYXBwZW5kIGl0LiAgKi8KICAgICAgIGlmIChpdC0+Z2x5cGhfcm93LT5yZXZlcnNlZF9w
ICYmIGl0LT5hcmVhID09IFRFWFRfQVJFQSkKIAl7CiAJICBzdHJ1Y3QgZ2x5cGggKmc7CisJ
ICBpbnQgbW92ZV9ieSA9IHdpZHRoOwogCiAJICAvKiBNYWtlIHJvb20gZm9yIHRoZSBuZXcg
Z2x5cGguICAqLworCSAgaWYgKG1vdmVfYnkgPiBlbmQgLSBnbHlwaCkKKwkgICAgbW92ZV9i
eSA9IGVuZCAtIGdseXBoOwogCSAgZm9yIChnID0gZ2x5cGggLSAxOyBnID49IGl0LT5nbHlw
aF9yb3ctPmdseXBoc1tpdC0+YXJlYV07IGctLSkKLQkgICAgZ1sxXSA9ICpnOworCSAgICBn
W21vdmVfYnldID0gKmc7CiAJICBnbHlwaCA9IGl0LT5nbHlwaF9yb3ctPmdseXBoc1tpdC0+
YXJlYV07CisJICBlbmQgPSBnbHlwaCArIG1vdmVfYnk7CiAJfQotICAgICAgZ2x5cGgtPnR5
cGUgPSBDT01QT1NJVEVfR0xZUEg7Ci0gICAgICBlYXNzZXJ0IChpdC0+cGl4ZWxfd2lkdGgg
PD0gU0hSVF9NQVgpOwotICAgICAgZ2x5cGgtPnBpeGVsX3dpZHRoID0gaXQtPnBpeGVsX3dp
ZHRoOwotICAgICAgZ2x5cGgtPnUuY21wLmlkID0gaXQtPmNtcF9pdC5pZDsKLSAgICAgIGlm
IChpdC0+Y21wX2l0LmNoIDwgMCkKLQl7Ci0JICBnbHlwaC0+dS5jbXAuYXV0b21hdGljID0g
MDsKLQkgIGdseXBoLT51LmNtcC5pZCA9IGl0LT5jbXBfaXQuaWQ7Ci0JfQotICAgICAgZWxz
ZQorCisgICAgICBlYXNzZXJ0KGl0LT5waXhlbF93aWR0aCA8PSBTSFJUX01BWCk7CisgICAg
ICBmb3IgKGkgPSAwOworCSAgIGkgPCB3aWR0aCAmJiBnbHlwaCA8IGVuZDsKKwkgICArK2kp
CiAJewotCSAgZ2x5cGgtPnUuY21wLmF1dG9tYXRpYyA9IDE7CisJICBnbHlwaC0+dHlwZSA9
IENPTVBPU0lURV9HTFlQSDsKKwkgIGdseXBoLT5waXhlbF93aWR0aCA9IGl0LT5waXhlbF93
aWR0aCAtIHBhZGRpbmc7CiAJICBnbHlwaC0+dS5jbXAuaWQgPSBpdC0+Y21wX2l0LmlkOwot
CSAgZ2x5cGgtPnNsaWNlLmNtcC5mcm9tID0gaXQtPmNtcF9pdC5mcm9tOwotCSAgZ2x5cGgt
PnNsaWNlLmNtcC50byA9IGl0LT5jbXBfaXQudG8gLSAxOwotCX0KKwkgIGlmIChpdC0+Y21w
X2l0LmNoIDwgMCkKKwkgICAgeworCSAgICAgIGdseXBoLT51LmNtcC5hdXRvbWF0aWMgPSAw
OworCSAgICAgIGdseXBoLT51LmNtcC5pZCA9IGl0LT5jbXBfaXQuaWQ7CisJICAgIH0KKwkg
IGVsc2UKKwkgICAgeworCSAgICAgIGdseXBoLT51LmNtcC5hdXRvbWF0aWMgPSAxOworCSAg
ICAgIGdseXBoLT51LmNtcC5pZCA9IGl0LT5jbXBfaXQuaWQ7CisJICAgICAgZ2x5cGgtPnNs
aWNlLmNtcC5mcm9tID0gaXQtPmNtcF9pdC5mcm9tOworCSAgICAgIGdseXBoLT5zbGljZS5j
bXAudG8gPSBpdC0+Y21wX2l0LnRvIC0gMTsKKwkgICAgfQorCSAgZ2x5cGgtPmF2b2lkX2N1
cnNvcl9wID0gaXQtPmF2b2lkX2N1cnNvcl9wOworCSAgZ2x5cGgtPm11bHRpYnl0ZV9wID0g
aXQtPm11bHRpYnl0ZV9wOworCSAgZ2x5cGgtPmZyYW1lID0gaXQtPmY7CisJICBnbHlwaC0+
ZmFjZV9pZCA9IGl0LT5mYWNlX2lkOworCSAgZ2x5cGgtPnBhZGRpbmdfcCA9IGkgPiAwOwor
CSAgZ2x5cGgtPmNoYXJwb3MgPSBDSEFSUE9TIChpdC0+cG9zaXRpb24pOworCSAgZ2x5cGgt
Pm9iamVjdCA9IGl0LT5vYmplY3Q7CisJICBpZiAoaXQtPmJpZGlfcCkKKwkgICAgeworCSAg
ICAgIGdseXBoLT5yZXNvbHZlZF9sZXZlbCA9IGl0LT5iaWRpX2l0LnJlc29sdmVkX2xldmVs
OworCSAgICAgIGVhc3NlcnQgKChpdC0+YmlkaV9pdC50eXBlICYgNykgPT0gaXQtPmJpZGlf
aXQudHlwZSk7CisJICAgICAgZ2x5cGgtPmJpZGlfdHlwZSA9IGl0LT5iaWRpX2l0LnR5cGU7
CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGdseXBoLT5yZXNvbHZlZF9sZXZl
bCA9IDA7CisJICAgICAgZ2x5cGgtPmJpZGlfdHlwZSA9IFVOS05PV05fQlQ7CisJICAgIH0K
IAotICAgICAgZ2x5cGgtPmF2b2lkX2N1cnNvcl9wID0gaXQtPmF2b2lkX2N1cnNvcl9wOwot
ICAgICAgZ2x5cGgtPm11bHRpYnl0ZV9wID0gaXQtPm11bHRpYnl0ZV9wOwotICAgICAgZ2x5
cGgtPmZyYW1lID0gaXQtPmY7Ci0gICAgICBnbHlwaC0+ZmFjZV9pZCA9IGl0LT5mYWNlX2lk
OwotICAgICAgZ2x5cGgtPnBhZGRpbmdfcCA9IGZhbHNlOwotICAgICAgZ2x5cGgtPmNoYXJw
b3MgPSBDSEFSUE9TIChpdC0+cG9zaXRpb24pOwotICAgICAgZ2x5cGgtPm9iamVjdCA9IGl0
LT5vYmplY3Q7Ci0gICAgICBpZiAoaXQtPmJpZGlfcCkKLQl7Ci0JICBnbHlwaC0+cmVzb2x2
ZWRfbGV2ZWwgPSBpdC0+YmlkaV9pdC5yZXNvbHZlZF9sZXZlbDsKLQkgIGVhc3NlcnQgKChp
dC0+YmlkaV9pdC50eXBlICYgNykgPT0gaXQtPmJpZGlfaXQudHlwZSk7Ci0JICBnbHlwaC0+
YmlkaV90eXBlID0gaXQtPmJpZGlfaXQudHlwZTsKKwkgICsraXQtPmdseXBoX3Jvdy0+dXNl
ZFtpdC0+YXJlYV07CisJICArK2dseXBoOwogCX0KLSAgICAgIGVsc2UKLQl7Ci0JICBnbHlw
aC0+cmVzb2x2ZWRfbGV2ZWwgPSAwOwotCSAgZ2x5cGgtPmJpZGlfdHlwZSA9IFVOS05PV05f
QlQ7Ci0JfQotCi0gICAgICArK2l0LT5nbHlwaF9yb3ctPnVzZWRbaXQtPmFyZWFdOwotICAg
ICAgKytnbHlwaDsKICAgICB9CiB9CiAKIAorLyogQ2hlY2sgaWYgdGhlIGdseXBoIHN0cmlu
ZyBpcyBhbiBlbW9qaS4gIEluIHRoYXQgY2FzZSwgZm9yY2UgaXQgdG8gYmUKKyAgIHNob3du
IGFzIHdpZGUuICAqLworCitzdGF0aWMgYm9vbAorY29tcG9zaXRlX2dseXBoX2lzX2Vtb2pp
IChzdHJ1Y3QgaXQgKml0KQoreworICBMaXNwX09iamVjdCBnc3RyaW5nLCBnbHlwaDsKKyAg
aW50IGM7CisKKyAgLyogU2tpcCBzdGF0aWMgY29tcG9zaXRpb25zLiAgKi8KKyAgaWYgKGl0
LT5jbXBfaXQuY2ggPCAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBnc3RyaW5nID0gY29t
cG9zaXRpb25fZ3N0cmluZ19mcm9tX2lkIChpdC0+Y21wX2l0LmlkKTsKKyAgaWYgKGl0LT5j
bXBfaXQuZnJvbSArIDEgPj0gTEdTVFJJTkdfR0xZUEhfTEVOIChnc3RyaW5nKSkKKyAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgLyogQ2hlY2sgaWYgdGhlIHNlY29uZCBjaGFyYWN0ZXIgaXMg
VlMxNiBvciBhbiBlbW9qaSBtb2RpZmllci4gICovCisgIGdseXBoID0gTEdTVFJJTkdfR0xZ
UEggKGdzdHJpbmcsIGl0LT5jbXBfaXQuZnJvbSArIDEpOworICBpZiAoISBnbHlwaCkKKyAg
ICByZXR1cm4gZmFsc2U7CisgIGMgPSBMR0xZUEhfQ0hBUiAoZ2x5cGgpOworICByZXR1cm4g
KGMgPT0gMHhGRTBGIHx8ICgweDFGM0ZCIDw9IGMgJiYgYyA8PSAweDFGM0ZGKSk7Cit9CisK
KwogLyogUHJvZHVjZSBhIGNvbXBvc2l0ZSBnbHlwaCBmb3IgaXRlcmF0b3IgSVQuICBJVC0+
Y21wX2lkIGlzIHRoZSBJRCBvZgogICAgdGhlIGNvbXBvc2l0aW9uLiAgV2Ugc2ltcGx5IHBy
b2R1Y2VzIGNvbXBvbmVudHMgb2YgdGhlIGNvbXBvc2l0aW9uCiAgICBhc3N1bWluZyB0aGF0
IHRoZSB0ZXJtaW5hbCBoYXMgYSBjYXBhYmlsaXR5IHRvIGxheW91dC9yZW5kZXIgaXQKLSAg
IGNvcnJlY3RseS4gICovCisgICBjb3JyZWN0bHkuICBBIHBhZGRpbmcgZ2x5cGggaXMgYWRk
ZWQgaWYgYm90aCB0aGUgY29tcG9zaXRpb24gYW5kIHRoZQorICAgZmlyc3QgY2hhcmFjdGVy
IGhhcyB3aWR0aCA+PSAyLiAgKi8KIAogc3RhdGljIHZvaWQKIHByb2R1Y2VfY29tcG9zaXRl
X2dseXBoIChzdHJ1Y3QgaXQgKml0KQogeworICBpbnQgcGFkZGluZywgZmlyc3RfY2hhcjsK
KwogICBpZiAoaXQtPmNtcF9pdC5jaCA8IDApCiAgICAgewogICAgICAgc3RydWN0IGNvbXBv
c2l0aW9uICpjbXAgPSBjb21wb3NpdGlvbl90YWJsZVtpdC0+Y21wX2l0LmlkXTsKIAogICAg
ICAgaXQtPnBpeGVsX3dpZHRoID0gY21wLT53aWR0aDsKKyAgICAgIGZpcnN0X2NoYXIgPSBp
dC0+YzsKICAgICB9CiAgIGVsc2UKICAgICB7CkBAIC0xODY0LDEwICsxOTA2LDE1IEBAIHBy
b2R1Y2VfY29tcG9zaXRlX2dseXBoIChzdHJ1Y3QgaXQgKml0KQogCiAgICAgICBpdC0+cGl4
ZWxfd2lkdGggPSBjb21wb3NpdGlvbl9nc3RyaW5nX3dpZHRoIChnc3RyaW5nLCBpdC0+Y21w
X2l0LmZyb20sCiAJCQkJCQkgICBpdC0+Y21wX2l0LnRvLCBOVUxMKTsKKyAgICAgIGZpcnN0
X2NoYXIgPSBMR0xZUEhfQ0hBUiAoTEdTVFJJTkdfR0xZUEggKGdzdHJpbmcsCisJCQkJCQlp
dC0+Y21wX2l0LmZyb20pKTsKICAgICB9Ci0gIGl0LT5uZ2x5cGhzID0gMTsKKworICBwYWRk
aW5nID0gKChpdC0+cGl4ZWxfd2lkdGggPj0gMikgJiYgKENIQVJBQ1RFUl9XSURUSCAoZmly
c3RfY2hhcikgPj0gMikpCisgICAgfHwgY29tcG9zaXRlX2dseXBoX2lzX2Vtb2ppIChpdCk7
CisgIGl0LT5uZ2x5cGhzID0gMSArIHBhZGRpbmc7CiAgIGlmIChpdC0+Z2x5cGhfcm93KQot
ICAgIGFwcGVuZF9jb21wb3NpdGVfZ2x5cGggKGl0KTsKKyAgICBhcHBlbmRfY29tcG9zaXRl
X2dseXBoIChpdCwgcGFkZGluZyk7CiB9CiAKIAotLSAKMi41My4wCgo=
--------------rmdN6IDiG0QTWkda9VwZ3h4m--