From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26185 invoked by alias); 4 Dec 2014 16:46:53 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 26175 invoked by uid 89); 4 Dec 2014 16:46:52 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.2 required=5.0 tests=AWL,BAYES_50,FREEMAIL_FROM,KAM_STOCKGEN,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=no version=3.3.2 X-HELO: mail-ob0-f171.google.com Received: from mail-ob0-f171.google.com (HELO mail-ob0-f171.google.com) (209.85.214.171) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Thu, 04 Dec 2014 16:46:50 +0000 Received: by mail-ob0-f171.google.com with SMTP id uz6so13494464obc.2 for ; Thu, 04 Dec 2014 08:46:48 -0800 (PST) MIME-Version: 1.0 X-Received: by 10.202.174.198 with SMTP id x189mr6930906oie.78.1417711608186; Thu, 04 Dec 2014 08:46:48 -0800 (PST) Received: by 10.76.185.7 with HTTP; Thu, 4 Dec 2014 08:46:48 -0800 (PST) In-Reply-To: References: Date: Thu, 04 Dec 2014 16:46:00 -0000 Message-ID: Subject: Re: [PATCH x86_64] Optimize access to globals in "-fpie -pie" builds with copy relocations From: "H.J. Lu" To: Uros Bizjak Cc: "gcc-patches@gcc.gnu.org" , Sriraman Tallam , Jakub Jelinek Content-Type: multipart/mixed; boundary=001a113ce8e4cce83e050966b40c X-IsSubscribed: yes X-SW-Source: 2014-12/txt/msg00428.txt.bz2 --001a113ce8e4cce83e050966b40c Content-Type: text/plain; charset=UTF-8 Content-length: 4771 On Thu, Dec 4, 2014 at 4:44 AM, Uros Bizjak wrote: > On Wed, Dec 3, 2014 at 10:35 PM, H.J. Lu wrote: > >>>>>>> It would probably help reviewers if you pointed to actual path >>>>>>> submission [1], which unfortunately contains the explanation in the >>>>>>> patch itself [2], which further explains that this functionality is >>>>>>> currently only supported with gold, patched with [3]. >>>>>>> >>>>>>> [1] https://gcc.gnu.org/ml/gcc-patches/2014-09/msg00645.html >>>>>>> [2] https://gcc.gnu.org/ml/gcc-patches/2014-09/txt2CHtu81P1O.txt >>>>>>> [3] https://sourceware.org/ml/binutils/2014-05/msg00092.html >>>>>>> >>>>>>> After a bit of the above detective work, I think that new gcc option >>>>>>> is not necessary. The configure should detect if new functionality is >>>>>>> supported in the linker, and auto-configure gcc to use it when >>>>>>> appropriate. >>>>>> >>>>>> I think GCC option is needed since one can use -fuse-ld= to >>>>>> change linker. >>>>> >>>>> IMO, nobody will use this highly special x86_64-only option. It would >>>>> be best for gnu-ld to reach feature parity with gold as far as this >>>>> functionality is concerned. In this case, the optimization would be >>>>> auto-configured, and would fire automatically, without any user >>>>> intervention. >>>>> >>>> >>>> Let's do it. I implemented the same feature in bfd linker on both >>>> master and 2.25 branch. >>>> >>> >>> +bool >>> +i386_binds_local_p (const_tree exp) >>> +{ >>> + /* Globals marked extern are treated as local when linker copy relocations >>> + support is available with -f{pie|PIE}. */ >>> + if (TARGET_64BIT && ix86_copyrelocs && flag_pie >>> + && TREE_CODE (exp) == VAR_DECL >>> + && DECL_EXTERNAL (exp) && !DECL_WEAK (exp)) >>> + return true; >>> + return default_binds_local_p (exp); >>> +} >>> + >>> >>> It returns true with -fPIE and false without -fPIE. It is lying to compiler. >>> Maybe legitimate_pic_address_disp_p is a better place. > > Agreed. > >> Something like this? > > Yes. > > OK, if Jakub doesn't have any objections here. Please also add > Sriraman as author to ChangeLog entry. > > Thanks, > Uros. Here is the patch. OK to install? Thanks. -- H.J. --- Normally, with -fPIE/-fpie, GCC accesses globals that are extern to the module using the GOT. This is two instructions, one to get the address of the global from the GOT and the other to get the value. If it turns out that the global gets defined in the executable at link-time, it still needs to go through the GOT as it is too late then to generate a direct access. Examples: foo.cc ------ int a_glob; int main () { return a_glob; // defined in this file } With -O2 -fpie -pie, the generated code directly accesses the global via PC-relative insn: 5e0
: mov 0x165a(%rip),%eax # 1c40 foo.cc ------ extern int a_glob; int main () { return a_glob; // defined in this file } With -O2 -fpie -pie, the generated code accesses global via GOT using two memory loads: 6f0
: mov 0x1609(%rip),%rax # 1d00 <_DYNAMIC+0x230> mov (%rax),%eax This is true even if in the latter case the global was defined in the executable through a different file. Some experiments on google benchmarks shows that the extra memory loads affects performance by 1% to 5%. Solution - Copy Relocations: When the linker supports copy relocations, GCC can always assume that the global will be defined in the executable. For globals that are truly extern (come from shared objects), the linker will create copy relocations and have them defined in the executable. Result is that no global access needs to go through the GOT and hence improves performance. This optimization only applies to undefined, non-weak global data. Undefined, weak global data access still must go through the GOT. This patch checks if linker supports PIE with copy reloc, which is enabled in gold and bfd linker in bininutils 2.25, at configure time and enables this optimization if the linker support is available. gcc/ * configure.ac (HAVE_LD_PIE_COPYRELOC): Defined to 1 if Linux/x86-64 linker supports PIE with copy reloc. * config.in: Regenerated. * configure: Likewise. * config/i386/i386.c (legitimate_pic_address_disp_p): Allow pc-relative address for undefined, non-weak, non-function symbol reference in 64-bit PIE if linker supports PIE with copy reloc. * doc/sourcebuild.texi: Document pie_copyreloc target. gcc/testsuite/ * gcc.target/i386/pie-copyrelocs-1.c: New test. * gcc.target/i386/pie-copyrelocs-2.c: Likewise. * gcc.target/i386/pie-copyrelocs-3.c: Likewise. * gcc.target/i386/pie-copyrelocs-4.c: Likewise. * lib/target-supports.exp (check_effective_target_pie_copyreloc): New procedure. --001a113ce8e4cce83e050966b40c Content-Type: text/x-patch; charset=US-ASCII; name="0001-x86-64-Optimize-access-to-globals-in-PIE-with-copy-r.patch" Content-Disposition: attachment; filename="0001-x86-64-Optimize-access-to-globals-in-PIE-with-copy-r.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i3acst440 Content-length: 20448 RnJvbSBkNTU1OWE5NjljNTQxZTUzNzVkYTkzNzJmNjkyNWY0MGI4N2RmNWYz IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiSC5KLiBMdSIgPGhq bC50b29sc0BnbWFpbC5jb20+CkRhdGU6IFRodSwgNCBEZWMgMjAxNCAwODoy NzoyMiAtMDgwMApTdWJqZWN0OiBbUEFUQ0hdIHg4Ni02NDogT3B0aW1pemUg YWNjZXNzIHRvIGdsb2JhbHMgaW4gUElFIHdpdGggY29weSByZWxvYwoKTm9y bWFsbHksIHdpdGggLWZQSUUvLWZwaWUsIEdDQyBhY2Nlc3NlcyBnbG9iYWxz IHRoYXQgYXJlIGV4dGVybiB0byB0aGUKbW9kdWxlIHVzaW5nIHRoZSBHT1Qu ICBUaGlzIGlzIHR3byBpbnN0cnVjdGlvbnMsIG9uZSB0byBnZXQgdGhlIGFk ZHJlc3MKb2YgdGhlIGdsb2JhbCBmcm9tIHRoZSBHT1QgYW5kIHRoZSBvdGhl ciB0byBnZXQgdGhlIHZhbHVlLiAgSWYgaXQgdHVybnMKb3V0IHRoYXQgdGhl IGdsb2JhbCBnZXRzIGRlZmluZWQgaW4gdGhlIGV4ZWN1dGFibGUgYXQgbGlu ay10aW1lLCBpdCBzdGlsbApuZWVkcyB0byBnbyB0aHJvdWdoIHRoZSBHT1Qg YXMgaXQgaXMgdG9vIGxhdGUgdGhlbiB0byBnZW5lcmF0ZSBhIGRpcmVjdAog YWNjZXNzLgoKRXhhbXBsZXM6Cgpmb28uY2MKLS0tLS0tCmludCBhX2dsb2I7 CmludCBtYWluICgpIHsKICByZXR1cm4gYV9nbG9iOyAvLyBkZWZpbmVkIGlu IHRoaXMgZmlsZQp9CgpXaXRoIC1PMiAtZnBpZSAtcGllLCB0aGUgZ2VuZXJh dGVkIGNvZGUgZGlyZWN0bHkgYWNjZXNzZXMgdGhlIGdsb2JhbCB2aWEKUEMt cmVsYXRpdmUgaW5zbjoKCjVlMCAgIDxtYWluPjoKICAgbW92ICAgIDB4MTY1 YSglcmlwKSwlZWF4ICAgICAgICAjIDFjNDAgPGFfZ2xvYj4KCmZvby5jYwot LS0tLS0KCmV4dGVybiBpbnQgYV9nbG9iOwppbnQgbWFpbiAoKSB7CiAgcmV0 dXJuIGFfZ2xvYjsgLy8gZGVmaW5lZCBpbiB0aGlzIGZpbGUKfQoKV2l0aCAt TzIgLWZwaWUgLXBpZSwgdGhlIGdlbmVyYXRlZCBjb2RlIGFjY2Vzc2VzIGds b2JhbCB2aWEgR09UIHVzaW5nCnR3byBtZW1vcnkgbG9hZHM6Cgo2ZjAgIDxt YWluPjoKICAgbW92ICAgIDB4MTYwOSglcmlwKSwlcmF4ICAgIyAxZDAwIDxf RFlOQU1JQysweDIzMD4KICAgbW92ICAgICglcmF4KSwlZWF4CgpUaGlzIGlz IHRydWUgZXZlbiBpZiBpbiB0aGUgbGF0dGVyIGNhc2UgdGhlIGdsb2JhbCB3 YXMgZGVmaW5lZCBpbiB0aGUKZXhlY3V0YWJsZSB0aHJvdWdoIGEgZGlmZmVy ZW50IGZpbGUuCgpTb21lIGV4cGVyaW1lbnRzIG9uIGdvb2dsZSBiZW5jaG1h cmtzIHNob3dzIHRoYXQgdGhlIGV4dHJhIG1lbW9yeSBsb2FkcwphZmZlY3Rz IHBlcmZvcm1hbmNlIGJ5IDElIHRvIDUlLgoKU29sdXRpb24gLSBDb3B5IFJl bG9jYXRpb25zOgoKV2hlbiB0aGUgbGlua2VyIHN1cHBvcnRzIGNvcHkgcmVs b2NhdGlvbnMsIEdDQyBjYW4gYWx3YXlzIGFzc3VtZSB0aGF0CnRoZSBnbG9i YWwgd2lsbCBiZSBkZWZpbmVkIGluIHRoZSBleGVjdXRhYmxlLiAgRm9yIGds b2JhbHMgdGhhdCBhcmUgdHJ1bHkKZXh0ZXJuIChjb21lIGZyb20gc2hhcmVk IG9iamVjdHMpLCB0aGUgbGlua2VyIHdpbGwgY3JlYXRlIGNvcHkgcmVsb2Nh dGlvbnMKYW5kIGhhdmUgdGhlbSBkZWZpbmVkIGluIHRoZSBleGVjdXRhYmxl LiBSZXN1bHQgaXMgdGhhdCBubyBnbG9iYWwgYWNjZXNzCm5lZWRzIHRvIGdv IHRocm91Z2ggdGhlIEdPVCBhbmQgaGVuY2UgaW1wcm92ZXMgcGVyZm9ybWFu Y2UuCgpUaGlzIG9wdGltaXphdGlvbiBvbmx5IGFwcGxpZXMgdG8gdW5kZWZp bmVkLCBub24td2VhayBnbG9iYWwgZGF0YS4KVW5kZWZpbmVkLCB3ZWFrIGds b2JhbCBkYXRhIGFjY2VzcyBzdGlsbCBtdXN0IGdvIHRocm91Z2ggdGhlIEdP VC4KClRoaXMgcGF0Y2ggY2hlY2tzIGlmIGxpbmtlciBzdXBwb3J0cyBQSUUg d2l0aCBjb3B5IHJlbG9jLCB3aGljaCBpcwplbmFibGVkIGluIGdvbGQgYW5k IGJmZCBsaW5rZXIgaW4gYmluaW51dGlscyAyLjI1LCBhdCBjb25maWd1cmUg dGltZQphbmQgZW5hYmxlcyB0aGlzIG9wdGltaXphdGlvbiBpZiB0aGUgbGlu a2VyIHN1cHBvcnQgaXMgYXZhaWxhYmxlLgoKZ2NjLwoKCSogY29uZmlndXJl LmFjIChIQVZFX0xEX1BJRV9DT1BZUkVMT0MpOiBEZWZpbmVkIHRvIDEgaWYK CUxpbnV4L3g4Ni02NCBsaW5rZXIgc3VwcG9ydHMgUElFIHdpdGggY29weSBy ZWxvYy4KCSogY29uZmlnLmluOiBSZWdlbmVyYXRlZC4KCSogY29uZmlndXJl OiBMaWtld2lzZS4KCgkqIGNvbmZpZy9pMzg2L2kzODYuYyAobGVnaXRpbWF0 ZV9waWNfYWRkcmVzc19kaXNwX3ApOiBBbGxvdwoJcGMtcmVsYXRpdmUgYWRk cmVzcyBmb3IgdW5kZWZpbmVkLCBub24td2Vhaywgbm9uLWZ1bmN0aW9uCglz eW1ib2wgcmVmZXJlbmNlIGluIDY0LWJpdCBQSUUgaWYgbGlua2VyIHN1cHBv cnRzIFBJRSB3aXRoCgljb3B5IHJlbG9jLgoKCSogZG9jL3NvdXJjZWJ1aWxk LnRleGk6IERvY3VtZW50IHBpZV9jb3B5cmVsb2MgdGFyZ2V0LgoKZ2NjL3Rl c3RzdWl0ZS8KCgkqIGdjYy50YXJnZXQvaTM4Ni9waWUtY29weXJlbG9jcy0x LmM6IE5ldyB0ZXN0LgoJKiBnY2MudGFyZ2V0L2kzODYvcGllLWNvcHlyZWxv Y3MtMi5jOiBMaWtld2lzZS4KCSogZ2NjLnRhcmdldC9pMzg2L3BpZS1jb3B5 cmVsb2NzLTMuYzogTGlrZXdpc2UuCgkqIGdjYy50YXJnZXQvaTM4Ni9waWUt Y29weXJlbG9jcy00LmM6IExpa2V3aXNlLgoKCSogbGliL3RhcmdldC1zdXBw b3J0cy5leHAgKGNoZWNrX2VmZmVjdGl2ZV90YXJnZXRfcGllX2NvcHlyZWxv Yyk6CglOZXcgcHJvY2VkdXJlLgotLS0KIGdjYy9DaGFuZ2VMb2cgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE1ICsrKysrKysKIGdj Yy9jb25maWcuaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB8ICA2ICsrKwogZ2NjL2NvbmZpZy9pMzg2L2kzODYuYyAgICAgICAgICAg ICAgICAgICAgICAgICAgIHwgIDYgKystCiBnY2MvY29uZmlndXJlICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA0NyArKysrKysrKysr KysrKysrKysrKysrCiBnY2MvY29uZmlndXJlLmFjICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgfCA0MyArKysrKysrKysrKysrKysrKysrKwog Z2NjL2RvYy9zb3VyY2VidWlsZC50ZXhpICAgICAgICAgICAgICAgICAgICAg ICAgIHwgIDMgKysKIGdjYy90ZXN0c3VpdGUvQ2hhbmdlTG9nICAgICAgICAg ICAgICAgICAgICAgICAgICB8IDExICsrKysrCiBnY2MvdGVzdHN1aXRlL2dj Yy50YXJnZXQvaTM4Ni9waWUtY29weXJlbG9jcy0xLmMgfCAxNCArKysrKysr CiBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9waWUtY29weXJlbG9j cy0yLmMgfCAxNCArKysrKysrCiBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQv aTM4Ni9waWUtY29weXJlbG9jcy0zLmMgfCAxNCArKysrKysrCiBnY2MvdGVz dHN1aXRlL2djYy50YXJnZXQvaTM4Ni9waWUtY29weXJlbG9jcy00LmMgfCAx NyArKysrKysrKwogZ2NjL3Rlc3RzdWl0ZS9saWIvdGFyZ2V0LXN1cHBvcnRz LmV4cCAgICAgICAgICAgIHwgNTEgKysrKysrKysrKysrKysrKysrKysrKysr CiAxMiBmaWxlcyBjaGFuZ2VkLCAyNDAgaW5zZXJ0aW9ucygrKSwgMSBkZWxl dGlvbigtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2Nj LnRhcmdldC9pMzg2L3BpZS1jb3B5cmVsb2NzLTEuYwogY3JlYXRlIG1vZGUg MTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3BpZS1jb3B5 cmVsb2NzLTIuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUv Z2NjLnRhcmdldC9pMzg2L3BpZS1jb3B5cmVsb2NzLTMuYwogY3JlYXRlIG1v ZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3BpZS1j b3B5cmVsb2NzLTQuYwoKZGlmZiAtLWdpdCBhL2djYy9DaGFuZ2VMb2cgYi9n Y2MvQ2hhbmdlTG9nCmluZGV4IDkyOGI2YjguLjc4MzVhYjAgMTAwNjQ0Ci0t LSBhL2djYy9DaGFuZ2VMb2cKKysrIGIvZ2NjL0NoYW5nZUxvZwpAQCAtMSwz ICsxLDE4IEBACisyMDE0LTEyLTA0ICBTcmlyYW1hbiBUYWxsYW0gIDx0bXNy aXJhbUBnb29nbGUuY29tPgorCSAgICBILkouIEx1ICA8aG9uZ2ppdS5sdUBp bnRlbC5jb20+CisKKwkqIGNvbmZpZ3VyZS5hYyAoSEFWRV9MRF9QSUVfQ09Q WVJFTE9DKTogRGVmaW5lZCB0byAxIGlmCisJTGludXgveDg2LTY0IGxpbmtl ciBzdXBwb3J0cyBQSUUgd2l0aCBjb3B5IHJlbG9jLgorCSogY29uZmlnLmlu OiBSZWdlbmVyYXRlZC4KKwkqIGNvbmZpZ3VyZTogTGlrZXdpc2UuCisKKwkq IGNvbmZpZy9pMzg2L2kzODYuYyAobGVnaXRpbWF0ZV9waWNfYWRkcmVzc19k aXNwX3ApOiBBbGxvdworCXBjLXJlbGF0aXZlIGFkZHJlc3MgZm9yIHVuZGVm aW5lZCwgbm9uLXdlYWssIG5vbi1mdW5jdGlvbgorCXN5bWJvbCByZWZlcmVu Y2UgaW4gNjQtYml0IFBJRSBpZiBsaW5rZXIgc3VwcG9ydHMgUElFIHdpdGgK Kwljb3B5IHJlbG9jLgorCisJKiBkb2Mvc291cmNlYnVpbGQudGV4aTogRG9j dW1lbnQgcGllX2NvcHlyZWxvYyB0YXJnZXQuCisKIDIwMTQtMTItMDMgIE1p Y2hhZWwgTWVpc3NuZXIgIDxtZWlzc25lckBsaW51eC52bmV0LmlibS5jb20+ CiAKIAlQUiB0YXJnZXQvNjQwMTkKZGlmZiAtLWdpdCBhL2djYy9jb25maWcu aW4gYi9nY2MvY29uZmlnLmluCmluZGV4IDY1ZDVlNDIuLmYzNGFkYjUgMTAw NjQ0Ci0tLSBhL2djYy9jb25maWcuaW4KKysrIGIvZ2NjL2NvbmZpZy5pbgpA QCAtMTQxMSw2ICsxNDExLDEyIEBACiAjZW5kaWYKIAogCisvKiBEZWZpbmUg MC8xIGlmIHlvdXIgbGlua2VyIHN1cHBvcnRzIC1waWUgb3B0aW9uIHdpdGgg Y29weSByZWxvYy4gKi8KKyNpZm5kZWYgVVNFRF9GT1JfVEFSR0VUCisjdW5k ZWYgSEFWRV9MRF9QSUVfQ09QWVJFTE9DCisjZW5kaWYKKworCiAvKiBEZWZp bmUgaWYgeW91ciBsaW5rZXIgbGlua3MgYSBtaXggb2YgcmVhZC1vbmx5IGFu ZCByZWFkLXdyaXRlIHNlY3Rpb25zIGludG8KICAgIGEgcmVhZC13cml0ZSBz ZWN0aW9uLiAqLwogI2lmbmRlZiBVU0VEX0ZPUl9UQVJHRVQKZGlmZiAtLWdp dCBhL2djYy9jb25maWcvaTM4Ni9pMzg2LmMgYi9nY2MvY29uZmlnL2kzODYv aTM4Ni5jCmluZGV4IDIxMWM5ZTYuLjRmMWExOGIgMTAwNjQ0Ci0tLSBhL2dj Yy9jb25maWcvaTM4Ni9pMzg2LmMKKysrIGIvZ2NjL2NvbmZpZy9pMzg2L2kz ODYuYwpAQCAtMTMxMTMsNyArMTMxMTMsMTEgQEAgbGVnaXRpbWF0ZV9waWNf YWRkcmVzc19kaXNwX3AgKHJ0eCBkaXNwKQogCQlyZXR1cm4gdHJ1ZTsKIAkg ICAgfQogCSAgZWxzZSBpZiAoIVNZTUJPTF9SRUZfRkFSX0FERFJfUCAob3Aw KQotCQkgICAmJiBTWU1CT0xfUkVGX0xPQ0FMX1AgKG9wMCkKKwkJICAgJiYg KFNZTUJPTF9SRUZfTE9DQUxfUCAob3AwKQorCQkgICAgICAgfHwgKEhBVkVf TERfUElFX0NPUFlSRUxPQworCQkJICAgJiYgZmxhZ19waWUKKwkJCSAgICYm ICFTWU1CT0xfUkVGX1dFQUsgKG9wMCkKKwkJCSAgICYmICFTWU1CT0xfUkVG X0ZVTkNUSU9OX1AgKG9wMCkpKQogCQkgICAmJiBpeDg2X2Ntb2RlbCAhPSBD TV9MQVJHRV9QSUMpCiAJICAgIHJldHVybiB0cnVlOwogCSAgYnJlYWs7CmRp ZmYgLS1naXQgYS9nY2MvY29uZmlndXJlIGIvZ2NjL2NvbmZpZ3VyZQppbmRl eCA2YjQ2YmJiLi44MTFmMDVkIDEwMDc1NQotLS0gYS9nY2MvY29uZmlndXJl CisrKyBiL2djYy9jb25maWd1cmUKQEAgLTI3MDI1LDYgKzI3MDI1LDUzIEBA IGZpCiB7ICRhc19lY2hvICIkYXNfbWU6JHthc19saW5lbm8tJExJTkVOT306 IHJlc3VsdDogJGdjY19jdl9sZF9waWUiID4mNQogJGFzX2VjaG8gIiRnY2Nf Y3ZfbGRfcGllIiA+JjY7IH0KIAoreyAkYXNfZWNobyAiJGFzX21lOiR7YXNf bGluZW5vLSRMSU5FTk99OiBjaGVja2luZyBsaW5rZXIgUElFIHN1cHBvcnQg d2l0aCBjb3B5IHJlbG9jIiA+JjUKKyRhc19lY2hvX24gImNoZWNraW5nIGxp bmtlciBQSUUgc3VwcG9ydCB3aXRoIGNvcHkgcmVsb2MuLi4gIiA+JjY7IH0K K2djY19jdl9sZF9waWVfY29weXJlbG9jPW5vCitpZiB0ZXN0ICRnY2NfY3Zf bGRfcGllID0geWVzIDsgdGhlbgorICBpZiB0ZXN0ICRpbl90cmVlX2xkID0g eWVzIDsgdGhlbgorICAgIGlmIHRlc3QgIiRnY2NfY3ZfZ2xkX21ham9yX3Zl cnNpb24iIC1lcSAyIC1hICIkZ2NjX2N2X2dsZF9taW5vcl92ZXJzaW9uIiAt Z2UgMjUgLW8gIiRnY2NfY3ZfZ2xkX21ham9yX3ZlcnNpb24iIC1ndCAyOyB0 aGVuCisgICAgICBnY2NfY3ZfbGRfcGllX2NvcHlyZWxvYz15ZXMKKyAgICBm aQorICBlbGlmIHRlc3QgeCRnY2NfY3ZfYXMgIT0geCAtYSB4JGdjY19jdl9s ZCAhPSB4IDsgdGhlbgorICAgICMgQ2hlY2sgaWYgbGlua2VyIHN1cHBvcnRz IC1waWUgb3B0aW9uIHdpdGggY29weSByZWxvYworICAgIGNhc2UgIiR0YXJn ZXQiIGluCisgICAgaT84Ni0qLWxpbnV4KiB8IHg4Nl82NC0qLWxpbnV4KikK KyAgICAgIGNhdCA+IGNvbmZ0ZXN0MS5zIDw8RU9GCisJLmdsb2JsCWFfZ2xv YgorCS5kYXRhCisJLnR5cGUJYV9nbG9iLCBAb2JqZWN0CisJLnNpemUJYV9n bG9iLCA0CithX2dsb2I6CisJLmxvbmcJMgorRU9GCisgICAgICBjYXQgPiBj b25mdGVzdDIucyA8PEVPRgorCS50ZXh0CisJLmdsb2JsCW1haW4KKwkudHlw ZQltYWluLCBAZnVuY3Rpb24KK21haW46CisJbW92bAklZWF4LCBhX2dsb2Io JXJpcCkKKwkuc2l6ZQltYWluLCAuLW1haW4KK0VPRgorICAgICAgaWYgJGdj Y19jdl9hcyAtLTY0IC1vIGNvbmZ0ZXN0MS5vIGNvbmZ0ZXN0MS5zID4gL2Rl di9udWxsIDI+JjEgXAorICAgICAgICAgJiYgJGdjY19jdl9sZCAtc2hhcmVk IC1tZWxmX3g4Nl82NCAtbyBjb25mdGVzdDEuc28gY29uZnRlc3QxLm8gPiAv ZGV2L251bGwgMj4mMSBcCisgICAgICAgICAmJiAkZ2NjX2N2X2FzIC0tNjQg LW8gY29uZnRlc3QyLm8gY29uZnRlc3QyLnMgPiAvZGV2L251bGwgMj4mMSBc CisgICAgICAgICAmJiAkZ2NjX2N2X2xkIC1waWUgLW1lbGZfeDg2XzY0IC1v IGNvbmZ0ZXN0IGNvbmZ0ZXN0Mi5vIGNvbmZ0ZXN0MS5zbyA+IC9kZXYvbnVs bCAyPiYxOyB0aGVuCisgICAgICAgIGdjY19jdl9sZF9waWVfY29weXJlbG9j PXllcworICAgICAgZmkKKyAgICAgIHJtIC1mIGNvbmZ0ZXN0IGNvbmZ0ZXN0 MS5zbyBjb25mdGVzdDEubyBjb25mdGVzdDIubyBjb25mdGVzdDEucyBjb25m dGVzdDIucworICAgICAgOzsKKyAgICBlc2FjCisgIGZpCisKK2NhdCA+PmNv bmZkZWZzLmggPDxfQUNFT0YKKyNkZWZpbmUgSEFWRV9MRF9QSUVfQ09QWVJF TE9DIGBpZiB0ZXN0IHgiJGdjY19jdl9sZF9waWVfY29weXJlbG9jIiA9IHh5 ZXM7IHRoZW4gZWNobyAxOyBlbHNlIGVjaG8gMDsgZmlgCitfQUNFT0YKKwor ZmkKK3sgJGFzX2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTog cmVzdWx0OiAkZ2NjX2N2X2xkX3BpZV9jb3B5cmVsb2MiID4mNQorJGFzX2Vj aG8gIiRnY2NfY3ZfbGRfcGllX2NvcHlyZWxvYyIgPiY2OyB9CisKIHsgJGFz X2VjaG8gIiRhc19tZToke2FzX2xpbmVuby0kTElORU5PfTogY2hlY2tpbmcg bGlua2VyIEVILWNvbXBhdGlibGUgZ2FyYmFnZSBjb2xsZWN0aW9uIG9mIHNl Y3Rpb25zIiA+JjUKICRhc19lY2hvX24gImNoZWNraW5nIGxpbmtlciBFSC1j b21wYXRpYmxlIGdhcmJhZ2UgY29sbGVjdGlvbiBvZiBzZWN0aW9ucy4uLiAi ID4mNjsgfQogZ2NjX2N2X2xkX2VoX2djX3NlY3Rpb25zPW5vCmRpZmYgLS1n aXQgYS9nY2MvY29uZmlndXJlLmFjIGIvZ2NjL2NvbmZpZ3VyZS5hYwppbmRl eCA0OGM4MDAwLi5hMzNmM2E1IDEwMDY0NAotLS0gYS9nY2MvY29uZmlndXJl LmFjCisrKyBiL2djYy9jb25maWd1cmUuYWMKQEAgLTQ2OTMsNiArNDY5Myw0 OSBAQCBpZiB0ZXN0IHgiJGdjY19jdl9sZF9waWUiID0geHllczsgdGhlbgog ZmkKIEFDX01TR19SRVNVTFQoJGdjY19jdl9sZF9waWUpCiAKK0FDX01TR19D SEVDS0lORyhsaW5rZXIgUElFIHN1cHBvcnQgd2l0aCBjb3B5IHJlbG9jKQor Z2NjX2N2X2xkX3BpZV9jb3B5cmVsb2M9bm8KK2lmIHRlc3QgJGdjY19jdl9s ZF9waWUgPSB5ZXMgOyB0aGVuCisgIGlmIHRlc3QgJGluX3RyZWVfbGQgPSB5 ZXMgOyB0aGVuCisgICAgaWYgdGVzdCAiJGdjY19jdl9nbGRfbWFqb3JfdmVy c2lvbiIgLWVxIDIgLWEgIiRnY2NfY3ZfZ2xkX21pbm9yX3ZlcnNpb24iIC1n ZSAyNSAtbyAiJGdjY19jdl9nbGRfbWFqb3JfdmVyc2lvbiIgLWd0IDI7IHRo ZW4KKyAgICAgIGdjY19jdl9sZF9waWVfY29weXJlbG9jPXllcworICAgIGZp CisgIGVsaWYgdGVzdCB4JGdjY19jdl9hcyAhPSB4IC1hIHgkZ2NjX2N2X2xk ICE9IHggOyB0aGVuCisgICAgIyBDaGVjayBpZiBsaW5rZXIgc3VwcG9ydHMg LXBpZSBvcHRpb24gd2l0aCBjb3B5IHJlbG9jCisgICAgY2FzZSAiJHRhcmdl dCIgaW4KKyAgICBpPzg2LSotbGludXgqIHwgeDg2XzY0LSotbGludXgqKQor ICAgICAgY2F0ID4gY29uZnRlc3QxLnMgPDxFT0YKKwkuZ2xvYmwJYV9nbG9i CisJLmRhdGEKKwkudHlwZQlhX2dsb2IsIEBvYmplY3QKKwkuc2l6ZQlhX2ds b2IsIDQKK2FfZ2xvYjoKKwkubG9uZwkyCitFT0YKKyAgICAgIGNhdCA+IGNv bmZ0ZXN0Mi5zIDw8RU9GCisJLnRleHQKKwkuZ2xvYmwJbWFpbgorCS50eXBl CW1haW4sIEBmdW5jdGlvbgorbWFpbjoKKwltb3ZsCSVlYXgsIGFfZ2xvYigl cmlwKQorCS5zaXplCW1haW4sIC4tbWFpbgorRU9GCisgICAgICBpZiAkZ2Nj X2N2X2FzIC0tNjQgLW8gY29uZnRlc3QxLm8gY29uZnRlc3QxLnMgPiAvZGV2 L251bGwgMj4mMSBcCisgICAgICAgICAmJiAkZ2NjX2N2X2xkIC1zaGFyZWQg LW1lbGZfeDg2XzY0IC1vIGNvbmZ0ZXN0MS5zbyBjb25mdGVzdDEubyA+IC9k ZXYvbnVsbCAyPiYxIFwKKyAgICAgICAgICYmICRnY2NfY3ZfYXMgLS02NCAt byBjb25mdGVzdDIubyBjb25mdGVzdDIucyA+IC9kZXYvbnVsbCAyPiYxIFwK KyAgICAgICAgICYmICRnY2NfY3ZfbGQgLXBpZSAtbWVsZl94ODZfNjQgLW8g Y29uZnRlc3QgY29uZnRlc3QyLm8gY29uZnRlc3QxLnNvID4gL2Rldi9udWxs IDI+JjE7IHRoZW4KKyAgICAgICAgZ2NjX2N2X2xkX3BpZV9jb3B5cmVsb2M9 eWVzCisgICAgICBmaQorICAgICAgcm0gLWYgY29uZnRlc3QgY29uZnRlc3Qx LnNvIGNvbmZ0ZXN0MS5vIGNvbmZ0ZXN0Mi5vIGNvbmZ0ZXN0MS5zIGNvbmZ0 ZXN0Mi5zCisgICAgICA7OworICAgIGVzYWMKKyAgZmkKKyAgQUNfREVGSU5F X1VOUVVPVEVEKEhBVkVfTERfUElFX0NPUFlSRUxPQywKKyAgICBbYGlmIHRl c3QgeCIkZ2NjX2N2X2xkX3BpZV9jb3B5cmVsb2MiID0geHllczsgdGhlbiBl Y2hvIDE7IGVsc2UgZWNobyAwOyBmaWBdLAorICAgIFtEZWZpbmUgMC8xIGlm IHlvdXIgbGlua2VyIHN1cHBvcnRzIC1waWUgb3B0aW9uIHdpdGggY29weSBy ZWxvYy5dKQorZmkKK0FDX01TR19SRVNVTFQoJGdjY19jdl9sZF9waWVfY29w eXJlbG9jKQorCiBBQ19NU0dfQ0hFQ0tJTkcobGlua2VyIEVILWNvbXBhdGli bGUgZ2FyYmFnZSBjb2xsZWN0aW9uIG9mIHNlY3Rpb25zKQogZ2NjX2N2X2xk X2VoX2djX3NlY3Rpb25zPW5vCiBpZiB0ZXN0ICRpbl90cmVlX2xkID0geWVz IDsgdGhlbgpkaWZmIC0tZ2l0IGEvZ2NjL2RvYy9zb3VyY2VidWlsZC50ZXhp IGIvZ2NjL2RvYy9zb3VyY2VidWlsZC50ZXhpCmluZGV4IDIwYTIwNmQuLjk4 YmExYTYgMTAwNjQ0Ci0tLSBhL2djYy9kb2Mvc291cmNlYnVpbGQudGV4aQor KysgYi9nY2MvZG9jL3NvdXJjZWJ1aWxkLnRleGkKQEAgLTE3MTcsNiArMTcx Nyw5IEBAIG9yIEBjb2Rle0VNX1NQQVJDVjl9IGV4ZWN1dGFibGVzLgogCiBA aXRlbSB2ZWN0X2NtZGxpbmVfbmVlZGVkCiBUYXJnZXQgcmVxdWlyZXMgYSBj b21tYW5kIGxpbmUgYXJndW1lbnQgdG8gZW5hYmxlIGEgU0lNRCBpbnN0cnVj dGlvbiBzZXQuCisKK0BpdGVtIHBpZV9jb3B5cmVsb2MKK1RoZSB4ODYtNjQg dGFyZ2V0IGxpbmtlciBzdXBwb3J0cyBQSUUgd2l0aCBjb3B5IHJlbG9jLgog QGVuZCB0YWJsZQogCiBAc3Vic3Vic2VjdGlvbiBFbnZpcm9ubWVudCBhdHRy aWJ1dGVzCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL0NoYW5nZUxvZyBi L2djYy90ZXN0c3VpdGUvQ2hhbmdlTG9nCmluZGV4IDBiNGQzMWYuLmMzMWEw ZDkgMTAwNjQ0Ci0tLSBhL2djYy90ZXN0c3VpdGUvQ2hhbmdlTG9nCisrKyBi L2djYy90ZXN0c3VpdGUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTQgQEAKKzIw MTQtMTItMDQgIFNyaXJhbWFuIFRhbGxhbSAgPHRtc3JpcmFtQGdvb2dsZS5j b20+CisJICAgIEguSi4gTHUgIDxob25naml1Lmx1QGludGVsLmNvbT4KKwor CSogZ2NjLnRhcmdldC9pMzg2L3BpZS1jb3B5cmVsb2NzLTEuYzogTmV3IHRl c3QuCisJKiBnY2MudGFyZ2V0L2kzODYvcGllLWNvcHlyZWxvY3MtMi5jOiBM aWtld2lzZS4KKwkqIGdjYy50YXJnZXQvaTM4Ni9waWUtY29weXJlbG9jcy0z LmM6IExpa2V3aXNlLgorCSogZ2NjLnRhcmdldC9pMzg2L3BpZS1jb3B5cmVs b2NzLTQuYzogTGlrZXdpc2UuCisKKwkqIGxpYi90YXJnZXQtc3VwcG9ydHMu ZXhwIChjaGVja19lZmZlY3RpdmVfdGFyZ2V0X3BpZV9jb3B5cmVsb2MpOgor CU5ldyBwcm9jZWR1cmUuCisKIDIwMTQtMTItMDMgIFBhb2xvIENhcmxpbmkg IDxwYW9sby5jYXJsaW5pQG9yYWNsZS5jb20+CiAKIAlQUiBjKysvNjM1NTgK ZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3Bp ZS1jb3B5cmVsb2NzLTEuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9p Mzg2L3BpZS1jb3B5cmVsb2NzLTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwLi42NzcxMWUzCi0tLSAvZGV2L251bGwKKysrIGIvZ2Nj L3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcGllLWNvcHlyZWxvY3MtMS5j CkBAIC0wLDAgKzEsMTQgQEAKKy8qIENoZWNrIHRoYXQgR09UUENSRUwgaXNu J3QgdXNlZCB0byBhY2Nlc3MgZ2xvYl9hLiAgKi8KKy8qIHsgZGctZG8gY29t cGlsZSB7IHRhcmdldCAqLSotbGludXgqIH0gfSAqLworLyogeyBkZy1yZXF1 aXJlLWVmZmVjdGl2ZS10YXJnZXQgcGllX2NvcHlyZWxvYyB9ICovCisvKiB7 IGRnLW9wdGlvbnMgIi1PMiAtZnBpZSIgfSAqLworCitleHRlcm4gaW50IGds b2JfYTsKKworaW50IGZvbyAoKQoreworICByZXR1cm4gZ2xvYl9hOworfQor CisvKiBnbG9iX2Egc2hvdWxkIG5ldmVyIGJlIGFjY2Vzc2VkIHdpdGggYSBH T1RQQ1JFTC4gICovIAorLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVy LW5vdCAiZ2xvYl9hQEdPVFBDUkVMIiB7IHRhcmdldCB7ICEgaWEzMiB9IH0g fSB9ICovCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQv aTM4Ni9waWUtY29weXJlbG9jcy0yLmMgYi9nY2MvdGVzdHN1aXRlL2djYy50 YXJnZXQvaTM4Ni9waWUtY29weXJlbG9jcy0yLmMKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMC4uOTIzYmQ2OAotLS0gL2Rldi9udWxsCisr KyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3BpZS1jb3B5cmVs b2NzLTIuYwpAQCAtMCwwICsxLDE0IEBACisvKiBDaGVjayB0aGF0IEdPVFBD UkVMIGlzbid0IHVzZWQgdG8gYWNjZXNzIGdsb2JfYS4gICovCisvKiB7IGRn LWRvIGNvbXBpbGUgeyB0YXJnZXQgKi0qLWxpbnV4KiB9IH0gKi8KKy8qIHsg ZGctcmVxdWlyZS1lZmZlY3RpdmUtdGFyZ2V0IHBpZV9jb3B5cmVsb2MgfSAq LworLyogeyBkZy1vcHRpb25zICItTzIgLWZwaWUiIH0gKi8KKworaW50IGds b2JfYTsKKworaW50IGZvbyAoKQoreworICByZXR1cm4gZ2xvYl9hOworfQor CisvKiBnbG9iX2Egc2hvdWxkIG5ldmVyIGJlIGFjY2Vzc2VkIHdpdGggYSBH T1RQQ1JFTC4gICovIAorLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVy LW5vdCAiZ2xvYl9hQEdPVFBDUkVMIiB7IHRhcmdldCB7ICEgaWEzMiB9IH0g fSB9ICovCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQv aTM4Ni9waWUtY29weXJlbG9jcy0zLmMgYi9nY2MvdGVzdHN1aXRlL2djYy50 YXJnZXQvaTM4Ni9waWUtY29weXJlbG9jcy0zLmMKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q2OTVmMQotLS0gL2Rldi9udWxsCisr KyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3BpZS1jb3B5cmVs b2NzLTMuYwpAQCAtMCwwICsxLDE0IEBACisvKiBDaGVjayB0aGF0IFBMVCBp cyB1c2VkIHRvIGFjY2VzcyBnbG9iX2EuICAqLworLyogeyBkZy1kbyBjb21w aWxlIHsgdGFyZ2V0ICotKi1saW51eCogfSB9ICovCisvKiB7IGRnLXJlcXVp cmUtZWZmZWN0aXZlLXRhcmdldCBwaWVfY29weXJlbG9jIH0gKi8KKy8qIHsg ZGctb3B0aW9ucyAiLU8yIC1mcGllIiB9ICovCisKK2V4dGVybiBpbnQgZ2xv Yl9hICh2b2lkKTsKKworaW50IGZvbyAoKQoreworICByZXR1cm4gZ2xvYl9h ICgpOworfQorCisvKiBnbG9iX2Egc2hvdWxkIGJlIGFjY2Vzc2VkIHdpdGgg YSBQTFQuICAqLyAKKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlciAi Z2xvYl9hQFBMVCIgeyB0YXJnZXQgeyAhIGlhMzIgfSB9IH0gfSAqLwpkaWZm IC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcGllLWNv cHlyZWxvY3MtNC5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYv cGllLWNvcHlyZWxvY3MtNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAuLjgwNjZlMWQKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVz dHN1aXRlL2djYy50YXJnZXQvaTM4Ni9waWUtY29weXJlbG9jcy00LmMKQEAg LTAsMCArMSwxNyBAQAorLyogQ2hlY2sgdGhhdCBHT1RQQ1JFTCBpcyB1c2Vk IHRvIGFjY2VzcyBnbG9iX2EuICAqLworLyogeyBkZy1kbyBjb21waWxlIHsg dGFyZ2V0ICotKi1saW51eCogfSB9ICovCisvKiB7IGRnLXJlcXVpcmUtZWZm ZWN0aXZlLXRhcmdldCBwaWVfY29weXJlbG9jIH0gKi8KKy8qIHsgZGctb3B0 aW9ucyAiLU8yIC1mcGllIiB9ICovCisKK2V4dGVybiBpbnQgZ2xvYl9hICBf X2F0dHJpYnV0ZV9fKCh3ZWFrKSk7CisKK2ludCBmb28gKCkKK3sKKyAgaWYg KCZnbG9iX2EgIT0gMCkKKyAgICByZXR1cm4gZ2xvYl9hOworICBlbHNlCisg ICAgcmV0dXJuIDA7Cit9CisKKy8qIHdlYWsgZ2xvYl9hIHNob3VsZCBiZSBh Y2Nlc3NlZCB3aXRoIGEgR09UUENSRUwuICAqLyAKKy8qIHsgZGctZmluYWwg eyBzY2FuLWFzc2VtYmxlciAiZ2xvYl9hQEdPVFBDUkVMIiB7IHRhcmdldCB7 ICEgaWEzMiB9IH0gfSB9ICovCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRl L2xpYi90YXJnZXQtc3VwcG9ydHMuZXhwIGIvZ2NjL3Rlc3RzdWl0ZS9saWIv dGFyZ2V0LXN1cHBvcnRzLmV4cAppbmRleCBhYzA0ZDk1Li44MTY5ODY1IDEw MDY0NAotLS0gYS9nY2MvdGVzdHN1aXRlL2xpYi90YXJnZXQtc3VwcG9ydHMu ZXhwCisrKyBiL2djYy90ZXN0c3VpdGUvbGliL3RhcmdldC1zdXBwb3J0cy5l eHAKQEAgLTYwOTAsMyArNjA5MCw1NCBAQCBwcm9jIGZvcmNlX2NvbnZlbnRp b25hbF9vdXRwdXRfZm9yIHsgdGVzdCB9IHsKICAgICB9CiB9CiAKKyMgUmV0 dXJuIDEgaWYgdGhlIHg4Ni02NCB0YXJnZXQgc3VwcG9ydHMgUElFIHdpdGgg Y29weSByZWxvYywgMAorIyBvdGhlcndpc2UuICBDYWNoZSB0aGUgcmVzdWx0 LgorCitwcm9jIGNoZWNrX2VmZmVjdGl2ZV90YXJnZXRfcGllX2NvcHlyZWxv YyB7IH0geworICAgIGdsb2JhbCBwaWVfY29weXJlbG9jX2F2YWlsYWJsZV9z YXZlZAorICAgIGdsb2JhbCB0b29sCisgICAgZ2xvYmFsIEdDQ19VTkRFUl9U RVNUCisKKyAgICBpZiB7ICEoW2lzdGFyZ2V0IHg4Nl82NC0qLSpdIHx8IFtp c3RhcmdldCBpPzg2LSotKl0pIH0geworCXJldHVybiAwCisgICAgfQorCisg ICAgIyBOZWVkIGF1dG8taG9zdC5oIHRvIGNoZWNrIGxpbmtlciBzdXBwb3J0 LgorICAgIGlmIHsgIVtmaWxlIGV4aXN0cyAuLi8uLi9hdXRvLWhvc3QuaCBd IH0geworCXJldHVybiAwCisgICAgfQorCisgICAgaWYgW2luZm8gZXhpc3Rz IHBpZV9jb3B5cmVsb2NfYXZhaWxhYmxlX3NhdmVkXSB7CisJdmVyYm9zZSAi Y2hlY2tfZWZmZWN0aXZlX3RhcmdldF9waWVfY29weXJlbG9jIHJldHVybmlu ZyBzYXZlZCAkcGllX2NvcHlyZWxvY19hdmFpbGFibGVfc2F2ZWQiIDIKKyAg ICB9IGVsc2UgeworCSMgU2V0IHVwIGFuZCBjb21waWxlIHRvIHNlZSBpZiBs aW5rZXIgc3VwcG9ydHMgUElFIHdpdGggY29weQorCSMgcmVsb2MuICBJbmNs dWRlIHRoZSBjdXJyZW50IHByb2Nlc3MgSUQgaW4gdGhlIGZpbGUgbmFtZXMg dG8KKwkjIHByZXZlbnQgY29uZmxpY3RzIHdpdGggaW52b2NhdGlvbnMgZm9y IG11bHRpcGxlIHRlc3RzdWl0ZXMuCisKKwlzZXQgc3JjIHBpZVtwaWRdLmMK KwlzZXQgb2JqIHBpZVtwaWRdLm8KKworCXNldCBmIFtvcGVuICRzcmMgInci XQorCXB1dHMgJGYgIiNpbmNsdWRlIFwiLi4vLi4vYXV0by1ob3N0LmhcIiIK KwlwdXRzICRmICIjaWYgSEFWRV9MRF9QSUVfQ09QWVJFTE9DID09IDAiCisJ cHV0cyAkZiAiIyBlcnJvciBMaW5rZXIgZG9lcyBub3Qgc3VwcG9ydCBQSUUg d2l0aCBjb3B5IHJlbG9jLiIKKwlwdXRzICRmICIjZW5kaWYiCisJY2xvc2Ug JGYKKworCXZlcmJvc2UgImNoZWNrX2VmZmVjdGl2ZV90YXJnZXRfcGllX2Nv cHlyZWxvYyBjb21waWxpbmcgdGVzdGZpbGUgJHNyYyIgMgorCXNldCBsaW5l cyBbJHt0b29sfV90YXJnZXRfY29tcGlsZSAkc3JjICRvYmogb2JqZWN0ICIi XQorCisJZmlsZSBkZWxldGUgJHNyYworCWZpbGUgZGVsZXRlICRvYmoKKwor CWlmIFtzdHJpbmcgbWF0Y2ggIiIgJGxpbmVzXSB0aGVuIHsKKwkgICAgdmVy Ym9zZSAiY2hlY2tfZWZmZWN0aXZlX3RhcmdldF9waWVfY29weXJlbG9jIHRl c3RmaWxlIGNvbXBpbGF0aW9uIHBhc3NlZCIgMgorCSAgICBzZXQgcGllX2Nv cHlyZWxvY19hdmFpbGFibGVfc2F2ZWQgMQorCX0gZWxzZSB7CisJICAgIHZl cmJvc2UgImNoZWNrX2VmZmVjdGl2ZV90YXJnZXRfcGllX2NvcHlyZWxvYyB0 ZXN0ZmlsZSBjb21waWxhdGlvbiBmYWlsZWQiIDIKKwkgICAgc2V0IHBpZV9j b3B5cmVsb2NfYXZhaWxhYmxlX3NhdmVkIDAKKwl9CisgICAgfQorCisgICAg cmV0dXJuICRwaWVfY29weXJlbG9jX2F2YWlsYWJsZV9zYXZlZAorfQotLSAK MS45LjMKCg== --001a113ce8e4cce83e050966b40c--