From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Philipp Stephani Newsgroups: gmane.emacs.devel Subject: Re: Character literals for Unicode (control) characters Date: Sun, 06 Mar 2016 18:28:09 +0000 Message-ID: References: <87r3fsjenn.fsf@gnus.org> <56D8623F.6060806@cs.ucla.edu> <838u1vwqj9.fsf@gnu.org> <56DC7227.10708@cs.ucla.edu> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=089e01419b023f3ad3052d658346 X-Trace: ger.gmane.org 1457288934 17148 80.91.229.3 (6 Mar 2016 18:28:54 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sun, 6 Mar 2016 18:28:54 +0000 (UTC) Cc: larsi@gnus.org, johnw@gnu.org, emacs-devel@gnu.org To: Paul Eggert , Eli Zaretskii Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sun Mar 06 19:28:51 2016 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1acdQA-0004Kf-Sa for ged-emacs-devel@m.gmane.org; Sun, 06 Mar 2016 19:28:51 +0100 Original-Received: from localhost ([::1]:51633 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1acdQ6-0002aq-Pz for ged-emacs-devel@m.gmane.org; Sun, 06 Mar 2016 13:28:46 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:48663) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1acdPi-0002ZT-LB for emacs-devel@gnu.org; Sun, 06 Mar 2016 13:28:23 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1acdPh-0000Cj-HK for emacs-devel@gnu.org; Sun, 06 Mar 2016 13:28:22 -0500 Original-Received: from mail-wm0-x235.google.com ([2a00:1450:400c:c09::235]:32977) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1acdPh-0000Cd-4i; Sun, 06 Mar 2016 13:28:21 -0500 Original-Received: by mail-wm0-x235.google.com with SMTP id l68so81887360wml.0; Sun, 06 Mar 2016 10:28:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=glPOZ5QJPCQcqqwkyE7Mdzc/wRcnEz8jlosrrLvWdEY=; b=kXPlfvu/HMUnajTypfV3qEQX3ZnxppjLBAqdtBYvbqstZEw8KHA/sWUI3G5Ozty5us sKQF81KBPuTEcgHLMAZ9ZuoMuAM3P6aD+Xy7dHxO6G3eG14wcHLp3jMYFWtA6jK8pVxU ix862u4F1ACad9ILigZ/c1ZIzQcOLvj87euXSyuEdXQHqUe2db+nhv8wsgZuecoRyB0G 4lC7QYNO6inYLZIyT3QjVgB5BJrJTttq6Y4LJ5HZGUfyFaDIeYdd5yGbtA8HjPiQ04ac 0onDkGs71K+2pF0X8Tvl+16o+JFgek1zqGV0PpRj+XNLGyhMncon/HQBAH5P8Y7P+ILj PxEw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=glPOZ5QJPCQcqqwkyE7Mdzc/wRcnEz8jlosrrLvWdEY=; b=DmHuQ8nwe/2+jyl33oV8ILcO6mgRa4rrEzpQSz22OkCktXQKMOxTK18eQWwFXbb53F TsJTxv7JaGtPvlItp+w9zGDE6vXFS1dyzPZVKrGfFyl9rRd7RNJFRH0k3gEUiDQqwj/e ZbZE40N2zXlUpSte/FJNKgpMldLj3iUwOLyEx75Vnhdirq1ODWgBJE0+LU+pyKS3s8a9 wfMnl6TAlNlCXHtBxvVAdCjLOS61yPJZbzDI/yz3LYbUFPkjSMZ9Esw+HaalQs8FYfF6 yw+lpMFCSdhXQBhDEHUXw5ixOzpRF+2KDAlI5Z0O0NP/+CdlJos13H4rw4c75BVkzm// QScw== X-Gm-Message-State: AD7BkJJz58FPf0N5YEIXFRL0eA3Z4eY2ITtQ2QVPleTRL/meKBLh4NXW0Ue8WdtnOEbpDg3VQlvr/DEpx4B6Jw== X-Received: by 10.194.242.202 with SMTP id ws10mr18755762wjc.3.1457288900349; Sun, 06 Mar 2016 10:28:20 -0800 (PST) In-Reply-To: <56DC7227.10708@cs.ucla.edu> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a00:1450:400c:c09::235 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:201011 Archived-At: --089e01419b023f3ad3052d658346 Content-Type: multipart/alternative; boundary=089e01419b023f3acd052d658344 --089e01419b023f3acd052d658344 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Paul Eggert schrieb am So., 6. M=C3=A4rz 2016 um 19:08= Uhr: > Thanks for taking this on. Some comments: > > Why the hash table? Existing Lisp code dealing with Unicode names uses an > alist, > and it seems to do OK. Hash tables are as easy to use as alists, but have average O(1) lookup time, as opposed to O(n) time for alists. Also alists are more prone to cache invalidation because they are less contiguous. > If a hash table is needed, a hash table should also be > used by the existing code elsewhere that does something similar. See the > function ucs-names and its callers. > Initially I used ucs-names, but the decided against it because it lacks most characters. That's OK for a tables used for completion, but for inputting all characters should be present. So the use cases are different. > > If a hash table is needed, I suggest using a perfect hashing function > (generated > by gperf) and checking its results with get-char-code-property. That > avoids the > runtime overhead of initialization. > Sounds good, but that would require much more effort and would delay this project unnecessarily. It can be done later once the basic functionality is in place. > > It needs documentation, both in the Emacs Lisp manual and in NEWS. > > Yes, I've attached a patch. > > > +void init_character_names () > > +{ > > The usual style is: > > void > init_character_names (void) > { > > > No need for "const" for local variables (cost exceeds benefit). > Removed. > > > > if (c_isspace (c)) > > { > > if (! whitespace) > > { > > whitespace =3D true; > > name[length++] =3D ' '; > > } > > } > > else > > { > > whitespace =3D false; > > name[length++] =3D c; > > } > > This would be a bit easier to follow (and most likely a tiny bit more > efficient) > as something like this: > > > bool ws =3D c_isspace (c); > > if (ws) > > { > > length -=3D whitespace; > > c =3D ' '; > > } > > whitespace =3D ws; > > name[length++] =3D c; > > I'd rather not have length decrease. Moved out the assignment, though. --089e01419b023f3acd052d658344 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable


Paul E= ggert <eggert@cs.ucla.edu> = schrieb am So., 6. M=C3=A4rz 2016 um 19:08=C2=A0Uhr:
Thanks for taking this on. Some comments:

Why the hash table? Existing Lisp code dealing with Unicode names uses an a= list,
and it seems to do OK.

Hash tables are as e= asy to use as alists, but have average O(1) lookup time, as opposed to O(n)= time for alists. Also alists are more prone to cache invalidation because = they are less contiguous.
=C2=A0
If a hash table is needed, a hash table should also be
used by the existing code elsewhere that does something similar. See the function ucs-names and its callers.

Ini= tially I used ucs-names, but the decided against it because it lacks most c= haracters. That's OK for a tables used for completion, but for inputtin= g all characters should be present. So the use cases are different.
=C2=A0

If a hash table is needed, I suggest using a perfect hashing function (gene= rated
by gperf) and checking its results with get-char-code-property. That avoids= the
runtime overhead of initialization.

Sou= nds good, but that would require much more effort and would delay this proj= ect unnecessarily. It can be done later once the basic functionality is in = place.
=C2=A0

It needs documentation, both in the Emacs Lisp manual and in NEWS.


Yes, I've attached a patch.
<= div>=C2=A0

=C2=A0> +void init_character_names ()
=C2=A0> +{

The usual style is:

void
init_character_names (void)
{


No need for "const" for local variables (cost exceeds benefit).

Removed.
=C2=A0


=C2=A0>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if (c_isspace (c)= )
=C2=A0>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0{
=C2=A0>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0if = (! whitespace)
=C2=A0>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0{
=C2=A0>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0whitespace =3D true;
=C2=A0>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0name[length++] =3D ' ';
=C2=A0>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0}
=C2=A0>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
=C2=A0>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0else
=C2=A0>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0{
=C2=A0>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0whi= tespace =3D false;
=C2=A0>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0nam= e[length++] =3D c;
=C2=A0>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}

This would be a bit easier to follow (and most likely a tiny bit more effic= ient)
as something like this:

>=C2=A0 =C2=A0 =C2=A0 =C2=A0bool ws =3D c_isspace (c);
>=C2=A0 =C2=A0 =C2=A0 =C2=A0if (ws)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0{
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0length -=3D whitespace;
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0c =3D ' ';
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0}
>=C2=A0 =C2=A0 =C2=A0 =C2=A0whitespace =3D ws;
>=C2=A0 =C2=A0 =C2=A0 =C2=A0name[length++] =3D c;


I'd rather not have length decreas= e. Moved out the assignment, though.=C2=A0
--089e01419b023f3acd052d658344-- --089e01419b023f3ad3052d658346 Content-Type: application/octet-stream; name="0002-Add-documentation-for-character-name-escapes.patch" Content-Disposition: attachment; filename="0002-Add-documentation-for-character-name-escapes.patch" Content-Transfer-Encoding: base64 Content-ID: <1534d2d8731bc4c427c1> X-Attachment-Id: 1534d2d8731bc4c427c1 RnJvbSBkMGQ1MjE5YTM1OGEyZDhlODUzZjFjZTExY2YxNmZiMjYyOTY5N2M2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBQaGlsaXBwIFN0ZXBoYW5pIDxwaHN0QGdvb2dsZS5jb20+CkRh dGU6IFN1biwgNiBNYXIgMjAxNiAxOTowNzowNiArMDEwMApTdWJqZWN0OiBbUEFUQ0ggMi8yXSBB ZGQgZG9jdW1lbnRhdGlvbiBmb3IgY2hhcmFjdGVyIG5hbWUgZXNjYXBlcwoKLS0tCiBkb2MvbGlz cHJlZi9ub25hc2NpaS50ZXhpIHwgIDIgKy0KIGRvYy9saXNwcmVmL29iamVjdHMudGV4aSAgfCAx MCArKysrKysrKysrCiBldGMvTkVXUyAgICAgICAgICAgICAgICAgIHwgIDUgKysrKysKIDMgZmls ZXMgY2hhbmdlZCwgMTYgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQoKZGlmZiAtLWdpdCBh L2RvYy9saXNwcmVmL25vbmFzY2lpLnRleGkgYi9kb2MvbGlzcHJlZi9ub25hc2NpaS50ZXhpCmlu ZGV4IDljZjNiNTcuLjY2YWQ5YWMgMTAwNjQ0Ci0tLSBhL2RvYy9saXNwcmVmL25vbmFzY2lpLnRl eGkKKysrIGIvZG9jL2xpc3ByZWYvbm9uYXNjaWkudGV4aQpAQCAtNjMzLDcgKzYzMyw3IEBAIENo YXJhY3RlciBQcm9wZXJ0aWVzCiBAZW5kIGdyb3VwCiBAZ3JvdXAKIDs7IFUrMjE2MyBST01BTiBO VU1FUkFMIEZPVVIKLShnZXQtY2hhci1jb2RlLXByb3BlcnR5ID9cdTIxNjMgJ251bWVyaWMtdmFs dWUpCisoZ2V0LWNoYXItY29kZS1wcm9wZXJ0eSA/XE5Ae1JPTUFOIE5VTUVSQUwgRk9VUkB9ICdu dW1lcmljLXZhbHVlKQogICAgICBAcmVzdWx0e30gNAogQGVuZCBncm91cAogQGdyb3VwCmRpZmYg LS1naXQgYS9kb2MvbGlzcHJlZi9vYmplY3RzLnRleGkgYi9kb2MvbGlzcHJlZi9vYmplY3RzLnRl eGkKaW5kZXggMzI0NTkzMC4uOTZiMzM0ZCAxMDA2NDQKLS0tIGEvZG9jL2xpc3ByZWYvb2JqZWN0 cy50ZXhpCisrKyBiL2RvYy9saXNwcmVmL29iamVjdHMudGV4aQpAQCAtMzg3LDYgKzM4NywxNiBA QCBHZW5lcmFsIEVzY2FwZSBTeW50YXgKIGZvciB0aGUgY2hhcmFjdGVyIEBrYmR7Qy1ifS4gIE9u bHkgY2hhcmFjdGVycyB1cCB0byBvY3RhbCBjb2RlIDc3NyBjYW4KIGJlIHNwZWNpZmllZCB0aGlz IHdheS4KIAorICBGb3VydGhseSwgeW91IGNhbiBzcGVjaWZ5IGNoYXJhY3RlcnMgYnkgdGhlaXIg bmFtZS4gIEEgY2hhcmFjdGVyCituYW1lIGVzY2FwZSBzZXF1ZW5jZSBjb25zaXN0cyBvZiBhIGJh Y2tzbGFzaCwgQHNhbXB7TkB7fSwgdGhlIFVuaWNvZGUKK2NoYXJhY3RlciBuYW1lLCBhbmQgQHNh bXB7QH19LiAgQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBhbHNvIHB1dCB0aGUKK251bWVyaWMgY29k ZSBwb2ludCB2YWx1ZSBiZXR3ZWVuIHRoZSBicmFjZXMsIHVzaW5nIHRoZSBzeW50YXgKK0BzYW1w e1xOQHtVK25ubm5AfX0sIHdoZXJlIEBzYW1we25ubm59IGRlbm90ZXMgYmV0d2VlbiBvbmUgYW5k IGVpZ2h0CitoZXhhZGVjaW1hbCBkaWdpdHMuICBUaHVzLCBAc2FtcHs/XE5Ae0xBVElOIENBUElU QUwgTEVUVEVSIEFAfX0gYW5kCitAc2FtcHs/XE5Ae1UrNDFAfX0gYm90aCBkZW5vdGUgdGhlIGNo YXJhY3RlciBAa2Jke0F9LiAgVG8gc2ltcGxpZnkKK2VudGVyaW5nIG11bHRpLWxpbmUgc3RyaW5n cywgeW91IGNhbiByZXBsYWNlIHNwYWNlcyBpbiB0aGUgY2hhcmFjdGVyCituYW1lcyBieSBhcmJp dHJhcnkgbm9uLWVtcHR5IHNlcXVlbmNlIG9mIHdoaXRlc3BhY2UgKGUuZy4sIG5ld2xpbmVzKS4K KwogICBUaGVzZSBlc2NhcGUgc2VxdWVuY2VzIG1heSBhbHNvIGJlIHVzZWQgaW4gc3RyaW5ncy4g IEB4cmVme05vbi1BU0NJSQogaW4gU3RyaW5nc30uCiAKZGlmZiAtLWdpdCBhL2V0Yy9ORVdTIGIv ZXRjL05FV1MKaW5kZXggOTJkNjlkMi4uOWM3NzQ3NCAxMDA2NDQKLS0tIGEvZXRjL05FV1MKKysr IGIvZXRjL05FV1MKQEAgLTE1OSw2ICsxNTksMTEgQEAgdGhhdCBuZWdvdGlhdGlvbiBzaG91bGQg Y29tcGxldGUgZXZlbiBvbiBub24tYmxvY2tpbmcgc29ja2V0cy4KIGB3aW5kb3ctcGl4ZWwtaGVp Z2h0LWJlZm9yZS1zaXplLWNoYW5nZScgYWxsb3cgdG8gZGV0ZWN0IHdoaWNoIHdpbmRvdwogY2hh bmdlZCBzaXplIHdoZW4gYHdpbmRvdy1zaXplLWNoYW5nZS1mdW5jdGlvbnMnIGFyZSBydW4uCiAK KysrKworKiogRW1hY3Mgbm93IHN1cHBvcnRzIGNoYXJhY3RlciBuYW1lIGVzY2FwZSBzZXF1ZW5j ZXMgaW4gY2hhcmFjdGVyIGFuZAorc3RyaW5nIGxpdGVyYWxzLiAgVGhlIHN5bnRheCB2YXJpYW50 cyBcTntjaGFyYWN0ZXIgbmFtZX0gYW5kCitcTntVK2NvZGV9IGFyZSBzdXBwb3J0ZWQuCisKIAwK ICogQ2hhbmdlcyBpbiBFbWFjcyAyNS4yIG9uIE5vbi1GcmVlIE9wZXJhdGluZyBTeXN0ZW1zCiAK LS0gCjIuNy4wCgo= --089e01419b023f3ad3052d658346 Content-Type: application/octet-stream; name="0003-Minor-cleanups-for-character-name-escapes.patch" Content-Disposition: attachment; filename="0003-Minor-cleanups-for-character-name-escapes.patch" Content-Transfer-Encoding: base64 Content-ID: <1534d2fbccd11d10e2> X-Attachment-Id: 1534d2fbccd11d10e2 RnJvbSAzMGU2ZDlkZDRlODNhMzZmZTA3YmJlYWU2NzhiM2YwODY3NzMzNDZlIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBQaGlsaXBwIFN0ZXBoYW5pIDxwaHN0QGdvb2dsZS5jb20+CkRh dGU6IFN1biwgNiBNYXIgMjAxNiAxOToyNzoyMSArMDEwMApTdWJqZWN0OiBbUEFUQ0ggMy8zXSBN aW5vciBjbGVhbnVwcyBmb3IgY2hhcmFjdGVyIG5hbWUgZXNjYXBlcy4KCiogbHJlYWQuYyAoaW5p dF9jaGFyYWN0ZXJfbmFtZXMpOiBBZGQgbWlzc2luZyBgdm9pZCcuICBSZW1vdmUKdG9wLWxldmVs IGBjb25zdCcuCihyZWFkX2VzY2FwZSk6IFNpbXBsaWZ5IGxvb3AgYSBiaXQuICBSZW1vdmUgdG9w LWxldmVsIGBjb25zdCcuCi0tLQogc3JjL2xyZWFkLmMgfCAyNyArKysrKysrKysrKystLS0tLS0t LS0tLS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCAxMiBpbnNlcnRpb25zKCspLCAxNSBkZWxldGlvbnMo LSkKCmRpZmYgLS1naXQgYS9zcmMvbHJlYWQuYyBiL3NyYy9scmVhZC5jCmluZGV4IDZlODRmYzgu LjQwMDA2MzcgMTAwNjQ0Ci0tLSBhL3NyYy9scmVhZC5jCisrKyBiL3NyYy9scmVhZC5jCkBAIC0y MTU5LDIwICsyMTU5LDIwIEBAIHN0YXRpYyBwdHJkaWZmX3QgbWF4X2NoYXJhY3Rlcl9uYW1lX2xl bmd0aDsKIAogLyogSW5pdGlhbGl6ZXMgYGNoYXJhY3Rlcl9uYW1lcycgYW5kIGBtYXhfY2hhcmFj dGVyX25hbWVfbGVuZ3RoJy4KICAgIENhbGxlZCBieSBgcmVhZF9lc2NhcGUnLiAgKi8KLXZvaWQg aW5pdF9jaGFyYWN0ZXJfbmFtZXMgKCkKK3ZvaWQgaW5pdF9jaGFyYWN0ZXJfbmFtZXMgKHZvaWQp CiB7CiAgIGNoYXJhY3Rlcl9uYW1lcyA9IENBTExOIChGbWFrZV9oYXNoX3RhYmxlLAogICAgICAg ICAgICAgICAgICAgICAgICAgICAgUUN0ZXN0LCBRZXF1YWwsCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAvKiBDdXJyZW50bHkgYXJvdW5kIDEwMCwwMDAgVW5pY29kZQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgY2hhcmFjdGVycyBhcmUgZGVmaW5lZC4gICovCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICBRQ3NpemUsIG1ha2VfbmF0bnVtICgxMDAwMDApKTsKLSAgY29uc3Qg TGlzcF9PYmplY3QgZ2V0X3Byb3BlcnR5ID0KKyAgTGlzcF9PYmplY3QgZ2V0X3Byb3BlcnR5ID0K ICAgICBGc3ltYm9sX2Z1bmN0aW9uIChpbnRlcm5fY19zdHJpbmcgKCJnZXQtY2hhci1jb2RlLXBy b3BlcnR5IikpOwogICBwdHJkaWZmX3QgbGVuZ3RoID0gMDsKICAgZm9yIChpbnQgaSA9IDA7IGkg PD0gTUFYX1VOSUNPREVfQ0hBUjsgKytpKQogICAgIHsKLSAgICAgIGNvbnN0IExpc3BfT2JqZWN0 IGNvZGUgPSBtYWtlX25hdG51bSAoaSk7Ci0gICAgICBjb25zdCBMaXNwX09iamVjdCBuYW1lID0g Y2FsbDIgKGdldF9wcm9wZXJ0eSwgY29kZSwgUW5hbWUpOworICAgICAgTGlzcF9PYmplY3QgY29k ZSA9IG1ha2VfbmF0bnVtIChpKTsKKyAgICAgIExpc3BfT2JqZWN0IG5hbWUgPSBjYWxsMiAoZ2V0 X3Byb3BlcnR5LCBjb2RlLCBRbmFtZSk7CiAgICAgICBpZiAoTklMUCAobmFtZSkpIGNvbnRpbnVl OwogICAgICAgQ0hFQ0tfU1RSSU5HIChuYW1lKTsKICAgICAgIGxlbmd0aCA9IG1heCAobGVuZ3Ro LCBTQllURVMgKG5hbWUpKTsKQEAgLTI0MTgsMjUgKzI0MTgsMjIgQEAgcmVhZF9lc2NhcGUgKExp c3BfT2JqZWN0IHJlYWRjaGFyZnVuLCBib29sIHN0cmluZ3ApCiAgICAgICAgICAgICAgICBjaGFy YWN0ZXIgbmFtZXMgaW4gZS5nLiBtdWx0aS1saW5lIHN0cmluZ3MuICAqLwogICAgICAgICAgICAg aWYgKGNfaXNzcGFjZSAoYykpCiAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAo ISB3aGl0ZXNwYWNlKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB3 aGl0ZXNwYWNlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbmFtZVtsZW5ndGgrK10gPSAn ICc7Ci0gICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHdoaXRlc3BhY2Up CisgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBjID0gJyAnOwor ICAgICAgICAgICAgICAgIHdoaXRlc3BhY2UgPSB0cnVlOwogICAgICAgICAgICAgICB9CiAgICAg ICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB3aGl0ZXNwYWNl ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbmFtZVtsZW5ndGgrK10gPSBjOwotICAgICAgICAg ICAgICB9CisgICAgICAgICAgICAgIHdoaXRlc3BhY2UgPSBmYWxzZTsKKyAgICAgICAgICAgIG5h bWVbbGVuZ3RoKytdID0gYzsKICAgICAgICAgICAgIGlmIChsZW5ndGggPj0gbWF4X2NoYXJhY3Rl cl9uYW1lX2xlbmd0aCkKICAgICAgICAgICAgICAgaW52YWxpZF9zeW50YXggKCJDaGFyYWN0ZXIg bmFtZSB0b28gbG9uZyIpOwogICAgICAgICAgIH0KICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKQog ICAgICAgICAgIGludmFsaWRfc3ludGF4ICgiRW1wdHkgY2hhcmFjdGVyIG5hbWUiKTsKICAgICAg ICAgbmFtZVtsZW5ndGhdID0gMDsKLSAgICAgICAgY29uc3QgTGlzcF9PYmplY3QgbGlzcF9uYW1l ID0gbWFrZV91bmlieXRlX3N0cmluZyAobmFtZSwgbGVuZ3RoKTsKLSAgICAgICAgY29uc3QgTGlz cF9PYmplY3QgY29kZSA9CisgICAgICAgIExpc3BfT2JqZWN0IGxpc3BfbmFtZSA9IG1ha2VfdW5p Ynl0ZV9zdHJpbmcgKG5hbWUsIGxlbmd0aCk7CisgICAgICAgIExpc3BfT2JqZWN0IGNvZGUgPQog ICAgICAgICAgIChsZW5ndGggPj0gMyAmJiBsZW5ndGggPD0gMTAgJiYgbmFtZVswXSA9PSAnVScg JiYgbmFtZVsxXSA9PSAnKycpID8KICAgICAgICAgICAvKiBDb2RlIHBvaW50IGFzIFUrTiwgd2hl cmUgTiBpcyBiZXR3ZWVuIDEgYW5kIDggaGV4YWRlY2ltYWwKICAgICAgICAgICAgICBkaWdpdHMu ICAqLwotLSAKMi43LjAKCg== --089e01419b023f3ad3052d658346--