Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752328AbdCDVLk (ORCPT ); Sat, 4 Mar 2017 16:11:40 -0500 Received: from ale.deltatee.com ([207.54.116.67]:40814 "EHLO ale.deltatee.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752056AbdCDVLj (ORCPT ); Sat, 4 Mar 2017 16:11:39 -0500 To: Thomas Gleixner , Ingo Molnar , "H. Peter Anvin" , Tony Luck , Borislav Petkov , Al Viro Cc: the arch/x86 maintainers , Linux Kernel Mailing List From: Logan Gunthorpe Message-ID: Date: Sat, 4 Mar 2017 13:08:15 -0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Icedove/45.6.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------70423FD932D45E7C65E69D65" X-SA-Exim-Connect-IP: 50.66.97.235 X-SA-Exim-Rcpt-To: linux-kernel@vger.kernel.org, x86@kernel.org, viro@zeniv.linux.org.uk, bp@suse.de, tony.luck@intel.com, hpa@zytor.com, mingo@redhat.com, tglx@linutronix.de X-SA-Exim-Mail-From: logang@deltatee.com Subject: Question Regarding ERMS memcpy X-SA-Exim-Version: 4.2.1 (built Mon, 26 Dec 2011 16:24:06 +0000) X-SA-Exim-Scanned: Yes (on ale.deltatee.com) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 11812 Lines: 189 This is a multi-part message in MIME format. --------------70423FD932D45E7C65E69D65 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Hi, I'm trying to chase down a performance issue with a driver I'm working on that does a repeated memcpy_fromio of about 1KB from a PCI device. I made a small change from a fixed size copy to a variable size only to be surprised with a performance decrease of about 1/3. I've looked through the code and discovered this is due to switching out __builtin_memcpy with __memcpy when the length is not constant. This makes sense and I've now been looking into the inner workings of memcpy_64.S. The CPU I'm testing on is a Sandy Bridge and according to /proc/cpuinfo, it does _not_ have the erms bit and does have the rep_good bit. So I expect to be using the "rep movsq" version of memcpy. However, I've done some testing with my driver by hacking in specific memcpy implementations and I've found the following results: __builtin_memcpy w/const length: 85KB/s memcpy_fromio: 26kB/s __builtin_memcpy: 26kB/s memcpy_movsq: 126kB/s memcpy_erms: 26kB/s Thus, based on these performance numbers, it almost seems like my platform is using the erms version when it probably shouldn't be. So my question is: how do I find out what version of memcpy my actual machine is using and fix it if it is wrong? I'm running with a 4.10.0 kernel and I've attached my cpuinfo. Thanks for any insights, Logan --------------70423FD932D45E7C65E69D65 Content-Type: text/plain; charset=UTF-8; name="cpuinfo.txt" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="cpuinfo.txt" cHJvY2Vzc29yCTogMAp2ZW5kb3JfaWQJOiBHZW51aW5lSW50ZWwKY3B1IGZhbWlseQk6IDYK bW9kZWwJCTogNDUKbW9kZWwgbmFtZQk6IEludGVsKFIpIFhlb24oUikgQ1BVIEU1LTI2MDkg MCBAIDIuNDBHSHoKc3RlcHBpbmcJOiA3Cm1pY3JvY29kZQk6IDB4NzEwCmNwdSBNSHoJCTog MTIwMC4wMDAKY2FjaGUgc2l6ZQk6IDEwMjQwIEtCCnBoeXNpY2FsIGlkCTogMApzaWJsaW5n cwk6IDQKY29yZSBpZAkJOiAwCmNwdSBjb3Jlcwk6IDQKYXBpY2lkCQk6IDAKaW5pdGlhbCBh cGljaWQJOiAwCmZwdQkJOiB5ZXMKZnB1X2V4Y2VwdGlvbgk6IHllcwpjcHVpZCBsZXZlbAk6 IDEzCndwCQk6IHllcwpmbGFncwkJOiBmcHUgdm1lIGRlIHBzZSB0c2MgbXNyIHBhZSBtY2Ug Y3g4IGFwaWMgc2VwIG10cnIgcGdlIG1jYSBjbW92IHBhdCBwc2UzNiBjbGZsdXNoIGR0cyBh Y3BpIG1teCBmeHNyIHNzZSBzc2UyIHNzIGh0IHRtIHBiZSBzeXNjYWxsIG54IHBkcGUxZ2Ig cmR0c2NwIGxtIGNvbnN0YW50X3RzYyBhcmNoX3BlcmZtb24gcGVicyBidHMgcmVwX2dvb2Qg bm9wbCB4dG9wb2xvZ3kgbm9uc3RvcF90c2MgYXBlcmZtcGVyZiBwbmkgcGNsbXVscWRxIGR0 ZXM2NCBtb25pdG9yIGRzX2NwbCB2bXggc214IGVzdCB0bTIgc3NzZTMgY3gxNiB4dHByIHBk Y20gcGNpZCBkY2Egc3NlNF8xIHNzZTRfMiB4MmFwaWMgcG9wY250IHRzY19kZWFkbGluZV90 aW1lciBhZXMgeHNhdmUgYXZ4IGxhaGZfbG0gZXBiIHRwcl9zaGFkb3cgdm5taSBmbGV4cHJp b3JpdHkgZXB0IHZwaWQgeHNhdmVvcHQgZHRoZXJtIGFyYXQgcGxuIHB0cwpidWdzCQk6CmJv Z29taXBzCTogNDc5OS45MApjbGZsdXNoIHNpemUJOiA2NApjYWNoZV9hbGlnbm1lbnQJOiA2 NAphZGRyZXNzIHNpemVzCTogNDYgYml0cyBwaHlzaWNhbCwgNDggYml0cyB2aXJ0dWFsCnBv d2VyIG1hbmFnZW1lbnQ6Cgpwcm9jZXNzb3IJOiAxCnZlbmRvcl9pZAk6IEdlbnVpbmVJbnRl bApjcHUgZmFtaWx5CTogNgptb2RlbAkJOiA0NQptb2RlbCBuYW1lCTogSW50ZWwoUikgWGVv bihSKSBDUFUgRTUtMjYwOSAwIEAgMi40MEdIegpzdGVwcGluZwk6IDcKbWljcm9jb2RlCTog MHg3MTAKY3B1IE1IegkJOiAxMjAwLjAwMApjYWNoZSBzaXplCTogMTAyNDAgS0IKcGh5c2lj YWwgaWQJOiAwCnNpYmxpbmdzCTogNApjb3JlIGlkCQk6IDEKY3B1IGNvcmVzCTogNAphcGlj aWQJCTogMgppbml0aWFsIGFwaWNpZAk6IDIKZnB1CQk6IHllcwpmcHVfZXhjZXB0aW9uCTog eWVzCmNwdWlkIGxldmVsCTogMTMKd3AJCTogeWVzCmZsYWdzCQk6IGZwdSB2bWUgZGUgcHNl IHRzYyBtc3IgcGFlIG1jZSBjeDggYXBpYyBzZXAgbXRyciBwZ2UgbWNhIGNtb3YgcGF0IHBz ZTM2IGNsZmx1c2ggZHRzIGFjcGkgbW14IGZ4c3Igc3NlIHNzZTIgc3MgaHQgdG0gcGJlIHN5 c2NhbGwgbnggcGRwZTFnYiByZHRzY3AgbG0gY29uc3RhbnRfdHNjIGFyY2hfcGVyZm1vbiBw ZWJzIGJ0cyByZXBfZ29vZCBub3BsIHh0b3BvbG9neSBub25zdG9wX3RzYyBhcGVyZm1wZXJm IHBuaSBwY2xtdWxxZHEgZHRlczY0IG1vbml0b3IgZHNfY3BsIHZteCBzbXggZXN0IHRtMiBz c3NlMyBjeDE2IHh0cHIgcGRjbSBwY2lkIGRjYSBzc2U0XzEgc3NlNF8yIHgyYXBpYyBwb3Bj bnQgdHNjX2RlYWRsaW5lX3RpbWVyIGFlcyB4c2F2ZSBhdnggbGFoZl9sbSBlcGIgdHByX3No YWRvdyB2bm1pIGZsZXhwcmlvcml0eSBlcHQgdnBpZCB4c2F2ZW9wdCBkdGhlcm0gYXJhdCBw bG4gcHRzCmJ1Z3MJCToKYm9nb21pcHMJOiA0ODAxLjA2CmNsZmx1c2ggc2l6ZQk6IDY0CmNh Y2hlX2FsaWdubWVudAk6IDY0CmFkZHJlc3Mgc2l6ZXMJOiA0NiBiaXRzIHBoeXNpY2FsLCA0 OCBiaXRzIHZpcnR1YWwKcG93ZXIgbWFuYWdlbWVudDoKCnByb2Nlc3Nvcgk6IDIKdmVuZG9y X2lkCTogR2VudWluZUludGVsCmNwdSBmYW1pbHkJOiA2Cm1vZGVsCQk6IDQ1Cm1vZGVsIG5h bWUJOiBJbnRlbChSKSBYZW9uKFIpIENQVSBFNS0yNjA5IDAgQCAyLjQwR0h6CnN0ZXBwaW5n CTogNwptaWNyb2NvZGUJOiAweDcxMApjcHUgTUh6CQk6IDEyMDAuMDAwCmNhY2hlIHNpemUJ OiAxMDI0MCBLQgpwaHlzaWNhbCBpZAk6IDAKc2libGluZ3MJOiA0CmNvcmUgaWQJCTogMgpj cHUgY29yZXMJOiA0CmFwaWNpZAkJOiA0CmluaXRpYWwgYXBpY2lkCTogNApmcHUJCTogeWVz CmZwdV9leGNlcHRpb24JOiB5ZXMKY3B1aWQgbGV2ZWwJOiAxMwp3cAkJOiB5ZXMKZmxhZ3MJ CTogZnB1IHZtZSBkZSBwc2UgdHNjIG1zciBwYWUgbWNlIGN4OCBhcGljIHNlcCBtdHJyIHBn ZSBtY2EgY21vdiBwYXQgcHNlMzYgY2xmbHVzaCBkdHMgYWNwaSBtbXggZnhzciBzc2Ugc3Nl MiBzcyBodCB0bSBwYmUgc3lzY2FsbCBueCBwZHBlMWdiIHJkdHNjcCBsbSBjb25zdGFudF90 c2MgYXJjaF9wZXJmbW9uIHBlYnMgYnRzIHJlcF9nb29kIG5vcGwgeHRvcG9sb2d5IG5vbnN0 b3BfdHNjIGFwZXJmbXBlcmYgcG5pIHBjbG11bHFkcSBkdGVzNjQgbW9uaXRvciBkc19jcGwg dm14IHNteCBlc3QgdG0yIHNzc2UzIGN4MTYgeHRwciBwZGNtIHBjaWQgZGNhIHNzZTRfMSBz c2U0XzIgeDJhcGljIHBvcGNudCB0c2NfZGVhZGxpbmVfdGltZXIgYWVzIHhzYXZlIGF2eCBs YWhmX2xtIGVwYiB0cHJfc2hhZG93IHZubWkgZmxleHByaW9yaXR5IGVwdCB2cGlkIHhzYXZl b3B0IGR0aGVybSBhcmF0IHBsbiBwdHMKYnVncwkJOgpib2dvbWlwcwk6IDQ4MDEuMTIKY2xm bHVzaCBzaXplCTogNjQKY2FjaGVfYWxpZ25tZW50CTogNjQKYWRkcmVzcyBzaXplcwk6IDQ2 IGJpdHMgcGh5c2ljYWwsIDQ4IGJpdHMgdmlydHVhbApwb3dlciBtYW5hZ2VtZW50OgoKcHJv Y2Vzc29yCTogMwp2ZW5kb3JfaWQJOiBHZW51aW5lSW50ZWwKY3B1IGZhbWlseQk6IDYKbW9k ZWwJCTogNDUKbW9kZWwgbmFtZQk6IEludGVsKFIpIFhlb24oUikgQ1BVIEU1LTI2MDkgMCBA IDIuNDBHSHoKc3RlcHBpbmcJOiA3Cm1pY3JvY29kZQk6IDB4NzEwCmNwdSBNSHoJCTogMTIw MC4wMDAKY2FjaGUgc2l6ZQk6IDEwMjQwIEtCCnBoeXNpY2FsIGlkCTogMApzaWJsaW5ncwk6 IDQKY29yZSBpZAkJOiAzCmNwdSBjb3Jlcwk6IDQKYXBpY2lkCQk6IDYKaW5pdGlhbCBhcGlj aWQJOiA2CmZwdQkJOiB5ZXMKZnB1X2V4Y2VwdGlvbgk6IHllcwpjcHVpZCBsZXZlbAk6IDEz CndwCQk6IHllcwpmbGFncwkJOiBmcHUgdm1lIGRlIHBzZSB0c2MgbXNyIHBhZSBtY2UgY3g4 IGFwaWMgc2VwIG10cnIgcGdlIG1jYSBjbW92IHBhdCBwc2UzNiBjbGZsdXNoIGR0cyBhY3Bp IG1teCBmeHNyIHNzZSBzc2UyIHNzIGh0IHRtIHBiZSBzeXNjYWxsIG54IHBkcGUxZ2IgcmR0 c2NwIGxtIGNvbnN0YW50X3RzYyBhcmNoX3BlcmZtb24gcGVicyBidHMgcmVwX2dvb2Qgbm9w bCB4dG9wb2xvZ3kgbm9uc3RvcF90c2MgYXBlcmZtcGVyZiBwbmkgcGNsbXVscWRxIGR0ZXM2 NCBtb25pdG9yIGRzX2NwbCB2bXggc214IGVzdCB0bTIgc3NzZTMgY3gxNiB4dHByIHBkY20g cGNpZCBkY2Egc3NlNF8xIHNzZTRfMiB4MmFwaWMgcG9wY250IHRzY19kZWFkbGluZV90aW1l ciBhZXMgeHNhdmUgYXZ4IGxhaGZfbG0gZXBiIHRwcl9zaGFkb3cgdm5taSBmbGV4cHJpb3Jp dHkgZXB0IHZwaWQgeHNhdmVvcHQgZHRoZXJtIGFyYXQgcGxuIHB0cwpidWdzCQk6CmJvZ29t aXBzCTogNDgwMS4xMApjbGZsdXNoIHNpemUJOiA2NApjYWNoZV9hbGlnbm1lbnQJOiA2NAph ZGRyZXNzIHNpemVzCTogNDYgYml0cyBwaHlzaWNhbCwgNDggYml0cyB2aXJ0dWFsCnBvd2Vy IG1hbmFnZW1lbnQ6Cgpwcm9jZXNzb3IJOiA0CnZlbmRvcl9pZAk6IEdlbnVpbmVJbnRlbApj cHUgZmFtaWx5CTogNgptb2RlbAkJOiA0NQptb2RlbCBuYW1lCTogSW50ZWwoUikgWGVvbihS KSBDUFUgRTUtMjYwOSAwIEAgMi40MEdIegpzdGVwcGluZwk6IDcKbWljcm9jb2RlCTogMHg3 MTAKY3B1IE1IegkJOiAxMjAwLjAwMApjYWNoZSBzaXplCTogMTAyNDAgS0IKcGh5c2ljYWwg aWQJOiAxCnNpYmxpbmdzCTogNApjb3JlIGlkCQk6IDAKY3B1IGNvcmVzCTogNAphcGljaWQJ CTogMzIKaW5pdGlhbCBhcGljaWQJOiAzMgpmcHUJCTogeWVzCmZwdV9leGNlcHRpb24JOiB5 ZXMKY3B1aWQgbGV2ZWwJOiAxMwp3cAkJOiB5ZXMKZmxhZ3MJCTogZnB1IHZtZSBkZSBwc2Ug dHNjIG1zciBwYWUgbWNlIGN4OCBhcGljIHNlcCBtdHJyIHBnZSBtY2EgY21vdiBwYXQgcHNl MzYgY2xmbHVzaCBkdHMgYWNwaSBtbXggZnhzciBzc2Ugc3NlMiBzcyBodCB0bSBwYmUgc3lz Y2FsbCBueCBwZHBlMWdiIHJkdHNjcCBsbSBjb25zdGFudF90c2MgYXJjaF9wZXJmbW9uIHBl YnMgYnRzIHJlcF9nb29kIG5vcGwgeHRvcG9sb2d5IG5vbnN0b3BfdHNjIGFwZXJmbXBlcmYg cG5pIHBjbG11bHFkcSBkdGVzNjQgbW9uaXRvciBkc19jcGwgdm14IHNteCBlc3QgdG0yIHNz c2UzIGN4MTYgeHRwciBwZGNtIHBjaWQgZGNhIHNzZTRfMSBzc2U0XzIgeDJhcGljIHBvcGNu dCB0c2NfZGVhZGxpbmVfdGltZXIgYWVzIHhzYXZlIGF2eCBsYWhmX2xtIGVwYiB0cHJfc2hh ZG93IHZubWkgZmxleHByaW9yaXR5IGVwdCB2cGlkIHhzYXZlb3B0IGR0aGVybSBhcmF0IHBs biBwdHMKYnVncwkJOgpib2dvbWlwcwk6IDQ4MDEuNDMKY2xmbHVzaCBzaXplCTogNjQKY2Fj aGVfYWxpZ25tZW50CTogNjQKYWRkcmVzcyBzaXplcwk6IDQ2IGJpdHMgcGh5c2ljYWwsIDQ4 IGJpdHMgdmlydHVhbApwb3dlciBtYW5hZ2VtZW50OgoKcHJvY2Vzc29yCTogNQp2ZW5kb3Jf aWQJOiBHZW51aW5lSW50ZWwKY3B1IGZhbWlseQk6IDYKbW9kZWwJCTogNDUKbW9kZWwgbmFt ZQk6IEludGVsKFIpIFhlb24oUikgQ1BVIEU1LTI2MDkgMCBAIDIuNDBHSHoKc3RlcHBpbmcJ OiA3Cm1pY3JvY29kZQk6IDB4NzEwCmNwdSBNSHoJCTogMTIwMC4wMDAKY2FjaGUgc2l6ZQk6 IDEwMjQwIEtCCnBoeXNpY2FsIGlkCTogMQpzaWJsaW5ncwk6IDQKY29yZSBpZAkJOiAxCmNw dSBjb3Jlcwk6IDQKYXBpY2lkCQk6IDM0CmluaXRpYWwgYXBpY2lkCTogMzQKZnB1CQk6IHll cwpmcHVfZXhjZXB0aW9uCTogeWVzCmNwdWlkIGxldmVsCTogMTMKd3AJCTogeWVzCmZsYWdz CQk6IGZwdSB2bWUgZGUgcHNlIHRzYyBtc3IgcGFlIG1jZSBjeDggYXBpYyBzZXAgbXRyciBw Z2UgbWNhIGNtb3YgcGF0IHBzZTM2IGNsZmx1c2ggZHRzIGFjcGkgbW14IGZ4c3Igc3NlIHNz ZTIgc3MgaHQgdG0gcGJlIHN5c2NhbGwgbnggcGRwZTFnYiByZHRzY3AgbG0gY29uc3RhbnRf dHNjIGFyY2hfcGVyZm1vbiBwZWJzIGJ0cyByZXBfZ29vZCBub3BsIHh0b3BvbG9neSBub25z dG9wX3RzYyBhcGVyZm1wZXJmIHBuaSBwY2xtdWxxZHEgZHRlczY0IG1vbml0b3IgZHNfY3Bs IHZteCBzbXggZXN0IHRtMiBzc3NlMyBjeDE2IHh0cHIgcGRjbSBwY2lkIGRjYSBzc2U0XzEg c3NlNF8yIHgyYXBpYyBwb3BjbnQgdHNjX2RlYWRsaW5lX3RpbWVyIGFlcyB4c2F2ZSBhdngg bGFoZl9sbSBlcGIgdHByX3NoYWRvdyB2bm1pIGZsZXhwcmlvcml0eSBlcHQgdnBpZCB4c2F2 ZW9wdCBkdGhlcm0gYXJhdCBwbG4gcHRzCmJ1Z3MJCToKYm9nb21pcHMJOiA0ODAxLjc0CmNs Zmx1c2ggc2l6ZQk6IDY0CmNhY2hlX2FsaWdubWVudAk6IDY0CmFkZHJlc3Mgc2l6ZXMJOiA0 NiBiaXRzIHBoeXNpY2FsLCA0OCBiaXRzIHZpcnR1YWwKcG93ZXIgbWFuYWdlbWVudDoKCnBy b2Nlc3Nvcgk6IDYKdmVuZG9yX2lkCTogR2VudWluZUludGVsCmNwdSBmYW1pbHkJOiA2Cm1v ZGVsCQk6IDQ1Cm1vZGVsIG5hbWUJOiBJbnRlbChSKSBYZW9uKFIpIENQVSBFNS0yNjA5IDAg QCAyLjQwR0h6CnN0ZXBwaW5nCTogNwptaWNyb2NvZGUJOiAweDcxMApjcHUgTUh6CQk6IDEy MDAuMDAwCmNhY2hlIHNpemUJOiAxMDI0MCBLQgpwaHlzaWNhbCBpZAk6IDEKc2libGluZ3MJ OiA0CmNvcmUgaWQJCTogMgpjcHUgY29yZXMJOiA0CmFwaWNpZAkJOiAzNgppbml0aWFsIGFw aWNpZAk6IDM2CmZwdQkJOiB5ZXMKZnB1X2V4Y2VwdGlvbgk6IHllcwpjcHVpZCBsZXZlbAk6 IDEzCndwCQk6IHllcwpmbGFncwkJOiBmcHUgdm1lIGRlIHBzZSB0c2MgbXNyIHBhZSBtY2Ug Y3g4IGFwaWMgc2VwIG10cnIgcGdlIG1jYSBjbW92IHBhdCBwc2UzNiBjbGZsdXNoIGR0cyBh Y3BpIG1teCBmeHNyIHNzZSBzc2UyIHNzIGh0IHRtIHBiZSBzeXNjYWxsIG54IHBkcGUxZ2Ig cmR0c2NwIGxtIGNvbnN0YW50X3RzYyBhcmNoX3BlcmZtb24gcGVicyBidHMgcmVwX2dvb2Qg bm9wbCB4dG9wb2xvZ3kgbm9uc3RvcF90c2MgYXBlcmZtcGVyZiBwbmkgcGNsbXVscWRxIGR0 ZXM2NCBtb25pdG9yIGRzX2NwbCB2bXggc214IGVzdCB0bTIgc3NzZTMgY3gxNiB4dHByIHBk Y20gcGNpZCBkY2Egc3NlNF8xIHNzZTRfMiB4MmFwaWMgcG9wY250IHRzY19kZWFkbGluZV90 aW1lciBhZXMgeHNhdmUgYXZ4IGxhaGZfbG0gZXBiIHRwcl9zaGFkb3cgdm5taSBmbGV4cHJp b3JpdHkgZXB0IHZwaWQgeHNhdmVvcHQgZHRoZXJtIGFyYXQgcGxuIHB0cwpidWdzCQk6CmJv Z29taXBzCTogNDgwMS43NgpjbGZsdXNoIHNpemUJOiA2NApjYWNoZV9hbGlnbm1lbnQJOiA2 NAphZGRyZXNzIHNpemVzCTogNDYgYml0cyBwaHlzaWNhbCwgNDggYml0cyB2aXJ0dWFsCnBv d2VyIG1hbmFnZW1lbnQ6Cgpwcm9jZXNzb3IJOiA3CnZlbmRvcl9pZAk6IEdlbnVpbmVJbnRl bApjcHUgZmFtaWx5CTogNgptb2RlbAkJOiA0NQptb2RlbCBuYW1lCTogSW50ZWwoUikgWGVv bihSKSBDUFUgRTUtMjYwOSAwIEAgMi40MEdIegpzdGVwcGluZwk6IDcKbWljcm9jb2RlCTog MHg3MTAKY3B1IE1IegkJOiAxMjAwLjAwMApjYWNoZSBzaXplCTogMTAyNDAgS0IKcGh5c2lj YWwgaWQJOiAxCnNpYmxpbmdzCTogNApjb3JlIGlkCQk6IDMKY3B1IGNvcmVzCTogNAphcGlj aWQJCTogMzgKaW5pdGlhbCBhcGljaWQJOiAzOApmcHUJCTogeWVzCmZwdV9leGNlcHRpb24J OiB5ZXMKY3B1aWQgbGV2ZWwJOiAxMwp3cAkJOiB5ZXMKZmxhZ3MJCTogZnB1IHZtZSBkZSBw c2UgdHNjIG1zciBwYWUgbWNlIGN4OCBhcGljIHNlcCBtdHJyIHBnZSBtY2EgY21vdiBwYXQg cHNlMzYgY2xmbHVzaCBkdHMgYWNwaSBtbXggZnhzciBzc2Ugc3NlMiBzcyBodCB0bSBwYmUg c3lzY2FsbCBueCBwZHBlMWdiIHJkdHNjcCBsbSBjb25zdGFudF90c2MgYXJjaF9wZXJmbW9u IHBlYnMgYnRzIHJlcF9nb29kIG5vcGwgeHRvcG9sb2d5IG5vbnN0b3BfdHNjIGFwZXJmbXBl cmYgcG5pIHBjbG11bHFkcSBkdGVzNjQgbW9uaXRvciBkc19jcGwgdm14IHNteCBlc3QgdG0y IHNzc2UzIGN4MTYgeHRwciBwZGNtIHBjaWQgZGNhIHNzZTRfMSBzc2U0XzIgeDJhcGljIHBv cGNudCB0c2NfZGVhZGxpbmVfdGltZXIgYWVzIHhzYXZlIGF2eCBsYWhmX2xtIGVwYiB0cHJf c2hhZG93IHZubWkgZmxleHByaW9yaXR5IGVwdCB2cGlkIHhzYXZlb3B0IGR0aGVybSBhcmF0 IHBsbiBwdHMKYnVncwkJOgpib2dvbWlwcwk6IDQ4MDEuNzgKY2xmbHVzaCBzaXplCTogNjQK Y2FjaGVfYWxpZ25tZW50CTogNjQKYWRkcmVzcyBzaXplcwk6IDQ2IGJpdHMgcGh5c2ljYWws IDQ4IGJpdHMgdmlydHVhbApwb3dlciBtYW5hZ2VtZW50OgoK --------------70423FD932D45E7C65E69D65--