From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.io/gmane.comp.tex.context/112310 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Hans Hagen via ntg-context Newsgroups: gmane.comp.tex.context Subject: Re: ligature exceptions Date: Wed, 28 Jul 2021 23:29:48 +0200 Message-ID: <0e311b52-307c-7c77-7d11-4fd48961ce53@xs4all.nl> References: <23fcdccf-b3d2-9912-6fd6-8ef0dd747da2@uni-bonn.de> Reply-To: mailing list for ConTeXt users Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------FBFFA5DFDC35042DBAAB92DA" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="12791"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.12.0 Cc: Hans Hagen To: "Thomas A. Schmitz via ntg-context" Original-X-From: ntg-context-bounces@ntg.nl Wed Jul 28 23:30:36 2021 Return-path: Envelope-to: gctc-ntg-context-518@m.gmane-mx.org Original-Received: from zapf.boekplan.nl ([5.39.185.232] helo=zapf.ntg.nl) by ciao.gmane.io with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1m8r8O-0003CD-8D for gctc-ntg-context-518@m.gmane-mx.org; Wed, 28 Jul 2021 23:30:36 +0200 Original-Received: from localhost (localhost [127.0.0.1]) by zapf.ntg.nl (Postfix) with ESMTP id 1165528045B; Wed, 28 Jul 2021 23:29:57 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at zapf.boekplan.nl Original-Received: from zapf.ntg.nl ([127.0.0.1]) by localhost (zapf.ntg.nl [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id nkgtbgvuTyqp; Wed, 28 Jul 2021 23:29:55 +0200 (CEST) Original-Received: from zapf.ntg.nl (localhost [127.0.0.1]) by zapf.ntg.nl (Postfix) with ESMTP id BF0D8280460; Wed, 28 Jul 2021 23:29:54 +0200 (CEST) Original-Received: from localhost (localhost [127.0.0.1]) by zapf.ntg.nl (Postfix) with ESMTP id 6C06928045B for ; Wed, 28 Jul 2021 23:29:52 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at zapf.boekplan.nl Original-Received: from zapf.ntg.nl ([127.0.0.1]) by localhost (zapf.ntg.nl [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 19dQSjhdMFqZ for ; Wed, 28 Jul 2021 23:29:51 +0200 (CEST) Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=194.109.24.25; helo=lb2-smtp-cloud8.xs4all.net; envelope-from=j.hagen@xs4all.nl; receiver= Original-Received: from lb2-smtp-cloud8.xs4all.net (lb2-smtp-cloud8.xs4all.net [194.109.24.25]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) (No client certificate requested) by zapf.ntg.nl (Postfix) with ESMTPS id 27AA3280459 for ; Wed, 28 Jul 2021 23:29:51 +0200 (CEST) Original-Received: from cust-a169be40 ([IPv6:fc0c:c118:7078:83cd:b49d:5a87:2838:627c]) by smtp-cloud8.xs4all.net with ESMTPSA id 8r7dmM5H3XTlc8r7emUeJ2; Wed, 28 Jul 2021 23:29:50 +0200 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xs4all.nl; s=s2; t=1627507790; bh=86fm1WNi/GlEecxQw6BdIoq6Pjqp54pDN6hj2Sfhd9E=; h=Subject:To:From:Message-ID:Date:MIME-Version:Content-Type:From: Subject; b=walch23TDs7XDAlZ8bbAdoi0QgDpe4Z/ouZxDFIRsyJY+w3MovG1AgO8bc0E6dpnP afQE+ugyTHpQDkzZN65vaZPB3+IOAApmo1ay+VeOj0rd3w35PWFKG85i9ZEuQClhm8 lamXTR2gDEEXkwwUxE9Dl58jn6LOJ+RK3hrQKK8Zo/OA2CMxhIrafptn+shl9F768D qoKqo/CZiD5VJXSohtxl5cOxm7VqV96knx7GhGphPHTiwAM8tYaMiAupKouoaXd8jJ ubnhDQKE1nZgHNoho6OXkzDvdGTcT1noCMhaonu7mO3vwZzsNZKfAKiODQ1C+FQ+lU 5s/FST0fTIWkg== In-Reply-To: <23fcdccf-b3d2-9912-6fd6-8ef0dd747da2@uni-bonn.de> Content-Language: en-US X-CMAE-Envelope: MS4xfNdsGRS69qadoOfVuAKrQgOJpi3y/npJcl/rmLqQYeObDxZrudfaWlEM5olJrnLDe26Dq9fWmKewJEmS9T9AR47O47ptVG9IwF66Aao1Yk7YWnmdHQ9n rphwpGpFk5bAGNHjgRQ+7JVSgy8x064JDYZNNVbTBN3IWUryCs3ISq5ug431vH43MW+88hyZvVqX8g== X-BeenThere: ntg-context@ntg.nl X-Mailman-Version: 2.1.26 Precedence: list List-Id: mailing list for ConTeXt users List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ntg-context-bounces@ntg.nl Original-Sender: "ntg-context" Xref: news.gmane.io gmane.comp.tex.context:112310 Archived-At: This is a multi-part message in MIME format. --------------FBFFA5DFDC35042DBAAB92DA Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit On 7/28/2021 7:24 PM, Thomas A. Schmitz via ntg-context wrote: > Hi all, > > just two quick questions: a couple of weeks ago, there was a long > discussion on ligature exceptions in, e.g., German. Hans provided an > elegant new mechanism (\startlanguageoptions). So my two questions: > > 1. Is the old mechanism (\replaceword[eg][Auflage][Au{fl}age]) now > obsolete? I tried using it, but unwanted ligatures still occurred. If it > is indeed deprecated, I'll add a note to the wiki (this would mean that > the current texlive version does not have the new mechanism and the > latest lmtx doesn't use the old one, so that's somewhat problematic). it's not too hard to make it work, see attached, but the new one is nicer because it permits more detailed control in luametatex you can do things like Au{\norightligaturing f}lage that is: each character can have a set of options; ok, one can do that with attributes but that is less efficients options have been introduced for ligatures, kerns, expansion etc (you can diff the attached lmt file with the lua file of the same name to see the difference in approach > 2. Both mechanisms only work for complete words, is that right? So I > can't just provide a pattern such as "uf|forder," I have to provide a > full list with all inflected forms: > > auf|fordern > auf|fordert > auf|fordernd > Auf|forderung > Auf|forderungen > > and for 1-3 also the forms with a capital letter. just lowercase will do if you look at the example files you can see that there are pre/post snippets possibel so basically you can create something pre [a|b|c] post which saves some definitions (make we can have pre/post lists which will nicely explode into huge lists but memory is not the issue here) while the replacement works by running over the node list, the second mechanism is using a callback at the hyphenation level (so per language) where each word is anyway checked against an exception list, so in addition that word can now be fed into a function and depending on outcome be fed back into the machinery (there are trackers that give insight in the process) Hans ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl ----------------------------------------------------------------- --------------FBFFA5DFDC35042DBAAB92DA Content-Type: text/plain; charset=UTF-8; name="lang-rep.lmt" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="lang-rep.lmt" aWYgbm90IG1vZHVsZXMgdGhlbiBtb2R1bGVzID0geyB9IGVuZCBtb2R1bGVzIFsnbGFuZy1y ZXAnXSA9IHsNCiAgICB2ZXJzaW9uICAgPSAxLjAwMSwNCiAgICBjb21tZW50ICAgPSAiY29t cGFuaW9uIHRvIGxhbmctcmVwLm1raXYiLA0KICAgIGF1dGhvciAgICA9ICJIYW5zIEhhZ2Vu LCBQUkFHTUEtQURFLCBIYXNzZWx0IE5MIiwNCiAgICBjb3B5cmlnaHQgPSAiUFJBR01BIEFE RSAvIENvblRlWHQgRGV2ZWxvcG1lbnQgVGVhbSIsDQogICAgbGljZW5zZSAgID0gInNlZSBj b250ZXh0IHJlbGF0ZWQgcmVhZG1lIGZpbGVzIg0KfQ0KDQotLSBBIEJhY2hvVGVYIDIwMTMg ZXhwZXJpbWVudCwgcHJvYmFibHkgbm90IHRoYXQgdXNlZnVsLiBFdmVudHVhbGx5IEkgdXNl ZCBhIHNpbXBsZXINCi0tIG1vcmUgZ2VuZXJpYyBleGFtcGxlLiBJJ20gc3VyZSBubyBvbmUg ZXZlciBub3RpY2VzIG9mIGV2ZW4gbmVlZHMgdGhpcyBjb2RlLg0KLS0NCi0tIEFzIGEgZm9s bG93IHVwIG9uIGEgcXVlc3Rpb24gYnkgQWxhbiBhYm91dCBzcGVjaWFsIHRyZWF0bWVudCBv ZiBkcm9wcGVkIGNhcHMgSSB3b25kZXINCi0tIGlmIEkgY2FuIG1ha2UgdGhpcyBvbmUgbW9y ZSBjbGV2ZXIgKHByb2JhYmx5IGluIGEgZmV3IG1vcmUgZGV2IHN0ZXBzKS4gRm9yIGluc3Rh bmNlDQotLSBpbmplY3Rpbmcgbm9kZXMgb3IgcmVwbGFjaW5nIG5vZGVzLiBJdCdzIGEgcHJl bHVkZSB0byBhIGtpbmQgb2YgbHBlZyBmb3Igbm9kZXMsDQotLSBhbHRob3VnaCAoZ2l2ZW4g ZXhwZXJpZW5jZXMgc28gZmFyKSB3ZSBkb24ndCByZWFsbHkgbmVlZCB0aGF0LiBBZnRlciBh bGwsIGVhY2ggcHJvYmxlbQ0KLS0gaXMgc29tZXdoYXQgdW5pcXVlLg0KDQpsb2NhbCB0eXBl LCB0b251bWJlciwgbmV4dCA9IHR5cGUsIHRvbnVtYmVyLCBuZXh0DQpsb2NhbCBnbWF0Y2gs IGdzdWIgPSBzdHJpbmcuZ21hdGNoLCBzdHJpbmcuZ3N1Yg0KbG9jYWwgdXRmYnl0ZSwgdXRm c3BsaXQgPSB1dGYuYnl0ZSwgdXRmLnNwbGl0DQpsb2NhbCBQLCBDLCBVLCBDYywgQ3QsIENz LCBscGVnbWF0Y2ggPSBscGVnLlAsIGxwZWcuQywgbHBlZy5wYXR0ZXJucy51dGY4Y2hhcmFj dGVyLCBscGVnLkNjLCBscGVnLkN0LCBscGVnLkNzLCBscGVnLm1hdGNoDQpsb2NhbCBmaW5k ID0gc3RyaW5nLmZpbmQNCg0KbG9jYWwgenduaiAgICAgPSAgMHgyMDBDDQpsb2NhbCBncm91 cGVkICA9IFAoInsiKSAqICggQ3QoKFUvdXRmYnl0ZS1QKCJ9IikpXjEpICsgQ2MoZmFsc2Up ICkgKiBQKCJ9IiktLSBncm91cGVkDQpsb2NhbCBzcGxpdHRlciA9IEN0KCgNCiAgICAgICAg ICAgICAgICAgICAgI1AoInsiKSAqICgNCiAgICAgICAgICAgICAgICAgICAgICAgIFAoInt9 IikgLyBmdW5jdGlvbigpIHJldHVybiB6d25qIGVuZA0KICAgICAgICAgICAgICAgICAgICAg ICsgQ3QoQ2MoImRpc2NyZXRpb25hcnkiKSAqIGdyb3VwZWQgKiBncm91cGVkICogZ3JvdXBl ZCkNCiAgICAgICAgICAgICAgICAgICAgICArIEN0KENjKCJub2xpZ2F0dXJlIikgICAgKiBn cm91cGVkKQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICArIFUv dXRmYnl0ZQ0KICAgICAgICAgICAgICAgICleMSkNCg0KbG9jYWwgc3RyaXBwZXIgPSBQKCJ7 IikgKiBDcygoMS1QKC0yKSleMCkgKiBQKCJ9IikgKiBQKC0xKQ0KDQpsb2NhbCB0cmFjZV9y ZXBsYWNlbWVudHMgPSBmYWxzZSAgdHJhY2tlcnMucmVnaXN0ZXIoImxhbmd1YWdlcy5yZXBs YWNlbWVudHMiLCAgICAgICAgIGZ1bmN0aW9uKHYpIHRyYWNlX3JlcGxhY2VtZW50cyA9IHYg ZW5kKQ0KbG9jYWwgdHJhY2VfZGV0YWlscyAgICAgID0gZmFsc2UgIHRyYWNrZXJzLnJlZ2lz dGVyKCJsYW5ndWFnZXMucmVwbGFjZW1lbnRzLmRldGFpbHMiLCBmdW5jdGlvbih2KSB0cmFj ZV9kZXRhaWxzICAgICAgPSB2IGVuZCkNCg0KbG9jYWwgcmVwb3J0X3JlcGxhY2VtZW50ID0g bG9ncy5yZXBvcnRlcigibGFuZ3VhZ2VzIiwicmVwbGFjZW1lbnRzIikNCg0KbG9jYWwgZ2x5 cGhfY29kZSAgICAgICAgID0gbm9kZXMubm9kZWNvZGVzLmdseXBoDQpsb2NhbCBnbHVlX2Nv ZGUgICAgICAgICAgPSBub2Rlcy5ub2RlY29kZXMuZ2x1ZQ0KDQpsb2NhbCBzcGFjZXNraXBf Y29kZSAgICAgPSBub2Rlcy5nbHVlY29kZXMuc3BhY2Vza2lwDQpsb2NhbCB4c3BhY2Vza2lw X2NvZGUgICAgPSBub2Rlcy5nbHVlY29kZXMueHNwYWNlc2tpcA0KDQpsb2NhbCBudXRzICAg ICAgICAgICAgICAgPSBub2Rlcy5udXRzDQoNCmxvY2FsIGdldG5leHQgICAgICAgICAgICA9 IG51dHMuZ2V0bmV4dA0KbG9jYWwgZ2V0cHJldiAgICAgICAgICAgID0gbnV0cy5nZXRwcmV2 DQpsb2NhbCBnZXRhdHRyICAgICAgICAgICAgPSBudXRzLmdldGF0dHINCmxvY2FsIGdldGlk ICAgICAgICAgICAgICA9IG51dHMuZ2V0aWQNCmxvY2FsIGdldHN1YnR5cGUgICAgICAgICA9 IG51dHMuZ2V0c3VidHlwZQ0KbG9jYWwgZ2V0Y2hhciAgICAgICAgICAgID0gbnV0cy5nZXRj aGFyDQpsb2NhbCBpc2dseXBoICAgICAgICAgICAgPSBudXRzLmlzZ2x5cGgNCg0KbG9jYWwg c2V0bGluayAgICAgICAgICAgID0gbnV0cy5zZXRsaW5rDQpsb2NhbCBzZXRuZXh0ICAgICAg ICAgICAgPSBudXRzLnNldG5leHQNCmxvY2FsIHNldHByZXYgICAgICAgICAgICA9IG51dHMu c2V0cHJldg0KbG9jYWwgc2V0Y2hhciAgICAgICAgICAgID0gbnV0cy5zZXRjaGFyDQpsb2Nh bCBzZXRhdHRybGlzdCAgICAgICAgPSBudXRzLnNldGF0dHJsaXN0DQpsb2NhbCBzZXRvcHRp b25zICAgICAgICAgPSBudXRzLnNldG9wdGlvbnMNCg0KbG9jYWwgZ2x5cGhvcHRpb25jb2Rl cyAgICAgICA9IHRleC5nbHlwaG9wdGlvbmNvZGVzDQpsb2NhbCBub3JpZ2h0bGlnYXR1cmVf b3B0aW9uID0gZ2x5cGhvcHRpb25jb2Rlcy5ub3JpZ2h0bGlnYXR1cmUNCmxvY2FsIG5vbGVm dGxpZ2F0dXJlX29wdGlvbiAgPSBnbHlwaG9wdGlvbmNvZGVzLm5vbGVmdGxpZ2F0dXJlDQoN CmxvY2FsIGluc2VydGJlZm9yZSAgICAgICA9IG51dHMuaW5zZXJ0YmVmb3JlDQpsb2NhbCBp bnNlcnRhZnRlciAgICAgICAgPSBudXRzLmluc2VydGFmdGVyDQpsb2NhbCByZW1vdmVfbm9k ZSAgICAgICAgPSBudXRzLnJlbW92ZQ0KbG9jYWwgY29weV9ub2RlICAgICAgICAgID0gbnV0 cy5jb3B5DQpsb2NhbCBmbHVzaGxpc3QgICAgICAgICAgPSBudXRzLmZsdXNobGlzdA0KDQps b2NhbCBub2RlcG9vbCAgICAgICAgICAgPSBudXRzLnBvb2wNCmxvY2FsIG5ld19kaXNjICAg ICAgICAgICA9IG5vZGVwb29sLmRpc2MNCg0KbG9jYWwgdGV4c2V0YXR0cmlidXRlICAgID0g dGV4LnNldGF0dHJpYnV0ZQ0KbG9jYWwgdW5zZXR2YWx1ZSAgICAgICAgID0gYXR0cmlidXRl cy51bnNldHZhbHVlDQoNCmxvY2FsIGVuYWJsZWFjdGlvbiAgICAgICA9IG5vZGVzLnRhc2tz LmVuYWJsZWFjdGlvbg0KDQpsb2NhbCB2X3Jlc2V0ICAgICAgICAgICAgPSBpbnRlcmZhY2Vz LnZhcmlhYmxlcy5yZXNldA0KDQpsb2NhbCBpbXBsZW1lbnQgICAgICAgICAgPSBpbnRlcmZh Y2VzLmltcGxlbWVudA0KDQpsb2NhbCBwcm9jZXNzb3JzICAgICAgICAgPSB0eXBlc2V0dGVy cy5wcm9jZXNzb3JzDQpsb2NhbCBzcGxpdHByb2Nlc3NvciAgICAgPSBwcm9jZXNzb3JzLnNw bGl0DQoNCmxvY2FsIHJlcGxhY2VtZW50cyAgICAgICA9IGxhbmd1YWdlcy5yZXBsYWNlbWVu dHMgb3IgeyB9DQpsYW5ndWFnZXMucmVwbGFjZW1lbnRzICAgPSByZXBsYWNlbWVudHMNCg0K bG9jYWwgYV9yZXBsYWNlbWVudHMgICAgID0gYXR0cmlidXRlcy5wcml2YXRlKCJyZXBsYWNl bWVudHMiKQ0KDQpsb2NhbCBsaXN0cyA9IHsgfQ0KbG9jYWwgbGFzdCAgPSAwDQpsb2NhbCB0 cmVlcyA9IHsgfQ0KDQp0YWJsZS5zZXRtZXRhdGFibGVpbmRleChsaXN0cyxmdW5jdGlvbihs aXN0cyxuYW1lKQ0KICAgIGxhc3QgPSBsYXN0ICsgMQ0KICAgIGxvY2FsIGxpc3QgPSB7IH0N CiAgICBsb2NhbCBkYXRhID0geyBuYW1lID0gbmFtZSwgbGlzdCA9IGxpc3QsIGF0dHJpYnV0 ZSA9IGxhc3QgfQ0KICAgIGxpc3RzW2xhc3RdID0gZGF0YQ0KICAgIGxpc3RzW25hbWVdID0g ZGF0YQ0KICAgIHRyZWVzW2xhc3RdID0gbGlzdA0KICAgIHJldHVybiBkYXRhDQplbmQpDQoN Cmxpc3RzW3ZfcmVzZXRdLmF0dHJpYnV0ZSA9IHVuc2V0dmFsdWUgLS0gc28gd2UgZGlzY2Fy ZCAwDQoNCi0tIHRvZG86IGdsdWUga2VybiBhdHRyDQoNCmxvY2FsIGZ1bmN0aW9uIGFkZChy b290LHdvcmQscmVwbGFjZW1lbnQpDQogICAgbG9jYWwgcHJvY2Vzc29yLCByZXBsYWNlbWVu dCA9IHNwbGl0cHJvY2Vzc29yKHJlcGxhY2VtZW50LHRydWUpIC0tIG5vIGNoZWNrDQogICAg cmVwbGFjZW1lbnQgPSBscGVnbWF0Y2goc3RyaXBwZXIscmVwbGFjZW1lbnQpIG9yIHJlcGxh Y2VtZW50DQogICAgbG9jYWwgbGlzdCA9IHV0ZnNwbGl0KHdvcmQpIC0tICx0cnVlKQ0KICAg IGxvY2FsIHNpemUgPSAjbGlzdA0KICAgIGZvciBpPTEsc2l6ZSBkbw0KICAgICAgICBsb2Nh bCBsID0gdXRmYnl0ZShsaXN0W2ldKQ0KICAgICAgICBpZiBub3Qgcm9vdFtsXSB0aGVuDQog ICAgICAgICAgICByb290W2xdID0geyB9DQogICAgICAgIGVuZA0KICAgICAgICBpZiBpID09 IHNpemUgdGhlbg0KICAgICAgICAgICAgbG9jYWwgc3BlY2lhbCA9IGZpbmQocmVwbGFjZW1l bnQsInsiLDEsdHJ1ZSkNCiAgICAgICAgICAgIGxvY2FsIG5ld2xpc3QgPSBscGVnbWF0Y2go c3BsaXR0ZXIscmVwbGFjZW1lbnQpDQogICAgICAgICAgICByb290W2xdLmZpbmFsID0gew0K ICAgICAgICAgICAgICAgIHdvcmQgICAgICAgID0gd29yZCwNCiAgICAgICAgICAgICAgICBy ZXBsYWNlbWVudCA9IHJlcGxhY2VtZW50LA0KICAgICAgICAgICAgICAgIHByb2Nlc3NvciAg ID0gcHJvY2Vzc29yLA0KICAgICAgICAgICAgICAgIG9sZGxlbmd0aCAgID0gc2l6ZSwNCiAg ICAgICAgICAgICAgICBuZXdjb2RlcyAgICA9IG5ld2xpc3QsDQogICAgICAgICAgICAgICAg c3BlY2lhbCAgICAgPSBzcGVjaWFsLA0KICAgICAgICAgICAgfQ0KICAgICAgICBlbmQNCiAg ICAgICAgcm9vdCA9IHJvb3RbbF0NCiAgICBlbmQNCmVuZA0KDQpmdW5jdGlvbiByZXBsYWNl bWVudHMuYWRkKGNhdGVnb3J5LHdvcmQscmVwbGFjZW1lbnQpDQogICAgbG9jYWwgcm9vdCA9 IGxpc3RzW2NhdGVnb3J5XS5saXN0DQogICAgaWYgdHlwZSh3b3JkKSA9PSAidGFibGUiIHRo ZW4NCiAgICAgICAgZm9yIHdvcmQsIHJlcGxhY2VtZW50IGluIG5leHQsIHdvcmQgZG8NCiAg ICAgICAgICAgIGFkZChyb290LHdvcmQscmVwbGFjZW1lbnQpDQogICAgICAgIGVuZA0KICAg IGVsc2UNCiAgICAgICAgYWRkKHJvb3Qsd29yZCxyZXBsYWNlbWVudCBvciAiIikNCiAgICBl bmQNCmVuZA0KDQotLSBsb2NhbCBzdHJpcCA9IGxwZWcuc3RyaXBwZXIoInt9IikNCg0KZnVu Y3Rpb24gbGFuZ3VhZ2VzLnJlcGxhY2VtZW50cy5hZGRsaXN0KGNhdGVnb3J5LGxpc3QpDQog ICAgbG9jYWwgcm9vdCA9IGxpc3RzW2NhdGVnb3J5XS5saXN0DQogICAgaWYgdHlwZShsaXN0 KSA9PSAic3RyaW5nIiB0aGVuDQogICAgICAgIGZvciBuZXcgaW4gZ21hdGNoKGxpc3QsIiVT KyIpIGRvDQogICAgICAgICAgICBsb2NhbCBvbGQgPSBnc3ViKG5ldywiW3t9XSIsIiIpDQog ICAgICAgICAtLSBsb2NhbCBvbGQgPSBscGVnbWF0Y2goc3RyaXAsbmV3KQ0KICAgICAgICAg ICAgYWRkKHJvb3Qsb2xkLG5ldykNCiAgICAgICAgZW5kDQogICAgZWxzZQ0KICAgICAgICBm b3IgaT0xLCNsaXN0IGRvDQogICAgICAgICAgICBsb2NhbCBuZXcgPSBsaXN0W2ldDQogICAg ICAgICAgICBsb2NhbCBvbGQgPSBnc3ViKG5ldywiW3t9XSIsIiIpDQogICAgICAgICAtLSBs b2NhbCBvbGQgPSBscGVnbWF0Y2goc3RyaXAsbmV3KQ0KICAgICAgICAgICAgYWRkKHJvb3Qs b2xkLG5ldykNCiAgICAgICAgZW5kDQogICAgZW5kDQplbmQNCg0KbG9jYWwgZnVuY3Rpb24g dG9ub2RlcyhsaXN0LHRlbXBsYXRlKQ0KICAgIGxvY2FsIGhlYWQsIGN1cnJlbnQNCiAgICBm b3IgaT0xLCNsaXN0IGRvDQogICAgICAgIGxvY2FsIG5ldyA9IGNvcHlfbm9kZSh0ZW1wbGF0 ZSkNCiAgICAgICAgc2V0Y2hhcihuZXcsbGlzdFtpXSkNCiAgICAgICAgaWYgaGVhZCB0aGVu DQogICAgICAgICAgICBoZWFkLCBjdXJyZW50ID0gaW5zZXJ0YWZ0ZXIoaGVhZCxjdXJyZW50 LG5ldykNCiAgICAgICAgZWxzZQ0KICAgICAgICAgICAgaGVhZCwgY3VycmVudCA9IG5ldywg bmV3DQogICAgICAgIGVuZA0KICAgIGVuZA0KICAgIHJldHVybiBoZWFkDQplbmQNCg0KbG9j YWwgaXNfcHVuY3R1YXRpb24gPSBjaGFyYWN0ZXJzLmlzX3B1bmN0dWF0aW9uDQoNCi0tIFdl IGNhbiB0cnkgdG8gYmUgY2xldmVyIGFuZCB1c2UgdGhlIGZhY3QgdGhhdCB0aGVyZSBpcyBu byBtYXRjaCB0byBza2lwDQotLSBvdmVyIHRvIHRoZSBuZXh0IHdvcmQgYnV0IGl0IGlzIGdp dmVzIGZ1enp5IGNvZGUgc28gZm9yIG5vdyBJIHJlbW92ZWQNCi0tIHRoYXQgb3B0aW1pemF0 aW9uICh3aGVuIEkgcmVhbGx5IG5lZWQgYSBoaWdoIHBlcmZvcm1hbmNlIHZlcnNpb24gbXlz ZWxmDQotLSBJIHdpbGwgbG9vayBpbnRvIGl0IChidXQgc28gZmFyIEkgbmV2ZXIgdXNlZCB0 aGlzIG1lY2hhbmlzbSBteXNlbGYpLg0KLS0NCi0tIFdlIHVzZWQgdG8gaGF2ZSB0aGUgaGl0 IGNoZWNrZXIgYXMgZnVuY3Rpb24gYnV0IGlzIGdvdCBtZXNzeSB3aGVuIGNoZWNrcw0KLS0g Zm9yIHB1bmN0dWF0aW9uIHdhcyBhZGRlZC4NCg0KbG9jYWwgZnVuY3Rpb24gcmVwbGFjZSho ZWFkLGZpcnN0LGxhc3QsZmluYWwsaGFzc3BhY2Usb3ZlcmxvYWQpDQogICAgbG9jYWwgY3Vy cmVudCAgID0gZmlyc3QNCiAgICBsb2NhbCBwcmVmaXJzdCAgPSBnZXRwcmV2KGZpcnN0KSBv ciBoZWFkDQogICAgbG9jYWwgcG9zdGxhc3QgID0gZ2V0bmV4dChsYXN0KQ0KICAgIGxvY2Fs IG9sZGxlbmd0aCA9IGZpbmFsLm9sZGxlbmd0aA0KICAgIGxvY2FsIG5ld2NvZGVzICA9IGZp bmFsLm5ld2NvZGVzDQogICAgbG9jYWwgbmV3bGVuZ3RoID0gbmV3Y29kZXMgYW5kICNuZXdj b2RlcyBvciAwDQogICAgaWYgdHJhY2VfcmVwbGFjZW1lbnRzIHRoZW4NCiAgICAgICAgcmVw b3J0X3JlcGxhY2VtZW50KCJyZXBsYWNpbmcgd29yZCAlYSBieSAlYSIsZmluYWwud29yZCxm aW5hbC5yZXBsYWNlbWVudCkNCiAgICBlbmQNCiAgICBpZiBoYXNzcGFjZSBvciBmaW5hbC5z cGVjaWFsIHRoZW4NCiAgICAgICAgLS0gSXQncyBlYXNpZXIgdG8gZGVsZXRlIGFuZCBpbnNl cnQgc28gd2UgZG8ganVzdCB0aGF0LiBPbiB0aGUgdG9kbyBsaXN0IGlzDQogICAgICAgIC0t IHR1cm4gaW5qZWN0ZWQgc3BhY2VzIGludG8gZ2x1ZSBidXQgZWFzaWVyIG1pZ2h0IGJlIHRv IGxldCB0aGUgY2hhciBicmVhaw0KICAgICAgICAtLSBoYW5kbGVyIGRvIHRoYXQgLi4uDQog ICAgICAgIGxvY2FsIHByZXYgPSBnZXRwcmV2KGN1cnJlbnQpDQogICAgICAgIGxvY2FsIG5l eHQgPSBnZXRuZXh0KGxhc3QpDQogICAgICAgIGxvY2FsIGxpc3QgPSBjdXJyZW50DQogICAg ICAgIHNldG5leHQobGFzdCkNCiAgICAgICAgc2V0bGluayhwcmV2LG5leHQpDQogICAgICAg IGN1cnJlbnQgPSBwcmV2DQogICAgICAgIGlmIG5vdCBjdXJyZW50IHRoZW4NCiAgICAgICAg ICAgIGhlYWQgPSBuaWwNCiAgICAgICAgZW5kDQogICAgICAgIGxvY2FsIGkgPSAxDQogICAg ICAgIHdoaWxlIGkgPD0gbmV3bGVuZ3RoIGRvDQogICAgICAgICAgICBsb2NhbCBjb2RlcyA9 IG5ld2NvZGVzW2ldDQogICAgICAgICAgICBpZiB0eXBlKGNvZGVzKSA9PSAidGFibGUiIHRo ZW4NCiAgICAgICAgICAgICAgICBsb2NhbCBtZXRob2QgPSBjb2Rlc1sxXQ0KICAgICAgICAg ICAgICAgIGlmIG1ldGhvZCA9PSAiZGlzY3JldGlvbmFyeSIgdGhlbg0KICAgICAgICAgICAg ICAgICAgICBsb2NhbCBwcmUsIHBvc3QsIHJlcGxhY2UgPSBjb2Rlc1syXSwgY29kZXNbM10s IGNvZGVzWzRdDQogICAgICAgICAgICAgICAgICAgIGlmIHByZSB0aGVuDQogICAgICAgICAg ICAgICAgICAgICAgICBwcmUgPSB0b25vZGVzKHByZSxmaXJzdCkNCiAgICAgICAgICAgICAg ICAgICAgZW5kDQogICAgICAgICAgICAgICAgICAgIGlmIHBvc3QgdGhlbg0KICAgICAgICAg ICAgICAgICAgICAgICAgcG9zdCA9IHRvbm9kZXMocG9zdCxmaXJzdCkNCiAgICAgICAgICAg ICAgICAgICAgZW5kDQogICAgICAgICAgICAgICAgICAgIGlmIHJlcGxhY2UgdGhlbg0KICAg ICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZSA9IHRvbm9kZXMocmVwbGFjZSxmaXJzdCkN CiAgICAgICAgICAgICAgICAgICAgZW5kDQogICAgICAgICAgICAgICAgICAgIC0tIHRvZG86 IGFsc28gc2V0IGF0dHINCiAgICAgICAgICAgICAgICAgICAgbG9jYWwgbmV3ID0gbmV3X2Rp c2MocHJlLHBvc3QscmVwbGFjZSkNCiAgICAgICAgICAgICAgICAgICAgc2V0YXR0cmxpc3Qo bmV3LGZpcnN0KQ0KICAgICAgICAgICAgICAgICAgICBoZWFkLCBjdXJyZW50ID0gaW5zZXJ0 YWZ0ZXIoaGVhZCxjdXJyZW50LG5ldykNCiAgICAgICAgICAgICAgICBlbHNlaWYgbWV0aG9k ID09ICJub2xpZ2F0dXJlIiB0aGVuDQogICAgICAgICAgICAgICAgICAgIC0tIG5vdCB0aGF0 IGVmZmljaWVudCB0byBjb3B5IGJ1dCBvayBmb3IgdGVzdGluZw0KICAgICAgICAgICAgICAg ICAgICBsb2NhbCBsaXN0ID0gY29kZXNbMl0NCiAgICAgICAgICAgICAgICAgICAgaWYgbGlz dCB0aGVuDQogICAgICAgICAgICAgICAgICAgICAgICBsb2NhbCBuID0gI2xpc3QNCiAgICAg ICAgICAgICAgICAgICAgICAgIGZvciBpPTEsbiBkbw0KICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGxvY2FsIG5ldyA9IGNvcHlfbm9kZShmaXJzdCkNCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICBzZXRjaGFyKG5ldyxsaXN0W2ldKQ0KICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGlmIGkgPT0gMSB0aGVuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHNldG9wdGlvbnMobmV3LG5vcmlnaHRsaWdhdHVyZV9vcHRpb24pDQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgZWxzZWlmIGkgPT0gbiB0aGVuDQogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHNldG9wdGlvbnMobmV3LGdseXBob3B0aW9uY29kZXMubm9sZWZ0bGln YXR1cmUgfCBub3JpZ2h0bGlnYXR1cmVfb3B0aW9uKQ0KICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0b3B0aW9u cyhuZXcsZ2x5cGhvcHRpb25jb2Rlcy5ub2xlZnRsaWdhdHVyZSkNCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICBlbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkLCBj dXJyZW50ID0gaW5zZXJ0YWZ0ZXIoaGVhZCxjdXJyZW50LG5ldykNCiAgICAgICAgICAgICAg ICAgICAgICAgIGVuZA0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAg ICAgICAgICAtLSBsb2NhbCBuZXcgPSBjb3B5X25vZGUoZmlyc3QpDQogICAgICAgICAgICAg ICAgICAgICAtLSBzZXRjaGFyKG5ldyx6d25qKQ0KICAgICAgICAgICAgICAgICAgICAgLS0g aGVhZCwgY3VycmVudCA9IGluc2VydGFmdGVyKGhlYWQsY3VycmVudCxuZXcpDQogICAgICAg ICAgICAgICAgICAgICAgICBzZXRvcHRpb25zKGN1cnJlbnQsbm9yaWdodGxpZ2F0dXJlX29w dGlvbikNCiAgICAgICAgICAgICAgICAgICAgZW5kDQogICAgICAgICAgICAgICAgZWxzZQ0K ICAgICAgICAgICAgICAgICAgICByZXBvcnRfcmVwbGFjZW1lbnQoInVua25vd24gbWV0aG9k ICVhIixtZXRob2Qgb3IgIj8iKQ0KICAgICAgICAgICAgICAgIGVuZA0KICAgICAgICAgICAg ZWxzZQ0KICAgICAgICAgICAgICAgIGxvY2FsIG5ldyA9IGNvcHlfbm9kZShmaXJzdCkNCiAg ICAgICAgICAgICAgICBzZXRjaGFyKG5ldyxjb2RlcykNCiAgICAgICAgICAgICAgICBoZWFk LCBjdXJyZW50ID0gaW5zZXJ0YWZ0ZXIoaGVhZCxjdXJyZW50LG5ldykNCiAgICAgICAgICAg IGVuZA0KICAgICAgICAgICAgaSA9IGkgKyAxDQogICAgICAgIGVuZA0KICAgICAgICBmbHVz aGxpc3QobGlzdCkNCiAgICBlbHNlaWYgbmV3bGVuZ3RoID09IDAgdGhlbg0KICAgICAgICAt LSB3ZSBvdmVybG9hZA0KICAgIGVsc2VpZiBvbGRsZW5ndGggPT0gbmV3bGVuZ3RoIHRoZW4N CiAgICAgICAgaWYgZmluYWwud29yZCB+PSBmaW5hbC5yZXBsYWNlbWVudCB0aGVuDQogICAg ICAgICAgICBmb3IgaT0xLG5ld2xlbmd0aCBkbw0KICAgICAgICAgICAgICAgIHNldGNoYXIo Y3VycmVudCxuZXdjb2Rlc1tpXSkNCiAgICAgICAgICAgICAgICBjdXJyZW50ID0gZ2V0bmV4 dChjdXJyZW50KQ0KICAgICAgICAgICAgZW5kDQogICAgICAgIGVuZA0KICAgICAgICBjdXJy ZW50ID0gZ2V0bmV4dChmaW5hbCkNCiAgICBlbHNlaWYgb2xkbGVuZ3RoIDwgbmV3bGVuZ3Ro IHRoZW4NCiAgICAgICAgZm9yIGk9MSxuZXdsZW5ndGgtb2xkbGVuZ3RoIGRvDQogICAgICAg ICAgICBsb2NhbCBuID0gY29weV9ub2RlKGN1cnJlbnQpDQogICAgICAgICAgICBzZXRjaGFy KG4sbmV3Y29kZXNbaV0pDQogICAgICAgICAgICBoZWFkLCBjdXJyZW50ID0gaW5zZXJ0YmVm b3JlKGhlYWQsY3VycmVudCxuKQ0KICAgICAgICAgICAgY3VycmVudCA9IGdldG5leHQoY3Vy cmVudCkNCiAgICAgICAgZW5kDQogICAgICAgIGZvciBpPW5ld2xlbmd0aC1vbGRsZW5ndGgr MSxuZXdsZW5ndGggZG8NCiAgICAgICAgICAgIHNldGNoYXIoY3VycmVudCxuZXdjb2Rlc1tp XSkNCiAgICAgICAgICAgIGN1cnJlbnQgPSBnZXRuZXh0KGN1cnJlbnQpDQogICAgICAgIGVu ZA0KICAgIGVsc2UNCiAgICAgICAgZm9yIGk9MSxvbGRsZW5ndGgtbmV3bGVuZ3RoIGRvDQog ICAgICAgICAgICBoZWFkLCBjdXJyZW50ID0gcmVtb3ZlX25vZGUoaGVhZCxjdXJyZW50LHRy dWUpDQogICAgICAgIGVuZA0KICAgICAgICBmb3IgaT0xLG5ld2xlbmd0aCBkbw0KICAgICAg ICAgICAgc2V0Y2hhcihjdXJyZW50LG5ld2NvZGVzW2ldKQ0KICAgICAgICAgICAgY3VycmVu dCA9IGdldG5leHQoY3VycmVudCkNCiAgICAgICAgZW5kDQogICAgZW5kDQogICAgaWYgb3Zl cmxvYWQgdGhlbg0KICAgICAgICBvdmVybG9hZChmaW5hbCxnZXRuZXh0KHByZWZpcnN0KSxn ZXRwcmV2KHBvc3RsYXN0KSkNCiAgICBlbmQNCiAgICByZXR1cm4gaGVhZCwgcG9zdGxhc3QN CmVuZA0KDQotLSB3ZSBoYW5kbGUganVzdCBvbmUgc3BhY2UNCg0KZnVuY3Rpb24gcmVwbGFj ZW1lbnRzLmhhbmRsZXIoaGVhZCkNCiAgICBsb2NhbCBjdXJyZW50ICAgPSBoZWFkDQogICAg bG9jYWwgb3ZlcmxvYWQgID0gYXR0cmlidXRlcy5hcHBseW92ZXJsb2Fkcw0KICAgIGxvY2Fs IG1vZGUgICAgICA9IGZhbHNlIC0tIHdlJ3JlIGluIHdvcmQgb3IgcHVuY3R1YXRpb24gbW9k ZQ0KICAgIGxvY2FsIHdvcmRzdGFydCA9IGZhbHNlDQogICAgbG9jYWwgd29yZGVuZCAgID0g ZmFsc2UNCiAgICBsb2NhbCBwcmV2ZW5kICAgPSBmYWxzZQ0KICAgIGxvY2FsIHByZXZmaW5h bCA9IGZhbHNlDQogICAgbG9jYWwgdHJlZSAgICAgID0gZmFsc2UNCiAgICBsb2NhbCByb290 ICAgICAgPSBmYWxzZQ0KICAgIGxvY2FsIGhhc3NwYWNlICA9IGZhbHNlDQogICAgd2hpbGUg Y3VycmVudCBkbw0KICAgICAgICBsb2NhbCBpZCA9IGdldGlkKGN1cnJlbnQpIC0tIG9yIHVz ZSB0aGUgY2hhciBnZXR0ZXINCiAgICAgICAgaWYgaWQgPT0gZ2x5cGhfY29kZSB0aGVuDQog ICAgICAgICAgICBsb2NhbCBhID0gZ2V0YXR0cihjdXJyZW50LGFfcmVwbGFjZW1lbnRzKQ0K ICAgICAgICAgICAgaWYgYSB0aGVuDQogICAgICAgICAgICAgICAgLS0gd2UgaGF2ZSBhIHJ1 bg0KICAgICAgICAgICAgICAgIHRyZWUgPSB0cmVlc1thXQ0KICAgICAgICAgICAgICAgIGlm IHRyZWUgdGhlbg0KICAgICAgICAgICAgICAgICAgICBsb2NhbCBjaGFyID0gZ2V0Y2hhcihj dXJyZW50KQ0KICAgICAgICAgICAgICAgICAgICBsb2NhbCBwdW5jID0gaXNfcHVuY3R1YXRp b25bY2hhcl0NCiAgICAgICAgICAgICAgICAgICAgaWYgbW9kZSA9PSAicHVuYyIgdGhlbg0K ICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHB1bmMgdGhlbg0KICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGlmIHJvb3QgdGhlbg0KICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBsb2NhbCBmaW5hbCA9IHJvb3QuZmluYWwNCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgaWYgZmluYWwgdGhlbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgaGVhZCA9IHJlcGxhY2UoaGVhZCx3b3Jkc3RhcnQsd29yZGVuZCxmaW5hbCxo YXNzcGFjZSxvdmVybG9hZCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxz ZWlmIHByZXZmaW5hbCB0aGVuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBoZWFkID0gcmVwbGFjZShoZWFkLHdvcmRzdGFydCxwcmV2ZW5kLHByZXZmaW5hbCxoYXNz cGFjZSxvdmVybG9hZCkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kDQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZmaW5hbCA9IGZhbHNlDQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QgPSBmYWxzZQ0KICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGVuZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUg PSAid29yZCINCiAgICAgICAgICAgICAgICAgICAgICAgIGVuZA0KICAgICAgICAgICAgICAg ICAgICBlbHNlaWYgbW9kZSA9PSAid29yZCIgdGhlbg0KICAgICAgICAgICAgICAgICAgICAg ICAgaWYgcHVuYyB0aGVuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcm9vdCB0 aGVuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsIGZpbmFsID0gcm9v dC5maW5hbA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBmaW5hbCB0aGVu DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkID0gcmVwbGFjZSho ZWFkLHdvcmRzdGFydCx3b3JkZW5kLGZpbmFsLGhhc3NwYWNlLG92ZXJsb2FkKQ0KICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlaWYgcHJldmZpbmFsIHRoZW4NCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWQgPSByZXBsYWNlKGhlYWQsd29y ZHN0YXJ0LHByZXZlbmQscHJldmZpbmFsLGhhc3NwYWNlLG92ZXJsb2FkKQ0KICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBlbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgcHJldmZpbmFsID0gZmFsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgcm9vdCA9IGZhbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kDQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9ICJwdW5jIg0KICAgICAgICAgICAgICAg ICAgICAgICAgZW5kDQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAg ICAgICAgICAgIG1vZGUgPSBwdW5jIGFuZCAicHVuYyIgb3IgIndvcmQiDQogICAgICAgICAg ICAgICAgICAgIGVuZA0KICAgICAgICAgICAgICAgICAgICBpZiByb290IHRoZW4NCiAgICAg ICAgICAgICAgICAgICAgICAgIHJvb3QgPSByb290W2NoYXJdDQogICAgICAgICAgICAgICAg ICAgICAgICBpZiByb290IHRoZW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jk ZW5kID0gY3VycmVudA0KICAgICAgICAgICAgICAgICAgICAgICAgZW5kDQogICAgICAgICAg ICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHByZXZmaW5hbCB0 aGVuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZCA9IHJlcGxhY2UoaGVhZCx3 b3Jkc3RhcnQscHJldmVuZCxwcmV2ZmluYWwsaGFzc3BhY2Usb3ZlcmxvYWQpDQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgcHJldmZpbmFsID0gZmFsc2UNCiAgICAgICAgICAgICAg ICAgICAgICAgIGVuZA0KICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCA9IHRyZWVbY2hh cl0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHJvb3QgdGhlbg0KICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHdvcmRzdGFydCA9IGN1cnJlbnQNCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICB3b3JkZW5kICAgPSBjdXJyZW50DQogICAgICAgICAgICAgICAgICAgICAg ICAgICAgcHJldmVuZCAgID0gZmFsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBo YXNzcGFjZSAgPSBmYWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgZW5kDQogICAgICAg ICAgICAgICAgICAgIGVuZA0KICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAg ICAgICAgcm9vdD0gZmFsc2UNCiAgICAgICAgICAgICAgICBlbmQNCiAgICAgICAgICAgIGVs c2UNCiAgICAgICAgICAgICAgICB0cmVlID0gZmFsc2UNCiAgICAgICAgICAgIGVuZA0KICAg ICAgICAgICAgY3VycmVudCA9IGdldG5leHQoY3VycmVudCkNCiAgICAgICAgZWxzZWlmIHJv b3QgdGhlbg0KICAgICAgICAgICAgbG9jYWwgZmluYWwgPSByb290LmZpbmFsDQogICAgICAg ICAgICBpZiBtb2RlID09ICJ3b3JkIiBhbmQgaWQgPT0gZ2x1ZV9jb2RlIHRoZW4NCiAgICAg ICAgICAgICAgICBsb2NhbCBzID0gZ2V0c3VidHlwZShjdXJyZW50KQ0KICAgICAgICAgICAg ICAgIGlmIHMgPT0gc3BhY2Vza2lwX2NvZGUgb3IgcyA9PSB4c3BhY2Vza2lwX2NvZGUgdGhl bg0KICAgICAgICAgICAgICAgICAgICBsb2NhbCByID0gcm9vdFszMl0gLS0gbWF5YmUgbW9y ZSB0eXBlcw0KICAgICAgICAgICAgICAgICAgICBpZiByIHRoZW4NCiAgICAgICAgICAgICAg ICAgICAgICAgIGlmIG5vdCBwcmV2ZW5kIHRoZW4NCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICBsb2NhbCBmID0gcm9vdC5maW5hbA0KICAgICAgICAgICAgICAgICAgICAgICAgICAg IGlmIGYgdGhlbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZW5kICAg PSB3b3JkZW5kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZmaW5hbCA9 IGYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQNCiAgICAgICAgICAgICAgICAg ICAgICAgIGVuZA0KICAgICAgICAgICAgICAgICAgICAgICAgd29yZGVuZCAgPSBjdXJyZW50 DQogICAgICAgICAgICAgICAgICAgICAgICByb290ICAgICA9IHINCiAgICAgICAgICAgICAg ICAgICAgICAgIGhhc3NwYWNlID0gdHJ1ZQ0KICAgICAgICAgICAgICAgICAgICAgICAgZ290 byBtb3Zlb24NCiAgICAgICAgICAgICAgICAgICAgZW5kDQogICAgICAgICAgICAgICAgZW5k DQogICAgICAgICAgICBlbmQNCiAgICAgICAgICAgIGlmIGZpbmFsIHRoZW4NCiAgICAgICAg ICAgICAgICBoZWFkLCBjdXJyZW50ID0gcmVwbGFjZShoZWFkLHdvcmRzdGFydCx3b3JkZW5k LGZpbmFsLGhhc3NwYWNlLG92ZXJsb2FkKQ0KICAgICAgICAgICAgZWxzZWlmIHByZXZmaW5h bCB0aGVuDQogICAgICAgICAgICAgICAgaGVhZCwgY3VycmVudCA9IHJlcGxhY2UoaGVhZCx3 b3Jkc3RhcnQscHJldmVuZCxwcmV2ZmluYWwsaGFzc3BhY2Usb3ZlcmxvYWQpDQogICAgICAg ICAgICBlbmQNCiAgICAgICAgICAgIHByZXZmaW5hbCA9IGZhbHNlDQogICAgICAgICAgICBy b290ID0gZmFsc2UNCiAgICAgICAgICA6Om1vdmVvbjo6DQogICAgICAgICAgICBjdXJyZW50 ID0gZ2V0bmV4dChjdXJyZW50KQ0KICAgICAgICBlbHNlDQogICAgICAgICAgICBjdXJyZW50 ID0gZ2V0bmV4dChjdXJyZW50KQ0KICAgICAgICBlbmQNCiAgICBlbmQNCiAgICBpZiByb290 IHRoZW4NCiAgICAgICAgbG9jYWwgZmluYWwgPSByb290LmZpbmFsDQogICAgICAgIGlmIGZp bmFsIHRoZW4NCiAgICAgICAgICAgIGhlYWQgPSByZXBsYWNlKGhlYWQsd29yZHN0YXJ0LHdv cmRlbmQsZmluYWwsaGFzc3BhY2Usb3ZlcmxvYWQpDQogICAgICAgIGVsc2VpZiBwcmV2Zmlu YWwgdGhlbg0KICAgICAgICAgICAgaGVhZCA9IHJlcGxhY2UoaGVhZCx3b3Jkc3RhcnQscHJl dmVuZCxwcmV2ZmluYWwsaGFzc3BhY2Usb3ZlcmxvYWQpDQogICAgICAgIGVuZA0KICAgIGVu ZA0KICAgIHJldHVybiBoZWFkDQplbmQNCg0KbG9jYWwgZW5hYmxlZCA9IGZhbHNlDQoNCmZ1 bmN0aW9uIHJlcGxhY2VtZW50cy5zZXQobikNCiAgICBpZiBuID09IHZfcmVzZXQgdGhlbg0K ICAgICAgICBuID0gdW5zZXR2YWx1ZQ0KICAgIGVsc2UNCiAgICAgICAgbiA9IGxpc3RzW25d LmF0dHJpYnV0ZQ0KICAgICAgICBpZiBub3QgZW5hYmxlZCB0aGVuDQogICAgICAgICAgICBl bmFibGVhY3Rpb24oInByb2Nlc3NvcnMiLCJsYW5ndWFnZXMucmVwbGFjZW1lbnRzLmhhbmRs ZXIiKQ0KICAgICAgICAgICAgaWYgdHJhY2VfcmVwbGFjZW1lbnRzIHRoZW4NCiAgICAgICAg ICAgICAgICByZXBvcnRfcmVwbGFjZW1lbnQoImVuYWJsaW5nIHJlcGxhY2VtZW50IGhhbmRs ZXIiKQ0KICAgICAgICAgICAgZW5kDQogICAgICAgICAgICBlbmFibGVkID0gdHJ1ZQ0KICAg ICAgICBlbmQNCiAgICBlbmQNCiAgICB0ZXhzZXRhdHRyaWJ1dGUoYV9yZXBsYWNlbWVudHMs bikNCmVuZA0KDQotLSBpbnRlcmZhY2UNCg0KaW1wbGVtZW50IHsNCiAgICBuYW1lICAgICAg PSAic2V0cmVwbGFjZW1lbnRzIiwNCiAgICBhY3Rpb25zICAgPSByZXBsYWNlbWVudHMuc2V0 LA0KICAgIGFyZ3VtZW50cyA9ICJzdHJpbmciDQp9DQoNCmltcGxlbWVudCB7DQogICAgbmFt ZSAgICAgID0gImFkZHJlcGxhY2VtZW50cyIsDQogICAgYWN0aW9ucyAgID0gcmVwbGFjZW1l bnRzLmFkZCwNCiAgICBhcmd1bWVudHMgPSAiMyBzdHJpbmdzIiwNCn0NCg0KaW1wbGVtZW50 IHsNCiAgICBuYW1lICAgICAgPSAiYWRkcmVwbGFjZW1lbnRzbGlzdCIsDQogICAgYWN0aW9u cyAgID0gcmVwbGFjZW1lbnRzLmFkZGxpc3QsDQogICAgYXJndW1lbnRzID0gIjIgc3RyaW5n cyIsDQp9DQo= --------------FBFFA5DFDC35042DBAAB92DA Content-Type: text/plain; charset=UTF-8; name="lang-rep.mkxl" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="lang-rep.mkxl" JUQgXG1vZHVsZQ0KJUQgICBbICAgICAgIGZpbGU9bGFuZy1yZXAsDQolRCAgICAgICAgdmVy c2lvbj0yMDEzLjA0LjI4LA0KJUQgICAgICAgICAgdGl0bGU9XENPTlRFWFRcIExhbmd1YWdl IE1hY3JvcywNCiVEICAgICAgIHN1YnRpdGxlPVN1YnN0aXR1dGlvbiwNCiVEICAgICAgICAg YXV0aG9yPUhhbnMgSGFnZW4sDQolRCAgICAgICAgICAgZGF0ZT1cY3VycmVudGRhdGUsDQol RCAgICAgIGNvcHlyaWdodD17UFJBR01BIEFERSBcJiBcQ09OVEVYVFwgRGV2ZWxvcG1lbnQg VGVhbX1dDQolQw0KJUMgVGhpcyBtb2R1bGUgaXMgcGFydCBvZiB0aGUgXENPTlRFWFRcIG1h Y3JvfHxwYWNrYWdlIGFuZCBpcw0KJUMgdGhlcmVmb3JlIGNvcHlyaWdodGVkIGJ5IFxQUkFH TUEuIFNlZSBtcmVhZG1lLnBkZiBmb3INCiVDIGRldGFpbHMuDQoNCiVEIEFzIEkgbmVlZGVk IGFuIGV4YW1wbGUgb2YgbWVzc2luZyB3aXRoIG5vZGVzIGZvciB0aGUgYmFjaG9cVEVYXCB0 dXRvcmlhbA0KJUQgSSBjb29rZWQgdXAgdGhpcy4gSW4gdGhlIGVuZCBJIGRlY2lkZWQgdG8g c3RpY2sgdG8gYSBzaW1wbGVyIGV4YW1wbGUgYW5kDQolRCBqdXN0IGZpbmlzaGVkIHRoaXMg b2ZmIGluIGNhc2Ugc29tZW9uZSByZWFsbHkgbmVlZHMgaXQuDQoNClx3cml0ZXN0YXR1c3ts b2FkaW5nfXtDb25UZVh0IExhbmd1YWdlIE1hY3JvcyAvIFJlcGxhY2VtZW50c30NCg0KXHVu cHJvdGVjdA0KDQpccmVnaXN0ZXJjdHhsdWFmaWxle2xhbmctcmVwfXthdXRvc3VmZml4fQ0K DQpcZGVmaW5lc3lzdGVtYXR0cmlidXRlW3JlcGxhY2VtZW50c11bcHVibGljLGdsb2JhbF0N Cg0KJUQgXHN0YXJ0bHVhY29kZQ0KJUQNCiVEICAgICAtLSB0b2RvOiBvdGhlciBub2RlcyAo cHJlbHVkZSB0byBtb3JlIGV4cGVyaW1lbnRzIHdpdGggYXV0byBkcm9wcGVkIGNhcHMpDQol RA0KJUQgICAgIGxhbmd1YWdlcy5yZXBsYWNlbWVudHMuYWRkKCJiYXNpY3MiLCB7DQolRCAg ICAgICAgIFsiYWFwIl0gICA9ICJtb25rZXkiLA0KJUQgICAgICAgICBbIm5vb3QiXSAgPSAi bnV0IiwNCiVEICAgICAgICAgWyJuZXZlciJdID0gImZvcmV2ZXIiLA0KJUQgICAgICAgICBb Im5ld2VyIl0gPSAiY29vbGVyIiwNCiVEICAgICAgICAgWyJuZXciXSAgID0gImNvb2wiLA0K JUQgICAgICAtLSBbInNwZWNpYWwiXSA9ICJ2ZXJ5c3Blez4+Pn17PDw8fXs9fWNpYWwiLA0K JUQgICAgIH0pDQolRA0KJUQgXHN0b3BsdWFjb2RlDQolRA0KJUQgXHJlcGxhY2V3b3JkW21v cmVdW3RoaXNdW3RoYXRdDQolRCBccmVwbGFjZXdvcmRbbW9yZV1bY3JhcF1bc3VwcG9ydF0N CiVEIFxyZXBsYWNld29yZFttb3JlXVstLS1dW+KAlF0NCiVEIFxyZXBsYWNld29yZFtiYXNp Y3NdW3NwZWNpYWxdW3ZlcnlzcGV7Pj4+fXs8PDx9ez19Y2lhbF0NCiVEDQolRCBcc3RhcnR0 eXBpbmcNCiVEIFxzdGFydCBcc2V0cmVwbGFjZW1lbnRzW2Jhc2ljc10gV2hhdCB0aGUgaGVj aywgaXQncyBub3cgb3IgbmV2ZXIsIGlzbid0IGl0IG5ldz8gXHBhciBcc3RvcA0KJUQgXHN0 YXJ0IFxzZXRyZXBsYWNlbWVudHNbbW9yZV0gICBEbyB3ZSAtLS0ge1xpdCByZWFsbHl9IC0t LSBuZWVkIHRoaXMga2luZCBvZiBjcmFwPyBccGFyIFxzdG9wDQolRCBcc3RhcnQgXHNldHJl cGxhY2VtZW50c1tiYXNpY3NdIEFsbCBraW5kcyBvZiBzcGVjaWFsIHRoaW5naWVzISBccGFy IFxzdG9wDQolRCBcc3RhcnQgXHNldHJlcGxhY2VtZW50c1tiYXNpY3NdIFxoc2l6ZTFtbSBz cGVjaWFsIFxwYXIgXHN0b3ANCiVEIFxzdG9wdHlwaW5nDQoNClxwZXJtYW5lbnRccHJvdGVj dGVkXGRlZlxzZXRyZXBsYWNlbWVudHNbIzFdJQ0KICB7XGNsZl9zZXRyZXBsYWNlbWVudHN7 IzF9fQ0KDQpccGVybWFuZW50XHByb3RlY3RlZFxkZWZccmVzZXRyZXBsYWNlbWVudHMNCiAg e1xjX2F0dHJfcmVwbGFjZW1lbnRzXGF0dHJpYnV0ZXVuc2V0dmFsdWV9DQoNClxwZXJtYW5l bnRcdG9sZXJhbnRccHJvdGVjdGVkXGRlZlxyZXBsYWNld29yZFsjMV0jKlsjMl0jKlsjM10l DQogIHtcaWZhcmd1bWVudHNcb3Jcb3INCiAgICAgXGNsZl9hZGRyZXBsYWNlbWVudHNsaXN0 eyMxfXsjMn0lDQogICBcb3INCiAgICAgXGNsZl9hZGRyZXBsYWNlbWVudHN7IzF9eyMyfXsj M30lDQogICBcZml9DQoNClxhcHBlbmR0b2tzDQogICAgXHJlc2V0cmVwbGFjZW1lbnRzDQpc dG8gXGV2ZXJ5cmVzZXR0eXBlc2V0dGluZw0KDQpcYXBwZW5kdG9rcw0KICAgIFxyZXNldHJl cGxhY2VtZW50cw0KXHRvIFxldmVyeWluaXRpYWxpemV2ZXJiYXRpbQ0KDQpccHJvdGVjdCBc ZW5kaW5wdXQNCg== --------------FBFFA5DFDC35042DBAAB92DA Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: inline X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KSWYgeW91ciBxdWVzdGlvbiBpcyBvZiBpbnRlcmVz dCB0byBvdGhlcnMgYXMgd2VsbCwgcGxlYXNlIGFkZCBhbiBlbnRyeSB0byB0aGUgV2lraSEKCm1h aWxsaXN0IDogbnRnLWNvbnRleHRAbnRnLm5sIC8gaHR0cDovL3d3dy5udGcubmwvbWFpbG1hbi9s aXN0aW5mby9udGctY29udGV4dAp3ZWJwYWdlICA6IGh0dHA6Ly93d3cucHJhZ21hLWFkZS5ubCAv IGh0dHA6Ly9jb250ZXh0LmFhbmhldC5uZXQKYXJjaGl2ZSAgOiBodHRwczovL2JpdGJ1Y2tldC5v cmcvcGhnL2NvbnRleHQtbWlycm9yL2NvbW1pdHMvCndpa2kgICAgIDogaHR0cDovL2NvbnRleHRn YXJkZW4ubmV0Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCg== --------------FBFFA5DFDC35042DBAAB92DA--