From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Francois Fleuret Newsgroups: gmane.emacs.devel Subject: A dynamic pattern-matching Date: Tue, 3 Mar 2009 09:23:39 +0100 Message-ID: <18860.59659.494547.384677@moose.fleuret.org> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="EDWvEV4ID4" Content-Transfer-Encoding: 7bit X-Trace: ger.gmane.org 1236104362 7463 80.91.229.12 (3 Mar 2009 18:19:22 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Tue, 3 Mar 2009 18:19:22 +0000 (UTC) To: emacs-devel@gnu.org Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Tue Mar 03 19:20:35 2009 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1LeZDy-0002Rw-2k for ged-emacs-devel@m.gmane.org; Tue, 03 Mar 2009 19:20:22 +0100 Original-Received: from localhost ([127.0.0.1]:57939 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LeZCa-0006Ct-Lc for ged-emacs-devel@m.gmane.org; Tue, 03 Mar 2009 13:18:48 -0500 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LePwU-0001NF-AG for emacs-devel@gnu.org; Tue, 03 Mar 2009 03:25:34 -0500 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LePwS-0001LT-VP for emacs-devel@gnu.org; Tue, 03 Mar 2009 03:25:33 -0500 Original-Received: from [199.232.76.173] (port=43360 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LePwS-0001L1-K0 for emacs-devel@gnu.org; Tue, 03 Mar 2009 03:25:32 -0500 Original-Received: from mx20.gnu.org ([199.232.41.8]:43578) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LePwS-0003ko-3A for emacs-devel@gnu.org; Tue, 03 Mar 2009 03:25:32 -0500 Original-Received: from barracuda.idiap.ch ([192.33.221.13]) by mx20.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1LePwL-0003pA-25 for emacs-devel@gnu.org; Tue, 03 Mar 2009 03:25:26 -0500 X-ASG-Debug-ID: 1236068657-6c49006e0000-uRBjzT X-Barracuda-URL: http://barracuda.idiap.ch:8000/cgi-bin/mark.cgi Original-Received: from mail02.vs.idiap.ch (localhost [127.0.0.1]) by barracuda.idiap.ch (Spam Firewall) with ESMTP id 0B043354E7B for ; Tue, 3 Mar 2009 09:24:50 +0100 (CET) Original-Received: from mail02.vs.idiap.ch (mail02.vs.idiap.ch [172.17.90.82]) by barracuda.idiap.ch with ESMTP id lgxP1bA0zQ0pl1GE (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO) for ; Tue, 03 Mar 2009 09:24:50 +0100 (CET) X-ASG-Whitelist: Client Original-Received: from idiap.ch (unknown [172.24.3.15]) (using SSLv3 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail02.vs.idiap.ch (Postfix) with ESMTPSA id 74DE48112; Tue, 3 Mar 2009 09:23:45 +0100 (CET) Original-Received: by idiap.ch (Postfix, from userid 1000) id 912C48BC048; Tue, 3 Mar 2009 09:23:39 +0100 (CET) X-ASG-Orig-Subj: A dynamic pattern-matching X-Mailer: VM 8.0.9 under Emacs 23.0.90.1 (i686-pc-linux-gnu) X-Barracuda-Connect: mail02.vs.idiap.ch[172.17.90.82] X-Barracuda-Start-Time: 1236068699 X-Barracuda-Encrypted: AES256-SHA X-Barracuda-Virus-Scanned: by Barracuda Spam Firewall at idiap.ch X-detected-kernel: by mx20.gnu.org: Linux 2.4-2.6 X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6, seldom 2.4 (older, 4) X-Mailman-Approved-At: Tue, 03 Mar 2009 13:17:51 -0500 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:109416 Archived-At: --EDWvEV4ID4 Content-Type: text/plain; charset=us-ascii Content-Description: message body and .signature Content-Transfer-Encoding: 7bit Dear Emacs developers, I wrote a dynamic pattern-matching that restricts in real-time the display of a list of items to the ones matching the typed pattern. Since it uses a standard buffer it shows the said list over a large visual space, which is very practical. Among other things, it provides an efficient way of visiting a file picked in recentf-list. To try it, you just need the file selector.el attached and something like this in your ~/.emacs.el (when (load "selector" t) (define-key global-map [(control x) (control b)] 'selector/switch-buffer) (define-key global-map [(control x) (control q)] 'selector/quick-pick-recent) ) As far as I could test, it works with emacs21, emacs22 and emacs CVS. Regards, -- Francois Fleuret http://www.idiap.ch/~fleuret/ --EDWvEV4ID4 Content-Type: application/octet-stream; name="selector.el" Content-Disposition: attachment; filename="selector.el" Content-Transfer-Encoding: base64 OzsgLSotIG1vZGU6IGVtYWNzLWxpc3AgLSotCgo7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKOzsgVGhpcyBw cm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAg ICAgICAgIDs7Cjs7IG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlIGFzICAgICAgICA7Owo7OyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29m dHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMywgb3IgKGF0ICAgOzsKOzsgeW91ciBv cHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDs7Cjs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICA7Owo7OyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0 ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0ICAgOzsKOzsgV0lUSE9V VCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAg ICAgICAgIDs7Cjs7IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg UFVSUE9TRS4gU2VlIHRoZSBHTlUgICAgICA7Owo7OyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv ciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsKOzsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDs7Cjs7IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBH ZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICA7Owo7OyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4g SWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgOzsKOzsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDs7Cjs7IFdyaXR0ZW4gYnkgYW5kIENvcHlyaWdodCAoQykgRnJhbmNvaXMgRmxldXJl dCAgICAgICAgICAgICAgICAgICAgICAgICA7Owo7OyBDb250YWN0IDxmcmFuY29pc0BmbGV1cmV0 Lm9yZz4gZm9yIGNvbW1lbnRzICYgYnVnIHJlcG9ydHMgICAgICAgICAgICAgOzsKOzs7Ozs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7Ozs7Ozs7Cgo7OyBUaGUgc2VsZWN0b3Ivc2VsZWN0IGZ1bmN0aW9uIHByb3ZpZGVzIGEgc2lt cGxlIGludGVyZmFjZSBmb3IKOzsgc2VsZWN0aW5nIGFuIG9iamVjdCB3aXRoIG9uLXRoZS1mbHkg cGF0dGVybiBtYXRjaGluZyBpbiBhIHN0YW5kYXJkCjs7IGJ1ZmZlciAoaS5lLiBub3QgaW4gdGhl IG1pbmlidWZmZXIpLiBZb3UgY2FuIGVpdGhlciB1c2UgaXQgaW4geW91cgo7OyBvd24gZnVuY3Rp b25zIG9yIGRpcmVjdGx5IHVzZSBzZWxlY3Rvci9xdWljay1waWNrLXJlY2VudCBvcgo7OyBzZWxl Y3Rvci9xdWljay1tb3ZlLWluLWJ1ZmZlci4KOzsKOzsgRm9yIGluc3RhbmNlLCB5b3UgY2FuIGFk ZCBpbiB5b3VyIC5lbWFjcy5lbAo7Owo7OyAocmVxdWlyZSAncmVjZW50ZikKOzsgKHJlY2VudGYt bW9kZSAxKQo7Owo7OyAod2hlbiAobG9hZCAic2VsZWN0b3IiIHQgdCkKOzsgICAoZGVmaW5lLWtl eSBnbG9iYWwtbWFwIFsoY29udHJvbCB4KSAoY29udHJvbCByKV0gJ3NlbGVjdG9yL3F1aWNrLXBp Y2stcmVjZW50KQo7OyAgIChkZWZpbmUta2V5IGdsb2JhbC1tYXAgWyhjb250cm9sIGMpIChjb250 cm9sIHMpXSAnc2VsZWN0b3IvcXVpY2stbW92ZS1pbi1idWZmZXIpCjs7ICAgKGRlZmluZS1rZXkg Z2xvYmFsLW1hcCBbKGNvbnRyb2wgeCkgKGNvbnRyb2wgYildICdzZWxlY3Rvci9zd2l0Y2gtYnVm ZmVyKQo7OyApCgooZGVmZ3JvdXAgc2VsZWN0b3IgKCkKICAiTWFqb3IgbW9kZSBmb3Igc2VsZWN0 aW9uIG9mIGVudHJpZXMgd2l0aCBkeW5hbWljIHBhdHRlcm4gbWF0Y2hpbmciCiAgOnZlcnNpb24g IjEuMi4zIikKCjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Owo7OyBVc2VyLWNvbmZpZ3VyYWJsZSB2YXJpYWJs ZXMKOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7CgooZGVmY3VzdG9tIHNlbGVjdG9yL21lbW9yaXplLWVudHJ5 LW9ubHktb24tbW90aW9ucyB0CiAgIklmIG5vbi1uaWwsIG9ubHkgdGhlIGN1cnNvciBtb3Rpb25z IG1lbW9yaXplIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KUmVzdHJpY3Rpb24gb2YgdGhlIHNlbGVj dGlvbiBkb2VzIG5vdC4gVGhpcyBtZWFucyB0aGF0IGlmIHlvdQpjaGFuZ2UgdGhlIHBhdHRlcm4g YW5kIHRoZW4gZWRpdCBpdCB0byBjYW5jZWwgdGhlIGNoYW5nZSwgdGhlCmN1cnNvciB3aWxsIGNv bWUgYmFjayB0byBpdHMgb3JpZ2luYWwgbG9jYXRpb24sIHVubGVzcyB5b3UgaGF2ZQpleHBsaWNp dGVseSBtb3ZlZCBpdCB3aXRoIHRoZSBhcnJvdyBrZXlzIGF0IHNvbWUgcG9pbnQuIgogIDp0eXBl ICdib29sCiAgOmdyb3VwICdzZWxlY3RvcikKCihkZWZjdXN0b20gc2VsZWN0b3IvaW5mby1pbi1t b2RlLWxpbmUgbmlsCiAgIklmIG5pbCwgdGhlIHBhdHRlcm4gaXMgc2hvd24gaW4gdGhlIG1lbnUg aGVhZGVyLgpPdGhlcndpc2UgdXNlIHRoZSBtb2RlLWxpbmUuIgogIDp0eXBlICdib29sCiAgOmdy b3VwICdzZWxlY3RvcikKCihkZWZjdXN0b20gc2VsZWN0b3IvYWx3YXlzLWNyZWF0ZS1idWZmZXIg bmlsCiAgIklmIG5pbCwgcmUtdXNlIGV4aXN0aW5nIHNpbWlsYXIgYnVmZmVyIHdoZW4gcG9zc2li bGUuIgogIDp0eXBlICdib29sCiAgOmdyb3VwICdzZWxlY3RvcikKCjs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 OwoKKGRlZmZhY2Ugc2VsZWN0b3Ivc2VsZWN0aW9uCiAgOzsgJygodCAoOmJvbGQgdCkpKQogICco KHQgKDpiYWNrZ3JvdW5kICJjaGFydHJldXNlIikpKQogICJUaGUgZmFjZSBmb3IgdGhlIGN1cnJl bnQgc2VsZWN0aW9uLiIpCgooZGVmZmFjZSBzZWxlY3Rvci9kaW0KICAnKCh0ICg6Zm9yZWdyb3Vu ZCAiZ3JheTcwIikpKQogICJUaGUgZmFjZSBmb3IgZGltbWVkIGVudHJpZXMuIikKCihkZWZmYWNl IHNlbGVjdG9yL2RhdGUKICAnKCh0ICg6Zm9yZWdyb3VuZCAiZGFyayB2aW9sZXQiKSkpCiAgIlRo ZSBmYWNlIGZvciB0aGUgZGF0ZXMgaW4gc2VsZWN0b3IvcXVpY2stcGljay1yZWNlbnQuIikKCjs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7OwoKKGRlZnZhciBzZWxlY3Rvci9wYXR0ZXJuCiAgIiIKICAiVGhlIHBh dHRlcm4gdG8gbWF0Y2ggdG8gYXBwZWFyIGluIHRoZSBzZWxlY3RvciBidWZmZXIuIikKCjs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7Ozs7Ozs7Ozs7OwoKKGRlZnVuIHNlbGVjdG9yL3N0cmluZy1tYXRjaC1hbGwgKHJlZ2V4cHMg c3RyaW5nKQogICJSZXR1cm4gaWYgU1RSSU5HIG1hdGNoZXMgYWxsIHJlZ3VsYXIgZXhwcmVzc2lv bnMgaW4gUkVHRVhQUy4iCiAgKGlmIHJlZ2V4cHMKICAgICAgKGFuZCAoc3RyaW5nLW1hdGNoIChj YXIgcmVnZXhwcykgc3RyaW5nKQogICAgICAgICAgIChzZWxlY3Rvci9zdHJpbmctbWF0Y2gtYWxs IChjZHIgcmVnZXhwcykgc3RyaW5nKSkKICAgIHQpKQoKOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7CgooZGVm dW4gc2VsZWN0b3IvbW92ZS1oaWdobGlnaHQtb3ZlcmxheSAoKQogICJNb3ZlIHRoZSBoaWdobGln aHQgb3ZlcmxheSB0byBoaWdobGlnaHQgdGhlIGN1cnJlbnQgbGluZS4iCiAgKGlmIChnZXQtdGV4 dC1wcm9wZXJ0eSAocG9pbnQpICdlbnRyeSkKICAgICAgKG1vdmUtb3ZlcmxheSBzZWxlY3Rvci9o aWdobGlnaHQtb3ZlcmxheQogICAgICAgICAgICAgICAgICAgIChvciAocHJldmlvdXMtc2luZ2xl LXByb3BlcnR5LWNoYW5nZSAoMSsgKHBvaW50KSkgJ2VudHJ5KQogICAgICAgICAgICAgICAgICAg ICAgICAocG9pbnQtbWluKSkKICAgICAgICAgICAgICAgICAgICAob3IgKG5leHQtc2luZ2xlLXBy b3BlcnR5LWNoYW5nZSAocG9pbnQpICdlbnRyeSkKICAgICAgICAgICAgICAgICAgICAgICAgKHBv aW50LW1heCkpKQogICAgKG1vdmUtb3ZlcmxheSBzZWxlY3Rvci9oaWdobGlnaHQtb3ZlcmxheSAw IDApCiAgICApCgogICh1bmxlc3MgKGFuZCBzZWxlY3Rvci9tZW1vcml6ZS1lbnRyeS1vbmx5LW9u LW1vdGlvbnMKICAgICAgICAgICAgICAgKG1lbXEgdGhpcy1jb21tYW5kCiAgICAgICAgICAgICAg ICAgICAgICcoc2VsZWN0b3IvZGVsZXRlLWJhY2t3YXJkLWNoYXIKICAgICAgICAgICAgICAgICAg ICAgICBzZWxlY3Rvci9zZWxmLWluc2VydC1jb21tYW5kKSkpCiAgICAoc2V0cSBzZWxlY3Rvci9j dXJyZW50LWVudHJ5IChnZXQtdGV4dC1wcm9wZXJ0eSAocG9pbnQpICdlbnRyeSkpKQogICkKCihk ZWZ1biBzZWxlY3Rvci9yZWZyZXNoICgpCiAgIkVyYXNlIGFuZCByZWNvbnN0cnVjdCB0aGUgY29u dGVudCBvZiB0aGUgY3VycmVudCBidWZmZXIKYWNjb3JkaW5nIHRvIGBzZWxlY3Rvci9lbnRyaWVz JyBhbmQgYHNlbGVjdG9yL3BhdHRlcm4nLiIKCiAgKGxldCAoKGluaGliaXQtcmVhZC1vbmx5IHQp CiAgICAgICAgKHBvcyAocG9pbnQpKQogICAgICAgIChsaW5lLWJlZ2lubmluZyAobGluZS1iZWdp bm5pbmctcG9zaXRpb24pKQogICAgICAgIChyZWdleHBzIChtYXBjYXIgJ3JlZ2V4cC1xdW90ZSAo c3BsaXQtc3RyaW5nIHNlbGVjdG9yL3BhdHRlcm4gIjsiKSkpCiAgICAgICAgKG5ld3BvcyAocG9p bnQpKQogICAgICAgIChuYi1zaG93bi1lbnRyaWVzIDApKQoKICAgIChlcmFzZS1idWZmZXIpCgog ICAgKG1hcGMgKGxhbWJkYSAocykKICAgICAgICAgICAgKHdoZW4gKHNlbGVjdG9yL3N0cmluZy1t YXRjaC1hbGwgcmVnZXhwcyAoY2FyIHMpKQogICAgICAgICAgICAgIChzZXRxIG5iLXNob3duLWVu dHJpZXMgKDErIG5iLXNob3duLWVudHJpZXMpKQogICAgICAgICAgICAgIChpZiAoZXEgKGNkciBz KSBzZWxlY3Rvci9jdXJyZW50LWVudHJ5KQogICAgICAgICAgICAgICAgICAoc2V0cSBuZXdwb3Mg KCsgKC0gcG9zIGxpbmUtYmVnaW5uaW5nKSAocG9pbnQpKSkpCiAgICAgICAgICAgICAgKGluc2Vy dAogICAgICAgICAgICAgICAocHJvcGVydGl6ZSAoY29uY2F0IChjYXIgcykgIlxuIikKICAgICAg ICAgICAgICAgICAgICAgICAgICAgJ2VudHJ5IChjZHIgcykKICAgICAgICAgICAgICAgICAgICAg ICAgICAgOzsgJ2ZhY2UgJ2NvbXBpbGF0aW9uLWVycm9yCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICkpKSkKICAgICAgICAgIHNlbGVjdG9yL2VudHJpZXMpCgogICAgKHNldHEgbmV3cG9zICht aW4gbmV3cG9zIChwb2ludC1tYXgpKSkKICAgIChzZXRxIHNlbGVjdG9yL25iLXNob3duLWVudHJp ZXMgKG51bWJlci10by1zdHJpbmcgbmItc2hvd24tZW50cmllcykpCgogICAgKGdvdG8tY2hhciAo b3IgKGFuZCAoZ2V0LXRleHQtcHJvcGVydHkgbmV3cG9zICdlbnRyeSkgbmV3cG9zKQogICAgICAg ICAgICAgICAgICAgKHByZXZpb3VzLXNpbmdsZS1wcm9wZXJ0eS1jaGFuZ2UgbmV3cG9zICdlbnRy eSkKICAgICAgICAgICAgICAgICAgIChwb2ludC1tYXgpKSkKCiAgICAoYmVnaW5uaW5nLW9mLWxp bmUpCiAgICAoZm9yY2UtbW9kZS1saW5lLXVwZGF0ZSkKICAgICkpCgo7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 OzsKCihkZWZ1biBzZWxlY3Rvci9zZWxmLWluc2VydC1jb21tYW5kICgpCiAgIkluc2VydCB0aGUg bGFzdCBwcmVzc2VkIGtleSBhdCB0aGUgZW5kIG9mIGBzZWxlY3Rvci9wYXR0ZXJuJy4iCiAgKGlu dGVyYWN0aXZlKQogIChzZXRxIHNlbGVjdG9yL3BhdHRlcm4gKGNvbmNhdCBzZWxlY3Rvci9wYXR0 ZXJuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLWNvbW1hbmQta2V5cykp KQogIChzZWxlY3Rvci9yZWZyZXNoKQogICkKCihkZWZ1biBzZWxlY3Rvci9kZWxldGUtYmFja3dh cmQtY2hhciAoKQogICJSZW1vdmUgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIGBzZWxlY3Rvci9wYXR0 ZXJuJy4iCiAgKGludGVyYWN0aXZlKQogICh3aGVuICg+IChsZW5ndGggc2VsZWN0b3IvcGF0dGVy bikgMCkKICAgIChzZXRxIHNlbGVjdG9yL3BhdHRlcm4gKHN1YnN0cmluZyBzZWxlY3Rvci9wYXR0 ZXJuIDAgLTEpKSkKICAoc2VsZWN0b3IvcmVmcmVzaCkKICApCgooZGVmdW4gc2VsZWN0b3Iva2ls bC1saW5lICgpCiAgIk1vdmUgdGhlIGNvbnRlbnQgb2YgYHNlbGVjdG9yL3BhdHRlcm4nIHRvIHRo ZSBraWxsIHJpbmcuIgogIChpbnRlcmFjdGl2ZSkKICAoa2lsbC1uZXcgc2VsZWN0b3IvcGF0dGVy biB0KQogIChzZXRxIHNlbGVjdG9yL3BhdHRlcm4gIiIpCiAgKHNlbGVjdG9yL3JlZnJlc2gpKQoK KGRlZnVuIHNlbGVjdG9yL3lhbmsgKCZvcHRpb25hbCBhcmcpCiAgIkFwcGVuZCB0aGUgY29udGVu dCBvZiB0aGUga2lsbCByaW5nIHRvIGBzZWxlY3Rvci9wYXR0ZXJuJy4iCiAgKGludGVyYWN0aXZl ICJQIikKICAoc2V0cSBzZWxlY3Rvci9wYXR0ZXJuIChjb25jYXQgc2VsZWN0b3IvcGF0dGVybgog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudC1raWxsIChjb25kCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobGlzdHAgYXJnKSAw KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGVxIGFy ZyAnLSkgLTIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICh0ICgxLSBhcmcpKSkpKSkKICAoc2VsZWN0b3IvcmVmcmVzaCkpCgooZGVmdW4gc2VsZWN0b3Iv cmV0dXJuICgpCiAgIkNhbGwgdGhlIGZ1bmN0aW9uIHNwZWNpZmllZCBieSBgc2VsZWN0b3IvY2Fs bGJhY2snIHdpdGggdGhlCmVudHJ5IGF0IHBvaW50IGFzIHBhcmFtZXRlci4iCiAgKGludGVyYWN0 aXZlKQogIChsZXQgKChyZXN1bHQgKGdldC10ZXh0LXByb3BlcnR5IChwb2ludCkgJ2VudHJ5KSkK ICAgICAgICAoY2FsbGJhY2sgc2VsZWN0b3IvY2FsbGJhY2spKQogICAgKGtpbGwtdGhpcy1idWZm ZXIpCiAgICAoaWYgcmVzdWx0IChmdW5jYWxsIGNhbGxiYWNrIHJlc3VsdCkKICAgICAgKGVycm9y ICJObyBzZWxlY3Rpb24iKSkpKQoKKGRlZnVuIHNlbGVjdG9yL2dvdG8tbmV4dC1lbnRyeSAoKQog ICJNb3ZlIHBvaW50IHRvIHRoZSBuZXh0IGVudHJ5LiIKICAoaW50ZXJhY3RpdmUpCiAgKGxldCAo KG4gKG9yIChuZXh0LXNpbmdsZS1wcm9wZXJ0eS1jaGFuZ2UgKHBvaW50KSAnZW50cnkpCiAgICAg ICAgICAgICAgIChwb2ludC1taW4pKSkpCiAgICAoaWYgbiAoZ290by1jaGFyIG4pKSkpCgooZGVm dW4gc2VsZWN0b3IvZ290by1wcmV2aW91cy1lbnRyeSAoKQogICJNb3ZlIHBvaW50IHRvIHRoZSBw cmV2aW91cyBlbnRyeS4iCiAgKGludGVyYWN0aXZlKQogIChsZXQgKChuIChvciAocHJldmlvdXMt c2luZ2xlLXByb3BlcnR5LWNoYW5nZSAocG9pbnQpICdlbnRyeSkKICAgICAgICAgICAgICAgKHBy ZXZpb3VzLXNpbmdsZS1wcm9wZXJ0eS1jaGFuZ2UgKHBvaW50LW1heCkgJ2VudHJ5KSkpKQogICAg KGlmIG4gKGdvdG8tY2hhciBuKSkpKQoKOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7CgooZGVmdW4gc2VsZWN0 b3IvbW9kZSAoKQogICJNb2RlIGZvciBzZWxlY3Rpb24gb2Ygc3RyaW5ncy4gU2VlIGBzZWxlY3Rv ci9zZWxlY3QnIGZvciBhCmRldGFpbGVkIGV4cGxhbmF0aW9uLiIKCiAgKHVubGVzcyAoYm91bmRw ICdzZWxlY3Rvci9tYXApCiAgICAoc2V0cSBzZWxlY3Rvci9tYXAgKG1ha2Utc3BhcnNlLWtleW1h cCkpCgogICAgKG1hcGMgKGxhbWJkYSAocCkKICAgICAgICAgICAgKHN1YnN0aXR1dGUta2V5LWRl ZmluaXRpb24gKGNhciBwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo Y2RyIHApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yL21h cCBnbG9iYWwtbWFwKQogICAgICAgICAgICApCgogICAgICAgICAgOzsgV2hhdCBhcmUgdGhlIGZ1 bmN0aW9ucyB0byBzdWJzdGl0dXRlIGJ5IHdoYXQKICAgICAgICAgICcoKHNlbGYtaW5zZXJ0LWNv bW1hbmQgLiBzZWxlY3Rvci9zZWxmLWluc2VydC1jb21tYW5kKQogICAgICAgICAgICAoZGVsZXRl LWJhY2t3YXJkLWNoYXIgLiBzZWxlY3Rvci9kZWxldGUtYmFja3dhcmQtY2hhcikKICAgICAgICAg ICAgKGtpbGwtbGluZSAuIHNlbGVjdG9yL2tpbGwtbGluZSkKICAgICAgICAgICAgKHlhbmsgLiBz ZWxlY3Rvci95YW5rKQogICAgICAgICAgICAobmV3bGluZSAuIHNlbGVjdG9yL3JldHVybikKICAg ICAgICAgICAgOzsgKGtleWJvYXJkLXF1aXQgLiBraWxsLXRoaXMtYnVmZmVyKQogICAgICAgICAg ICApKQoKICAgIChkZWZpbmUta2V5IHNlbGVjdG9yL21hcCAiXEMtZyIKICAgICAgJ2tpbGwtdGhp cy1idWZmZXIpCgogICAgKGRlZmluZS1rZXkgc2VsZWN0b3IvbWFwIChrYmQgIlRBQiIpCiAgICAg ICdzZWxlY3Rvci9nb3RvLW5leHQtZW50cnkpCgogICAgKGRlZmluZS1rZXkgc2VsZWN0b3IvbWFw IFsoc2hpZnQgaXNvLWxlZnR0YWIpXQogICAgICAnc2VsZWN0b3IvZ290by1wcmV2aW91cy1lbnRy eSkKCiAgICApCgogIChzZXRxIG1ham9yLW1vZGUgJ3NlbGVjdG9yL21vZGUKICAgICAgICBtb2Rl LW5hbWUgIlNlbGVjdG9yIgogICAgICAgIGJ1ZmZlci1yZWFkLW9ubHkgdAogICAgICAgICkKCiAg KHNldAogICAoaWYgc2VsZWN0b3IvaW5mby1pbi1tb2RlLWxpbmUgJ21vZGUtbGluZS1mb3JtYXQg J2hlYWRlci1saW5lLWZvcm1hdCkKICAgJygiICIgc2VsZWN0b3IvbmItc2hvd24tZW50cmllcyAi LyIKICAgICBzZWxlY3Rvci9uYi10b3RhbC1lbnRyaWVzICIgcGF0dGVybjogIiBzZWxlY3Rvci9w YXR0ZXJuKQogICApCgogIChidWZmZXItZGlzYWJsZS11bmRvKQogICh1c2UtbG9jYWwtbWFwIHNl bGVjdG9yL21hcCkKICApCgo7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKCihkZWZ1biBzZWxlY3Rvci9zZWxl Y3QgKGVudHJpZXMgY2FsbGJhY2sgJm9wdGlvbmFsIG5hbWUpCiAgIk9wZW4gYSBuZXcgYnVmZmVy IHNob3dpbmcgZHluYW1pY2FsbHkgYSBzdWJzZXQgb2YgZW50cmllcwptYXRjaGluZyBhIHBhdHRl cm4gdGhhdCBjYW4gYmUgY2hhbmdlZCBieSBwcmVzc2luZyB0aGUgdXN1YWwKXCJpbnNlcnRhYmxl XCIgc3ltYm9scyBvciBiYWNrc3BhY2UuIFByZXNzaW5nIHRoZSBlbnRlciBrZXkKdmFsaWRhdGVz IHRoZSBzZWxlY3Rpb24uCgpOb3RlIHRoYXQgdGhlIHBhdHRlcm4gaXMgbm90IGEgcmVnZXhwIGJ1 dCBhIHNlcmllcyBvZiBzdWJzdHJpbmdzCnNlcGFyYXRlZCBieSBgOydzIHRoYXQgaGF2ZSBhbGwg dG8gYmUgcHJlc2VudC4KClRoZSBrZXkgbWFwcGluZyBpcyBoYWNrZWQgc28gdGhhdCB0aGUga2V5 cyBhc3NvY2lhdGVkIHRvCmBzZWxmLWluc2VydC1jb21tYW5kJywgYGRlbGV0ZS1iYWNrd2FyZC1j aGFyJywgYGtpbGwtbGluZScsCmB5YW5rJyBhbmQgYG5ld2xpbmUnIGFyZSBhc3NvY2lhdGVkIHRv IGZ1bmN0aW9ucyB3aGljaCBkbyBzb21laG93CndoYXQgdGhleSBhcmUgc3VwcG9zZWQgdG8gZG8u IFRoZSBsYXR0ZXIgdmFsaWRhdGluZyB0aGUKc2VsZWN0aW9uLgoKRU5UUklFUyBpcyBhIGxpc3Qg b2YgY29ucyBjZWxscywgZWFjaCBjb21wb3NlZCBvZiBhIHN0cmluZyB0bwpkaXNwbGF5IGFuZCBh biBvYmplY3QgdG8gcGFzcyBhcyB0aGUgdW5pcXVlIHBhcmFtZXRlciB0byBDQUxMQkFDSwp3aGVu IHRoZSB1c2VyIGFjdHVhbGx5IGRvZXMgYSBzZWxlY3Rpb24uIFRoZSBvcHRpb25hbCBOQU1FCnBh cmFtZXRlciBzcGVjaWZpZXMgdGhlIG5hbWUgdG8gZ2l2ZSB0byB0aGUgYnVmZmVyLgoKU2V0dGlu ZyBgc2VsZWN0b3IvbWVtb3JpemUtZW50cnktb25seS1vbi1tb3Rpb25zJyB0byBub24tbmlsCm1l YW5zIHRoYXQgdGhlIGVudHJ5IHRvIGtlZXAgdGhlIGN1cnNvciBvbiB3aGVuIGNoYW5naW5nIHRo ZQpzZWxlY3Rpb24gaXMgc2V0IG9ubHkgb24gY3Vyc29yIG1vdGlvbnMuIFRvIHNob3cgdGhlIHBh dHRlcm4gaW4KdGhlIG1vZGVsaW5lIHNldCBgc2VsZWN0b3IvaW5mby1pbi1tb2RlLWxpbmUnLiBU aGUgaGVhZGVyIGxpbmUgaXMKdXNlZCBieSBkZWZhdWx0LiBUbyBhbHdheXMgb3BlbiBhIG5ldyBi dWZmZXIgYW5kIG5vdCByZS11c2UgYW4KZXhpc3RpbmcgYnVmZmVyIHdpdGggdGhlIHNhbWUgbmFt ZSwgc2V0CmBzZWxlY3Rvci9hbHdheXMtY3JlYXRlLWJ1ZmZlcicgdG8gbm9uLW5pbC4KClRoZXJl IHNlZW1zIHRvIGJlIGhlYWRlci1saW5lIHJlZnJlc2hpbmcgcHJvYmxlbXMgd2l0aCBlbWFjczIx LiIKCiAgKHN3aXRjaC10by1idWZmZXIKICAgKGdldC1idWZmZXItY3JlYXRlCiAgICAoZnVuY2Fs bAogICAgIChpZiBzZWxlY3Rvci9hbHdheXMtY3JlYXRlLWJ1ZmZlciAnZ2VuZXJhdGUtbmV3LWJ1 ZmZlci1uYW1lICdpZGVudGl0eSkKICAgICAob3IgbmFtZSAiKnNlbGVjdG9yKiIpKSkpCgogIChz ZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3NlbGVjdG9yL2VudHJpZXMpIGVudHJpZXMpCiAgKHNl dCAobWFrZS1sb2NhbC12YXJpYWJsZSAnc2VsZWN0b3IvY2FsbGJhY2spIGNhbGxiYWNrKQogIChz ZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3NlbGVjdG9yL3BhdHRlcm4pICIiKQogIChzZXQgKG1h a2UtbG9jYWwtdmFyaWFibGUgJ3NlbGVjdG9yL2hpZ2hsaWdodC1vdmVybGF5KSAobWFrZS1vdmVy bGF5IDAgMCkpCiAgKHNldCAobWFrZS1sb2NhbC12YXJpYWJsZSAnc2VsZWN0b3IvY3VycmVudC1l bnRyeSkgbmlsKQogIChzZXQgKG1ha2UtbG9jYWwtdmFyaWFibGUgJ3NlbGVjdG9yL25iLXRvdGFs LWVudHJpZXMpCiAgICAgICAobnVtYmVyLXRvLXN0cmluZyAobGVuZ3RoIGVudHJpZXMpKSkKICAo c2V0IChtYWtlLWxvY2FsLXZhcmlhYmxlICdzZWxlY3Rvci9uYi1zaG93bi1lbnRyaWVzKSAiPyIp CgogIChvdmVybGF5LXB1dCBzZWxlY3Rvci9oaWdobGlnaHQtb3ZlcmxheSAnZmFjZSAnc2VsZWN0 b3Ivc2VsZWN0aW9uKQoKICAoYWRkLWhvb2sgJ3Bvc3QtY29tbWFuZC1ob29rICdzZWxlY3Rvci9t b3ZlLWhpZ2hsaWdodC1vdmVybGF5IG5pbCB0KQogIChzZWxlY3Rvci9tb2RlKQogIChzZWxlY3Rv ci9yZWZyZXNoKQogICkKCjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Owo7OyBUbyBvcGVuIHJlY2VudCBmaWxl cwo7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKCihkZWZ1biBzZWxlY3Rvci9maWxlbmFtZS10by1zdHJpbmcg KGZpbGVuYW1lKQogICJHZW5lcmF0ZSB0aGUgbGluZSBhc3NvY2lhdGVkIHRvIGEgZmlsZW5hbWUg Zm9yIGBzZWxlY3Rvci9xdWljay1waWNrLXJlY2VudCciCiAgKGNvbmNhdAogICAiICIKICAgKGlm IChmaWxlLXJlbW90ZS1wIHMpCiAgICAgICAiICAgICAgICAgICIKICAgICAocHJvcGVydGl6ZQog ICAgICAoZm9ybWF0LXRpbWUtc3RyaW5nICAgIiVhICViICVlIiAoZWx0IChmaWxlLWF0dHJpYnV0 ZXMgcykgNSkpCiAgICAgICdmYWNlICdzZWxlY3Rvci9kYXRlKSkKCiAgICIgLS0gIgoKICAgKGlm IChzdHJpbmctbWF0Y2ggYWJicmV2aWF0ZWQtaG9tZS1kaXIgcykKICAgICAgIChjb25jYXQgKHBy b3BlcnRpemUKICAgICAgICAgICAgICAgIChzdWJzdHJpbmcgcyAwIChtYXRjaC1lbmQgMCkpICdm YWNlICdzZWxlY3Rvci9kaW0pCiAgICAgICAgICAgICAgIChzdWJzdHJpbmcgcyAobWF0Y2gtZW5k IDApKSkKICAgICBzKQogICApCiAgKQoKKGRlZnVuIHNlbGVjdG9yL2ZpbmQtZmlsZSAoZmlsZW5h bWUpCiAgIkNhbGxiYWNrIGZ1bmN0aW9uIGZvciBgc2VsZWN0b3IvcXVpY2stcGljay1yZWNlbnQn LiBXaGVuCmNhbGxlZCB3aXRoIGEgdW5pdmVyc2FsIGFyZ3VtZW50LCBhbGxvd3MgdGhlIHVzZXIg dG8gZWRpdCB0aGUKZmlsZW5hbWUuIgogIChpbnRlcmFjdGl2ZSkKICAoaWYgY3VycmVudC1wcmVm aXgtYXJnCiAgICAgIChmaW5kLWZpbGUgKHJlYWQtZmlsZS1uYW1lCiAgICAgICAgICAgICAgICAg ICJGaW5kIGZpbGU6ICIKICAgICAgICAgICAgICAgICAgKGZpbGUtbmFtZS1kaXJlY3RvcnkgZmls ZW5hbWUpCiAgICAgICAgICAgICAgICAgIG5pbAogICAgICAgICAgICAgICAgICBuaWwKICAgICAg ICAgICAgICAgICAgKGZpbGUtbmFtZS1ub25kaXJlY3RvcnkgZmlsZW5hbWUpKSkKICAgIChmaW5k LWZpbGUgZmlsZW5hbWUpKSkKCihkZWZ1biBzZWxlY3Rvci9xdWljay1waWNrLXJlY2VudCAoKQog ICJPcGVuIGEgZmlsZSBwaWNrZWQgaW4gYHJlY2VudGYtbGlzdCcgd2l0aCB0aGUgZHluYW1pYwpw YXR0ZXJuLW1hdGNoaW5nIHNlYXJjaCBpbXBsZW1lbnRlZCBpbiBgc2VsZWN0b3Ivc2VsZWN0Jy4g V2l0aCBhCnByZWZpeCBhcmd1bWVudCwgYWxsb3dzIHRvIGVkaXQgdGhlIGZpbGVuYW1lIGFmdGVy IHNlbGVjdGlvbi4iCiAgKGludGVyYWN0aXZlKQoKICAodW5sZXNzIChhbmQgKGJvdW5kcCByZWNl bnRmLW1vZGUpIHJlY2VudGYtbW9kZSkKICAgIChlcnJvciAicmVjZW50ZiBtb2RlIG11c3QgYmUg dHVybmVkIG9uIikpCgogIChzZWxlY3Rvci9zZWxlY3QKCiAgIChtYXBjYXIKICAgIChsYW1iZGEg KHMpCiAgICAgIChjb25zIChzZWxlY3Rvci9maWxlbmFtZS10by1zdHJpbmcgcykgcykpCiAgICBy ZWNlbnRmLWxpc3QpCgogICAnc2VsZWN0b3IvZmluZC1maWxlCiAgICIqc2VsZWN0b3IgZmluZC1m aWxlKiIKICAgKSkKCjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Owo7OyBUbyBzZWFyY2ggaW4gdGhlIGN1cnJl bnQgYnVmZmVyCjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OwoKKGRlZnVuIHNlbGVjdG9yL3F1aWNrLW1vdmUt aW4tYnVmZmVyICgpCiAgIk1vdmUgdGhlIGN1cnNvciBpbiB0aGUgY3VycmVudCBidWZmZXIgdG8g YSBsaW5lIHNlbGVjdGVkCmR5bmFtaWNhbGx5IHdpdGggYHNlbGVjdG9yL3NlbGVjdCcuIgogIChp bnRlcmFjdGl2ZSkKICAoc2VsZWN0b3Ivc2VsZWN0CiAgIChyZXZlcnNlCiAgICAobGV0ICgobCBu aWwpKQogICAgICAoc2F2ZS1leGN1cnNpb24KICAgICAgICAoZ290by1jaGFyIChwb2ludC1taW4p KQogICAgICAgICh3aGlsZSAoPCAocG9pbnQpIChwb2ludC1tYXgpKQogICAgICAgICAgKHNldHEg bCAoY29ucyAoY29ucyAoYnVmZmVyLXN1YnN0cmluZyAocG9pbnQtYXQtYm9sKSAocG9pbnQtYXQt ZW9sKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvaW50LWF0LWJvbCkpIGwpKQog ICAgICAgICAgKGZvcndhcmQtbGluZSAxKSkKICAgICAgICBsKSkKICAgICkKICAgJ2dvdG8tY2hh cgogICAiKnNlbGVjdG9yIGJ1ZmZlciBtb3ZlKiIKICAgKSkKCjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Owo7 OyBUbyBzd2l0Y2ggYmV0d2VlbiBidWZmZXJzCjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OwoKKGRlZnVuIHNl bGVjdG9yL3N3aXRjaC1idWZmZXIgKCkgKGludGVyYWN0aXZlKQogICJTZWxlY3QgdGhlIGN1cnJl bnQgYnVmZmVyIGR5bmFtaWNhbGx5IHdpdGggYHNlbGVjdG9yL3NlbGVjdCcuIgogIChpbnRlcmFj dGl2ZSkKICAoc2VsZWN0b3Ivc2VsZWN0CiAgIChsZXQgKChsIG5pbCkpCiAgICAgKG1hcGMKICAg ICAgKGxhbWJkYSAoYnVmZmVyKQogICAgICAgICh3aXRoLWN1cnJlbnQtYnVmZmVyIGJ1ZmZlcgog ICAgICAgICAgKGxldCAoKG5hbWUgKGJ1ZmZlci1uYW1lKSkKICAgICAgICAgICAgICAgIChzaXpl IChidWZmZXItc2l6ZSkpCiAgICAgICAgICAgICAgICAoZmlsZSAoYnVmZmVyLWZpbGUtbmFtZSkp CiAgICAgICAgICAgICAgICAobW9kaWZpZWQgKGJ1ZmZlci1tb2RpZmllZC1wKSkpCiAgICAgICAg ICAgICh3aGVuIChub3QgKHN0cmluZy1tYXRjaCAiXiArIiBuYW1lKSkKICAgICAgICAgICAgICAo cHVzaAogICAgICAgICAgICAgICAoY29ucwogICAgICAgICAgICAgICAgKHJlcGxhY2UtcmVnZXhw LWluLXN0cmluZwogICAgICAgICAgICAgICAgICIgKyQiCiAgICAgICAgICAgICAgICAgIiIKICAg ICAgICAgICAgICAgICAoZm9ybWF0CiAgICAgICAgICAgICAgICAgICIlIDhkICVzICUtMzBzJXMi CiAgICAgICAgICAgICAgICAgIHNpemUKICAgICAgICAgICAgICAgICAgKGlmIG1vZGlmaWVkICIq IiAiLSIpCiAgICAgICAgICAgICAgICAgIG5hbWUKICAgICAgICAgICAgICAgICAgKGlmIGZpbGUg KGNvbmNhdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcGxhY2UtcmVnZXhwLWluLXN0 cmluZyBhYmJyZXZpYXRlZC1ob21lLWRpcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAifi8iIGZpbGUpCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICApICIiKQogICAgICAgICAgICAgICAgICApKQogICAgICAgICAgICAgICAgYnVmZmVyKQog ICAgICAgICAgICAgICBsKQogICAgICAgICAgICAgICkpKSkKICAgICAgKHJldmVyc2UgKGJ1ZmZl ci1saXN0KSkpCiAgICAgbCkKICAgJ3N3aXRjaC10by1idWZmZXIKICAgIipzZWxlY3RvciBidWZm ZXIgc3dpdGNoKiIKICAgKSkKCjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Owo7OyBUbyBzZWFyY2ggYW1vbmcg c2VudGVuY2VzIChpLmUuIGJldHdlZW4gcGVyaW9kcywgbm90IGJldHdlZW4gXG4pCjs7IFRoaXMg aXMgd29yayBpbiBwcm9ncmVzcywgaXQgY3VycmVudGx5IGxvb2tzIGtpbmQgb2YgdWdseSBidXQg aXMKOzsgYWxyZWFkeSB1c2VmdWwgdG8gbmF2aWdhdGUgaW4gYSBsb25nIGFydGljbGUKOzs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7Ozs7Ozs7Ozs7CgooZGVmdW4gc2VsZWN0b3Ivc2VhcmNoLXNlbnRlbmNlICgpCiAgIk1vdmUg dGhlIGN1cnNvciB0byBhIHNlbnRlbmNlIGNob3NlbiBkeW5hbWljYWxseSB3aXRoCmBzZWxlY3Rv ci9zZWxlY3QnLiIKICAoaW50ZXJhY3RpdmUpCiAgKHNlbGVjdG9yL3NlbGVjdAogICAobGV0ICgo c2VudGVuY2VzIG5pbCkpCiAgICAgKHNhdmUtZXhjdXJzaW9uCiAgICAgICAoZ290by1jaGFyIChw b2ludC1taW4pKQogICAgICAgKHdoaWxlIChyZS1zZWFyY2gtZm9yd2FyZCAiW14uXStcXC4iIG5p bCB0KQogICAgICAgICAobGV0ICgocyAocmVwbGFjZS1yZWdleHAtaW4tc3RyaW5nICJeWyBcbl0r IiAiIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaC1z dHJpbmctbm8tcHJvcGVydGllcyAwKSkpCiAgICAgICAgICAgICAgIChwIChtYXRjaC1iZWdpbm5p bmcgMCkpKQogICAgICAgICAgIChzZXRxIHMgKHJlcGxhY2UtcmVnZXhwLWluLXN0cmluZyAiWyBc bl0rJCIgIiIgcykpCiAgICAgICAgICAgKHdoZW4gKD4gKGxlbmd0aCBzKSAxKQogICAgICAgICAg ICAgKHB1c2ggKGNvbnMKICAgICAgICAgICAgICAgICAgICAod2l0aC10ZW1wLWJ1ZmZlcgogICAg ICAgICAgICAgICAgICAgICAgKGluc2VydCBzICJcbiIpCiAgICAgICAgICAgICAgICAgICAgICAo ZmlsbC1yZWdpb24gKHBvaW50LW1pbikgKHBvaW50LW1heCkpCiAgICAgICAgICAgICAgICAgICAg ICAoYnVmZmVyLXN0cmluZykpCiAgICAgICAgICAgICAgICAgICAgcCkgc2VudGVuY2VzKSkpKSkK ICAgICAocmV2ZXJzZSBzZW50ZW5jZXMpKQogICAnZ290by1jaGFyKSkKCjs7Ozs7Ozs7Ozs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7OwoKKGRlZmZhY2Ugc2VsZWN0b3IvZGlyCiAgJygodCAoOmZvcmVncm91bmQgInJlZCIpKSkK ICAiVGhlIGZhY2UgZm9yIGRpcmVjdG9yaWVzLiIpCgooZGVmZmFjZSBzZWxlY3Rvci9zeW1saW5r CiAgJygodCAoOmZvcmVncm91bmQgImJsdWUiKSkpCiAgIlRoZSBmYWNlIGZvciBzeW1saW5rcy4i KQoKKGRlZnVuIHNlbGVjdG9yL3JlYy1maW5kLWZpbGUgKCZvcHRpb25hbCBmaWxlbmFtZSkgKGlu dGVyYWN0aXZlKQogIChzZXRxIGZpbGVuYW1lIChvciBmaWxlbmFtZQogICAgICAgICAgICAgICAg ICAgICAoYW5kIChidWZmZXItZmlsZS1uYW1lKSAoZmlsZS1uYW1lLWRpcmVjdG9yeSAoYnVmZmVy LWZpbGUtbmFtZSkpKQogICAgICAgICAgICAgICAgICAgICBkZWZhdWx0LWRpcmVjdG9yeSkpCgog IChpZiAoZmlsZS1yZWd1bGFyLXAgZmlsZW5hbWUpIChmaW5kLWZpbGUgZmlsZW5hbWUpCiAgICAo c2VsZWN0b3Ivc2VsZWN0CiAgICAgKG1hcGNhcgogICAgICAobGFtYmRhIChmaWxlKQogICAgICAg IChsZXQgKChmIChjYXIgZmlsZSkpKQogICAgICAgICAgKGNvbnMKICAgICAgICAgICAoaWYgKGZp bGUtcmVndWxhci1wIGYpCiAgICAgICAgICAgICAgIGYKICAgICAgICAgICAgIChpZiAoZmlsZS1z eW1saW5rLXAgZikKICAgICAgICAgICAgICAgICAocHJvcGVydGl6ZSBmICdmYWNlICdzZWxlY3Rv ci9zeW1saW5rKQogICAgICAgICAgICAgICAocHJvcGVydGl6ZSBmICdmYWNlICdzZWxlY3Rvci9k aXIpKSkKICAgICAgICAgICAoY29uY2F0IGZpbGVuYW1lICIvIiBmKSkpKQogICAgICAoZGlyZWN0 b3J5LWZpbGVzLWFuZC1hdHRyaWJ1dGVzIGZpbGVuYW1lKSkKICAgICAnc2VsZWN0b3IvcmVjLWZp bmQtZmlsZQogICAgIChjb25jYXQgInNlbGVjdG9yICIgZmlsZW5hbWUpCiAgICAgKSkpCgo7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7Ozs7Ozs7Ozs7OzsK --EDWvEV4ID4--