Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:38659 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 81180 invoked from network); 27 Jun 2008 17:02:31 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 27 Jun 2008 17:02:31 -0000 Authentication-Results: pb1.pair.com smtp.mail=dmitry@zend.com; spf=pass; sender-id=pass Authentication-Results: pb1.pair.com header.from=dmitry@zend.com; sender-id=pass Received-SPF: pass (pb1.pair.com: domain zend.com designates 212.25.124.162 as permitted sender) X-PHP-List-Original-Sender: dmitry@zend.com X-Host-Fingerprint: 212.25.124.162 mail.zend.com Windows 2000 SP4, XP SP1 Received: from [212.25.124.162] ([212.25.124.162:4837] helo=mx1.zend.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 6B/DC-33826-52D15684 for ; Fri, 27 Jun 2008 13:02:31 -0400 Received: from ws.home ([10.1.1.1]) by mx1.zend.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 27 Jun 2008 20:02:41 +0300 Message-ID: <48651D20.6050301@zend.com> Date: Fri, 27 Jun 2008 21:02:24 +0400 User-Agent: Thunderbird 2.0.0.14 (X11/20080501) MIME-Version: 1.0 To: Christian Seiler CC: php-dev List , Andi Gutmans , Stanislav Malyshev References: <4856A547.3080801@gmx.net> <485A35A0.9050602@zend.com> <485AF253.2070400@gmx.net> <485B908D.7000106@zend.com> <4863C299.1080002@gmx.net> In-Reply-To: <4863C299.1080002@gmx.net> X-Enigmail-Version: 0.95.6 Content-Type: multipart/mixed; boundary="------------020209050106000500030306" X-OriginalArrivalTime: 27 Jun 2008 17:02:42.0058 (UTC) FILETIME=[9CA13EA0:01C8D877] Subject: Re: [PHP-DEV] [PATCH] [RFC] Closures and lambda functions in PHP From: dmitry@zend.com (Dmitry Stogov) --------------020209050106000500030306 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Hi Christian, I reworked your patch a little bit. 1) Fixed ref/noref issues 2) Explicit $this passing $a = function foo() use ($this) {} 3) Some code reorganization to encapsulate closure implementation. Thanks. Dmitry. Christian Seiler wrote: > Hi Dmitry, > >> I'm fine if you'll improve my patch (It's mainly yours :) > > I updated my closures RFC: http://wiki.php.net/rfc/closures > > I have based my new version of the patch on yours (Dmitry), but I made > some changes to that: > > * Objects instead of resources are used, two new files > zend_closures.[ch] are added where the new Closure class > is defined. Currently, it contains a dummy __toString method > that in future may be extended to provide enhanced debugging info, > also further additional cool stuff could be added to such a > class later on. But I prefer to only add the basic closure > functionality at first - you can always extend it once it's there. > > * I have *not* added any __invoke() magic to normal objects. This is > mainly due to the simple reason that adding that would not help > a closure implementation at all. Closures need some engine internal > magic (use a dynamically created op_array instead of looking one up, > setting the correct class scope and setting the correct EG(this). And > as I said: I want to stick with the closure basics for now. > > That said, I do like the possibility of invoking objects directly, so > I suggest someone created an additional proposal for that? > > * I've added a patch for PHP HEAD (PHP 6.0). This is due to the fact > that Dmitry's variant of my patch has far less intersections with > the unicode functionality than my original patch, so it was quite > straight-forward to do so. > > * Lexical vars are now copied instead of referenced by default. Using > & in front of the var, the behaviour may be changed. I added that in > order to demonstrate that both was possible and that a simply change > of grammar suffices. In my eyes this is the main issue where a > discussion has to take place (i.e. copy or reference by default? > possibility to change default via syntax? which lexical syntax?) > before the proposal can be accepted. > > * I provided patches for both lexical $var and use ($var) syntaxes. > > * I provided a patch variant that only stores $this if $this is > explicitely used inside a closure (or a nested closure of that > closure). This works since it is possible to detect whether $this > is used at compile time. For this, I have added a this_used flag > to the op_array structure. > > * I added tests (Zend/tests/closures_*.phpt) that ensure the correct > behaviour of closures. > > [Note that I created my own local SVN repos for developing these patches > because I was fed up with CVS's inability to local diffs and locally > mark files as added to include them in the diffs. Just to explain the > format of the patch.] > > Anyway, feel free to discuss. > > In my eyes, the following questions should be answered: > > * Do you want closures in PHP? > > I have not seen a single negative reaction to my proposal, so I > assume the answer to that is yes. ;-) > > * Which syntax should be used for lexical variables? Should references > or copies be created by default? > > This is far trickier. > > First of all: There must *always* be the _possiblity_ to create > references, else you can't call it closures. > > Second: I prefer the 'lexical' keyword, but I could live with the > use solution [function () use ($...)]. > > Third: There are several arguments against default referencing: > > * (use syntax) As they look similar to parameters and normal > parameters aren't passed by ref, this could be quite > odd. > * Loop index WTFs (see proposal) > * Speed? (You always read that refs are slower in PHP than normal > variable copies. Is that actually true?) > * While it is possible to simply add an & in front of the variable > name to switch to refs in "no refs default" mode, there is no > obvious syntax to use copies in "refs default" mode other than > unsetting the variable in the parent scope immediately after > closure creation. > > Fourth: There are several arguments for default referencing: > > * (lexical syntax) global also creates a reference, why shouldn't > lexical? > * Other languages *appear* to exhibit a very similar behaviour to > PHP if PHP created references. This is due to the fact that > other languages have a different concept of scope as PHP > does. > > Although the list of against arguments appears to be longer, I do > prefer using references by default nevertheless. But that's just > my personal opinion. > > * Are you OK with the change that $this is only stored when needed? > > I don't see a problem. Dmitry seems to be very touchy (;-)) about > changing op_arrays but in this case it's only a flag so I don't > see a problem for opcode caches (in contrast to a HashTable where > the opcode cache must actually add code to duplicate that table). > > * Do you want closures in PHP 5.3? > > Since the majority of core developers appear to be against it, I > presume the answer is no. > > I will provide a revised patch that incorporates the results of the > following discussion for 5_3 and HEAD once consensus or at least a > majority regarding the remaining issues is reached. I will also rewrite > the proposal to reflect the discussion results and adjust the tests. > After that, I hope that someone will commit at least the HEAD version. > > Regards, > Christian --------------020209050106000500030306 Content-Type: text/plain; name="lambda.diff.txt" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="lambda.diff.txt" SW5kZXg6IGNvbmZpZ3VyZS5pbgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvcmVwb3NpdG9y eS9waHAtc3JjL2NvbmZpZ3VyZS5pbix2CnJldHJpZXZpbmcgcmV2aXNpb24gMS41NzkuMi41 Mi4yLjc3LjIuMjAKZGlmZiAtdSAtcCAtZCAtcjEuNTc5LjIuNTIuMi43Ny4yLjIwIGNvbmZp Z3VyZS5pbgotLS0gY29uZmlndXJlLmluCTIgSnVuIDIwMDggMTY6NTg6MTkgLTAwMDAJMS41 NzkuMi41Mi4yLjc3LjIuMjAKKysrIGNvbmZpZ3VyZS5pbgkyNyBKdW4gMjAwOCAxNjo1Mzoy NiAtMDAwMApAQCAtMTQwMyw3ICsxNDAzLDggQEAgUEhQX0FERF9TT1VSQ0VTKFplbmQsIFwK ICAgICB6ZW5kX3ZhcmlhYmxlcy5jIHplbmQuYyB6ZW5kX0FQSS5jIHplbmRfZXh0ZW5zaW9u cy5jIHplbmRfaGFzaC5jIFwKICAgICB6ZW5kX2xpc3QuYyB6ZW5kX2luZGVudC5jIHplbmRf YnVpbHRpbl9mdW5jdGlvbnMuYyB6ZW5kX3NwcmludGYuYyBcCiAgICAgemVuZF9pbmkuYyB6 ZW5kX3Fzb3J0LmMgemVuZF9tdWx0aWJ5dGUuYyB6ZW5kX3RzX2hhc2guYyB6ZW5kX3N0cmVh bS5jIFwKLSAgICB6ZW5kX2l0ZXJhdG9ycy5jIHplbmRfaW50ZXJmYWNlcy5jIHplbmRfZXhj ZXB0aW9ucy5jIHplbmRfc3RydG9kLmMgemVuZF9nYy5jKQorICAgIHplbmRfaXRlcmF0b3Jz LmMgemVuZF9pbnRlcmZhY2VzLmMgemVuZF9leGNlcHRpb25zLmMgemVuZF9zdHJ0b2QuYyB6 ZW5kX2djLmMgXAorICAgIHplbmRfY2xvc3VyZXMuYykKIAogaWYgdGVzdCAtciAiJGFic19z cmNkaXIvWmVuZC96ZW5kX29iamVjdHMuYyI7IHRoZW4KICAgUEhQX0FERF9TT1VSQ0VTKFpl bmQsIHplbmRfb2JqZWN0cy5jIHplbmRfb2JqZWN0X2hhbmRsZXJzLmMgemVuZF9vYmplY3Rz X0FQSS5jIFwKSW5kZXg6IFplbmQvTWFrZWZpbGUuYW0KPT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmls ZTogL3JlcG9zaXRvcnkvWmVuZEVuZ2luZTIvTWFrZWZpbGUuYW0sdgpyZXRyaWV2aW5nIHJl dmlzaW9uIDEuNTcuMi4xLjIuMS4yLjEKZGlmZiAtdSAtcCAtZCAtcjEuNTcuMi4xLjIuMS4y LjEgTWFrZWZpbGUuYW0KLS0tIFplbmQvTWFrZWZpbGUuYW0JMTYgTWFyIDIwMDggMjE6MDU6 MzMgLTAwMDAJMS41Ny4yLjEuMi4xLjIuMQorKysgWmVuZC9NYWtlZmlsZS5hbQkyNyBKdW4g MjAwOCAxNjo1MzoyNiAtMDAwMApAQCAtMTcsNyArMTcsNyBAQCBsaWJaZW5kX2xhX1NPVVJD RVM9XAogCXplbmRfb2JqZWN0c19BUEkuYyB6ZW5kX3RzX2hhc2guYyB6ZW5kX3N0cmVhbS5j IFwKIAl6ZW5kX2RlZmF1bHRfY2xhc3Nlcy5jIFwKIAl6ZW5kX2l0ZXJhdG9ycy5jIHplbmRf aW50ZXJmYWNlcy5jIHplbmRfZXhjZXB0aW9ucy5jIFwKLQl6ZW5kX3N0cnRvZC5jCisJemVu ZF9zdHJ0b2QuYyB6ZW5kX2Nsb3N1cmVzLmMKIAogbGliWmVuZF9sYV9MREZMQUdTID0KIGxp YlplbmRfbGFfTElCQUREID0gQFpFTkRfRVhUUkFfTElCU0AKSW5kZXg6IFplbmQvWmVuZC5k c3AKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL3JlcG9zaXRvcnkvWmVuZEVuZ2luZTIvWmVu ZC5kc3AsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMjUuMi4xLjIuMQpkaWZmIC11IC1wIC1k IC1yMS4yNS4yLjEuMi4xIFplbmQuZHNwCi0tLSBaZW5kL1plbmQuZHNwCTUgRGVjIDIwMDYg MDg6MDc6NTcgLTAwMDAJMS4yNS4yLjEuMi4xCisrKyBaZW5kL1plbmQuZHNwCTI3IEp1biAy MDA4IDE2OjUzOjI2IC0wMDAwCkBAIC0xMjMsNiArMTIzLDEwIEBAIFNPVVJDRT0uXHplbmRf YnVpbHRpbl9mdW5jdGlvbnMuYw0KICMgRW5kIFNvdXJjZSBGaWxlDQogIyBCZWdpbiBTb3Vy Y2UgRmlsZQ0KIA0KK1NPVVJDRT0uXHplbmRfY2xvc3VyZXMuYw0KKyMgRW5kIFNvdXJjZSBG aWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KIFNPVVJDRT0uXHplbmRfY29tcGlsZS5j DQogIyBFbmQgU291cmNlIEZpbGUNCiAjIEJlZ2luIFNvdXJjZSBGaWxlDQpJbmRleDogWmVu ZC9aZW5kVFMuZHNwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9yZXBvc2l0b3J5L1plbmRF bmdpbmUyL1plbmRUUy5kc3AsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuNDcuMi4xLjIuMgpk aWZmIC11IC1wIC1kIC1yMS40Ny4yLjEuMi4yIFplbmRUUy5kc3AKLS0tIFplbmQvWmVuZFRT LmRzcAk1IERlYyAyMDA2IDA4OjA3OjU3IC0wMDAwCTEuNDcuMi4xLjIuMgorKysgWmVuZC9a ZW5kVFMuZHNwCTI3IEp1biAyMDA4IDE2OjUzOjI2IC0wMDAwCkBAIC0xNDgsNiArMTQ4LDEw IEBAIFNPVVJDRT0uXHplbmRfYnVpbHRpbl9mdW5jdGlvbnMuYw0KICMgRW5kIFNvdXJjZSBG aWxlDQogIyBCZWdpbiBTb3VyY2UgRmlsZQ0KIA0KK1NPVVJDRT0uXHplbmRfY2xvc3VyZXMu Yw0KKyMgRW5kIFNvdXJjZSBGaWxlDQorIyBCZWdpbiBTb3VyY2UgRmlsZQ0KKw0KIFNPVVJD RT0uXHplbmRfY29tcGlsZS5jDQogIyBFbmQgU291cmNlIEZpbGUNCiAjIEJlZ2luIFNvdXJj ZSBGaWxlDQpJbmRleDogWmVuZC96ZW5kLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL3Jl cG9zaXRvcnkvWmVuZEVuZ2luZTIvemVuZC5oLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjI5 My4yLjExLjIuOS4yLjIyCmRpZmYgLXUgLXAgLWQgLXIxLjI5My4yLjExLjIuOS4yLjIyIHpl bmQuaAotLS0gWmVuZC96ZW5kLmgJMjcgSnVuIDIwMDggMDA6MDE6MjUgLTAwMDAJMS4yOTMu Mi4xMS4yLjkuMi4yMgorKysgWmVuZC96ZW5kLmgJMjcgSnVuIDIwMDggMTY6NTM6MjYgLTAw MDAKQEAgLTUxNiw2ICs1MTYsOCBAQCB0eXBlZGVmIGludCAoKnplbmRfd3JpdGVfZnVuY190 KShjb25zdCBjCiAjZGVmaW5lIElTX0NPTlNUQU5UX1RZUEVfTUFTSwkweDBmCiAjZGVmaW5l IElTX0NPTlNUQU5UX1JUX05TX0NIRUNLCTB4MTAKICNkZWZpbmUgSVNfQ09OU1RBTlRfSU5E RVgJCTB4ODAKKyNkZWZpbmUgSVNfTEVYSUNBTF9WQVIJCQkweDIwCisjZGVmaW5lIElTX0xF WElDQUxfUkVGCQkJMHg0MAogCiAvKiBvdmVybG9hZGVkIGVsZW1lbnRzIGRhdGEgdHlwZXMg Ki8KICNkZWZpbmUgT0VfSVNfQVJSQVkJCSgxPDwwKQpJbmRleDogWmVuZC96ZW5kX0FQSS5j Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9yZXBvc2l0b3J5L1plbmRFbmdpbmUyL3plbmRf QVBJLmMsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMjk2LjIuMjcuMi4zNC4yLjM4CmRpZmYg LXUgLXAgLWQgLXIxLjI5Ni4yLjI3LjIuMzQuMi4zOCB6ZW5kX0FQSS5jCi0tLSBaZW5kL3pl bmRfQVBJLmMJNSBKdW4gMjAwOCAxODo1MzowNiAtMDAwMAkxLjI5Ni4yLjI3LjIuMzQuMi4z OAorKysgWmVuZC96ZW5kX0FQSS5jCTI3IEp1biAyMDA4IDE2OjUzOjI3IC0wMDAwCkBAIC0y Niw2ICsyNiw3IEBACiAjaW5jbHVkZSAiemVuZF9tb2R1bGVzLmgiCiAjaW5jbHVkZSAiemVu ZF9jb25zdGFudHMuaCIKICNpbmNsdWRlICJ6ZW5kX2V4Y2VwdGlvbnMuaCIKKyNpbmNsdWRl ICJ6ZW5kX2Nsb3N1cmVzLmgiCiAKICNpZmRlZiBIQVZFX1NUREFSR19ICiAjaW5jbHVkZSA8 c3RkYXJnLmg+CkBAIC0yNjE1LDYgKzI2MTYsMTYgQEAgWkVORF9BUEkgemVuZF9ib29sIHpl bmRfaXNfY2FsbGFibGVfZXgoegogCQkJfQogCQkJcmV0dXJuIDA7CiAKKwkJY2FzZSBJU19P QkpFQ1Q6CisJCQlpZiAoemVuZF9nZXRfY2xvc3VyZShjYWxsYWJsZSwgY2VfcHRyLCBmcHRy X3B0ciwgTlVMTCwgem9ial9wdHJfcHRyIFRTUk1MU19DQykgPT0gU1VDQ0VTUykgeworCQkJ CWlmIChjYWxsYWJsZV9uYW1lKSB7CisJCQkJCSpjYWxsYWJsZV9uYW1lX2xlbiA9IHN0cmxl bigoKmZwdHJfcHRyKS0+Y29tbW9uLmZ1bmN0aW9uX25hbWUpOworCQkJCQkqY2FsbGFibGVf bmFtZSA9IGVzdHJuZHVwKCgqZnB0cl9wdHIpLT5jb21tb24uZnVuY3Rpb25fbmFtZSwgKmNh bGxhYmxlX25hbWVfbGVuKTsKKwkJCQl9CQkJCQkJCQkJCisJCQkJcmV0dXJuIDE7CisJCQl9 CisJCQkvKiBicmVhayBtaXNzaW5nIGludGVudGlvbmFsbHkgKi8KKwogCQlkZWZhdWx0Ogog CQkJaWYgKGNhbGxhYmxlX25hbWUpIHsKIAkJCQl6dmFsIGV4cHJfY29weTsKSW5kZXg6IFpl bmQvemVuZF9jbG9zdXJlcy5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IFplbmQvemVuZF9j bG9zdXJlcy5jCmRpZmYgLU4gWmVuZC96ZW5kX2Nsb3N1cmVzLmMKLS0tIC9kZXYvbnVsbAkx IEphbiAxOTcwIDAwOjAwOjAwIC0wMDAwCisrKyBaZW5kL3plbmRfY2xvc3VyZXMuYwkyNyBK dW4gMjAwOCAxNjo1MzoyNyAtMDAwMApAQCAtMCwwICsxLDIzOSBAQAorLyoKKyAgICstLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tKworICAgfCBaZW5kIEVuZ2luZSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICArLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLSsKKyAgIHwgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDggWmVuZCBUZWNobm9sb2dpZXMg THRkLiAoaHR0cDovL3d3dy56ZW5kLmNvbSkgfAorICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisg ICB8IFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB2ZXJzaW9uIDIuMDAgb2YgdGhl IFplbmQgbGljZW5zZSwgICAgIHwKKyAgIHwgdGhhdCBpcyBidW5kbGVkIHdpdGggdGhpcyBw YWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UsIGFuZCBpcyAgICAgICAgfCAKKyAgIHwgYXZh aWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoZSBmb2xsb3dpbmcgdXJs OiAgICAgICAgICAgfAorICAgfCBodHRwOi8vd3d3LnplbmQuY29tL2xpY2Vuc2UvMl8wMC50 eHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICB8IElmIHlvdSBkaWQg bm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBaZW5kIGxpY2Vuc2UgYW5kIGFyZSB1bmFibGUg dG8gIHwKKyAgIHwgb2J0YWluIGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBwbGVh c2Ugc2VuZCBhIG5vdGUgdG8gICAgICAgICAgfAorICAgfCBsaWNlbnNlQHplbmQuY29tIHNv IHdlIGNhbiBtYWlsIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuICAgICAgICAgICAgICB8Cisg ICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgIHwgQXV0aG9yczogQ2hyaXN0aWFuIFNlaWxlciA8 Y2hyaXNfc2VAZ214Lm5ldD4gICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgfCAgICAg ICAgICBEbWl0cnkgU3RvZ292IDxkbWl0cnlAemVuZC5jb20+ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB8CisgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyovCisKKy8qICRJZDogemVu ZF9pbnRlcmZhY2VzLmMsdiAxLjMzLjIuNC4yLjYuMi40IDIwMDgvMDEvMjQgMTg6MDc6NDUg ZG1pdHJ5IEV4cCAkICovCisKKyNpbmNsdWRlICJ6ZW5kLmgiCisjaW5jbHVkZSAiemVuZF9B UEkuaCIKKyNpbmNsdWRlICJ6ZW5kX2Nsb3N1cmVzLmgiCisjaW5jbHVkZSAiemVuZF9vYmpl Y3RzLmgiCisjaW5jbHVkZSAiemVuZF9vYmplY3RzX0FQSS5oIgorI2luY2x1ZGUgInplbmRf Z2xvYmFscy5oIgorCit0eXBlZGVmIHN0cnVjdCBfemVuZF9jbG9zdXJlIHsKKwl6ZW5kX29i amVjdCAgICBzdGQ7CisJemVuZF9mdW5jdGlvbiAgZnVuYzsKKwl6dmFsICAgICAgICAgICp0 aGlzX3B0cjsKK30gemVuZF9jbG9zdXJlOworCitzdGF0aWMgemVuZF9jbGFzc19lbnRyeSAq emVuZF9jZV9jbG9zdXJlOworc3RhdGljIHplbmRfb2JqZWN0X2hhbmRsZXJzIGNsb3N1cmVf aGFuZGxlcnM7CisKK3N0YXRpYyB6ZW5kX2Z1bmN0aW9uICp6ZW5kX2Nsb3N1cmVfZ2V0X2Nv bnN0cnVjdG9yKHp2YWwgKm9iamVjdCBUU1JNTFNfREMpIC8qIHt7eyAqLworeworCXplbmRf ZXJyb3IoRV9FUlJPUiwgIkluc3RhbnRpYXRpb24gb2YgJ0Nsb3N1cmUnIGlzIG5vdCBhbGxv d2VkIik7CisJcmV0dXJuIE5VTEw7Cit9CisvKiB9fX0gKi8KKworc3RhdGljIGludCB6ZW5k X2Nsb3N1cmVfY29tcGFyZV9vYmplY3RzKHp2YWwgKm8xLCB6dmFsICpvMiBUU1JNTFNfREMp IC8qIHt7eyAqLworeworCXJldHVybiAoWl9PQkpfSEFORExFX1AobzEpICE9IFpfT0JKX0hB TkRMRV9QKG8yKSk7Cit9CisvKiB9fX0gKi8KKworc3RhdGljIGludCB6ZW5kX2Nsb3N1cmVf Y2FzdF9vYmplY3RfdG9zdHJpbmcoenZhbCAqcmVhZG9iaiwgenZhbCAqd3JpdGVvYmosIGlu dCB0eXBlIFRTUk1MU19EQykgLyoge3t7ICovCit7CisJemVuZF9jbGFzc19lbnRyeSAqY2U7 CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBJU19TVFJJTkc6CisJCQlJTklUX1BaVkFM KHdyaXRlb2JqKTsKKwkJCVpWQUxfU1RSSU5HTCh3cml0ZW9iaiwgIkNsb3N1cmUgb2JqZWN0 Iiwgc2l6ZW9mKCJDbG9zdXJlIG9iamVjdCIpLCAxKTsKKwkJCXJldHVybiBTVUNDRVNTOwor CQlkZWZhdWx0OgorCQkJY2UgPSBaX09CSkNFX1AocmVhZG9iaik7CisJCQl6ZW5kX2Vycm9y KEVfTk9USUNFLCAiT2JqZWN0IG9mIGNsYXNzICVzIGNvdWxkIG5vdCBiZSBjb252ZXJ0ZWQg dG8gJXMiLCBjZS0+bmFtZSwgemVuZF9nZXRfdHlwZV9ieV9jb25zdCh0eXBlKSk7CisJCQlJ TklUX1BaVkFMKHdyaXRlb2JqKTsKKwkJCVpfVFlQRV9QKHdyaXRlb2JqKSA9IElTX05VTEw7 CisJCQlicmVhazsKKwl9CisJcmV0dXJuIEZBSUxVUkU7Cit9CisvKiB9fX0gKi8KKworc3Rh dGljIHZvaWQgemVuZF9jbG9zdXJlX2ZyZWVfc3RvcmFnZSh2b2lkICpvYmplY3QgVFNSTUxT X0RDKSAvKiB7e3sgKi8KK3sKKwl6ZW5kX2Nsb3N1cmUgKmNsb3N1cmUgPSAoemVuZF9jbG9z dXJlICopb2JqZWN0OworCisJemVuZF9vYmplY3Rfc3RkX2R0b3IoJmNsb3N1cmUtPnN0ZCBU U1JNTFNfQ0MpOworCisJaWYgKGNsb3N1cmUtPmZ1bmMudHlwZSA9PSBaRU5EX1VTRVJfRlVO Q1RJT04pIHsKKwkJemVuZF9leGVjdXRlX2RhdGEgKmV4ID0gRUcoY3VycmVudF9leGVjdXRl X2RhdGEpOworCQl3aGlsZSAoZXgpIHsKKwkJCWlmIChleC0+b3BfYXJyYXkgPT0gJmNsb3N1 cmUtPmZ1bmMub3BfYXJyYXkpIHsKKwkJCQl6ZW5kX2Vycm9yKEVfRVJST1IsICJDYW5ub3Qg ZGVzdHJveSBhY3RpdmUgbGFtYmRhIGZ1bmN0aW9uIik7CisJCQl9CisJCQlleCA9IGV4LT5w cmV2X2V4ZWN1dGVfZGF0YTsKKwkJfQorCQlkZXN0cm95X29wX2FycmF5KCZjbG9zdXJlLT5m dW5jLm9wX2FycmF5IFRTUk1MU19DQyk7CisJfQorCisJaWYgKGNsb3N1cmUtPnRoaXNfcHRy KSB7CisJCXp2YWxfcHRyX2R0b3IoJmNsb3N1cmUtPnRoaXNfcHRyKTsKKwl9CisKKwllZnJl ZShjbG9zdXJlKTsKK30KKy8qIH19fSAqLworCitzdGF0aWMgemVuZF9vYmplY3RfdmFsdWUg emVuZF9jbG9zdXJlX25ldyh6ZW5kX2NsYXNzX2VudHJ5ICpjbGFzc190eXBlIFRTUk1MU19E QykgLyoge3t7ICovCit7CisJemVuZF9jbG9zdXJlICpjbG9zdXJlOworCXplbmRfb2JqZWN0 X3ZhbHVlIG9iamVjdDsKKworCWNsb3N1cmUgPSBlbWFsbG9jKHNpemVvZih6ZW5kX2Nsb3N1 cmUpKTsKKwltZW1zZXQoY2xvc3VyZSwgMCwgc2l6ZW9mKHplbmRfY2xvc3VyZSkpOworCisJ emVuZF9vYmplY3Rfc3RkX2luaXQoJmNsb3N1cmUtPnN0ZCwgY2xhc3NfdHlwZSBUU1JNTFNf Q0MpOworCQorCW9iamVjdC5oYW5kbGUgPSB6ZW5kX29iamVjdHNfc3RvcmVfcHV0KGNsb3N1 cmUsICh6ZW5kX29iamVjdHNfc3RvcmVfZHRvcl90KXplbmRfb2JqZWN0c19kZXN0cm95X29i amVjdCwgKHplbmRfb2JqZWN0c19mcmVlX29iamVjdF9zdG9yYWdlX3QpIHplbmRfY2xvc3Vy ZV9mcmVlX3N0b3JhZ2UsIE5VTEwgVFNSTUxTX0NDKTsKKwlvYmplY3QuaGFuZGxlcnMgPSAm Y2xvc3VyZV9oYW5kbGVyczsKKwkKKwlyZXR1cm4gb2JqZWN0OworfQorLyogfX19ICovCisK K3ZvaWQgemVuZF9yZWdpc3Rlcl9jbG9zdXJlX2NlKFRTUk1MU19EKSAvKiB7e3sgKi8KK3sK Kwl6ZW5kX2NsYXNzX2VudHJ5IGNlOworCisJSU5JVF9DTEFTU19FTlRSWShjZSwgIkNsb3N1 cmUiLCBOVUxMKTsKKwl6ZW5kX2NlX2Nsb3N1cmUgPSB6ZW5kX3JlZ2lzdGVyX2ludGVybmFs X2NsYXNzKCZjZSBUU1JNTFNfQ0MpOworCXplbmRfY2VfY2xvc3VyZS0+Y2VfZmxhZ3MgfD0g WkVORF9BQ0NfRklOQUxfQ0xBU1M7CisJemVuZF9jZV9jbG9zdXJlLT5jcmVhdGVfb2JqZWN0 ID0gemVuZF9jbG9zdXJlX25ldzsKKworCW1lbWNweSgmY2xvc3VyZV9oYW5kbGVycywgemVu ZF9nZXRfc3RkX29iamVjdF9oYW5kbGVycygpLCBzaXplb2YoemVuZF9vYmplY3RfaGFuZGxl cnMpKTsKKwljbG9zdXJlX2hhbmRsZXJzLmdldF9jb25zdHJ1Y3RvciA9IHplbmRfY2xvc3Vy ZV9nZXRfY29uc3RydWN0b3I7CisJY2xvc3VyZV9oYW5kbGVycy5jb21wYXJlX29iamVjdHMg PSB6ZW5kX2Nsb3N1cmVfY29tcGFyZV9vYmplY3RzOworCWNsb3N1cmVfaGFuZGxlcnMuY2Fz dF9vYmplY3QgPSB6ZW5kX2Nsb3N1cmVfY2FzdF9vYmplY3RfdG9zdHJpbmc7CisJY2xvc3Vy ZV9oYW5kbGVycy5jbG9uZV9vYmogPSBOVUxMOworfQorLyogfX19ICovCisKK3N0YXRpYyBp bnQgenZhbF9jb3B5X3N0YXRpY192YXIoenZhbCAqKnAsIGludCBudW1fYXJncywgdmFfbGlz dCBhcmdzLCB6ZW5kX2hhc2hfa2V5ICprZXkpIC8qIHt7eyAqLworeworCUhhc2hUYWJsZSAq dGFyZ2V0ID0gdmFfYXJnKGFyZ3MsIEhhc2hUYWJsZSopOworCXplbmRfYm9vbCBpc19yZWY7 CisKKwlpZiAoWl9UWVBFX1BQKHApICYgKElTX0xFWElDQUxfVkFSfElTX0xFWElDQUxfUkVG KSkgeworCQlUU1JNTFNfRkVUQ0goKTsKKwkJaXNfcmVmID0gWl9UWVBFX1BQKHApICYgSVNf TEVYSUNBTF9SRUY7CisKKwkJaWYgKCFFRyhhY3RpdmVfc3ltYm9sX3RhYmxlKSkgeworCQkJ emVuZF9yZWJ1aWxkX3N5bWJvbF90YWJsZShUU1JNTFNfQyk7CisJCX0KKwkJaWYgKHplbmRf aGFzaF9xdWlja19maW5kKEVHKGFjdGl2ZV9zeW1ib2xfdGFibGUpLCBrZXktPmFyS2V5LCBr ZXktPm5LZXlMZW5ndGgsIGtleS0+aCwgKHZvaWQgKiopICZwKSA9PSBGQUlMVVJFKSB7CisJ CQl6dmFsICp0bXA7CisKKwkJCUFMTE9DX0lOSVRfWlZBTCh0bXApOworCQkJWlZBTF9OVUxM KHRtcCk7CisJCQl6ZW5kX2hhc2hfcXVpY2tfYWRkKHRhcmdldCwga2V5LT5hcktleSwga2V5 LT5uS2V5TGVuZ3RoLCBrZXktPmgsICZ0bXAsIHNpemVvZih6dmFsKiksIE5VTEwpOworCisJ CQl6ZW5kX2Vycm9yKEVfTk9USUNFLCJVbmRlZmluZWQgdmFyaWFibGU6ICVzIiwga2V5LT5h cktleSk7CisKKwkJCXJldHVybiBaRU5EX0hBU0hfQVBQTFlfS0VFUDsKKwkJfQorCisJCWlm IChpc19yZWYpIHsKKwkJCVNFUEFSQVRFX1pWQUxfVE9fTUFLRV9JU19SRUYocCk7CisJCX0g ZWxzZSB7CisJCQlTRVBBUkFURV9aVkFMKHApOworCQl9CisJfQorCWlmICh6ZW5kX2hhc2hf cXVpY2tfYWRkKHRhcmdldCwga2V5LT5hcktleSwga2V5LT5uS2V5TGVuZ3RoLCBrZXktPmgs IHAsIHNpemVvZih6dmFsKiksIE5VTEwpID09IFNVQ0NFU1MpIHsKKwkJWl9BRERSRUZfUFAo cCk7CisJfQorCXJldHVybiBaRU5EX0hBU0hfQVBQTFlfS0VFUDsKK30KKy8qIH19fSAqLwor CitaRU5EX0FQSSB2b2lkIHplbmRfY3JlYXRlX2Nsb3N1cmUoenZhbCAqcmVzLCB6ZW5kX2Z1 bmN0aW9uICpmdW5jLCB6ZW5kX2NsYXNzX2VudHJ5ICpzY29wZSwgenZhbCAqdGhpc19wdHIg VFNSTUxTX0RDKSAvKiB7e3sgKi8KK3sKKwl6ZW5kX2Nsb3N1cmUgKmNsb3N1cmU7CisKKwlv YmplY3RfaW5pdF9leChyZXMsIHplbmRfY2VfY2xvc3VyZSk7CisKKwljbG9zdXJlID0gKHpl bmRfY2xvc3VyZSAqKXplbmRfb2JqZWN0X3N0b3JlX2dldF9vYmplY3QocmVzKTsKKworCWNs b3N1cmUtPmZ1bmMgPSAqZnVuYzsKKworCWlmIChjbG9zdXJlLT5mdW5jLnR5cGUgPT0gWkVO RF9VU0VSX0ZVTkNUSU9OKSB7CisJCWlmIChjbG9zdXJlLT5mdW5jLm9wX2FycmF5LnN0YXRp Y192YXJpYWJsZXMpIHsKKwkJCUhhc2hUYWJsZSAqc3RhdGljX3ZhcmlhYmxlcyA9IGNsb3N1 cmUtPmZ1bmMub3BfYXJyYXkuc3RhdGljX3ZhcmlhYmxlczsKKwkKKwkJCUFMTE9DX0hBU0hU QUJMRShjbG9zdXJlLT5mdW5jLm9wX2FycmF5LnN0YXRpY192YXJpYWJsZXMpOworCQkJemVu ZF9oYXNoX2luaXQoY2xvc3VyZS0+ZnVuYy5vcF9hcnJheS5zdGF0aWNfdmFyaWFibGVzLCB6 ZW5kX2hhc2hfbnVtX2VsZW1lbnRzKHN0YXRpY192YXJpYWJsZXMpLCBOVUxMLCBaVkFMX1BU Ul9EVE9SLCAwKTsKKwkJCXplbmRfaGFzaF9hcHBseV93aXRoX2FyZ3VtZW50cyhzdGF0aWNf dmFyaWFibGVzLCAoYXBwbHlfZnVuY19hcmdzX3QpenZhbF9jb3B5X3N0YXRpY192YXIsIDEs IGNsb3N1cmUtPmZ1bmMub3BfYXJyYXkuc3RhdGljX3ZhcmlhYmxlcyk7CisJCX0KKwkJKCpj bG9zdXJlLT5mdW5jLm9wX2FycmF5LnJlZmNvdW50KSsrOworCX0KKworCWNsb3N1cmUtPmZ1 bmMuY29tbW9uLnNjb3BlID0gc2NvcGU7CisJaWYgKHNjb3BlKSB7CisJCWNsb3N1cmUtPmZ1 bmMuY29tbW9uLmZuX2ZsYWdzIHw9IFpFTkRfQUNDX1BVQkxJQzsKKwkJaWYgKHRoaXNfcHRy ICYmIChjbG9zdXJlLT5mdW5jLmNvbW1vbi5mbl9mbGFncyAmIFpFTkRfQUNDX0NMT1NVUkVf V0lUSF9USElTKSkgeworCQkJY2xvc3VyZS0+dGhpc19wdHIgPSB0aGlzX3B0cjsKKwkJCVpf QUREUkVGX1AodGhpc19wdHIpOworCQl9IGVsc2UgeworCQkJY2xvc3VyZS0+dGhpc19wdHIg PSBOVUxMOworCQkJY2xvc3VyZS0+ZnVuYy5jb21tb24uZm5fZmxhZ3MgfD0gWkVORF9BQ0Nf U1RBVElDOworCQl9CisJfSBlbHNlIHsKKwkJY2xvc3VyZS0+dGhpc19wdHIgPSBOVUxMOwor CX0KK30KKy8qIH19fSAqLworCitaRU5EX0FQSSBpbnQgemVuZF9nZXRfY2xvc3VyZSh6dmFs ICpvYmosIHplbmRfY2xhc3NfZW50cnkgKipjZV9wdHIsIHplbmRfZnVuY3Rpb24gKipmcHRy X3B0ciwgenZhbCAqKnpvYmpfcHRyLCB6dmFsICoqKnpvYmpfcHRyX3B0ciBUU1JNTFNfREMp IC8qIHt7eyAqLworeworCWlmIChaX09CSkNFX1Aob2JqKSA9PSB6ZW5kX2NlX2Nsb3N1cmUp IHsKKwkJemVuZF9jbG9zdXJlICpjbG9zdXJlID0gKHplbmRfY2xvc3VyZSAqKXplbmRfb2Jq ZWN0X3N0b3JlX2dldF9vYmplY3Qob2JqKTsKKworCQkqZnB0cl9wdHIgPSAmY2xvc3VyZS0+ ZnVuYzsKKwkJaWYgKGNsb3N1cmUtPnRoaXNfcHRyKSB7CisJCQlpZiAoem9ial9wdHIpIHsK KwkJCQkqem9ial9wdHIgPSBjbG9zdXJlLT50aGlzX3B0cjsKKwkJCX0KKwkJCWlmICh6b2Jq X3B0cl9wdHIpIHsKKwkJCQkqem9ial9wdHJfcHRyID0gJmNsb3N1cmUtPnRoaXNfcHRyOwor CQkJfQorCQkJKmNlX3B0ciA9IFpfT0JKQ0VfUChjbG9zdXJlLT50aGlzX3B0cik7CisJCX0g ZWxzZSB7CisJCQlpZiAoem9ial9wdHIpIHsKKwkJCQkqem9ial9wdHIgPSBOVUxMOworCQkJ fQorCQkJaWYgKHpvYmpfcHRyX3B0cikgeworCQkJCSp6b2JqX3B0cl9wdHIgPSBOVUxMOwor CQkJfQorCQkJKmNlX3B0ciA9IGNsb3N1cmUtPmZ1bmMuY29tbW9uLnNjb3BlOworCQl9CisJ CXJldHVybiBTVUNDRVNTOworCX0KKwlyZXR1cm4gRkFJTFVSRTsKK30KKy8qIH19fSAqLwor CisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogdGFiLXdpZHRoOiA0CisgKiBjLWJhc2lj LW9mZnNldDogNAorICogaW5kZW50LXRhYnMtbW9kZTogdAorICogRW5kOgorICovCkluZGV4 OiBaZW5kL3plbmRfY2xvc3VyZXMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiBaZW5kL3pl bmRfY2xvc3VyZXMuaApkaWZmIC1OIFplbmQvemVuZF9jbG9zdXJlcy5oCi0tLSAvZGV2L251 bGwJMSBKYW4gMTk3MCAwMDowMDowMCAtMDAwMAorKysgWmVuZC96ZW5kX2Nsb3N1cmVzLmgJ MjcgSnVuIDIwMDggMTY6NTM6MjcgLTAwMDAKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAgICst LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tKworICAgfCBaZW5kIEVuZ2luZSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICArLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLSsKKyAgIHwgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDggWmVuZCBUZWNobm9sb2dp ZXMgTHRkLiAoaHR0cDovL3d3dy56ZW5kLmNvbSkgfAorICAgKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0r CisgICB8IFRoaXMgc291cmNlIGZpbGUgaXMgc3ViamVjdCB0byB2ZXJzaW9uIDIuMDAgb2Yg dGhlIFplbmQgbGljZW5zZSwgICAgIHwKKyAgIHwgdGhhdCBpcyBidW5kbGVkIHdpdGggdGhp cyBwYWNrYWdlIGluIHRoZSBmaWxlIExJQ0VOU0UsIGFuZCBpcyAgICAgICAgfCAKKyAgIHwg YXZhaWxhYmxlIHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViIGF0IHRoZSBmb2xsb3dpbmcg dXJsOiAgICAgICAgICAgfAorICAgfCBodHRwOi8vd3d3LnplbmQuY29tL2xpY2Vuc2UvMl8w MC50eHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICB8IElmIHlvdSBk aWQgbm90IHJlY2VpdmUgYSBjb3B5IG9mIHRoZSBaZW5kIGxpY2Vuc2UgYW5kIGFyZSB1bmFi bGUgdG8gIHwKKyAgIHwgb2J0YWluIGl0IHRocm91Z2ggdGhlIHdvcmxkLXdpZGUtd2ViLCBw bGVhc2Ugc2VuZCBhIG5vdGUgdG8gICAgICAgICAgfAorICAgfCBsaWNlbnNlQHplbmQuY29t IHNvIHdlIGNhbiBtYWlsIHlvdSBhIGNvcHkgaW1tZWRpYXRlbHkuICAgICAgICAgICAgICB8 CisgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgIHwgQXV0aG9yczogQ2hyaXN0aWFuIFNlaWxl ciA8Y2hyaXNfc2VAZ214Lm5ldD4gICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgfCAg ICAgICAgICBEbWl0cnkgU3RvZ292IDxkbWl0cnlAemVuZC5jb20+ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8CisgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyovCisKKy8qICRJZCQg Ki8KKworI2lmbmRlZiBaRU5EX0NMT1NVUkVTX0gKKyNkZWZpbmUgWkVORF9DTE9TVVJFU19I CisKK0JFR0lOX0VYVEVSTl9DKCkKKwordm9pZCB6ZW5kX3JlZ2lzdGVyX2Nsb3N1cmVfY2Uo VFNSTUxTX0QpOworCitaRU5EX0FQSSB2b2lkIHplbmRfY3JlYXRlX2Nsb3N1cmUoenZhbCAq cmVzLCB6ZW5kX2Z1bmN0aW9uICpvcF9hcnJheSwgemVuZF9jbGFzc19lbnRyeSAqc2NvcGUs IHp2YWwgKnRoaXNfcHRyIFRTUk1MU19EQyk7CitaRU5EX0FQSSBpbnQgemVuZF9nZXRfY2xv c3VyZSh6dmFsICpvYmosIHplbmRfY2xhc3NfZW50cnkgKipjZV9wdHIsIHplbmRfZnVuY3Rp b24gKipmcHRyX3B0ciwgenZhbCAqKnpvYmpfcHRyLCB6dmFsICoqKnpvYmpfcHRyX3B0ciBU U1JNTFNfREMpOworCitFTkRfRVhURVJOX0MoKQorCisjZW5kaWYKKworLyoKKyAqIExvY2Fs IHZhcmlhYmxlczoKKyAqIHRhYi13aWR0aDogNAorICogYy1iYXNpYy1vZmZzZXQ6IDQKKyAq IGluZGVudC10YWJzLW1vZGU6IHQKKyAqIEVuZDoKKyAqLwpJbmRleDogWmVuZC96ZW5kX2Nv bXBpbGUuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvcmVwb3NpdG9yeS9aZW5kRW5naW5l Mi96ZW5kX2NvbXBpbGUuYyx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS42NDcuMi4yNy4yLjQx LjIuNjkKZGlmZiAtdSAtcCAtZCAtcjEuNjQ3LjIuMjcuMi40MS4yLjY5IHplbmRfY29tcGls ZS5jCi0tLSBaZW5kL3plbmRfY29tcGlsZS5jCTIwIEp1biAyMDA4IDE3OjE3OjA1IC0wMDAw CTEuNjQ3LjIuMjcuMi40MS4yLjY5CisrKyBaZW5kL3plbmRfY29tcGlsZS5jCTI3IEp1biAy MDA4IDE2OjUzOjI3IC0wMDAwCkBAIC0xMzc1LDYgKzEzNzUsMzEgQEAgdm9pZCB6ZW5kX2Rv X2JlZ2luX2Z1bmN0aW9uX2RlY2xhcmF0aW9uKAogCUNHKGxhYmVscykgPSBOVUxMOwogfQog Cit2b2lkIHplbmRfZG9fYmVnaW5fbGFtYmRhX2Z1bmN0aW9uX2RlY2xhcmF0aW9uKHpub2Rl ICpyZXN1bHQsIHpub2RlICpmdW5jdGlvbl90b2tlbiwgaW50IHJldHVybl9yZWZlcmVuY2Ug VFNSTUxTX0RDKQoreworCXpub2RlICAgICAgICAgIGZ1bmN0aW9uX25hbWU7CisJemVuZF9v cF9hcnJheSAqY3VycmVudF9vcF9hcnJheSA9IENHKGFjdGl2ZV9vcF9hcnJheSk7CisJaW50 ICAgICAgICAgICAgY3VycmVudF9vcF9udW1iZXIgPSBnZXRfbmV4dF9vcF9udW1iZXIoQ0co YWN0aXZlX29wX2FycmF5KSk7CisJemVuZF9vcCAgICAgICAqY3VycmVudF9vcDsKKworCWZ1 bmN0aW9uX25hbWUub3BfdHlwZSA9IElTX0NPTlNUOworCVpWQUxfU1RSSU5HTCgmZnVuY3Rp b25fbmFtZS51LmNvbnN0YW50LCAibGFtYmRhIiwgc2l6ZW9mKCJsYW1iZGEiKS0xLCAxKTsK KworCXplbmRfZG9fYmVnaW5fZnVuY3Rpb25fZGVjbGFyYXRpb24oZnVuY3Rpb25fdG9rZW4s ICZmdW5jdGlvbl9uYW1lLCAwLCByZXR1cm5fcmVmZXJlbmNlLCBOVUxMIFRTUk1MU19DQyk7 CisKKwlyZXN1bHQtPm9wX3R5cGUgPSBJU19UTVBfVkFSOworCXJlc3VsdC0+dS52YXIgPSBn ZXRfdGVtcG9yYXJ5X3ZhcmlhYmxlKGN1cnJlbnRfb3BfYXJyYXkpOzsKKworCWN1cnJlbnRf b3AgPSAmY3VycmVudF9vcF9hcnJheS0+b3Bjb2Rlc1tjdXJyZW50X29wX251bWJlcl07CisJ Y3VycmVudF9vcC0+b3Bjb2RlID0gWkVORF9ERUNMQVJFX0xBTUJEQV9GVU5DVElPTjsKKwl6 dmFsX2R0b3IoJmN1cnJlbnRfb3AtPm9wMi51LmNvbnN0YW50KTsKKwlaVkFMX0xPTkcoJmN1 cnJlbnRfb3AtPm9wMi51LmNvbnN0YW50LCB6ZW5kX2hhc2hfZnVuYyhaX1NUUlZBTChjdXJy ZW50X29wLT5vcDEudS5jb25zdGFudCksIFpfU1RSTEVOKGN1cnJlbnRfb3AtPm9wMS51LmNv bnN0YW50KSkpOworCWN1cnJlbnRfb3AtPnJlc3VsdCA9ICpyZXN1bHQ7CisKKyAgICBDRyhh Y3RpdmVfb3BfYXJyYXkpLT5mbl9mbGFncyB8PSBaRU5EX0FDQ19DTE9TVVJFOworfQorCisK IHZvaWQgemVuZF9kb19oYW5kbGVfZXhjZXB0aW9uKFRTUk1MU19EKQogewogCXplbmRfb3Ag Km9wbGluZSA9IGdldF9uZXh0X29wKENHKGFjdGl2ZV9vcF9hcnJheSkgVFNSTUxTX0NDKTsK QEAgLTQxMjksMTMgKzQxNTQsMTMgQEAgdm9pZCB6ZW5kX2RvX2ZldGNoX3N0YXRpY192YXJp YWJsZSh6bm9kZQogCX0KIAogCW9wbGluZSA9IGdldF9uZXh0X29wKENHKGFjdGl2ZV9vcF9h cnJheSkgVFNSTUxTX0NDKTsKLQlvcGxpbmUtPm9wY29kZSA9IFpFTkRfRkVUQ0hfVzsJCS8q IHRoZSBkZWZhdWx0IG1vZGUgbXVzdCBiZSBXcml0ZSwgc2luY2UgZmV0Y2hfc2ltcGxlX3Zh cmlhYmxlKCkgaXMgdXNlZCB0byBkZWZpbmUgZnVuY3Rpb24gYXJndW1lbnRzICovCisJb3Bs aW5lLT5vcGNvZGUgPSAoZmV0Y2hfdHlwZSA9PSBaRU5EX0ZFVENIX0xFWElDQUwpID8gWkVO RF9GRVRDSF9SIDogWkVORF9GRVRDSF9XOwkJLyogdGhlIGRlZmF1bHQgbW9kZSBtdXN0IGJl IFdyaXRlLCBzaW5jZSBmZXRjaF9zaW1wbGVfdmFyaWFibGUoKSBpcyB1c2VkIHRvIGRlZmlu ZSBmdW5jdGlvbiBhcmd1bWVudHMgKi8KIAlvcGxpbmUtPnJlc3VsdC5vcF90eXBlID0gSVNf VkFSOwogCW9wbGluZS0+cmVzdWx0LnUuRUEudHlwZSA9IDA7CiAJb3BsaW5lLT5yZXN1bHQu dS52YXIgPSBnZXRfdGVtcG9yYXJ5X3ZhcmlhYmxlKENHKGFjdGl2ZV9vcF9hcnJheSkpOwog CW9wbGluZS0+b3AxID0gKnZhcm5hbWU7CiAJU0VUX1VOVVNFRChvcGxpbmUtPm9wMik7Ci0J b3BsaW5lLT5vcDIudS5FQS50eXBlID0gZmV0Y2hfdHlwZTsKKwlvcGxpbmUtPm9wMi51LkVB LnR5cGUgPSBaRU5EX0ZFVENIX1NUQVRJQzsKIAlyZXN1bHQgPSBvcGxpbmUtPnJlc3VsdDsK IAogCWlmICh2YXJuYW1lLT5vcF90eXBlID09IElTX0NPTlNUKSB7CkBAIC00MTQzLDEyICs0 MTY4LDQwIEBAIHZvaWQgemVuZF9kb19mZXRjaF9zdGF0aWNfdmFyaWFibGUoem5vZGUKIAl9 CiAJZmV0Y2hfc2ltcGxlX3ZhcmlhYmxlKCZsdmFsLCB2YXJuYW1lLCAwIFRTUk1MU19DQyk7 IC8qIFJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IHRoZSBkZWZhdWx0IGZldGNoIGlzIEJQX1ZB Ul9XICovCiAKLQl6ZW5kX2RvX2Fzc2lnbl9yZWYoTlVMTCwgJmx2YWwsICZyZXN1bHQgVFNS TUxTX0NDKTsKKwlpZiAoZmV0Y2hfdHlwZSA9PSBaRU5EX0ZFVENIX0xFWElDQUwpIHsKKwkJ em5vZGUgZHVtbXk7CisKKwkJemVuZF9kb19iZWdpbl92YXJpYWJsZV9wYXJzZShUU1JNTFNf Qyk7CisJCXplbmRfZG9fYXNzaWduKCZkdW1teSwgJmx2YWwsICZyZXN1bHQgVFNSTUxTX0ND KTsKKwkJemVuZF9kb19mcmVlKCZkdW1teSk7CisJfSBlbHNlIHsKKwkJemVuZF9kb19hc3Np Z25fcmVmKE5VTEwsICZsdmFsLCAmcmVzdWx0IFRTUk1MU19DQyk7CisJfQogCUNHKGFjdGl2 ZV9vcF9hcnJheSktPm9wY29kZXNbQ0coYWN0aXZlX29wX2FycmF5KS0+bGFzdC0xXS5yZXN1 bHQudS5FQS50eXBlIHw9IEVYVF9UWVBFX1VOVVNFRDsKIAogLyoJenZhbF9kdG9yKCZ2YXJu YW1lLT51LmNvbnN0YW50KTsgKi8KIH0KIAordm9pZCB6ZW5kX2RvX2ZldGNoX2xleGljYWxf dmFyaWFibGUoem5vZGUgKnZhcm5hbWUsIHplbmRfYm9vbCBpc19yZWYgVFNSTUxTX0RDKQor eworCXpub2RlIHZhbHVlOworCisJaWYgKFpfU1RSTEVOKHZhcm5hbWUtPnUuY29uc3RhbnQp ID09IHNpemVvZigidGhpcyIpIC0gMSAmJgorCSAgICBtZW1jbXAoWl9TVFJWQUwodmFybmFt ZS0+dS5jb25zdGFudCksICJ0aGlzIiwgc2l6ZW9mKCJ0aGlzIikgLSAxKSA9PSAwKSB7CisJ ICAgIHp2YWxfZHRvcigmdmFybmFtZS0+dS5jb25zdGFudCk7CisJICAgIENHKGFjdGl2ZV9v cF9hcnJheSktPmZuX2ZsYWdzIHw9IFpFTkRfQUNDX0NMT1NVUkVfV0lUSF9USElTOworCQly ZXR1cm47CisJfQorCisJdmFsdWUub3BfdHlwZSA9IElTX0NPTlNUOworCVpWQUxfTlVMTCgm dmFsdWUudS5jb25zdGFudCk7CisJWl9UWVBFKHZhbHVlLnUuY29uc3RhbnQpIHw9IGlzX3Jl ZiA/IElTX0xFWElDQUxfUkVGIDogSVNfTEVYSUNBTF9WQVI7CisJWl9TRVRfUkVGQ09VTlRf UCgmdmFsdWUudS5jb25zdGFudCwgMSk7CisJWl9VTlNFVF9JU1JFRl9QKCZ2YWx1ZS51LmNv bnN0YW50KTsKKwkKKwl6ZW5kX2RvX2ZldGNoX3N0YXRpY192YXJpYWJsZSh2YXJuYW1lLCAm dmFsdWUsIGlzX3JlZiA/IFpFTkRfRkVUQ0hfU1RBVElDIDogWkVORF9GRVRDSF9MRVhJQ0FM IFRTUk1MU19DQyk7Cit9CisKIHZvaWQgemVuZF9kb19mZXRjaF9nbG9iYWxfdmFyaWFibGUo em5vZGUgKnZhcm5hbWUsIHpub2RlICpzdGF0aWNfYXNzaWdubWVudCwgaW50IGZldGNoX3R5 cGUgVFNSTUxTX0RDKQogewogCXplbmRfb3AgKm9wbGluZTsKSW5kZXg6IFplbmQvemVuZF9j b21waWxlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL3JlcG9zaXRvcnkvWmVuZEVuZ2lu ZTIvemVuZF9jb21waWxlLmgsdgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuMzE2LjIuOC4yLjEy LjIuMjUKZGlmZiAtdSAtcCAtZCAtcjEuMzE2LjIuOC4yLjEyLjIuMjUgemVuZF9jb21waWxl LmgKLS0tIFplbmQvemVuZF9jb21waWxlLmgJMTEgSnVuIDIwMDggMTM6MTg6MzkgLTAwMDAJ MS4zMTYuMi44LjIuMTIuMi4yNQorKysgWmVuZC96ZW5kX2NvbXBpbGUuaAkyNyBKdW4gMjAw OCAxNjo1MzoyNyAtMDAwMApAQCAtMTUxLDYgKzE1MSw4IEBAIHR5cGVkZWYgc3RydWN0IF96 ZW5kX3RyeV9jYXRjaF9lbGVtZW50IHsKIC8qIGNsYXNzIGltcGxlbWVudCBpbnRlcmZhY2Uo cykgZmxhZyAqLwogI2RlZmluZSBaRU5EX0FDQ19JTVBMRU1FTlRfSU5URVJGQUNFUyAweDgw MDAwCiAKKyNkZWZpbmUgWkVORF9BQ0NfQ0xPU1VSRSAgICAgICAgICAgICAgMHgxMDAwMDAK KyNkZWZpbmUgWkVORF9BQ0NfQ0xPU1VSRV9XSVRIX1RISVMgICAgMHgyMDAwMDAKIAogY2hh ciAqemVuZF92aXNpYmlsaXR5X3N0cmluZyh6ZW5kX3VpbnQgZm5fZmxhZ3MpOwogCkBAIC00 MjksNiArNDMxLDkgQEAgdm9pZCB6ZW5kX2RvX2VuZF9mdW5jdGlvbl9jYWxsKHpub2RlICpm dQogdm9pZCB6ZW5kX2RvX3JldHVybih6bm9kZSAqZXhwciwgaW50IGRvX2VuZF92cGFyc2Ug VFNSTUxTX0RDKTsKIHZvaWQgemVuZF9kb19oYW5kbGVfZXhjZXB0aW9uKFRTUk1MU19EKTsK IAordm9pZCB6ZW5kX2RvX2JlZ2luX2xhbWJkYV9mdW5jdGlvbl9kZWNsYXJhdGlvbih6bm9k ZSAqcmVzdWx0LCB6bm9kZSAqZnVuY3Rpb25fdG9rZW4sIGludCByZXR1cm5fcmVmZXJlbmNl IFRTUk1MU19EQyk7Cit2b2lkIHplbmRfZG9fZmV0Y2hfbGV4aWNhbF92YXJpYWJsZSh6bm9k ZSAqdmFybmFtZSwgemVuZF9ib29sIGlzX3JlZiBUU1JNTFNfREMpOworCiB2b2lkIHplbmRf ZG9fdHJ5KHpub2RlICp0cnlfdG9rZW4gVFNSTUxTX0RDKTsKIHZvaWQgemVuZF9kb19iZWdp bl9jYXRjaCh6bm9kZSAqdHJ5X3Rva2VuLCB6bm9kZSAqY2F0Y2hfY2xhc3MsIHpub2RlICpj YXRjaF92YXIsIHpub2RlICpmaXJzdF9jYXRjaCBUU1JNTFNfREMpOwogdm9pZCB6ZW5kX2Rv X2VuZF9jYXRjaCh6bm9kZSAqdHJ5X3Rva2VuIFRTUk1MU19EQyk7CkBAIC02MTQsNyArNjE5 LDggQEAgaW50IHplbmRsZXgoem5vZGUgKnplbmRsdmFsIFRTUk1MU19EQyk7CiAjZGVmaW5l IFpFTkRfRkVUQ0hfTE9DQUwJCQkxCiAjZGVmaW5lIFpFTkRfRkVUQ0hfU1RBVElDCQkJMgog I2RlZmluZSBaRU5EX0ZFVENIX1NUQVRJQ19NRU1CRVIJMwotI2RlZmluZSBaRU5EX0ZFVENI X0dMT0JBTF9MT0NLCTQKKyNkZWZpbmUgWkVORF9GRVRDSF9HTE9CQUxfTE9DSwkJNAorI2Rl ZmluZSBaRU5EX0ZFVENIX0xFWElDQUwJCQk1CiAKIAogLyogY2xhc3MgZmV0Y2hlcyAqLwpJ bmRleDogWmVuZC96ZW5kX2RlZmF1bHRfY2xhc3Nlcy5jCj09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZp bGU6IC9yZXBvc2l0b3J5L1plbmRFbmdpbmUyL3plbmRfZGVmYXVsdF9jbGFzc2VzLmMsdgpy ZXRyaWV2aW5nIHJldmlzaW9uIDEuNTkuMi4yLjIuMS4yLjEKZGlmZiAtdSAtcCAtZCAtcjEu NTkuMi4yLjIuMS4yLjEgemVuZF9kZWZhdWx0X2NsYXNzZXMuYwotLS0gWmVuZC96ZW5kX2Rl ZmF1bHRfY2xhc3Nlcy5jCTMxIERlYyAyMDA3IDA3OjE3OjA0IC0wMDAwCTEuNTkuMi4yLjIu MS4yLjEKKysrIFplbmQvemVuZF9kZWZhdWx0X2NsYXNzZXMuYwkyNyBKdW4gMjAwOCAxNjo1 MzoyNyAtMDAwMApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgInplbmRfYnVpbHRpbl9m dW5jdGlvbnMuaCIKICNpbmNsdWRlICJ6ZW5kX2ludGVyZmFjZXMuaCIKICNpbmNsdWRlICJ6 ZW5kX2V4Y2VwdGlvbnMuaCIKKyNpbmNsdWRlICJ6ZW5kX2Nsb3N1cmVzLmgiCiAKIAogWkVO RF9BUEkgdm9pZCB6ZW5kX3JlZ2lzdGVyX2RlZmF1bHRfY2xhc3NlcyhUU1JNTFNfRCkKQEAg LTMxLDYgKzMyLDcgQEAgWkVORF9BUEkgdm9pZCB6ZW5kX3JlZ2lzdGVyX2RlZmF1bHRfY2xh cwogCXplbmRfcmVnaXN0ZXJfaW50ZXJmYWNlcyhUU1JNTFNfQyk7CiAJemVuZF9yZWdpc3Rl cl9kZWZhdWx0X2V4Y2VwdGlvbihUU1JNTFNfQyk7CiAJemVuZF9yZWdpc3Rlcl9pdGVyYXRv cl93cmFwcGVyKFRTUk1MU19DKTsKKwl6ZW5kX3JlZ2lzdGVyX2Nsb3N1cmVfY2UoVFNSTUxT X0MpOwogfQogCiAvKgpJbmRleDogWmVuZC96ZW5kX2V4ZWN1dGUuYwo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 ClJDUyBmaWxlOiAvcmVwb3NpdG9yeS9aZW5kRW5naW5lMi96ZW5kX2V4ZWN1dGUuYyx2CnJl dHJpZXZpbmcgcmV2aXNpb24gMS43MTYuMi4xMi4yLjI0LjIuMzAKZGlmZiAtdSAtcCAtZCAt cjEuNzE2LjIuMTIuMi4yNC4yLjMwIHplbmRfZXhlY3V0ZS5jCi0tLSBaZW5kL3plbmRfZXhl Y3V0ZS5jCTExIEp1biAyMDA4IDEzOjE4OjM5IC0wMDAwCTEuNzE2LjIuMTIuMi4yNC4yLjMw CisrKyBaZW5kL3plbmRfZXhlY3V0ZS5jCTI3IEp1biAyMDA4IDE2OjUzOjI3IC0wMDAwCkBA IC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSAiemVuZF9pbmkuaCIKICNpbmNsdWRlICJ6ZW5k X2V4Y2VwdGlvbnMuaCIKICNpbmNsdWRlICJ6ZW5kX2ludGVyZmFjZXMuaCIKKyNpbmNsdWRl ICJ6ZW5kX2Nsb3N1cmVzLmgiCiAjaW5jbHVkZSAiemVuZF92bS5oIgogCiAvKiBWaXJ0dWFs IGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgc3VwcG9ydCAqLwpJbmRleDogWmVuZC96ZW5k X2V4ZWN1dGVfQVBJLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL3JlcG9zaXRvcnkvWmVu ZEVuZ2luZTIvemVuZF9leGVjdXRlX0FQSS5jLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjMz MS4yLjIwLjIuMjQuMi40MgpkaWZmIC11IC1wIC1kIC1yMS4zMzEuMi4yMC4yLjI0LjIuNDIg emVuZF9leGVjdXRlX0FQSS5jCi0tLSBaZW5kL3plbmRfZXhlY3V0ZV9BUEkuYwk1IEp1biAy MDA4IDE4OjUwOjI5IC0wMDAwCTEuMzMxLjIuMjAuMi4yNC4yLjQyCisrKyBaZW5kL3plbmRf ZXhlY3V0ZV9BUEkuYwkyNyBKdW4gMjAwOCAxNjo1MzoyNyAtMDAwMApAQCAtMzAsNiArMzAs NyBAQAogI2luY2x1ZGUgInplbmRfY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAiemVuZF9leHRl bnNpb25zLmgiCiAjaW5jbHVkZSAiemVuZF9leGNlcHRpb25zLmgiCisjaW5jbHVkZSAiemVu ZF9jbG9zdXJlcy5oIgogI2luY2x1ZGUgInplbmRfdm0uaCIKICNpZmRlZiBIQVZFX1NZU19U SU1FX0gKICNpbmNsdWRlIDxzeXMvdGltZS5oPgpAQCAtNzM5LDYgKzc0MCwxMCBAQCBpbnQg emVuZF9jYWxsX2Z1bmN0aW9uKHplbmRfZmNhbGxfaW5mbyAqCiAJCQlTRVBBUkFURV9aVkFM X0lGX05PVF9SRUYodG1wX29iamVjdF9wdHIpOwogCQkJZmNpLT5vYmplY3RfcHAgPSB0bXBf b2JqZWN0X3B0cjsKIAkJCVpfU0VUX0lTUkVGX1BQKGZjaS0+b2JqZWN0X3BwKTsKKwkJfSBl bHNlIGlmIChaX1RZUEVfUChmY2ktPmZ1bmN0aW9uX25hbWUpID09IElTX09CSkVDVCkgewor CQkJaWYgKHplbmRfZ2V0X2Nsb3N1cmUoZmNpLT5mdW5jdGlvbl9uYW1lLCAmY2FsbGluZ19z Y29wZSwgJkVYKGZ1bmN0aW9uX3N0YXRlKS5mdW5jdGlvbiwgTlVMTCwgJmZjaS0+b2JqZWN0 X3BwIFRTUk1MU19DQykgPT0gU1VDQ0VTUykgeworCQkJCWdvdG8gaW5pdF9mY2lfY2FjaGU7 CisJCQl9CiAJCX0KIAogCQlpZiAoZmNpLT5vYmplY3RfcHAgJiYgISpmY2ktPm9iamVjdF9w cCkgewpAQCAtOTM1LDYgKzk0MCw4IEBAIGludCB6ZW5kX2NhbGxfZnVuY3Rpb24oemVuZF9m Y2FsbF9pbmZvICoKIAkJCQlyZXR1cm4gRkFJTFVSRTsKIAkJCX0KIAkJfQorCitpbml0X2Zj aV9jYWNoZToKIAkJaWYgKGZjaV9jYWNoZSAmJgogCQkJKEVYKGZ1bmN0aW9uX3N0YXRlKS5m dW5jdGlvbi0+dHlwZSAhPSBaRU5EX0lOVEVSTkFMX0ZVTkNUSU9OIHx8CiAJCQkoKHplbmRf aW50ZXJuYWxfZnVuY3Rpb24qKUVYKGZ1bmN0aW9uX3N0YXRlKS5mdW5jdGlvbiktPmhhbmRs ZXIgIT0gemVuZF9zdGRfY2FsbF91c2VyX2NhbGwpCkluZGV4OiBaZW5kL3plbmRfbGFuZ3Vh Z2VfcGFyc2VyLnkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogL3JlcG9zaXRvcnkvWmVuZEVu Z2luZTIvemVuZF9sYW5ndWFnZV9wYXJzZXIueSx2CnJldHJpZXZpbmcgcmV2aXNpb24gMS4x NjAuMi40LjIuOC4yLjIxCmRpZmYgLXUgLXAgLWQgLXIxLjE2MC4yLjQuMi44LjIuMjEgemVu ZF9sYW5ndWFnZV9wYXJzZXIueQotLS0gWmVuZC96ZW5kX2xhbmd1YWdlX3BhcnNlci55CTgg SnVuIDIwMDggMDk6Mzg6NDcgLTAwMDAJMS4xNjAuMi40LjIuOC4yLjIxCisrKyBaZW5kL3pl bmRfbGFuZ3VhZ2VfcGFyc2VyLnkJMjcgSnVuIDIwMDggMTY6NTM6MjcgLTAwMDAKQEAgLTMw Miw3ICszMDIsNyBAQCBpc19yZWZlcmVuY2U6CiAKIAogdW50aWNrZWRfZnVuY3Rpb25fZGVj bGFyYXRpb25fc3RhdGVtZW50OgotCQlUX0ZVTkNUSU9OIHsgJDEudS5vcGxpbmVfbnVtID0g Q0coemVuZF9saW5lbm8pOyB9IGlzX3JlZmVyZW5jZSBUX1NUUklORyB7IHplbmRfZG9fYmVn aW5fZnVuY3Rpb25fZGVjbGFyYXRpb24oJiQxLCAmJDQsIDAsICQzLm9wX3R5cGUsIE5VTEwg VFNSTUxTX0NDKTsgfQorCQlmdW5jdGlvbiBpc19yZWZlcmVuY2UgVF9TVFJJTkcgeyB6ZW5k X2RvX2JlZ2luX2Z1bmN0aW9uX2RlY2xhcmF0aW9uKCYkMSwgJiQzLCAwLCAkMi5vcF90eXBl LCBOVUxMIFRTUk1MU19DQyk7IH0KIAkJCScoJyBwYXJhbWV0ZXJfbGlzdCAnKScgJ3snIGlu bmVyX3N0YXRlbWVudF9saXN0ICd9JyB7IHplbmRfZG9fZW5kX2Z1bmN0aW9uX2RlY2xhcmF0 aW9uKCYkMSBUU1JNTFNfQ0MpOyB9CiA7CiAKQEAgLTUxMCw4ICs1MTAsOCBAQCBjbGFzc19z dGF0ZW1lbnRfbGlzdDoKIGNsYXNzX3N0YXRlbWVudDoKIAkJdmFyaWFibGVfbW9kaWZpZXJz IHsgQ0coYWNjZXNzX3R5cGUpID0gWl9MVkFMKCQxLnUuY29uc3RhbnQpOyB9IGNsYXNzX3Zh cmlhYmxlX2RlY2xhcmF0aW9uICc7JwogCXwJY2xhc3NfY29uc3RhbnRfZGVjbGFyYXRpb24g JzsnCi0JfAltZXRob2RfbW9kaWZpZXJzIFRfRlVOQ1RJT04geyAkMi51Lm9wbGluZV9udW0g PSBDRyh6ZW5kX2xpbmVubyk7IH0gaXNfcmVmZXJlbmNlIFRfU1RSSU5HIHsgemVuZF9kb19i ZWdpbl9mdW5jdGlvbl9kZWNsYXJhdGlvbigmJDIsICYkNSwgMSwgJDQub3BfdHlwZSwgJiQx IFRTUk1MU19DQyk7IH0gJygnCi0JCQlwYXJhbWV0ZXJfbGlzdCAnKScgbWV0aG9kX2JvZHkg eyB6ZW5kX2RvX2Fic3RyYWN0X21ldGhvZCgmJDUsICYkMSwgJiQxMCBUU1JNTFNfQ0MpOyB6 ZW5kX2RvX2VuZF9mdW5jdGlvbl9kZWNsYXJhdGlvbigmJDIgVFNSTUxTX0NDKTsgfQorCXwJ bWV0aG9kX21vZGlmaWVycyBmdW5jdGlvbiBpc19yZWZlcmVuY2UgVF9TVFJJTkcgeyB6ZW5k X2RvX2JlZ2luX2Z1bmN0aW9uX2RlY2xhcmF0aW9uKCYkMiwgJiQ0LCAxLCAkMy5vcF90eXBl LCAmJDEgVFNSTUxTX0NDKTsgfSAnKCcKKwkJCXBhcmFtZXRlcl9saXN0ICcpJyBtZXRob2Rf Ym9keSB7IHplbmRfZG9fYWJzdHJhY3RfbWV0aG9kKCYkNCwgJiQxLCAmJDkgVFNSTUxTX0ND KTsgemVuZF9kb19lbmRfZnVuY3Rpb25fZGVjbGFyYXRpb24oJiQyIFRTUk1MU19DQyk7IH0K IDsKIAogCkBAIC02NDMsMTAgKzY0MywyOCBAQCBleHByX3dpdGhvdXRfdmFyaWFibGU6CiAJ fAlUX0FSUkFZICcoJyBhcnJheV9wYWlyX2xpc3QgJyknIHsgJCQgPSAkMzsgfQogCXwJJ2An IGVuY2Fwc19saXN0ICdgJyB7IHplbmRfZG9fc2hlbGxfZXhlYygmJCQsICYkMiBUU1JNTFNf Q0MpOyB9CiAJfAlUX1BSSU5UIGV4cHIgIHsgemVuZF9kb19wcmludCgmJCQsICYkMiBUU1JN TFNfQ0MpOyB9CisJfAlmdW5jdGlvbiBpc19yZWZlcmVuY2UgJygnIHsgemVuZF9kb19iZWdp bl9sYW1iZGFfZnVuY3Rpb25fZGVjbGFyYXRpb24oJiQkLCAmJDEsICQyLm9wX3R5cGUgVFNS TUxTX0NDKTsgfQorCQkJcGFyYW1ldGVyX2xpc3QgJyknIGxleGljYWxfdmFycyAneycgaW5u ZXJfc3RhdGVtZW50X2xpc3QgJ30nIHsgIHplbmRfZG9fZW5kX2Z1bmN0aW9uX2RlY2xhcmF0 aW9uKCYkMSBUU1JNTFNfQ0MpOyAkJCA9ICQ0OyB9Cis7CisKK2Z1bmN0aW9uOgorCVRfRlVO Q1RJT04geyAkJC51Lm9wbGluZV9udW0gPSBDRyh6ZW5kX2xpbmVubyk7IH0KKzsKKworbGV4 aWNhbF92YXJzOgorCQkvKiBlbXB0cnkgKi8KKwl8CVRfVVNFICcoJyBsZXhpY2FsX3Zhcl9s aXN0ICcpJworOworCitsZXhpY2FsX3Zhcl9saXN0OgorCQlsZXhpY2FsX3Zhcl9saXN0ICcs JyBUX1ZBUklBQkxFCQkJeyB6ZW5kX2RvX2ZldGNoX2xleGljYWxfdmFyaWFibGUoJiQzLCAw IFRTUk1MU19DQyk7IH0KKwl8CWxleGljYWxfdmFyX2xpc3QgJywnICcmJyBUX1ZBUklBQkxF CQl7IHplbmRfZG9fZmV0Y2hfbGV4aWNhbF92YXJpYWJsZSgmJDQsIDEgVFNSTUxTX0NDKTsg fQorCXwJVF9WQVJJQUJMRQkJCQkJCQkJeyB6ZW5kX2RvX2ZldGNoX2xleGljYWxfdmFyaWFi bGUoJiQxLCAwIFRTUk1MU19DQyk7IH0KKwl8CScmJyBUX1ZBUklBQkxFCQkJCQkJCXsgemVu ZF9kb19mZXRjaF9sZXhpY2FsX3ZhcmlhYmxlKCYkMiwgMSBUU1JNTFNfQ0MpOyB9CiA7CiAK IGZ1bmN0aW9uX2NhbGw6Ci0JCVRfU1RSSU5HCScoJyB7ICQyLnUub3BsaW5lX251bSA9IHpl bmRfZG9fYmVnaW5fZnVuY3Rpb25fY2FsbCgmJDEsIDEgVFNSTUxTX0NDKTsgfQorCQlUX1NU UklORyAnKCcgeyAkMi51Lm9wbGluZV9udW0gPSB6ZW5kX2RvX2JlZ2luX2Z1bmN0aW9uX2Nh bGwoJiQxLCAxIFRTUk1MU19DQyk7IH0KIAkJCQlmdW5jdGlvbl9jYWxsX3BhcmFtZXRlcl9s aXN0CiAJCQkJJyknIHsgemVuZF9kb19lbmRfZnVuY3Rpb25fY2FsbCgmJDEsICYkJCwgJiQ0 LCAwLCAkMi51Lm9wbGluZV9udW0gVFNSTUxTX0NDKTsgemVuZF9kb19leHRlbmRlZF9mY2Fs bF9lbmQoVFNSTUxTX0MpOyB9CiAJfAlUX1BBQU1BWUlNX05FS1VET1RBWUlNIFRfU1RSSU5H ICcoJyB7ICQzLnUub3BsaW5lX251bSA9IHplbmRfZG9fYmVnaW5fZnVuY3Rpb25fY2FsbCgm JDIsIDAgVFNSTUxTX0NDKTsgfQpJbmRleDogWmVuZC96ZW5kX3ZtX2RlZi5oCj09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0KUkNTIGZpbGU6IC9yZXBvc2l0b3J5L1plbmRFbmdpbmUyL3plbmRfdm1fZGVmLmgs dgpyZXRyaWV2aW5nIHJldmlzaW9uIDEuNTkuMi4yOS4yLjQ4LjIuNTgKZGlmZiAtdSAtcCAt ZCAtcjEuNTkuMi4yOS4yLjQ4LjIuNTggemVuZF92bV9kZWYuaAotLS0gWmVuZC96ZW5kX3Zt X2RlZi5oCTExIEp1biAyMDA4IDEzOjE4OjM5IC0wMDAwCTEuNTkuMi4yOS4yLjQ4LjIuNTgK KysrIFplbmQvemVuZF92bV9kZWYuaAkyNyBKdW4gMjAwOCAxNjo1MzoyNyAtMDAwMApAQCAt MjAyOSw2ICsyMDI5LDE1IEBAIFpFTkRfVk1fSEFORExFUig1OSwgWkVORF9JTklUX0ZDQUxM X0JZX04KIAl9IGVsc2UgewogCQlmdW5jdGlvbl9uYW1lID0gR0VUX09QMl9aVkFMX1BUUihC UF9WQVJfUik7CiAKKwkJaWYgKFpfVFlQRV9QKGZ1bmN0aW9uX25hbWUpID09IElTX09CSkVD VCAmJgorCQkJemVuZF9nZXRfY2xvc3VyZShmdW5jdGlvbl9uYW1lLCAmRVgoY2FsbGVkX3Nj b3BlKSwgJkVYKGZiYyksICZFWChvYmplY3QpLCBOVUxMIFRTUk1MU19DQykgPT0gU1VDQ0VT UykgeworCQkJaWYgKEVYKG9iamVjdCkpIHsKKwkJCQlaX0FERFJFRl9QKEVYKG9iamVjdCkp OworCQkJfQorCQkJRlJFRV9PUDIoKTsKKwkJCVpFTkRfVk1fTkVYVF9PUENPREUoKTsKKwkJ fQorCiAJCWlmIChaX1RZUEVfUChmdW5jdGlvbl9uYW1lKSAhPSBJU19TVFJJTkcpIHsKIAkJ CXplbmRfZXJyb3Jfbm9yZXR1cm4oRV9FUlJPUiwgIkZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBh IHN0cmluZyIpOwogCQl9CkBAIC00MzI3LDQgKzQzMzYsMTkgQEAgWkVORF9WTV9IQU5ETEVS KDE0MywgWkVORF9ERUNMQVJFX0NPTlNULAogCVpFTkRfVk1fTkVYVF9PUENPREUoKTsKIH0K IAorWkVORF9WTV9IQU5ETEVSKDE1MywgWkVORF9ERUNMQVJFX0xBTUJEQV9GVU5DVElPTiwg Q09OU1QsIENPTlNUKQoreworCXplbmRfb3AgKm9wbGluZSA9IEVYKG9wbGluZSk7CisJemVu ZF9vcF9hcnJheSAqb3BfYXJyYXk7CisKKwlpZiAoemVuZF9oYXNoX3F1aWNrX2ZpbmQoRUco ZnVuY3Rpb25fdGFibGUpLCBaX1NUUlZBTChvcGxpbmUtPm9wMS51LmNvbnN0YW50KSwgWl9T VFJMRU4ob3BsaW5lLT5vcDEudS5jb25zdGFudCksIFpfTFZBTChvcGxpbmUtPm9wMi51LmNv bnN0YW50KSwgKHZvaWQgKikgJm9wX2FycmF5KSA9PSBGQUlMVVJFIHx8CisJICAgIG9wX2Fy cmF5LT50eXBlICE9IFpFTkRfVVNFUl9GVU5DVElPTikgeworCQl6ZW5kX2Vycm9yX25vcmV0 dXJuKEVfRVJST1IsICJCYXNlIGxhbWJkYSBmdW5jdGlvbiBmb3IgY2xvc3VyZSBub3QgZm91 bmQiKTsKKwl9CisKKwl6ZW5kX2NyZWF0ZV9jbG9zdXJlKCZFWF9UKG9wbGluZS0+cmVzdWx0 LnUudmFyKS50bXBfdmFyLCBvcF9hcnJheSwgRUcoc2NvcGUpLCBFRyhUaGlzKSBUU1JNTFNf Q0MpOworCisJWkVORF9WTV9ORVhUX09QQ09ERSgpOworfQorCiBaRU5EX1ZNX0VYUE9SVF9I RUxQRVIoemVuZF9kb19mY2FsbCwgemVuZF9kb19mY2FsbF9jb21tb25faGVscGVyKQpJbmRl eDogWmVuZC96ZW5kX3ZtX2V4ZWN1dGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiAvcmVw b3NpdG9yeS9aZW5kRW5naW5lMi96ZW5kX3ZtX2V4ZWN1dGUuaCx2CnJldHJpZXZpbmcgcmV2 aXNpb24gMS42Mi4yLjMwLjIuNDkuMi41OApkaWZmIC11IC1wIC1kIC1yMS42Mi4yLjMwLjIu NDkuMi41OCB6ZW5kX3ZtX2V4ZWN1dGUuaAotLS0gWmVuZC96ZW5kX3ZtX2V4ZWN1dGUuaAkx MSBKdW4gMjAwOCAxMzoxODozOSAtMDAwMAkxLjYyLjIuMzAuMi40OS4yLjU4CisrKyBaZW5k L3plbmRfdm1fZXhlY3V0ZS5oCTI3IEp1biAyMDA4IDE2OjUzOjI3IC0wMDAwCkBAIC03NDcs NiArNzQ3LDE1IEBAIHN0YXRpYyBpbnQgWkVORF9GQVNUQ0FMTCAgWkVORF9JTklUX0ZDQUwK IAl9IGVsc2UgewogCQlmdW5jdGlvbl9uYW1lID0gJm9wbGluZS0+b3AyLnUuY29uc3RhbnQ7 CiAKKwkJaWYgKFpfVFlQRV9QKGZ1bmN0aW9uX25hbWUpID09IElTX09CSkVDVCAmJgorCQkJ emVuZF9nZXRfY2xvc3VyZShmdW5jdGlvbl9uYW1lLCAmRVgoY2FsbGVkX3Njb3BlKSwgJkVY KGZiYyksICZFWChvYmplY3QpLCBOVUxMIFRTUk1MU19DQykgPT0gU1VDQ0VTUykgeworCQkJ aWYgKEVYKG9iamVjdCkpIHsKKwkJCQlaX0FERFJFRl9QKEVYKG9iamVjdCkpOworCQkJfQor CisJCQlaRU5EX1ZNX05FWFRfT1BDT0RFKCk7CisJCX0KKwogCQlpZiAoWl9UWVBFX1AoZnVu Y3Rpb25fbmFtZSkgIT0gSVNfU1RSSU5HKSB7CiAJCQl6ZW5kX2Vycm9yX25vcmV0dXJuKEVf RVJST1IsICJGdW5jdGlvbiBuYW1lIG11c3QgYmUgYSBzdHJpbmciKTsKIAkJfQpAQCAtOTM1 LDYgKzk0NCwxNSBAQCBzdGF0aWMgaW50IFpFTkRfRkFTVENBTEwgIFpFTkRfSU5JVF9GQ0FM CiAJfSBlbHNlIHsKIAkJZnVuY3Rpb25fbmFtZSA9IF9nZXRfenZhbF9wdHJfdG1wKCZvcGxp bmUtPm9wMiwgRVgoVHMpLCAmZnJlZV9vcDIgVFNSTUxTX0NDKTsKIAorCQlpZiAoWl9UWVBF X1AoZnVuY3Rpb25fbmFtZSkgPT0gSVNfT0JKRUNUICYmCisJCQl6ZW5kX2dldF9jbG9zdXJl KGZ1bmN0aW9uX25hbWUsICZFWChjYWxsZWRfc2NvcGUpLCAmRVgoZmJjKSwgJkVYKG9iamVj dCksIE5VTEwgVFNSTUxTX0NDKSA9PSBTVUNDRVNTKSB7CisJCQlpZiAoRVgob2JqZWN0KSkg eworCQkJCVpfQUREUkVGX1AoRVgob2JqZWN0KSk7CisJCQl9CisJCQl6dmFsX2R0b3IoZnJl ZV9vcDIudmFyKTsKKwkJCVpFTkRfVk1fTkVYVF9PUENPREUoKTsKKwkJfQorCiAJCWlmICha X1RZUEVfUChmdW5jdGlvbl9uYW1lKSAhPSBJU19TVFJJTkcpIHsKIAkJCXplbmRfZXJyb3Jf bm9yZXR1cm4oRV9FUlJPUiwgIkZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZyIpOwog CQl9CkBAIC0xMDMxLDYgKzEwNDksMTUgQEAgc3RhdGljIGludCBaRU5EX0ZBU1RDQUxMICBa RU5EX0lOSVRfRkNBTAogCX0gZWxzZSB7CiAJCWZ1bmN0aW9uX25hbWUgPSBfZ2V0X3p2YWxf cHRyX3Zhcigmb3BsaW5lLT5vcDIsIEVYKFRzKSwgJmZyZWVfb3AyIFRTUk1MU19DQyk7CiAK KwkJaWYgKFpfVFlQRV9QKGZ1bmN0aW9uX25hbWUpID09IElTX09CSkVDVCAmJgorCQkJemVu ZF9nZXRfY2xvc3VyZShmdW5jdGlvbl9uYW1lLCAmRVgoY2FsbGVkX3Njb3BlKSwgJkVYKGZi YyksICZFWChvYmplY3QpLCBOVUxMIFRTUk1MU19DQykgPT0gU1VDQ0VTUykgeworCQkJaWYg KEVYKG9iamVjdCkpIHsKKwkJCQlaX0FERFJFRl9QKEVYKG9iamVjdCkpOworCQkJfQorCQkJ aWYgKGZyZWVfb3AyLnZhcikge3p2YWxfcHRyX2R0b3IoJmZyZWVfb3AyLnZhcik7fTsKKwkJ CVpFTkRfVk1fTkVYVF9PUENPREUoKTsKKwkJfQorCiAJCWlmIChaX1RZUEVfUChmdW5jdGlv bl9uYW1lKSAhPSBJU19TVFJJTkcpIHsKIAkJCXplbmRfZXJyb3Jfbm9yZXR1cm4oRV9FUlJP UiwgIkZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZyIpOwogCQl9CkBAIC0xMTU1LDYg KzExODIsMTUgQEAgc3RhdGljIGludCBaRU5EX0ZBU1RDQUxMICBaRU5EX0lOSVRfRkNBTAog CX0gZWxzZSB7CiAJCWZ1bmN0aW9uX25hbWUgPSBfZ2V0X3p2YWxfcHRyX2N2KCZvcGxpbmUt Pm9wMiwgRVgoVHMpLCBCUF9WQVJfUiBUU1JNTFNfQ0MpOwogCisJCWlmIChaX1RZUEVfUChm dW5jdGlvbl9uYW1lKSA9PSBJU19PQkpFQ1QgJiYKKwkJCXplbmRfZ2V0X2Nsb3N1cmUoZnVu Y3Rpb25fbmFtZSwgJkVYKGNhbGxlZF9zY29wZSksICZFWChmYmMpLCAmRVgob2JqZWN0KSwg TlVMTCBUU1JNTFNfQ0MpID09IFNVQ0NFU1MpIHsKKwkJCWlmIChFWChvYmplY3QpKSB7CisJ CQkJWl9BRERSRUZfUChFWChvYmplY3QpKTsKKwkJCX0KKworCQkJWkVORF9WTV9ORVhUX09Q Q09ERSgpOworCQl9CisKIAkJaWYgKFpfVFlQRV9QKGZ1bmN0aW9uX25hbWUpICE9IElTX1NU UklORykgewogCQkJemVuZF9lcnJvcl9ub3JldHVybihFX0VSUk9SLCAiRnVuY3Rpb24gbmFt ZSBtdXN0IGJlIGEgc3RyaW5nIik7CiAJCX0KQEAgLTI4NzUsNiArMjkxMSwyMSBAQCBzdGF0 aWMgaW50IFpFTkRfRkFTVENBTEwgIFpFTkRfREVDTEFSRV9DCiAJWkVORF9WTV9ORVhUX09Q Q09ERSgpOwogfQogCitzdGF0aWMgaW50IFpFTkRfRkFTVENBTEwgIFpFTkRfREVDTEFSRV9M QU1CREFfRlVOQ1RJT05fU1BFQ19DT05TVF9DT05TVF9IQU5ETEVSKFpFTkRfT1BDT0RFX0hB TkRMRVJfQVJHUykKK3sKKwl6ZW5kX29wICpvcGxpbmUgPSBFWChvcGxpbmUpOworCXplbmRf b3BfYXJyYXkgKm9wX2FycmF5OworCisJaWYgKHplbmRfaGFzaF9xdWlja19maW5kKEVHKGZ1 bmN0aW9uX3RhYmxlKSwgWl9TVFJWQUwob3BsaW5lLT5vcDEudS5jb25zdGFudCksIFpfU1RS TEVOKG9wbGluZS0+b3AxLnUuY29uc3RhbnQpLCBaX0xWQUwob3BsaW5lLT5vcDIudS5jb25z dGFudCksICh2b2lkICopICZvcF9hcnJheSkgPT0gRkFJTFVSRSB8fAorCSAgICBvcF9hcnJh eS0+dHlwZSAhPSBaRU5EX1VTRVJfRlVOQ1RJT04pIHsKKwkJemVuZF9lcnJvcl9ub3JldHVy bihFX0VSUk9SLCAiQmFzZSBsYW1iZGEgZnVuY3Rpb24gZm9yIGNsb3N1cmUgbm90IGZvdW5k Iik7CisJfQorCisJemVuZF9jcmVhdGVfY2xvc3VyZSgmRVhfVChvcGxpbmUtPnJlc3VsdC51 LnZhcikudG1wX3Zhciwgb3BfYXJyYXksIEVHKHNjb3BlKSwgRUcoVGhpcykgVFNSTUxTX0ND KTsKKworCVpFTkRfVk1fTkVYVF9PUENPREUoKTsKK30KKwogc3RhdGljIGludCBaRU5EX0ZB U1RDQUxMICBaRU5EX0FERF9TUEVDX0NPTlNUX1RNUF9IQU5ETEVSKFpFTkRfT1BDT0RFX0hB TkRMRVJfQVJHUykKIHsKIAl6ZW5kX29wICpvcGxpbmUgPSBFWChvcGxpbmUpOwpAQCAtMzM1 MDgsNiArMzM1NTksMzEgQEAgdm9pZCB6ZW5kX2luaXRfb3Bjb2Rlc19oYW5kbGVycyh2b2lk KQogICAJWkVORF9KTVBfU0VUX1NQRUNfQ1ZfSEFORExFUiwKICAgCVpFTkRfSk1QX1NFVF9T UEVDX0NWX0hBTkRMRVIsCiAgIAlaRU5EX0pNUF9TRVRfU1BFQ19DVl9IQU5ETEVSLAorICAJ WkVORF9ERUNMQVJFX0xBTUJEQV9GVU5DVElPTl9TUEVDX0NPTlNUX0NPTlNUX0hBTkRMRVIs CisgIAlaRU5EX05VTExfSEFORExFUiwKKyAgCVpFTkRfTlVMTF9IQU5ETEVSLAorICAJWkVO RF9OVUxMX0hBTkRMRVIsCisgIAlaRU5EX05VTExfSEFORExFUiwKKyAgCVpFTkRfTlVMTF9I QU5ETEVSLAorICAJWkVORF9OVUxMX0hBTkRMRVIsCisgIAlaRU5EX05VTExfSEFORExFUiwK KyAgCVpFTkRfTlVMTF9IQU5ETEVSLAorICAJWkVORF9OVUxMX0hBTkRMRVIsCisgIAlaRU5E X05VTExfSEFORExFUiwKKyAgCVpFTkRfTlVMTF9IQU5ETEVSLAorICAJWkVORF9OVUxMX0hB TkRMRVIsCisgIAlaRU5EX05VTExfSEFORExFUiwKKyAgCVpFTkRfTlVMTF9IQU5ETEVSLAor ICAJWkVORF9OVUxMX0hBTkRMRVIsCisgIAlaRU5EX05VTExfSEFORExFUiwKKyAgCVpFTkRf TlVMTF9IQU5ETEVSLAorICAJWkVORF9OVUxMX0hBTkRMRVIsCisgIAlaRU5EX05VTExfSEFO RExFUiwKKyAgCVpFTkRfTlVMTF9IQU5ETEVSLAorICAJWkVORF9OVUxMX0hBTkRMRVIsCisg IAlaRU5EX05VTExfSEFORExFUiwKKyAgCVpFTkRfTlVMTF9IQU5ETEVSLAorICAJWkVORF9O VUxMX0hBTkRMRVIsCiAgIAlaRU5EX05VTExfSEFORExFUgogICB9OwogICB6ZW5kX29wY29k ZV9oYW5kbGVycyA9IChvcGNvZGVfaGFuZGxlcl90KilsYWJlbHM7CkluZGV4OiBaZW5kL3pl bmRfdm1fb3Bjb2Rlcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IC9yZXBvc2l0b3J5L1pl bmRFbmdpbmUyL3plbmRfdm1fb3Bjb2Rlcy5oLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjQy LjIuMTcuMi4xLjIuNgpkaWZmIC11IC1wIC1kIC1yMS40Mi4yLjE3LjIuMS4yLjYgemVuZF92 bV9vcGNvZGVzLmgKLS0tIFplbmQvemVuZF92bV9vcGNvZGVzLmgJMjggTWFyIDIwMDggMTQ6 MzU6MDEgLTAwMDAJMS40Mi4yLjE3LjIuMS4yLjYKKysrIFplbmQvemVuZF92bV9vcGNvZGVz LmgJMjcgSnVuIDIwMDggMTY6NTM6MjcgLTAwMDAKQEAgLTE1MiwzICsxNTIsNCBAQAogI2Rl ZmluZSBaRU5EX0hBTkRMRV9FWENFUFRJT04gICAgICAgICAgICAgICAgMTQ5CiAjZGVmaW5l IFpFTkRfVVNFUl9PUENPREUgICAgICAgICAgICAgICAgICAgICAxNTAKICNkZWZpbmUgWkVO RF9KTVBfU0VUICAgICAgICAgICAgICAgICAgICAgICAgIDE1MgorI2RlZmluZSBaRU5EX0RF Q0xBUkVfTEFNQkRBX0ZVTkNUSU9OICAgICAgICAgMTUzCkluZGV4OiBaZW5kL3Rlc3RzL2Ns b3N1cmVfMDAxLnBocHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogWmVuZC90ZXN0cy9jbG9z dXJlXzAwMS5waHB0CmRpZmYgLU4gWmVuZC90ZXN0cy9jbG9zdXJlXzAwMS5waHB0Ci0tLSAv ZGV2L251bGwJMSBKYW4gMTk3MCAwMDowMDowMCAtMDAwMAorKysgWmVuZC90ZXN0cy9jbG9z dXJlXzAwMS5waHB0CTI3IEp1biAyMDA4IDE2OjUzOjI3IC0wMDAwCkBAIC0wLDAgKzEsMzQg QEAKKy0tVEVTVC0tCitDbG9zdXJlIHRlc3Q6IExhbWJkYSB3aXRob3V0IGxleGljYWwgdmFy aWFibGVzCistLVNLSVBJRi0tCis8P3BocCAKKwlpZiAoIWNsYXNzX2V4aXN0cygnQ2xvc3Vy ZScpKSBkaWUoJ3NraXAgQ2xvc3VyZSBzdXBwb3J0IGlzIG5lZWRlZCcpOworPz4KKy0tRklM RS0tCis8P3BocAorCiskbGFtYmRhMSA9IGZ1bmN0aW9uICgpIHsKKwllY2hvICJIZWxsbyBX b3JsZCFcbiI7Cit9OworCiskbGFtYmRhMiA9IGZ1bmN0aW9uICgkeCkgeworCWVjaG8gIkhl bGxvICR4IVxuIjsKK307CisKK3Zhcl9kdW1wKGlzX2NhbGxhYmxlKCRsYW1iZGExKSk7Cit2 YXJfZHVtcChpc19jYWxsYWJsZSgkbGFtYmRhMikpOworJGxhbWJkYTEoKTsKKyRsYW1iZGEy KCJVbml2ZXJzZSIpOworY2FsbF91c2VyX2Z1bmMoJGxhbWJkYTEpOworY2FsbF91c2VyX2Z1 bmMoJGxhbWJkYTIsICJVbml2ZXJzZSIpOworCitlY2hvICJEb25lXG4iOworPz4KKy0tRVhQ RUNURi0tCQorYm9vbCh0cnVlKQorYm9vbCh0cnVlKQorSGVsbG8gV29ybGQhCitIZWxsbyBV bml2ZXJzZSEKK0hlbGxvIFdvcmxkIQorSGVsbG8gVW5pdmVyc2UhCitEb25lCkluZGV4OiBa ZW5kL3Rlc3RzL2Nsb3N1cmVfMDAyLnBocHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogWmVu ZC90ZXN0cy9jbG9zdXJlXzAwMi5waHB0CmRpZmYgLU4gWmVuZC90ZXN0cy9jbG9zdXJlXzAw Mi5waHB0Ci0tLSAvZGV2L251bGwJMSBKYW4gMTk3MCAwMDowMDowMCAtMDAwMAorKysgWmVu ZC90ZXN0cy9jbG9zdXJlXzAwMi5waHB0CTI3IEp1biAyMDA4IDE2OjUzOjI3IC0wMDAwCkBA IC0wLDAgKzEsMzMgQEAKKy0tVEVTVC0tCitDbG9zdXJlIHRlc3Q6IExhbWJkYSB3aXRoIGxl eGljYWwgdmFyaWFibGVzIChnbG9iYWwgc2NvcGUpCistLVNLSVBJRi0tCis8P3BocCAKKwlp ZiAoIWNsYXNzX2V4aXN0cygnQ2xvc3VyZScpKSBkaWUoJ3NraXAgQ2xvc3VyZSBzdXBwb3J0 IGlzIG5lZWRlZCcpOworPz4KKy0tRklMRS0tCis8P3BocAorCiskeCA9IDQ7CisKKyRsYW1i ZGExID0gZnVuY3Rpb24gKCkgdXNlICgkeCkgeworCWVjaG8gIiR4XG4iOworfTsKKworJGxh bWJkYTIgPSBmdW5jdGlvbiAoKSB1c2UgKCYkeCkgeworCWVjaG8gIiR4XG4iOworfTsKKwor JGxhbWJkYTEoKTsKKyRsYW1iZGEyKCk7CiskeCsrOworJGxhbWJkYTEoKTsKKyRsYW1iZGEy KCk7CisKK2VjaG8gIkRvbmVcbiI7Cis/PgorLS1FWFBFQ1RGLS0KKzQKKzQKKzQKKzUKK0Rv bmUKSW5kZXg6IFplbmQvdGVzdHMvY2xvc3VyZV8wMDMucGhwdAo9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJD UyBmaWxlOiBaZW5kL3Rlc3RzL2Nsb3N1cmVfMDAzLnBocHQKZGlmZiAtTiBaZW5kL3Rlc3Rz L2Nsb3N1cmVfMDAzLnBocHQKLS0tIC9kZXYvbnVsbAkxIEphbiAxOTcwIDAwOjAwOjAwIC0w MDAwCisrKyBaZW5kL3Rlc3RzL2Nsb3N1cmVfMDAzLnBocHQJMjcgSnVuIDIwMDggMTY6NTM6 MjcgLTAwMDAKQEAgLTAsMCArMSwzNyBAQAorLS1URVNULS0KK0Nsb3N1cmUgdGVzdDogTGFt YmRhIHdpdGggbGV4aWNhbCB2YXJpYWJsZXMgKGxvY2FsIHNjb3BlKQorLS1TS0lQSUYtLQor PD9waHAgCisJaWYgKCFjbGFzc19leGlzdHMoJ0Nsb3N1cmUnKSkgZGllKCdza2lwIENsb3N1 cmUgc3VwcG9ydCBpcyBuZWVkZWQnKTsKKz8+CistLUZJTEUtLQorPD9waHAKKworZnVuY3Rp b24gcnVuICgpIHsKKwkkeCA9IDQ7CisKKwkkbGFtYmRhMSA9IGZ1bmN0aW9uICgpIHVzZSAo JHgpIHsKKwkJZWNobyAiJHhcbiI7CisJfTsKKworCSRsYW1iZGEyID0gZnVuY3Rpb24gKCkg dXNlICgmJHgpIHsKKwkJZWNobyAiJHhcbiI7CisJfTsKKworCSRsYW1iZGExKCk7CisJJGxh bWJkYTIoKTsKKwkkeCsrOworCSRsYW1iZGExKCk7CisJJGxhbWJkYTIoKTsKK30KKworcnVu KCk7CisKK2VjaG8gIkRvbmVcbiI7Cis/PgorLS1FWFBFQ1RGLS0KKzQKKzQKKzQKKzUKK0Rv bmUKSW5kZXg6IFplbmQvdGVzdHMvY2xvc3VyZV8wMDQucGhwdAo9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJD UyBmaWxlOiBaZW5kL3Rlc3RzL2Nsb3N1cmVfMDA0LnBocHQKZGlmZiAtTiBaZW5kL3Rlc3Rz L2Nsb3N1cmVfMDA0LnBocHQKLS0tIC9kZXYvbnVsbAkxIEphbiAxOTcwIDAwOjAwOjAwIC0w MDAwCisrKyBaZW5kL3Rlc3RzL2Nsb3N1cmVfMDA0LnBocHQJMjcgSnVuIDIwMDggMTY6NTM6 MjcgLTAwMDAKQEAgLTAsMCArMSwzOSBAQAorLS1URVNULS0KK0Nsb3N1cmUgdGVzdDogTGFt YmRhIHdpdGggbGV4aWNhbCB2YXJpYWJsZXMgKHNjb3BlIGxpZmV0aW1lKQorLS1TS0lQSUYt LQorPD9waHAgCisJaWYgKCFjbGFzc19leGlzdHMoJ0Nsb3N1cmUnKSkgZGllKCdza2lwIENs b3N1cmUgc3VwcG9ydCBpcyBuZWVkZWQnKTsKKz8+CistLUZJTEUtLQorPD9waHAKKworZnVu Y3Rpb24gcnVuICgpIHsKKwkkeCA9IDQ7CisKKwkkbGFtYmRhMSA9IGZ1bmN0aW9uICgpIHVz ZSAoJHgpIHsKKwkJZWNobyAiJHhcbiI7CisJfTsKKworCSRsYW1iZGEyID0gZnVuY3Rpb24g KCkgdXNlICgmJHgpIHsKKwkJZWNobyAiJHhcbiI7CisJCSR4Kys7CisJfTsKKworCXJldHVy biBhcnJheSgkbGFtYmRhMSwgJGxhbWJkYTIpOworfQorCitsaXN0ICgkbGFtYmRhMSwgJGxh bWJkYTIpID0gcnVuKCk7CisKKyRsYW1iZGExKCk7CiskbGFtYmRhMigpOworJGxhbWJkYTEo KTsKKyRsYW1iZGEyKCk7CisKK2VjaG8gIkRvbmVcbiI7Cis/PgorLS1FWFBFQ1RGLS0KKzQK KzQKKzQKKzUKK0RvbmUKSW5kZXg6IFplbmQvdGVzdHMvY2xvc3VyZV8wMDUucGhwdAo9PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09ClJDUyBmaWxlOiBaZW5kL3Rlc3RzL2Nsb3N1cmVfMDA1LnBocHQKZGlmZiAt TiBaZW5kL3Rlc3RzL2Nsb3N1cmVfMDA1LnBocHQKLS0tIC9kZXYvbnVsbAkxIEphbiAxOTcw IDAwOjAwOjAwIC0wMDAwCisrKyBaZW5kL3Rlc3RzL2Nsb3N1cmVfMDA1LnBocHQJMjcgSnVu IDIwMDggMTY6NTM6MjcgLTAwMDAKQEAgLTAsMCArMSw3OCBAQAorLS1URVNULS0KK0Nsb3N1 cmUgdGVzdDogTGFtYmRhIGluc2lkZSBjbGFzcywgbGlmZXRpbWUgb2YgJHRoaXMKKy0tU0tJ UElGLS0KKzw/cGhwIAorCWlmICghY2xhc3NfZXhpc3RzKCdDbG9zdXJlJykpIGRpZSgnc2tp cCBDbG9zdXJlIHN1cHBvcnQgaXMgbmVlZGVkJyk7Cis/PgorLS1GSUxFLS0KKzw/cGhwCisK K2NsYXNzIEEgeworCXByaXZhdGUgJHg7CisKKwlmdW5jdGlvbiBfX2NvbnN0cnVjdCgkeCkg eworCQkkdGhpcy0+eCA9ICR4OworCX0KKworCWZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKSB7CisJ CWVjaG8gIkRlc3Ryb3llZFxuIjsKKwl9CisKKwlmdW5jdGlvbiBnZXRJbmNlcigkdmFsKSB7 CisJCXJldHVybiBmdW5jdGlvbigpIHVzZSAoJHRoaXMsICR2YWwpIHsKKwkJCSR0aGlzLT54 ICs9ICR2YWw7CisJCX07CisJfQorCisJZnVuY3Rpb24gZ2V0UHJpbnRlcigpIHsKKwkJcmV0 dXJuIGZ1bmN0aW9uKCkgdXNlICgkdGhpcykgeworCQkJZWNobyAkdGhpcy0+eC4iXG4iOwor CQl9OworCX0KKwkKKwlmdW5jdGlvbiBnZXRFcnJvcigpIHsKKwkJcmV0dXJuIGZ1bmN0aW9u KCkgeworCQkJZWNobyAkdGhpcy0+eC4iXG4iOworCQl9OworCX0KKwkKKwlmdW5jdGlvbiBw cmludFgoKSB7CisJCWVjaG8gJHRoaXMtPnguIlxuIjsKKwl9Cit9CisKKyRhID0gbmV3IEEo Myk7CiskaW5jZXIgPSAkYS0+Z2V0SW5jZXIoMik7CiskcHJpbnRlciA9ICRhLT5nZXRQcmlu dGVyKCk7CiskZXJyb3IgPSAkYS0+Z2V0RXJyb3IoKTsKKworJGEtPnByaW50WCgpOworJHBy aW50ZXIoKTsKKyRpbmNlcigpOworJGEtPnByaW50WCgpOworJHByaW50ZXIoKTsKKwordW5z ZXQoJGEpOworCiskaW5jZXIoKTsKKyRwcmludGVyKCk7CisKK3Vuc2V0KCRpbmNlcik7Cisk cHJpbnRlcigpOworCit1bnNldCgkcHJpbnRlcik7CisKKyRlcnJvcigpOworCitlY2hvICJE b25lXG4iOworPz4KKy0tRVhQRUNURi0tCiszCiszCis1Cis1Cis3Cis3CitEZXN0cm95ZWQK KworRmF0YWwgZXJyb3I6IFVzaW5nICR0aGlzIHdoZW4gbm90IGluIG9iamVjdCBjb250ZXh0 IGluICVzY2xvc3VyZV8wMDUucGhwIG9uIGxpbmUgMjgKSW5kZXg6IFplbmQvdGVzdHMvY2xv c3VyZV8wMDYucGhwdAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09ClJDUyBmaWxlOiBaZW5kL3Rlc3RzL2Nsb3N1 cmVfMDA2LnBocHQKZGlmZiAtTiBaZW5kL3Rlc3RzL2Nsb3N1cmVfMDA2LnBocHQKLS0tIC9k ZXYvbnVsbAkxIEphbiAxOTcwIDAwOjAwOjAwIC0wMDAwCisrKyBaZW5kL3Rlc3RzL2Nsb3N1 cmVfMDA2LnBocHQJMjcgSnVuIDIwMDggMTY6NTM6MjcgLTAwMDAKQEAgLTAsMCArMSwyMyBA QAorLS1URVNULS0KK0Nsb3N1cmUgdGVzdDogTmVzdGVkIGxhbWJkYXMKKy0tU0tJUElGLS0K Kzw/cGhwIAorCWlmICghY2xhc3NfZXhpc3RzKCdDbG9zdXJlJykpIGRpZSgnc2tpcCBDbG9z dXJlIHN1cHBvcnQgaXMgbmVlZGVkJyk7Cis/PgorLS1GSUxFLS0KKzw/cGhwCisKKyRnZXRD bG9zdXJlID0gZnVuY3Rpb24gKCR2KSB7CisJcmV0dXJuIGZ1bmN0aW9uICgpIHVzZSAoJHYp IHsKKwkJZWNobyAiSGVsbG8gV29ybGQ6ICR2IVxuIjsKKwl9OworfTsKKworJGNsb3N1cmUg PSAkZ2V0Q2xvc3VyZSAoMik7CiskY2xvc3VyZSAoKTsKKworZWNobyAiRG9uZVxuIjsKKz8+ CistLUVYUEVDVEYtLQorSGVsbG8gV29ybGQ6IDIhCitEb25lCkluZGV4OiBaZW5kL3Rlc3Rz L2Nsb3N1cmVfMDA3LnBocHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogWmVuZC90ZXN0cy9j bG9zdXJlXzAwNy5waHB0CmRpZmYgLU4gWmVuZC90ZXN0cy9jbG9zdXJlXzAwNy5waHB0Ci0t LSAvZGV2L251bGwJMSBKYW4gMTk3MCAwMDowMDowMCAtMDAwMAorKysgWmVuZC90ZXN0cy9j bG9zdXJlXzAwNy5waHB0CTI3IEp1biAyMDA4IDE2OjUzOjI3IC0wMDAwCkBAIC0wLDAgKzEs NDIgQEAKKy0tVEVTVC0tCitDbG9zdXJlIHRlc3Q6IE5lc3RlZCBsYW1iZGFzIGluIGNsYXNz ZXMKKy0tU0tJUElGLS0KKzw/cGhwIAorCWlmICghY2xhc3NfZXhpc3RzKCdDbG9zdXJlJykp IGRpZSgnc2tpcCBDbG9zdXJlIHN1cHBvcnQgaXMgbmVlZGVkJyk7Cis/PgorLS1GSUxFLS0K Kzw/cGhwCisKK2NsYXNzIEEgeworCXByaXZhdGUgJHggPSAwOworCisJZnVuY3Rpb24gZ2V0 Q2xvc3VyZUdldHRlciAoKSB7CisJCXJldHVybiBmdW5jdGlvbiAoKSB1c2UgKCR0aGlzKSB7 CisJCQlyZXR1cm4gZnVuY3Rpb24gKCkgdXNlICgkdGhpcykgeworCQkJCSR0aGlzLT54Kys7 CisJCQl9OworCQl9OworCX0KKworCWZ1bmN0aW9uIHByaW50WCAoKSB7CisJCWVjaG8gJHRo aXMtPnguIlxuIjsKKwl9Cit9CisKKyRhID0gbmV3IEE7CiskYS0+cHJpbnRYKCk7CiskZ2V0 Q2xvc3VyZSA9ICRhLT5nZXRDbG9zdXJlR2V0dGVyKCk7CiskYS0+cHJpbnRYKCk7CiskY2xv c3VyZSA9ICRnZXRDbG9zdXJlKCk7CiskYS0+cHJpbnRYKCk7CiskY2xvc3VyZSgpOworJGEt PnByaW50WCgpOworCitlY2hvICJEb25lXG4iOworPz4KKy0tRVhQRUNURi0tCiswCiswCisw CisxCitEb25lCkluZGV4OiBaZW5kL3Rlc3RzL2Nsb3N1cmVfMDA4LnBocHQKPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQpSQ1MgZmlsZTogWmVuZC90ZXN0cy9jbG9zdXJlXzAwOC5waHB0CmRpZmYgLU4gWmVu ZC90ZXN0cy9jbG9zdXJlXzAwOC5waHB0Ci0tLSAvZGV2L251bGwJMSBKYW4gMTk3MCAwMDow MDowMCAtMDAwMAorKysgWmVuZC90ZXN0cy9jbG9zdXJlXzAwOC5waHB0CTI3IEp1biAyMDA4 IDE2OjUzOjI3IC0wMDAwCkBAIC0wLDAgKzEsMjYgQEAKKy0tVEVTVC0tCitDbG9zdXJlIHRl c3Q6IFVzZSBpbiBwcmVnX3JlcGxhY2UoKQorLS1TS0lQSUYtLQorPD9waHAgCisJaWYgKCFj bGFzc19leGlzdHMoJ0Nsb3N1cmUnKSkgZGllKCdza2lwIENsb3N1cmUgc3VwcG9ydCBpcyBu ZWVkZWQnKTsKKz8+CistLUZJTEUtLQorPD9waHAKKworZnVuY3Rpb24gcmVwbGFjZV9zcGFj ZXMoJHRleHQpIHsKKwkkbGFtYmRhID0gZnVuY3Rpb24gKCRtYXRjaGVzKSB7CisJCXJldHVy biBzdHJfcmVwbGFjZSgnICcsICcmbmJzcDsnLCAkbWF0Y2hlc1sxXSkuJyAnOworCX07CisJ cmV0dXJuIHByZWdfcmVwbGFjZV9jYWxsYmFjaygnLyggKykgLycsICRsYW1iZGEsICR0ZXh0 KTsKK30KKworZWNobyByZXBsYWNlX3NwYWNlcygiMSAyIDNcbiIpOworZWNobyByZXBsYWNl X3NwYWNlcygiMSAgMiAgM1xuIik7CitlY2hvIHJlcGxhY2Vfc3BhY2VzKCIxICAgMiAgIDNc biIpOworZWNobyAiRG9uZVxuIjsKKz8+CistLUVYUEVDVEYtLQorMSAyIDMKKzEmbmJzcDsg MiZuYnNwOyAzCisxJm5ic3A7Jm5ic3A7IDImbmJzcDsmbmJzcDsgMworRG9uZQpJbmRleDog WmVuZC90ZXN0cy9jbG9zdXJlXzAwOS5waHB0Cj09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNTIGZpbGU6IFpl bmQvdGVzdHMvY2xvc3VyZV8wMDkucGhwdApkaWZmIC1OIFplbmQvdGVzdHMvY2xvc3VyZV8w MDkucGhwdAotLS0gL2Rldi9udWxsCTEgSmFuIDE5NzAgMDA6MDA6MDAgLTAwMDAKKysrIFpl bmQvdGVzdHMvY2xvc3VyZV8wMDkucGhwdAkyNyBKdW4gMjAwOCAxNjo1MzoyNyAtMDAwMApA QCAtMCwwICsxLDM1IEBACistLVRFU1QtLQorQ2xvc3VyZSB0ZXN0OiBVc2UgaW4gcHJlZ19y ZXBsYWNlKCkKKy0tU0tJUElGLS0KKzw/cGhwIAorCWlmICghY2xhc3NfZXhpc3RzKCdDbG9z dXJlJykpIGRpZSgnc2tpcCBDbG9zdXJlIHN1cHBvcnQgaXMgbmVlZGVkJyk7Cis/PgorLS1G SUxFLS0KKzw/cGhwCiskYSA9IDE7CiskeCA9IGZ1bmN0aW9uICgkeCkgdXNlICgkYSkgewor ICBzdGF0aWMgJG4gPSAwOworICAkbisrOworICAkYSA9ICRuLic6Jy4kYTsKKyAgZWNobyAk eC4nOicuJGEuIlxuIjsKK307CiskeSA9IGZ1bmN0aW9uICgkeCkgdXNlICgmJGEpIHsKKyAg c3RhdGljICRuID0gMDsKKyAgJG4rKzsKKyAgJGEgPSAkbi4nOicuJGE7CisgIGVjaG8gJHgu JzonLiRhLiJcbiI7Cit9OworJHgoMSk7CiskeCgyKTsKKyR4KDMpOworJHkoNCk7CiskeSg1 KTsKKyR5KDYpOworPz4KKy0tRVhQRUNULS0KKzE6MToxCisyOjI6MQorMzozOjEKKzQ6MTox Cis1OjI6MToxCis2OjM6MjoxOjEKSW5kZXg6IGV4dC9wY3JlL3BocF9wY3JlLmMKPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PQpSQ1MgZmlsZTogL3JlcG9zaXRvcnkvcGhwLXNyYy9leHQvcGNyZS9waHBfcGNy ZS5jLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjE2OC4yLjkuMi4yMS4yLjE1CmRpZmYgLXUg LXAgLWQgLXIxLjE2OC4yLjkuMi4yMS4yLjE1IHBocF9wY3JlLmMKLS0tIGV4dC9wY3JlL3Bo cF9wY3JlLmMJMSBKdW4gMjAwOCAxODo0NzoyMCAtMDAwMAkxLjE2OC4yLjkuMi4yMS4yLjE1 CisrKyBleHQvcGNyZS9waHBfcGNyZS5jCTI3IEp1biAyMDA4IDE2OjUzOjI4IC0wMDAwCkBA IC0xMzEyLDcgKzEzMTIsNyBAQCBzdGF0aWMgdm9pZCBwcmVnX3JlcGxhY2VfaW1wbChJTlRF Uk5BTF9GCiAJfQogCiAJU0VQQVJBVEVfWlZBTChyZXBsYWNlKTsKLQlpZiAoWl9UWVBFX1BQ KHJlcGxhY2UpICE9IElTX0FSUkFZKQorCWlmIChaX1RZUEVfUFAocmVwbGFjZSkgIT0gSVNf QVJSQVkgJiYgKFpfVFlQRV9QUChyZXBsYWNlKSAhPSBJU19PQkpFQ1QgfHwgIWlzX2NhbGxh YmxlX3JlcGxhY2UpKQogCQljb252ZXJ0X3RvX3N0cmluZ19leChyZXBsYWNlKTsKIAlpZiAo aXNfY2FsbGFibGVfcmVwbGFjZSkgewogCQlpZiAoIXplbmRfaXNfY2FsbGFibGUoKnJlcGxh Y2UsIDAsICZjYWxsYmFja19uYW1lKSkgewo= --------------020209050106000500030306--