From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS31976 209.132.180.0/23 X-Spam-Status: No, score=-4.0 required=3.0 tests=AWL,BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_EF,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED,SPF_HELO_PASS,SPF_PASS shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dcvr.yhbt.net (Postfix) with ESMTPS id A43E41F461 for ; Sat, 20 Jul 2019 17:51:10 +0000 (UTC) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:reply-to:from:subject:to:message-id:date :mime-version:content-type; q=dns; s=default; b=Q9D8z9Mx26/3cNuL XlCj5TO6owJXtYzTCWxUqUPqy7r6eKmTLeeKZFWOV3p9cojWXGuKeiB4tr6KVmY5 Z+I/wBG+i3x7vSVfXp5mOyXUZi6qei3uEq2WO+hp9SHXVcaktujYXeXUm3UHJ83y xQekpdvpNjJwAQX2L8OzgNPDCfs= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:reply-to:from:subject:to:message-id:date :mime-version:content-type; s=default; bh=frbP1DNKSkIPJ7OjdxreuA WqH7M=; b=NoPA7aejyC7f93z2laY27RN4ke1pLebuwigfC2X428pQm+3TPPB0ob WY8+bkilArqHH7ZYveoySZqdYScGXkYXeA5UhY2Birdmwdo7ujTQSP6VG5HZ1NiJ aIjWSKkjY5X3bdhqQX8sgZdPaztfi6n/sXAd72OiMLWFx0rORIV04= Received: (qmail 38487 invoked by alias); 20 Jul 2019 17:51:07 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Received: (qmail 38479 invoked by uid 89); 20 Jul 2019 17:51:07 -0000 Authentication-Results: sourceware.org; auth=none X-HELO: relay1.mentorg.com Reply-To: From: Chung-Lin Tang Subject: [PATCH 1/2][RFC] #17645, fix slow DSO sorting behavior in dynamic loader To: GNU C Library Message-ID: Date: Sun, 21 Jul 2019 01:50:53 +0800 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------247ED106C26F78D022B10156" --------------247ED106C26F78D022B10156 Content-Type: text/plain; charset="utf-8"; format=flowed Content-Transfer-Encoding: 7bit Hi, this patch is our attempt at resolving the slow shared object sorting situation in #17645, #15310, and some effort at #15311. I realize this is pretty unsuitable timing to be submitting a patch of such nature now (probably way too late to be included into 2.30), but still sending now anyways as this will probably need quite some discussion before being approved. Prior attempts at solving this slow sorting behavior appeared to have failed due to inadequate proposed testing, therefore cannot convince reviewers to touch what seems to be perceived as a sensitive and easy to break part of ld.so. Therefore the first part of this patch is not a change to the dynamic loader code proper, but a testing framework for constructing DSO sorting tests. It consists of a new Python script 'dso-ordering-test.py' that serves to generate both testcase source files and the needed Makefile fragments from a short description string, for example: a->b->c->d // four objects linked one after another a->[bc]->d;b->c // a depends on b and c, which both depend on d, // b depends on c (b,c linked to object a in fixed order) a->b->c;{+a;%a;-a} // a, b, c serially dependent, main program uses // dlopen/dlsym/dlclose on object a a->b->c;{}!->[abc] // a, b, c serially dependent; multiple tests generated // to test all permutations of a, b, c ordering linked // to main program (Above is just a short description of what the script can do, more documentation is in the script comments.) and, a patch to glibc/elf/Makefile which uses this script to add a few DSO sorting testcases. The description string notation and output form of the generated testcases is short enough that both the test descriptions and expected outcomes can all directly be specified in the Makefile. In terms of the tests I added using this script, I am not completely sure they are (together with existing tests) adequate to prove algorithmic integrity in face of any ld.so code changes, but the script should provide a solid tool to further improve on coverage. Also welcome suggestions if the current features are still lacking in expressing some case of shared object relations, or if the documentation still feels unclear. Thanks, Chung-Lin 2019-07-20 Chung-Lin Tang [BZ #17645] [BZ #15311] [BZ #15310] * elf/Makefile (test_dso_ordering): New make function. (tst-dso-ordering[123456789]): Define new DSO sorting tests. (tst-bz15311): Testcase from #15311. * scripts/dso-ordering-test.py: New script. --------------247ED106C26F78D022B10156 Content-Type: text/plain; charset="UTF-8"; x-mac-type=0; x-mac-creator=0; name="dlsort-01-tests.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="dlsort-01-tests.patch" ZGlmZiAtLWdpdCBhL2VsZi9NYWtlZmlsZSBiL2VsZi9NYWtlZmlsZQppbmRleCBhM2VlZmQx YjFmLi4xYzRlOTQxMTU0IDEwMDY0NAotLS0gYS9lbGYvTWFrZWZpbGUKKysrIGIvZWxmL01h a2VmaWxlCkBAIC0zODMsNiArMzgzLDQ4IEBAIHRlc3RzLXNwZWNpYWwgKz0gJChvYmpwZngp b3JkZXItY21wLm91dCAkKG9ianBmeCl0c3QtYXJyYXkxLWNtcC5vdXQgXAogCQkgJChvYmpw ZngpdHN0LXVudXNlZC1kZXAtY21wLm91dAogZW5kaWYKIAorIyBEU08gc29ydGluZyB0ZXN0 czoKKyMgVGhlIGRzby1vcmRlcmluZy10ZXN0LnB5IHNjcmlwdCBnZW5lcmF0ZXMgdGVzdGNh c2Ugc291cmNlIGZpbGVzIGluICQob2JqcGZ4KSwKKyMgYW5kIG91dHB1dHMgTWFrZWZpbGUg ZnJhZ21lbnRzIGZvciB1c2UgaGVyZS4gSG93ZXZlciBiZWNhdXNlIG5vcm1hbCBvdXRwdXQK KyMgZnJvbSAkKHNoZWxsIC4uKSBoYXMgbmV3bGluZXMgY2hhbmdlZCBpbnRvIHNwYWNlcywg d2UgaGF2ZSB0byBzYXZlIGl0IHRvIGEKKyMgdGVtcG9yYXJ5IGZpbGUgYW5kIHRoZW4gaW5j bHVkZSBpdC4gV2Ugd3JhcCB0aGlzIGVudGlyZSB0ZXN0Y2FzZSBjb25zdHJ1Y3Rpb24KKyMg aW50byBhIGZ1bmN0aW9uIGhlcmUgdG8gbWFrZSB0aGluZ3MgbW9yZSBjb252ZW5pZW50Lgor ZGVmaW5lIHRlc3RfZHNvX29yZGVyaW5nCiskKHNoZWxsICQoUFlUSE9OKSAkKC4uKXNjcmlw dHMvZHNvLW9yZGVyaW5nLXRlc3QucHkgXAorCSQoMikgJCgxKSAkKG9ianBmeCkgPiAkKG9i anBmeCkkKDEpLnRtcC1tYWtlZmlsZSkKKyQoc2hlbGwgZWNobyAkKDMpID4gJChvYmpwZngp JCgxKS5leHApCitpbmNsdWRlICQob2JqcGZ4KSQoMSkudG1wLW1ha2VmaWxlCitlbmRlZgor CisjIEluZGl2aWR1YWwgRFNPIHNvcnRpbmcgdGVzdHMuIFRoZSB0ZXN0IGRlc2NyaXB0aW9u IGFuZCBleHBlY3RlZCBvdXRwdXQgZm9yCisjIGVhY2ggdGVzdCBpcyBzcGVjaWZpZWQgZGly ZWN0bHkgaGVyZS4gU2VlIHRoZSBzb3VyY2Ugb2YgZHNvLW9yZGVyaW5nLXRlc3QucHkKKyMg Zm9yIGRvY3VtZW50YXRpb24gb24gdGhpcy4KKyMgTm90ZSB0aGF0IHdlIG5lZWQgdG8gY3Jl YXRlIHRoZSAkKG9ianBmeCkgZGlyZWN0b3J5IGhlcmUgaW1tZWRpYXRlbHkgdG8gaG9sZAor IyB0aGUgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcyBhbmQgTWFrZWZpbGUgZnJhZ21lbnRzLgor JChzaGVsbCBta2RpciAtcCAkKG9ianBmeCkpCiskKGV2YWwgJChjYWxsIHRlc3RfZHNvX29y ZGVyaW5nLHRzdC1kc28tb3JkZXJpbmcxLCdhLT5iLT5jJywnY2Jhe31hYmMnKSkKKyQoZXZh bCAkKGNhbGwgdGVzdF9kc29fb3JkZXJpbmcsdHN0LWRzby1vcmRlcmluZzIsXAorCSdhLT5i LT5bY2RdLT5lJywnZWRjYmF7fWFiY2RlJykpCiskKGV2YWwgJChjYWxsIHRlc3RfZHNvX29y ZGVyaW5nLHRzdC1kc28tb3JkZXJpbmczLFwKKwknYS0+W2JjXS0+W2RlZl0tPltnaF0tPmkn LCdpaGdmZWRjYmF7fWFiY2RlZmdoaScpKQorJChldmFsICQoY2FsbCB0ZXN0X2Rzb19vcmRl cmluZyx0c3QtZHNvLW9yZGVyaW5nNCxcCisJJ2EtPmItPltkZV07YS0+Yy0+ZC0+ZScsJ2Vk Y2Jhe31hYmNkZScpKQorJChldmFsICQoY2FsbCB0ZXN0X2Rzb19vcmRlcmluZyx0c3QtZHNv LW9yZGVyaW5nNSxcCisJJ2EtPltiY10tPmQ7Yi0+YycsJ2RjYmF7fWFiY2QnKSkKKyQoZXZh bCAkKGNhbGwgdGVzdF9kc29fb3JkZXJpbmcsdHN0LWRzby1vcmRlcmluZzYsXAorCSdhLT5b YmNkZV0tPmYnLCdmZWRjYmF7fWFiY2RlZicpKQorJChldmFsICQoY2FsbCB0ZXN0X2Rzb19v cmRlcmluZyx0c3QtZHNvLW9yZGVyaW5nNyxcCisJJ2EtPltiY107Yi0+W2NkZV07ZS0+Zics J2ZlZGNiYXt9YWJjZGVmJykpCiskKGV2YWwgJChjYWxsIHRlc3RfZHNvX29yZGVyaW5nLHRz dC1kc28tb3JkZXJpbmc4LFwKKwknYS0+Yi0+Yz0+YTt7fS0+W2JhXScsJ2NiYXt9YWJjJykp CiskKGV2YWwgJChjYWxsIHRlc3RfZHNvX29yZGVyaW5nLHRzdC1kc28tb3JkZXJpbmc5LFwK KwknYS0+Yi0+Yy0+ZC0+ZTt7fSEtPlthYmNkZV0nLCdlZGNiYXt9YWJjZGUnKSkKKworIyBG cm9tIEJaICMxNTMxMQorJChldmFsICQoY2FsbCB0ZXN0X2Rzb19vcmRlcmluZyx0c3QtYnox NTMxMSxcCisneythOytlOytmOytnOytkOyVkOy1kOy1nOy1mOy1lOy1hfTthLT5iLT5jLT5k O2Q9PltiYV07Yz0+YTtiPT5lPT5hO2M9PmY9PmI7ZD0+Zz0+YycsXAorJ3srYVtkY2JhXTsr ZVtlXTsrZltmXTsrZ1tnXTsrZFtdOzxkPGI8ZTxhPj4+PGE+PGc8YzxhPjxmPGI8ZTxhPj4+ Pj4+PjstZFtdOy1nW107LWZbXTstZVtdOy1hW2dmYWJjZGVdO30nKSkKKwogY2hlY2stYWJp OiAkKG9ianBmeCljaGVjay1hYmktbGQub3V0CiB0ZXN0cy1zcGVjaWFsICs9ICQob2JqcGZ4 KWNoZWNrLWFiaS1sZC5vdXQKIHVwZGF0ZS1hYmk6IHVwZGF0ZS1hYmktbGQKZGlmZiAtLWdp dCBhL3NjcmlwdHMvZHNvLW9yZGVyaW5nLXRlc3QucHkgYi9zY3JpcHRzL2Rzby1vcmRlcmlu Zy10ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAuLmNmNmY0 MzUyMGYKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2Rzby1vcmRlcmluZy10ZXN0LnB5 CkBAIC0wLDAgKzEsNTU2IEBACisjIS91c3IvYmluL3B5dGhvbjMKKyMgR2VuZXJhdGUgdGVz dGNhc2UgZmlsZXMgYW5kIE1ha2VmaWxlIGZyYWdtZW50cyBmb3IgRFNPIHNvcnRpbmcgdGVz dAorIyBDb3B5cmlnaHQgKEMpIDIwMTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMu CisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorIworIyBUaGUg R05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp dCBhbmQvb3IKKyMgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3Nl ciBHZW5lcmFsIFB1YmxpYworIyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyMgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vu c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoZSBH TlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi ZSB1c2VmdWwsCisjIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisjIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisjIExlc3NlciBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2 ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyMg TGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHNlZQorIyA8 aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKyIiIkdlbmVyYXRlIHRlc3RjYXNl IGZpbGVzIGFuZCBNYWtlZmlsZSBmcmFnbWVudHMgZm9yIERTTyBzb3J0aW5nIHRlc3QKKwor VGhpcyBzY3JpcHQgdGFrZXMgYSBzZW1pY29sb24tc2VwYXJhdGVkIGRlc2NyaXB0aW9uIHN0 cmluZywgYW5kIGdlbmVyYXRlcworYSB0ZXN0Y2FzZSwgaW5jbHVkaW5nIG1haW4gcHJvZ3Jh bSBhbmQgYXNzb2NpYXRlZCBtb2R1bGVzLCBhbmQgTWFrZWZpbGUKK2ZyYWdtZW50cyBmb3Ig aW5jbHVkaW5nIGludG8gZWxmL01ha2VmaWxlLgorCitUaGlzIGlzIGludGVuZGVkIHRvIHNw ZWVkIHVwIGNvbXBsZXggZHluYW1pYyBsaW5rZXIgdGVzdGNhc2UgY29uc3RydWN0aW9uLAor dGhlcmVmb3JlIGZlYXR1cmVzIGFyZSBsYXJnZWx5IG1lY2hhbmljYWwgaW4gbmF0dXJlOyBp bmNvbnNpc3RlbmNpZXMgb3IKK2Vycm9ycyBtYXkgb2NjdXIgaWYgaW5wdXQgY2FzZSB3YXMg aXRzZWxmIGVycm9yb25vdXMgb3IgaGF2ZQordW5mb3Jlc2VlbiBpbnRlcmFjdGlvbnMuCisK K09uIHRoZSBkZXNjcmlwdGlvbiBsYW5ndWFnZSB1c2VkLCBhcyBhbiBleGFtcGxlIGRlc2Ny aXB0aW9uIHN0cmluZzoKKworICBhLT5iIS0+W2NkZWZdO2M9Pmc9Pmg7eytjOyVjOy1jfS0+ YQorCitFYWNoIHNpbmdsZSBhbHBoYWJldCBjaGFyYWN0ZXIgcmVwcmVzZW50cyBhIHNoYXJl ZCBvYmplY3QgbW9kdWxlIChjdXJyZW50bHkKK1thLXpBLVowLTldIGFyZSBhbGxvd2VkLCBj YXNlLXNlbnNpdGl2ZSkKK0FsbCBzdWNoIHNoYXJlZCBvYmplY3RzIGhhdmUgYSBjb25zdHJ1 Y3Rvci9kZXN0cnVjdG9yIGdlbmVyYXRlZCBmb3IgdGhlbQordGhhdCBlbWl0cyBpdHMgc2lu Z2xlIGNoYXJhY3RlciBuYW1lIGJ5IHB1dGNoYXIoKS4KKworVGhlIC0+IG9wZXJhdG9yIHNw ZWNpZmllcyBhIGxpbmsgdGltZSBkZXBlbmRlbmN5LCB0aGVzZSBjYW4gYmUgY2hhaW5lZCBm b3IKK2NvbnZlbmllbmNlIChlLmcuIGEtPmItPmMtPmQpLgorCitUaGUgPT4gb3BlcmF0b3Ig Y3JlYXRlcyBhIGNhbGwtcmVmZXJlbmNlLCBlLmcuIGZvciBhPT5iLCBhbiBmbl9hKCkgZnVu Y3Rpb24KK2lzIGNyZWF0ZWQgaW5zaWRlIG1vZHVsZSAnYScsIHdoaWNoIGNhbGxzIGZuX2Io KSBpbiBtb2R1bGUgJ2InLgorVGhlc2UgbW9kdWxlIGZ1bmN0aW9ucyBlbWl0ICc8bmFtZT4n IG91dHB1dCBpbiBuZXN0ZWQgZm9ybSwKK2UuZy4gYT0+YiBlbWl0cyAnPGE8Yj4+JworCitT cXVhcmUgYnJhY2tldHMgW10gaW4gdGhlIGRlc2NyaXB0aW9uIHNwZWNpZmllcyBtdWx0aXBs ZSBvYmplY3RzOworZS5nLiBhLT5bYmNkXS0+ZSBpcyBlcXVpdmFsZW50IHRvIGEtPmItPmU7 YS0+Yy0+ZTthLT5kLT5lCisKK0Ege30gY29uc3RydWN0IHNwZWNpZmllcyB0aGUgbWFpbiB0 ZXN0IHByb2dyYW0sIGFuZCBpdHMgbGluayBkZXBlbmRlbmNpZXMKK2FyZSBhbHNvIHNwZWNp ZmllZCB1c2luZyAtPi4gSW5zaWRlIHt9LCBhIGZldyA7LXNlcGVyYXRlZCBjb25zdHJ1Y3Rz IGFyZQorYWxsb3dlZDoKKyAgICAgICAgICthICAgTG9hZHMgbW9kdWxlIGEgdXNpbmcgZGxv cGVuKFJUTERfTEFaWXxSVExEX0dMT0JBTCkKKyAgICAgICAgIDphICAgTG9hZHMgbW9kdWxl IGEgdXNpbmcgZGxvcGVuKFJUTERfTEFaWSkKKyAgICAgICAgICVhICAgVXNlIGRsc3ltKCkg dG8gbG9hZCBhbmQgY2FsbCBmbl9hKCkKKyAgICAgICAgIEBhICAgQ2FsbHMgZm5fYSgpIGRp cmVjdGx5LgorICAgICAgICAgLWEgICBVbmxvYWRzIG1vZHVsZSBhIHVzaW5nIGRsY2xvc2Uo KQorCitUaGUgZ2VuZXJhdGVkIG1haW4gcHJvZ3JhbSBvdXRwdXRzICd7JyAnfScgd2l0aCBh bGwgb3V0cHV0IGZyb20gYWJvdmUKK2NvbnN0cnVjdHMgaW4gYmV0d2Vlbi4gVGhlIG90aGVy IG91dHB1dCBiZWZvcmUvYWZ0ZXIge30gYXJlIHRoZSBvcmRlcmVkCitjb25zdHJ1Y3Rvci9k ZXN0cnVjdG9yIG91dHB1dC4KKworSWYgbm8ge30gY29uc3RydWN0IGlzIHByZXNlbnQsIGEg ZGVmYXVsdCBlbXB0eSBtYWluIHByb2dyYW0gaXMgbGlua2VkCithZ2FpbnN0IGFsbCBvYmpl Y3RzIHdoaWNoIGhhdmUgbm8gZGVwZW5kZW5jeSBsaW5rZWQgdG8gaXQuIGUuZy4gZm9yCisn W2FiXS0+YztkLT5lJywgdGhlIGRlZmF1bHQgbWFpbiBwcm9ncmFtIGlzIGVxdWl2YWxlbnQg dG8gJ3t9LT5bYWJkXScKKworVGhlICchJyBvcGVyYXRvciBhZnRlciBvYmplY3QgbmFtZXMg dHVybnMgb24gcGVybXV0YXRpb24gb2YgaXRzCitkZXBlbmRlbmNpZXMsIGUuZy4gd2hpbGUg YS0+W2JjZF0gb25seSBnZW5lcmF0ZXMgb25lIHNldCBvZiBvYmplY3RzLAord2l0aCAnYS5z bycgYnVpbHQgd2l0aCBhIGxpbmsgbGluZSBvZiAiYi5zbyBjLnNvIGQuc28iLCBmb3IgYSEt PltiY2RdCitwZXJtdXRhdGlvbnMgb2YgYSdzIGRlcGVuZGVuY2llcyBjcmVhdGVzIG11bHRp cGxlIHRlc3RjYXNlcyB3aXRoCitkaWZmZXJlbnQgbGluayBsaW5lIG9yZGVyczogImIuc28g Yy5zbyBkLnNvIiwgImMuc28gYi5zbyBkLnNvIiwKKyJiLnNvIGQuc28gYy5zbyIsIGV0Yy4g Tm90ZSB0aGF0IGZvciBhIDx0ZXN0LW5hbWU+IHNwZWNpZmllZCBvbgordGhlIHNjcmlwdCBj b21tYW5kLWxpbmUsIG11bHRpcGxlIDx0ZXN0LW5hbWVfMT4sIDx0ZXN0LW5hbWVfMj4sIGV0 Yy4KK3Rlc3RzIHdpbGwgYmUgZ2VuZXJhdGVkIChlLmcuIGZvciBhIS0+W2JjXSEtPltkZV0s IGVpZ2h0IHRlc3RzIHdpdGgKK2RpZmZlcmVudCBsaW5rIG9yZGVycyBmb3IgYSwgYiwgYW5k IGMgd2lsbCBiZSBnZW5lcmF0ZWQpCisKKyIiIgorCitpbXBvcnQgcmUKK2ltcG9ydCBvcwor aW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBhcmdwYXJzZQorZnJvbSBjb2xsZWN0aW9ucyBp bXBvcnQgT3JkZXJlZERpY3QKK2ltcG9ydCBpdGVydG9vbHMKKworIyBCVUlMRF9HQ0MgaXMg b25seSB1c2VkIHVuZGVyIHRoZSAtLWJ1aWxkIG9wdGlvbiwKKyMgd2hpY2ggYnVpbGRzIHRo ZSBnZW5lcmF0ZWQgdGVzdGNhc2UsIGluY2x1ZGluZyBEU09zIHVzaW5nIEJVSUxEX0dDQy4K KyMgTWFpbmx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLCBlc3BlY2lhbGx5IGRlYnVnZ2luZyBv ZiB0aGlzIHNjcmlwdCwKKyMgYW5kIGNhbiBiZSBjaGFuZ2VkIGhlcmUgdG8gYW5vdGhlciB0 b29sY2hhaW4gcGF0aCBpZiBuZWVkZWQuCitidWlsZF9nY2MgPSAiZ2NjIgorCitwYXJzZXIg PSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCitwYXJzZXIuYWRkX2FyZ3VtZW50KCJkZXNj cmlwdGlvbiIsCisgICAgICAgICAgICAgICAgICAgIGhlbHA9IkRlc2NyaXB0aW9uIHN0cmlu ZyBvZiBEU08gZGVwZW5kZW5jeSB0ZXN0IHRvIGJlICIKKyAgICAgICAgICAgICAgICAgICAg ImdlbmVyYXRlZCAoc2VlIHNjcmlwdCBzb3VyY2UgZm9yIGRvY3VtZW50YXRpb24gb2YgIgor ICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24gbGFuZ3VhZ2UpIikKK3BhcnNlci5h ZGRfYXJndW1lbnQoInRlc3RfbmFtZSIsIGhlbHA9IklkZW50aWZpZXIgZm9yIHRlc3RjYXNl IGJlaW5nICIKKyAgICAgICAgICAgICAgICAgICAgImdlbmVyYXRlZCIpCitwYXJzZXIuYWRk X2FyZ3VtZW50KCJvYmpwZngiLAorICAgICAgICAgICAgICAgICAgICBoZWxwPSJQYXRoIHRv IHBsYWNlIGdlbmVyYXRlZCBmaWxlcywgZGVmYXVsdHMgdG8gIgorICAgICAgICAgICAgICAg ICAgICAiY3VycmVudCBkaXJlY3RvcnkgaWYgbm9uZSBzcGVjaWZpZWQiLAorICAgICAgICAg ICAgICAgICAgICBuYXJncz0iPyIsIGRlZmF1bHQ9Ii4vIikKK3BhcnNlci5hZGRfYXJndW1l bnQoIi0tYnVpbGQiLCBoZWxwPSJBZnRlciBDIHRlc3RjYXNlIGdlbmVyYXRlZCwgYnVpbGQg aXQgIgorICAgICAgICAgICAgICAgICAgICAidXNpbmcgZ2NjIChmb3IgbWFudWFsIHRlc3Rp bmcgcHVycG9zZXMpIiwKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSJzdG9yZV90cnVl IikKK3BhcnNlci5hZGRfYXJndW1lbnQoIi0tZGVidWctb3V0cHV0IiwgaGVscD0iUHJpbnRz IHNvbWUgaW50ZXJuYWwgZGF0YSAiCisgICAgICAgICAgICAgICAgICAgICJzdHJ1Y3R1cmVz OyB1c2VkIGZvciBkZWJ1Z2dpbmcgb2YgdGhpcyBzY3JpcHQiLAorICAgICAgICAgICAgICAg ICAgICBhY3Rpb249InN0b3JlX3RydWUiKQorY21kbGluZWFyZ3MgPSBwYXJzZXIucGFyc2Vf YXJncygpCitiYXNlX3Rlc3RfbmFtZSA9IGNtZGxpbmVhcmdzLnRlc3RfbmFtZQordGVzdF9u YW1lID0gY21kbGluZWFyZ3MudGVzdF9uYW1lCitvYmpwZnggPSBjbWRsaW5lYXJncy5vYmpw ZngKKworb2JqX2RlcHMgPSBPcmRlcmVkRGljdCgpCitvYmpfY2FsbHJlZnMgPSBPcmRlcmVk RGljdCgpCisKK2FsbF9vYmpzID0gW10KK2N1cnJfb2JqcyA9IFtdCisKK29ial9kZXBfcGVy bXV0YXRpb25zID0gT3JkZXJlZERpY3QoKQorCisjIEFkZCAnb2JqZWN0IC0+IFtvYmplY3Qs IG9iamVjdCwgLi4uXScgcmVsYXRpb25zIHRvIENVUlJfTUFQCitkZWYgYWRkX2RlcHMgKHNy Y19vYmpzLCBkc3Rfb2JqcywgY3Vycl9tYXApOgorICAgIGZvciBzcmMgaW4gc3JjX29ianM6 CisgICAgICAgIGZvciBkc3QgaW4gZHN0X29ianM6CisgICAgICAgICAgICBpZiBub3Qgc3Jj IGluIGN1cnJfbWFwOgorICAgICAgICAgICAgICAgIGN1cnJfbWFwW3NyY10gPSBbXQorICAg ICAgICAgICAgaWYgbm90IGRzdCBpbiBjdXJyX21hcFtzcmNdOgorICAgICAgICAgICAgICAg IGN1cnJfbWFwW3NyY10uYXBwZW5kIChkc3QpCisKKyMgRm9yIGluc2lkZSB0aGUge30gY29u c3RydWN0CittYWluX3Byb2dyYW0gPSBbXQorbWFpbl9wcm9ncmFtX25lZWRzX2xkbCA9IEZh bHNlCittYWluX3Byb2dyYW1fZGVmYXVsdF9kZXBzID0gVHJ1ZQorZGVmIHByb2Nlc3NfbWFp bl9wcm9ncmFtIChtYWlucHJvZ19zdHIpOgorICAgIGdsb2JhbCBtYWluX3Byb2dyYW0KKyAg ICBnbG9iYWwgbWFpbl9wcm9ncmFtX25lZWRzX2xkbAorICAgIGdsb2JhbCBtYWluX3Byb2dy YW1fZGVmYXVsdF9kZXBzCisgICAgaWYgbWFpbnByb2dfc3RyOgorICAgICAgICBtYWluX3By b2dyYW0gPSBtYWlucHJvZ19zdHIuc3BsaXQgKCc7JykKKyAgICBmb3IgcyBpbiBtYWluX3By b2dyYW06CisgICAgICAgIG0gPSByZS5tYXRjaCAociJeKFsrXC0lOl0pKFswLTlhLXpBLVpd KykkIiwgcykKKyAgICAgICAgaWYgbm90IG06IHByaW50ICgiJyVzJyIgJSAocykpCisgICAg ICAgIGFzc2VydCAobSkKKyAgICAgICAgIyBEZXRlcm1pbmVkIHRoZSBtYWluIHByb2dyYW0g bmVlZHMgbGliZGwKKyAgICAgICAgbWFpbl9wcm9ncmFtX25lZWRzX2xkbCA9IFRydWUKKyAg ICAgICAgaWYgbGVuKG0uZ3JvdXAoMikpID4gMToKKyAgICAgICAgICAgIHByaW50ICgiRXJy b3I6IG9ubHkgc2luZ2xlIGNoYXJhY3RlciBvYmplY3QgbmFtZXMgYWxsb3dlZCwgIgorICAg ICAgICAgICAgICAgICAgICsgIiclcycgaXMgaW52YWxpZCIgJSAobS5ncm91cCgxKSkpCisg ICAgICAgICAgICBleGl0IC0xCisgICAgICAgIG9iaiA9IG0uZ3JvdXAoMikKKyAgICAgICAg aWYgbm90IG9iaiBpbiBhbGxfb2JqczoKKyAgICAgICAgICAgIGFsbF9vYmpzLmFwcGVuZCAo b2JqKQorICAgICAgICBpZiBtLmdyb3VwKDEpID09ICclJyBvciBtLmdyb3VwKDEpID09ICdA JzoKKyAgICAgICAgICAgIGFkZF9kZXBzIChbJyMnXSwgW29ial0sIG9ial9jYWxscmVmcykK KyAgICAjIFdlIGhhdmUgYSBtYWluIHByb2dyYW0gc3BlY2lmaWVkLCB0dXJuIHRoaXMgb2Zm CisgICAgbWFpbl9wcm9ncmFtX2RlZmF1bHRfZGVwcyA9IEZhbHNlCisKKyMgTGV4ZXIgZm9y IHRva2VucwordG9rZW5zcGVjID0gWyAoIk9CSiIsICAgICAgciIoWzAtOWEtekEtWl0rKSIp LAorICAgICAgICAgICAgICAoIkRFUCIsICAgICAgciItPiIpLAorICAgICAgICAgICAgICAo IkNBTExSRUYiLCAgciI9PiIpLAorICAgICAgICAgICAgICAoIk9CSlNFVCIsICAgciJcWyhb MC05YS16QS1aXSspXF0iKSwKKyAgICAgICAgICAgICAgKCJQUk9HIiwgICAgIHIieyhbMC05 YS16QS1aOys6XC0lXSopfSIpLAorICAgICAgICAgICAgICAoIlBFUk1VVEUiLCAgciIhIiks CisgICAgICAgICAgICAgICgiU0VNSUNPTCIsICByIjsiKSwKKyAgICAgICAgICAgICAgKCJF UlJPUiIsICAgIHIiLiIpIF0KK3Rva19yZSA9ICd8Jy5qb2luKCcoP1A8JXM+JXMpJyAlIHBh aXIgZm9yIHBhaXIgaW4gdG9rZW5zcGVjKQorCisjIFN0YXRlIHVzZWQgd2hlbiBwYXJzaW5n IGRlcGVuZGVuY2llcworaW5fZGVwID0gRmFsc2UKK2luX2NhbGxyZWYgPSBGYWxzZQorZGVm IGNsZWFyX2RlcF9zdGF0ZSAoKToKKyAgICBnbG9iYWwgaW5fZGVwLCBpbl9jYWxscmVmCisg ICAgaW5fZGVwID0gaW5fY2FsbHJlZiA9IEZhbHNlCisKKyMgTWFpbiBwYXJzZXIKK2ZvciBt IGluIHJlLmZpbmRpdGVyKHRva19yZSwgY21kbGluZWFyZ3MuZGVzY3JpcHRpb24pOgorICAg IGtpbmQgPSBtLmxhc3Rncm91cAorICAgIHZhbHVlID0gbS5ncm91cCAoKQorICAgIGlmIGtp bmQgPT0gIk9CSiI6CisgICAgICAgIGlmIGxlbiAodmFsdWUpID4gMToKKyAgICAgICAgICAg IHByaW50ICgiRXJyb3I6IG9ubHkgc2luZ2xlIGNoYXJhY3RlciBvYmplY3QgbmFtZXMgYWxs b3dlZCwgIgorICAgICAgICAgICAgICAgICAgICsgIiclcycgaXMgaW52YWxpZCIgJSAodmFs dWUpKQorICAgICAgICAgICAgZXhpdCAoLTEpCisgICAgICAgIGlmIGluX2RlcDoKKyAgICAg ICAgICAgIGFkZF9kZXBzIChjdXJyX29ianMsIFt2YWx1ZV0sIG9ial9kZXBzKQorICAgICAg ICBlbGlmIGluX2NhbGxyZWY6CisgICAgICAgICAgICBhZGRfZGVwcyAoY3Vycl9vYmpzLCBb dmFsdWVdLCBvYmpfY2FsbHJlZnMpCisgICAgICAgIGNsZWFyX2RlcF9zdGF0ZSAoKQorICAg ICAgICBjdXJyX29ianMgPSBbdmFsdWVdCisgICAgICAgIGlmIG5vdCB2YWx1ZSBpbiBhbGxf b2JqczoKKyAgICAgICAgICAgIGFsbF9vYmpzLmFwcGVuZCAodmFsdWUpCisKKyAgICBlbGlm IGtpbmQgPT0gIk9CSlNFVCI6CisgICAgICAgIG9ianNldCA9IHZhbHVlWzE6bGVuKHZhbHVl KS0xXQorICAgICAgICBpZiBpbl9kZXA6CisgICAgICAgICAgICBhZGRfZGVwcyAoY3Vycl9v YmpzLCBsaXN0IChvYmpzZXQpLCBvYmpfZGVwcykKKyAgICAgICAgZWxpZiBpbl9jYWxscmVm OgorICAgICAgICAgICAgYWRkX2RlcHMgKGN1cnJfb2JqcywgbGlzdCAob2Jqc2V0KSwgb2Jq X2NhbGxyZWZzKQorICAgICAgICBjbGVhcl9kZXBfc3RhdGUgKCkKKyAgICAgICAgY3Vycl9v YmpzID0gbGlzdCAob2Jqc2V0KQorICAgICAgICBmb3IgbyBpbiBsaXN0IChvYmpzZXQpOgor ICAgICAgICAgICAgaWYgbm90IG8gaW4gYWxsX29ianM6CisgICAgICAgICAgICAgICAgYWxs X29ianMuYXBwZW5kIChvKQorCisgICAgZWxpZiBraW5kID09ICJQRVJNVVRFIjoKKyAgICAg ICAgaWYgaW5fZGVwIG9yIGluX2NhbGxyZWY6CisgICAgICAgICAgICBwcmludCAoIkVycm9y OiBzeW50YXggZXJyb3IsIHBlcm11dGUgb3BlcmF0aW9uIGludmFsaWQgaGVyZSIpCisgICAg ICAgICAgICBleGl0IC0xCisgICAgICAgIGlmIG5vdCBjdXJyX29ianM6CisgICAgICAgICAg ICBwcmludCAoIkVycm9yOiBzeW50YXggZXJyb3IsIG5vIG9iamVjdHMgdG8gcGVybXV0ZSBo ZXJlIikKKyAgICAgICAgICAgIGV4aXQgLTEKKyAgICAgICAgZm9yIG9iaiBpbiBjdXJyX29i anM6CisgICAgICAgICAgICBpZiBub3Qgb2JqIGluIG9ial9kZXBfcGVybXV0YXRpb25zOgor ICAgICAgICAgICAgICAgICMgU2lnbmFsIHRoaXMgb2JqZWN0IGhhcyBwZXJtdXRhdGVkIGRl cGVuZGVuY2llcworICAgICAgICAgICAgICAgIG9ial9kZXBfcGVybXV0YXRpb25zW29ial0g PSBbXQorCisgICAgZWxpZiBraW5kID09ICJQUk9HIjoKKyAgICAgICAgaWYgbWFpbl9wcm9n cmFtOgorICAgICAgICAgICAgcHJpbnQgKCJFcnJvcjogY2Fubm90IGhhdmUgbW9yZSB0aGFu IG9uZSBtYWluIHByb2dyYW0iKQorICAgICAgICAgICAgZXhpdCAoLTEpCisgICAgICAgIGlm IGluX2RlcDoKKyAgICAgICAgICAgIHByaW50ICgiRXJyb3I6IG9iamVjdHMgY2Fubm90IGhh dmUgZGVwZW5kZW5jeSBvbiBtYWluIHByb2dyYW0iKQorICAgICAgICAgICAgZXhpdCAoLTEp CisgICAgICAgIGlmIGluX2NhbGxyZWY6CisgICAgICAgICAgICBhZGRfZGVwcyAoY3Vycl9v YmpzLCBbIiMiXSwgb2JqX2NhbGxyZWZzKQorICAgICAgICBwcm9jZXNzX21haW5fcHJvZ3Jh bSAodmFsdWVbMTpsZW4odmFsdWUpLTFdKQorICAgICAgICBjbGVhcl9kZXBfc3RhdGUgKCkK KyAgICAgICAgY3Vycl9vYmpzID0gWyIjIl0KKworICAgIGVsaWYga2luZCA9PSAiREVQIjoK KyAgICAgICAgaWYgaW5fZGVwIG9yIGluX2NhbGxyZWY6CisgICAgICAgICAgICBwcmludCAo IkVycm9yOiBzeW50YXggZXJyb3IsIG11bHRpcGxlIGNvbnRpZ3VvdXMgLT4sPT4gb3BlcmF0 aW9ucyIpCisgICAgICAgICAgICBleGl0IC0xCisgICAgICAgIGluX2RlcCA9IFRydWUKKwor ICAgIGVsaWYga2luZCA9PSAiQ0FMTFJFRiI6CisgICAgICAgIGlmIGluX2RlcCBvciBpbl9j YWxscmVmOgorICAgICAgICAgICAgcHJpbnQgKCJFcnJvcjogc3ludGF4IGVycm9yLCBtdWx0 aXBsZSBjb250aWd1b3VzIC0+LD0+IG9wZXJhdGlvbnMiKQorICAgICAgICAgICAgZXhpdCAt MQorICAgICAgICBpbl9jYWxscmVmID0gVHJ1ZQorICAgICAgICAKKyAgICBlbGlmIGtpbmQg PT0gIlNFTUlDT0wiOgorICAgICAgICBjdXJyX29ianMgPSBbXQorICAgICAgICBjbGVhcl9k ZXBfc3RhdGUgKCkKKworICAgIGVsc2U6CisgICAgICAgIHByaW50ICgiRXJyb3I6IHVua25v d24gdG9rZW4gJyVzJyIgJSAodmFsdWUpKQorICAgICAgICBleGl0ICgtMSkKKworZGVmIGZp bmRfb2Jqc19ub3RfZGVwZW5kZWRfb24gKCk6CisgICAgZ2xvYmFsIGFsbF9vYmpzLCBvYmpf ZGVwcworICAgIG9ianNfbm90X2RlcGVuZGVkX29uID0gW10KKyAgICBmb3Igb2JqIGluIGFs bF9vYmpzOgorICAgICAgICBza2lwID0gRmFsc2UKKyAgICAgICAgZm9yIHIgaW4gb2JqX2Rl cHMuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIG9iaiBpbiByWzFdOgorICAgICAgICAgICAg ICAgIHNraXAgPSBUcnVlCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgbm90 IHNraXA6CisgICAgICAgICAgICBvYmpzX25vdF9kZXBlbmRlZF9vbi5hcHBlbmQgKG9iaikK KyAgICByZXR1cm4gb2Jqc19ub3RfZGVwZW5kZWRfb24KKyAgICAgICAgCisjIElmIG5vIG1h aW4gcHJvZ3JhbSB3YXMgc3BlY2lmaWVkIGluIGRlcGVuZGVuY3kgZGVzY3JpcHRpb24sIG1h a2UgYQorIyBkZWZhdWx0IG1haW4gcHJvZ3JhbSB3aXRoIGRlcHMgcG9pbnRpbmcgdG8gYWxs IERTT3Mgd2hpY2ggYXJlIG5vdAorIyBkZXBlbmRlZCBieSBhbm90aGVyIERTTy4KK2lmIG1h aW5fcHJvZ3JhbV9kZWZhdWx0X2RlcHM6CisgICAgbWFpbl9kZXBzID0gZmluZF9vYmpzX25v dF9kZXBlbmRlZF9vbiAoKQorICAgICMgbWFpbl9kZXBzID0gW10KKyAgICAjIGZvciBvIGlu IGFsbF9vYmpzOgorICAgICMgICAgIHNraXAgPSBGYWxzZQorICAgICMgICAgIGZvciByIGlu IG9ial9kZXBzLml0ZW1zKCk6CisgICAgIyAgICAgICAgIGlmIG8gaW4gclsxXToKKyAgICAj ICAgICAgICAgICAgIHNraXAgPSBUcnVlCisgICAgIyAgICAgICAgICAgICBicmVhaworICAg ICMgICAgIGlmIHNraXA6CisgICAgIyAgICAgICAgIGNvbnRpbnVlCisgICAgIyAgICAgbWFp bl9kZXBzLmFwcGVuZCAobykKKyAgICBhZGRfZGVwcyAoWyIjIl0sIG1haW5fZGVwcywgb2Jq X2RlcHMpICAgIAorICAgICAgICAKKyMgRGVidWcgb3V0cHV0CitpZiBjbWRsaW5lYXJncy5k ZWJ1Z19vdXRwdXQ6CisgICAgcHJpbnQgKCJBbGwgb2JqZWN0czogJXMiICUgKGFsbF9vYmpz KSkKKyAgICBwcmludCAoIi0tLSBTdGF0aWMgbGluayBkZXBlbmRlbmNpZXMgLS0tIikKKyAg ICBmb3IgciBpbiBvYmpfZGVwcy5pdGVtcygpOgorICAgICAgICBwcmludCAoIiVzIC0+ICVz IiAlIChyWzBdLCByWzFdKSkKKyAgICBwcmludCAoIi0tLSBPYmplY3RzIHdob3NlIGRlcGVu ZGVuY2llcyBhcmUgdG8gYmUgcGVybXV0YXRlZCAtLS0iKQorICAgIGZvciByIGluIG9ial9k ZXBfcGVybXV0YXRpb25zLml0ZW1zKCk6CisgICAgICAgIHByaW50ICgiJXMiICUgKHJbMF0p KQorICAgICNwcmludCAob2JqX2RlcF9wZXJtdXRhdGlvbnMpCisgICAgcHJpbnQgKCItLS0g Q2FsbCByZWZlcmVuY2UgZGVwZW5kZW5jaWVzIC0tLSIpCisgICAgZm9yIHIgaW4gb2JqX2Nh bGxyZWZzLml0ZW1zKCk6CisgICAgICAgIHByaW50ICgiJXMgPT4gJXMiICUgKHJbMF0sIHJb MV0pKQorICAgIHByaW50ICgiLS0tIG1haW4gcHJvZ3JhbSAtLS0iKQorICAgIHByaW50ICht YWluX3Byb2dyYW0pCisKKyMgTWFpbiB0ZXN0Y2FzZSBwcm9jZXNzaW5nIHJvdXRpbmUsIGRv ZXMgTWFrZWZpbGUgZnJhZ21lbnQgZ2VuZXJhdGlvbiwKKyMgdGVzdGNhc2Ugc291cmNlIGdl bmVyYXRpb24sIGFuZCBpZiAtLWJ1aWxkIHNwZWNpZmllZCBidWlsZHMgdGVzdGNhc2UuCitk ZWYgcHJvY2Vzc190ZXN0Y2FzZSAodGVzdF9uYW1lKToKKyAgICBnbG9iYWwgb2JqcGZ4LCBh bGxfb2Jqcywgb2JqX2RlcHMsIG9ial9jYWxscmVmcworICAgIGdsb2JhbCBiYXNlX3Rlc3Rf bmFtZSwgbWFpbl9wcm9ncmFtLCBtYWluX3Byb2dyYW1fbmVlZHNfbGRsCisKKyAgICAjIFBy aW50IG91dCBuZWVkZWQgTWFrZWZpbGUgZnJhZ21lbnRzIGZvciB1c2UgaW4gZ2xpYmMvZWxm L01ha2VmaWxlLgorICAgICNpZiBtYWtlZmlsZToKKyAgICBwcmludCAoImlmZXEgKHllcywk KGJ1aWxkLXNoYXJlZCkpIikKKyAgICB0ID0gIiIKKyAgICBmb3IgbyBpbiBhbGxfb2JqczoK KyAgICAgICAgdCArPSAiICIgKyB0ZXN0X25hbWUgKyAiLSIgKyBvCisgICAgcHJpbnQgKCJt b2R1bGVzLW5hbWVzICs9JXMiICUgKHQpKQorICAgIHByaW50ICgidGVzdHMgKz0gJXMiICUg KHRlc3RfbmFtZSkpCisKKyAgICAjIFByaW50IGRpcmVjdCBsaW5rIGRlcGVuZGVuY2llcyBm b3IgZWFjaCBEU08KKyAgICBmb3Igb2JqIGluIGFsbF9vYmpzOgorICAgICAgICBpZiBvYmog aW4gb2JqX2RlcHM6CisgICAgICAgICAgICBkc28gPSB0ZXN0X25hbWUgKyAiLSIgKyBvYmog KyAiLnNvIgorICAgICAgICAgICAgZGVwc3RyID0gIiIKKyAgICAgICAgICAgIGZvciBkZXAg aW4gb2JqX2RlcHNbb2JqXToKKyAgICAgICAgICAgICAgICBkZXBzdHIgKz0gIiAkKG9ianBm eCkiICsgdGVzdF9uYW1lICsgIi0iICsgZGVwICsgIi5zbyIKKyAgICAgICAgICAgIHByaW50 ICgiJChvYmpwZngpJXM6JXMiICUgKGRzbywgZGVwc3RyKSkKKworICAgICMgUHJpbnQgTERG TEFHUy0qIGFuZCAqLW5vLXotZGVmcworICAgIGZvciBvIGluIGFsbF9vYmpzOgorICAgICAg ICBkc28gPSB0ZXN0X25hbWUgKyAiLSIgKyBvICsgIi5zbyIKKyAgICAgICAgcHJpbnQgKCJM REZMQUdTLSVzID0gJChuby1hcy1uZWVkZWQpIiAlIChkc28pKQorICAgICAgICBpZiBvIGlu IG9ial9jYWxscmVmczoKKyAgICAgICAgICAgIHByaW50ICgiJXMtbm8tei1kZWZzID0geWVz IiAlIChkc28pKQorCisgICAgIyBQcmludCBkZXBlbmRlbmNpZXMgZm9yIG1haW4gdGVzdCBw cm9ncmFtCisgICAgZGVwc3RyID0gIiIKKyAgICBpZiAnIycgaW4gb2JqX2RlcHM6CisgICAg ICAgIGZvciBvIGluIG9ial9kZXBzWycjJ106CisgICAgICAgICAgICBkZXBzdHIgKz0gIiAk KG9ianBmeCkiICsgdGVzdF9uYW1lICsgIi0iICsgbyArICIuc28iCisgICAgaWYgbWFpbl9w cm9ncmFtX25lZWRzX2xkbDoKKyAgICAgICAgZGVwc3RyICs9ICIgJChsaWJkbCkiCisgICAg cHJpbnQgKCIkKG9ianBmeCklczolcyIgJSAodGVzdF9uYW1lLCBkZXBzdHIpKQorICAgIHBy aW50ICgiTERGTEFHUy0lcyA9ICQobm8tYXMtbmVlZGVkKSIgJSAodGVzdF9uYW1lKSkKKwor ICAgIG5vdF9kZXBlbmRlZF9vYmpzID0gZmluZF9vYmpzX25vdF9kZXBlbmRlZF9vbiAoKQor ICAgIGlmIG5vdF9kZXBlbmRlZF9vYmpzOgorICAgICAgICBkZXBzdHIgPSAiIgorICAgICAg ICBmb3IgZGVwIGluIG5vdF9kZXBlbmRlZF9vYmpzOgorICAgICAgICAgICAgZGVwc3RyICs9 ICIgJChvYmpwZngpIiArIHRlc3RfbmFtZSArICItIiArIGRlcCArICIuc28iCisgICAgICAg IHByaW50ICgiJChvYmpwZngpJXMub3V0OiVzIiAlICh0ZXN0X25hbWUsIGRlcHN0cikpCisg ICAgCisgICAgIyBOb3RlIHRoaXMgaXMgY29tcGFyZWQgd2l0aCB0aGUgImJhc2UiIDx0ZXN0 X25hbWU+LmV4cCwgbm90CisgICAgIyA8dGVzdF9uYW1lPl88Tj4gd2l0aCBwZXJtdXRhdGlv biBpbmRleAorICAgIHByaW50ICgiJChvYmpwZngpJXMtY21wLm91dDogJChvYmpwZngpJXMu ZXhwICQob2JqcGZ4KSVzLm91dCIKKyAgICAgICAgICAgJSAodGVzdF9uYW1lLCBiYXNlX3Rl c3RfbmFtZSwgdGVzdF9uYW1lKSkKKyAgICBwcmludCAoIlx0ZGlmZiAtd3UgJF4gPiAkQDsg JChldmFsdWF0ZS10ZXN0KSIpCisgICAgcHJpbnQgKCJlbmRpZiIpCisgICAgcHJpbnQgKCJp ZmVxICgkKHJ1bi1idWlsdC10ZXN0cykseWVzKSIpCisgICAgcHJpbnQgKCJ0ZXN0cy1zcGVj aWFsICs9ICQob2JqcGZ4KSVzLWNtcC5vdXQiICUgKHRlc3RfbmFtZSkpCisgICAgcHJpbnQg KCJlbmRpZiIpCisKKyAgICAjIEdlbmVyYXRlIEMgZmlsZXMgYWNjb3JkaW5nIHRvIGRlcGVu ZGVuY3kgYW5kIGNhbGxpbmcgcmVsYXRpb25zIGZyb20KKyAgICAjIGRlc2NyaXB0aW9uIHN0 cmluZy4KKyAgICBmb3Igb2JqIGluIGFsbF9vYmpzOgorICAgICAgICBzcmNfbmFtZSA9IHRl c3RfbmFtZSArICItIiArIG9iaiArICIuYyIKKyAgICAgICAgZiA9IG9wZW4gKG9ianBmeCAr IHNyY19uYW1lLCAidyIpCisgICAgICAgIGlmIG9iaiBpbiBvYmpfY2FsbHJlZnM6CisgICAg ICAgICAgICBjYWxsZWRfb2JqcyA9IG9ial9jYWxscmVmc1tvYmpdCisgICAgICAgICAgICBm b3IgY2FsbGVlIGluIGNhbGxlZF9vYmpzOgorICAgICAgICAgICAgICAgIGYud3JpdGUgKCJl eHRlcm4gdm9pZCBmbl8lcyAodm9pZCk7XG4iICUgKGNhbGxlZSkpCisgICAgICAgIGYud3Jp dGUgKCJleHRlcm4gaW50IHB1dGNoYXIoaW50KTtcbiIpCisgICAgICAgIGYud3JpdGUgKCJz dGF0aWMgdm9pZCBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpICIgKworICAgICAgICAg ICAgICAgICAiaW5pdCh2b2lkKXtwdXRjaGFyKCclcycpO31cbiIgJSAob2JqKSkKKyAgICAg ICAgZi53cml0ZSAoInN0YXRpYyB2b2lkIF9fYXR0cmlidXRlX18oKGRlc3RydWN0b3IpKSAi ICsKKyAgICAgICAgICAgICAgICAgImZpbmkodm9pZCl7cHV0Y2hhcignJXMnKTt9XG4iICUg KG9iaikpCisgICAgICAgIGlmIG9iaiBpbiBvYmpfY2FsbHJlZnM6CisgICAgICAgICAgICBj YWxsZWRfb2JqcyA9IG9ial9jYWxscmVmc1tvYmpdCisgICAgICAgICAgICBmLndyaXRlICgi dm9pZCBmbl8lcyAodm9pZCkge1xuIiAlIChvYmopKQorICAgICAgICAgICAgZi53cml0ZSAo IiAgcHV0Y2hhciAoJzwnKTtcbiIpOworICAgICAgICAgICAgZi53cml0ZSAoIiAgcHV0Y2hh ciAoJyVzJyk7XG4iICUgKG9iaikpOworICAgICAgICAgICAgZm9yIGNhbGxlZSBpbiBjYWxs ZWRfb2JqczoKKyAgICAgICAgICAgICAgICBmLndyaXRlICgiICBmbl8lcyAoKTtcbiIgJSAo Y2FsbGVlKSkKKyAgICAgICAgICAgIGYud3JpdGUgKCIgIHB1dGNoYXIgKCc+Jyk7XG4iKTsK KyAgICAgICAgICAgIGYud3JpdGUgKCJ9XG4iKQorICAgICAgICBlbHNlOgorICAgICAgICAg ICAgZm9yIGNhbGxyZWYgaW4gb2JqX2NhbGxyZWZzLml0ZW1zKCk6CisgICAgICAgICAgICAg ICAgaWYgb2JqIGluIGNhbGxyZWZbMV06CisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUg KCJ2b2lkIGZuXyVzICh2b2lkKSB7XG4iICUgKG9iaikpCisgICAgICAgICAgICAgICAgICAg IGYud3JpdGUgKCIgIHB1dGNoYXIgKCc8Jyk7XG4iKTsKKyAgICAgICAgICAgICAgICAgICAg Zi53cml0ZSAoIiAgcHV0Y2hhciAoJyVzJyk7XG4iICUgKG9iaikpOworICAgICAgICAgICAg ICAgICAgICBmLndyaXRlICgiICBwdXRjaGFyICgnPicpO1xuIik7CisgICAgICAgICAgICAg ICAgICAgIGYud3JpdGUgKCJ9XG4iKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAg ICAgICBmLmNsb3NlICgpCisKKyAgICAjIE9wZW4gQyBmaWxlIGZvciB3cml0aW5nCisgICAg ZiA9IG9wZW4gKG9ianBmeCArIHRlc3RfbmFtZSArICIuYyIsICJ3IikKKworICAgICMgaWYg dGhlcmUgYXJlIHNvbWUgb3BlcmF0aW9ucyBpbiBtYWluKCksIGl0IG1lYW5zIHdlIG5lZWQg LWxkbAorICAgIGlmIG1haW5fcHJvZ3JhbV9uZWVkc19sZGw6CisgICAgICAgIGYud3JpdGUg KCIjaW5jbHVkZSA8ZGxmY24uaD5cbiIpCisgICAgZi53cml0ZSAoIiNpbmNsdWRlIDxzdGRp by5oPlxuIikKKyAgICBmLndyaXRlICgiI2luY2x1ZGUgPHN0ZGxpYi5oPlxuIikKKyAgICBm b3IgcyBpbiBtYWluX3Byb2dyYW06CisgICAgICAgIGlmIHNbMF0gPT0gJ0AnOgorICAgICAg ICAgICAgZi53cml0ZSAoImV4dGVybiB2b2lkIGZuXyVzICh2b2lkKTtcbiIsIHNbMV0pOwor ICAgIGYud3JpdGUgKCJpbnQgbWFpbiAodm9pZCkge1xuIikKKyAgICBmLndyaXRlICgiICBw dXRjaGFyKCd7Jyk7XG4iKQorCisgICAgIyBIZWxwZXIgcm91dGluZSBmb3Igc2FuaXR5IGNo ZWNrIGNvZGUKKyAgICBkZWYgcHV0X2ZhaWxfY2hlY2sgKGZhaWxfY29uZCwgYWN0aW9uX2Rl c2MpOgorICAgICAgICBmLndyaXRlICgnICBpZiAoJXMpIHsgcHJpbnRmICgiXFxuJXMgZmFp bGVkOiAlJXNcXG4iLCAnCisgICAgICAgICAgICAgICAgICdkbGVycm9yICgpKTsgZXhpdCAo MSk7fVxuJyAlIChmYWlsX2NvbmQsIGFjdGlvbl9kZXNjKSkKKyAgICBpID0gMAorICAgIHdo aWxlIGkgPCBsZW4obWFpbl9wcm9ncmFtKToKKyAgICAgICAgcyA9IG1haW5fcHJvZ3JhbVtp XQorICAgICAgICBvYmogPSBzW2xlbihzKS0xXQorICAgICAgICBkc28gPSB0ZXN0X25hbWUg KyAiLSIgKyBvYmoKKyAgICAgICAgaWYgc1swXSA9PSAnKycgb3Igc1swXSA9PSAnOic6Cisg ICAgICAgICAgICBpZiBzWzBdID09ICcrJzoKKyAgICAgICAgICAgICAgICBkbG9wZW5fZmxh Z3MgPSAiUlRMRF9MQVpZfFJUTERfR0xPQkFMIgorICAgICAgICAgICAgICAgIGYud3JpdGUg KCIgIHB1dGNoYXIoJysnKTtcbiIpOworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAg ICAgICBkbG9wZW5fZmxhZ3MgPSAiUlRMRF9MQVpZIgorICAgICAgICAgICAgICAgIGYud3Jp dGUgKCIgIHB1dGNoYXIoJzonKTtcbiIpOworICAgICAgICAgICAgZi53cml0ZSAoIiAgcHV0 Y2hhcignJXMnKTtcbiIgJSAob2JqKSk7CisgICAgICAgICAgICBmLndyaXRlICgiICBwdXRj aGFyKCdbJyk7XG4iKTsKKyAgICAgICAgICAgIGYud3JpdGUgKCcgIHZvaWQgKiVzID0gZGxv cGVuICgiJXMuc28iLCAlcyk7XG4nCisgICAgICAgICAgICAgICAgICAgICAlIChvYmosIGRz bywgZGxvcGVuX2ZsYWdzKSkKKyAgICAgICAgICAgIHB1dF9mYWlsX2NoZWNrICgiISVzIiAl IChvYmopLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcy5zbyBkbG9wZW4iICUg KGRzbykpCisgICAgICAgICAgICBmLndyaXRlICgiICBwdXRjaGFyKCddJyk7XG4iKTsKKyAg ICAgICAgZWxpZiBzWzBdID09ICctJzoKKyAgICAgICAgICAgIGYud3JpdGUgKCIgIHB1dGNo YXIoJy0nKTtcbiIpOworICAgICAgICAgICAgZi53cml0ZSAoIiAgcHV0Y2hhcignJXMnKTtc biIgJSAob2JqKSk7CisgICAgICAgICAgICBmLndyaXRlICgiICBwdXRjaGFyKCdbJyk7XG4i KTsKKyAgICAgICAgICAgIHB1dF9mYWlsX2NoZWNrICgiZGxjbG9zZSAoJXMpICE9IDAiICUg KG9iaiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzLnNvIGRsY2xvc2UiICUg KGRzbykpCisgICAgICAgICAgICBmLndyaXRlICgiICBwdXRjaGFyKCddJyk7XG4iKTsKKyAg ICAgICAgZWxpZiBzWzBdID09ICclJzoKKyAgICAgICAgICAgIGYud3JpdGUgKCcgIHZvaWQg KCpmbl8lcykodm9pZCkgPSBkbHN5bSAoJXMsICJmbl8lcyIpO1xuJworICAgICAgICAgICAg ICAgICAgICAgJSAob2JqLCBvYmosIG9iaikpCisgICAgICAgICAgICBwdXRfZmFpbF9jaGVj ayAoIiFmbl8lcyIgJSAob2JqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGxz eW0oZm5fJXMpIGZyb20gJXMuc28iICUgKG9iaiwgZHNvKSkKKyAgICAgICAgICAgIGYud3Jp dGUgKCIgIGZuXyVzICgpO1xuIiAlIChvYmopKQorICAgICAgICBlbGlmIHNbMF0gPT0gJ0An OgorICAgICAgICAgICAgZi53cml0ZSAoIiAgZm5fJXMgKCk7XG4iICUgKG9iaikpCisgICAg ICAgIGYud3JpdGUgKCIgIHB1dGNoYXIoJzsnKTtcbiIpOworICAgICAgICBpICs9IDEKKyAg ICBmLndyaXRlICgiICBwdXRjaGFyKCd9Jyk7XG4iKQorICAgIGYud3JpdGUgKCIgIHJldHVy biAwO1xuIikKKyAgICBmLndyaXRlICgifVxuIikKKyAgICBmLmNsb3NlICgpCisKKyAgICAj IEhlbHBlciByb3V0aW5lIHRvIHJ1biBhIHNoZWxsIGNvbW1hbmQsIGZvciBydW5uaW5nIEdD QyBiZWxvdworICAgIGRlZiBydW5fY21kIChhcmdzKToKKyAgICAgICAgaWYgY21kbGluZWFy Z3MuZGVidWdfb3V0cHV0OgorICAgICAgICAgICAgcHJpbnQgKHN0ci5qb2luICgnICcsIGFy Z3MpKQorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbiAoYXJncykKKyAgICAgICAgcC53 YWl0ICgpCisgICAgICAgIGlmIHAucmV0dXJuY29kZSAhPSAwOgorICAgICAgICAgICAgcHJp bnQgKCJFcnJvciBydW5uaW5nOiAlcyIgJSAoc3RyLmpvaW4gKCcgJywgYXJncykpKQorICAg ICAgICAgICAgZXhpdCAtMQorCisgICAgIyBEZXB0aC1maXJzdCB0cmF2ZXJzYWwsIGV4ZWN1 dGluZyBGTihPQkopIGluIHBvc3Qtb3JkZXIKKyAgICBvYmpfdmlzaXRlZCA9IHt9CisgICAg ZGVmIGRmcyAob2JqLCBmbik6CisgICAgICAgIGlmIG9iaiBpbiBvYmpfdmlzaXRlZDoKKyAg ICAgICAgICAgIHJldHVybgorICAgICAgICBvYmpfdmlzaXRlZFtvYmpdID0gVHJ1ZQorICAg ICAgICBpZiBvYmogaW4gb2JqX2RlcHM6CisgICAgICAgICAgICBmb3IgZGVwIGluIG9ial9k ZXBzW29ial06CisgICAgICAgICAgICAgICAgZGZzIChkZXAsIGZuKQorICAgICAgICBmbiAo b2JqKQorCisgICAgIyBGdW5jdGlvbiB0byBjcmVhdGUgPHRlc3RfbmFtZT4tPG9iaj4uc28K KyAgICBkZWYgYnVpbGRfZHNvIChvYmopOgorICAgICAgICBvYmpfbmFtZSA9IHRlc3RfbmFt ZSArICItIiArIG9iaiArICIub3MiCisgICAgICAgIGRzb19uYW1lID0gdGVzdF9uYW1lICsg Ii0iICsgb2JqICsgIi5zbyIKKyAgICAgICAgZGVwcyA9IFtdCisgICAgICAgIGlmIG9iaiBp biBvYmpfZGVwczoKKyAgICAgICAgICAgIGRlcHMgPSBvYmpfZGVwc1tvYmpdCisgICAgICAg IGRzb19kZXBzID0gbWFwIChsYW1iZGEgZDogb2JqcGZ4ICsgdGVzdF9uYW1lICsgIi0iICsg ZCArICIuc28iLCBkZXBzKQorICAgICAgICBjbWQgPSAoW2J1aWxkX2djYywgIi1zaGFyZWQi LCAiLW8iLCBvYmpwZnggKyBkc29fbmFtZSwKKyAgICAgICAgICAgICAgICBvYmpwZnggKyBv YmpfbmFtZSwgIi1XbCwtLW5vLWFzLW5lZWRlZCJdICsgbGlzdChkc29fZGVwcykpCisgICAg ICAgIHJ1bl9jbWQgKGNtZCkKKworICAgICMgLS1idWlsZCBvcHRpb24gcHJvY2Vzc2luZzog YnVpbGQgZ2VuZXJhdGVkIHNvdXJjZXMgdXNpbmcgJ2J1aWxkX2djYycKKyAgICBpZiBjbWRs aW5lYXJncy5idWlsZDoKKyAgICAgICAgIyBDb21waWxlIGluZGl2aWR1YWwgLm9zIGZpbGVz CisgICAgICAgIGZvciBvYmogaW4gYWxsX29ianM6CisgICAgICAgICAgICBzcmNfbmFtZSA9 IHRlc3RfbmFtZSArICItIiArIG9iaiArICIuYyIKKyAgICAgICAgICAgIG9ial9uYW1lID0g dGVzdF9uYW1lICsgIi0iICsgb2JqICsgIi5vcyIKKyAgICAgICAgICAgIHJ1bl9jbWQgKFti dWlsZF9nY2MsICItYyIsICItZlBJQyIsIG9ianBmeCArIHNyY19uYW1lLAorICAgICAgICAg ICAgICAgICAgICAgICItbyIsIG9ianBmeCArIG9ial9uYW1lXSkKKworICAgICAgICAjIEJ1 aWxkIGFsbCBEU09zLCB0aGlzIG5lZWRzIHRvIGJlIGluIHRvcG9sb2dpY2FsIGRlcGVuZGVu Y3kgb3JkZXIsCisgICAgICAgICMgb3IgbGluayB3aWxsIGZhaWwKKyAgICAgICAgZm9yIG9i aiBpbiBhbGxfb2JqczoKKyAgICAgICAgICAgIGRmcyAob2JqLCBidWlsZF9kc28pCisKKyAg ICAgICAgIyBCdWlsZCBtYWluIHByb2dyYW0KKyAgICAgICAgZGVwcyA9IFtdCisgICAgICAg IGlmICcjJyBpbiBvYmpfZGVwczoKKyAgICAgICAgICAgIGRlcHMgPSBvYmpfZGVwc1snIydd CisgICAgICAgIG1haW5fZGVwcyA9IG1hcCAobGFtYmRhIGQ6IG9ianBmeCArIHRlc3RfbmFt ZSArICItIiArIGQgKyAiLnNvIiwgZGVwcykKKyAgICAgICAgY21kID0gKFtidWlsZF9nY2Ms ICItV2wsLS1uby1hcy1uZWVkZWQiLCAiLW8iLCBvYmpwZnggKyB0ZXN0X25hbWUsCisgICAg ICAgICAgICAgICAgb2JqcGZ4ICsgdGVzdF9uYW1lICsgIi5jIiwgIi1MJXMiICUgKG9zLmdl dGN3ZCAoKSksCisgICAgICAgICAgICAgICAgIi1XbCwtcnBhdGgtbGluaz0lcyIgJSAob3Mu Z2V0Y3dkICgpKV0KKyAgICAgICAgICAgICAgICsgbGlzdCAobWFpbl9kZXBzKSkKKyAgICAg ICAgaWYgbWFpbl9wcm9ncmFtX25lZWRzX2xkbDoKKyAgICAgICAgICAgIGNtZCArPSBbIi1s ZGwiXQorICAgICAgICBydW5fY21kIChjbWQpCisKKyMgQ2hlY2sgaWYgd2UgbmVlZCB0byBl bnVtZXJhdGUgcGVybXV0YXRpb25zIG9mIGRlcGVuZGVuY2llcworbmVlZF9wZXJtdXRhdGlv bl9wcm9jZXNzaW5nID0gRmFsc2UgICAgICAgCitpZiBvYmpfZGVwX3Blcm11dGF0aW9uczoK KyAgICAjIEFkanVzdCBvYmpfZGVwX3Blcm11dGF0aW9ucyBpbnRvIG1hcCBvZiBvYmplY3Qg LT4gZGVwZW5kZW5jeSBwZXJtdXRhdGlvbnMKKyAgICBmb3IgciBpbiBvYmpfZGVwX3Blcm11 dGF0aW9ucy5pdGVtcygpOgorICAgICAgICBvYmogPSByWzBdCisgICAgICAgIGlmIG9iaiBp biBvYmpfZGVwcyBhbmQgbGVuKG9ial9kZXBzW29ial0pID4gMToKKyAgICAgICAgICAgIGRl cHMgPSBvYmpfZGVwc1tvYmpdCisgICAgICAgICAgICBvYmpfZGVwX3Blcm11dGF0aW9uc1tv YmpdID0gbGlzdCAoaXRlcnRvb2xzLnBlcm11dGF0aW9ucyAoZGVwcykpCisgICAgICAgICAg ICBuZWVkX3Blcm11dGF0aW9uX3Byb2Nlc3NpbmcgPSBUcnVlCisKK3Rlc3Rfc3ViaW5kZXgg PSAxCitjdXJyX3Blcm1zID0gW10KK2RlZiBlbnVtX3Blcm11dGF0aW9ucyAocGVybV9saXN0 KToKKyAgICBnbG9iYWwgdGVzdF9uYW1lLCBvYmpfZGVwcywgdGVzdF9zdWJpbmRleCwgY3Vy cl9wZXJtcworICAgIGlmIGxlbihwZXJtX2xpc3QpID49IDE6CisgICAgICAgIGN1cnIgPSBw ZXJtX2xpc3RbMF0KKyAgICAgICAgb2JqID0gY3VyclswXQorICAgICAgICBwZXJtcyA9IGN1 cnJbMV0KKyAgICAgICAgaWYgbm90IHBlcm1zOgorICAgICAgICAgICAgIyBUaGlzIG1heSBi ZSBhbiBlbXB0eSBsaXN0IGlmIG5vIG11bHRpcGxlIGRlcGVuZGVuY2llcyB0byBwZXJtdXRl CisgICAgICAgICAgICAjIHdlcmUgZm91bmQsIHNraXAgdG8gbmV4dCBpbiB0aGlzIGNhc2UK KyAgICAgICAgICAgIGVudW1fcGVybXV0YXRpb25zIChwZXJtX2xpc3RbMTpdKQorICAgICAg ICBlbHNlOgorICAgICAgICAgICAgZm9yIGRlcHMgaW4gcGVybXM6CisgICAgICAgICAgICAg ICAgb2JqX2RlcHNbb2JqXSA9IGRlcHMKKyAgICAgICAgICAgICAgICBwZXJtc3RyID0gIiIg aWYgb2JqID09ICIjIiBlbHNlIG9iaiArICJfIgorICAgICAgICAgICAgICAgIHBlcm1zdHIg Kz0gc3RyLmpvaW4gKCcnLCBkZXBzKQorICAgICAgICAgICAgICAgIGN1cnJfcGVybXMuYXBw ZW5kIChwZXJtc3RyKSAKKyAgICAgICAgICAgICAgICBlbnVtX3Blcm11dGF0aW9ucyAocGVy bV9saXN0WzE6XSkKKyAgICAgICAgICAgICAgICBjdXJyX3Blcm1zID0gY3Vycl9wZXJtc1sw OmxlbihjdXJyX3Blcm1zKS0xXQorICAgIGVsc2U6CisgICAgICAgICMgb2JqX2RlcHMgaXMg bm93IGluc3RhbnRpYXRlZCB3aXRoIG9uZSBkZXBlbmRlbmN5IG9yZGVyIHBlcm11dGF0aW9u CisgICAgICAgICMgKGFjcm9zcyBhbGwgb2JqZWN0cyB0aGF0IGhhdmUgbXVsdGlwbGUgcGVy bXV0YXRpb25zKQorICAgICAgICAjIE5vdyBwcm9jZXNzIGEgdGVzdGNhc2UKKyAgICAgICAg I2lmIG5vdCBvcy5wYXRoLmV4aXN0cyAob2JqcGZ4ICsgYmFzZV90ZXN0X25hbWUrICItcGVy bXV0YXRpb25zLyIpOgorICAgICAgICAjICAgIG9zLm1rZGlyIChvYmpwZnggKyBiYXNlX3Rl c3RfbmFtZSsgIi1wZXJtdXRhdGlvbnMvIikKKyAgICAgICAgcHJvY2Vzc190ZXN0Y2FzZSAo YmFzZV90ZXN0X25hbWUgKyAiXyIgKyBzdHIgKHRlc3Rfc3ViaW5kZXgpCisgICAgICAgICAg ICAgICAgICAgICAgICAgICsgIi0iICsgc3RyLmpvaW4gKCctJywgY3Vycl9wZXJtcykpCisg ICAgICAgIHRlc3Rfc3ViaW5kZXggKz0gMQorCitpZiBuZWVkX3Blcm11dGF0aW9uX3Byb2Nl c3Npbmc6CisgICAgZW51bV9wZXJtdXRhdGlvbnMgKGxpc3QgKG9ial9kZXBfcGVybXV0YXRp b25zLml0ZW1zKCkpKQorZWxzZToKKyAgICAjIFdlIGhhdmUgbm8gcGVybXV0YXRpb25zIHRv IGVudW1lcmF0ZSwganVzdCBwcm9jZXNzIHRlc3RjYXNlIG5vcm1hbGx5CisgICAgcHJvY2Vz c190ZXN0Y2FzZSAodGVzdF9uYW1lKQorCg== --------------247ED106C26F78D022B10156--