From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 1C00921962301 for ; Mon, 7 Jan 2019 10:48:48 -0800 (PST) From: "Verma, Vishal L" Subject: Re: [ndctl PATCH v2 1/2] ndctl: add the ciniparser tool from ccan Date: Mon, 7 Jan 2019 18:48:46 +0000 Message-ID: <04d69bf74e10c38550bc563aa61d2a9b70a5295d.camel@intel.com> References: <20190107083833.25941-1-qi.fuli@jp.fujitsu.com> <20190107083833.25941-2-qi.fuli@jp.fujitsu.com> In-Reply-To: <20190107083833.25941-2-qi.fuli@jp.fujitsu.com> Content-Language: en-US Content-ID: <6948A26200F47C489734DAA967BA4BB4@intel.com> MIME-Version: 1.0 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: linux-nvdimm-bounces@lists.01.org Sender: "Linux-nvdimm" To: "linux-nvdimm@lists.01.org" , "qi.fuli@jp.fujitsu.com" List-ID: DQpPbiBNb24sIDIwMTktMDEtMDcgYXQgMTc6MzggKzA5MDAsIFFJIEZ1bGkgd3JvdGU6DQo+IElt cG9ydCBjaW5pcGFyc2VyIHRvb2wgZnJvbSBjY2FuIFsxXSwgdGhlcmVmb3JlLCB0aGUgbmRjdGwg bW9uaXRvciBjYW4NCj4gcmVhZCB0aGUgY29uZmlndXJhdGlvbiBmaWxlIGJ5IHVzaW5nIHRoaXMg bGlicmFyeS4NCj4gDQo+IFsxXTogaHR0cHM6Ly9jY29kZWFyY2hpdmUubmV0L2luZm8vY2luaXBh cnNlci5odG1sDQo+IA0KPiBTaWduZWQtb2ZmLWJ5OiBRSSBGdWxpIDxxaS5mdWxpQGpwLmZ1aml0 c3UuY29tPg0KPiAtLS0NCj4gIE1ha2VmaWxlLmFtICAgICAgICAgICAgICAgICAgfCAgIDYgKy0N Cj4gIGNjYW4vY2luaXBhcnNlci9MSUNFTlNFICAgICAgfCAgIDEgKw0KPiAgY2Nhbi9jaW5pcGFy c2VyL2NpbmlwYXJzZXIuYyB8IDQ4MCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr Kw0KPiAgY2Nhbi9jaW5pcGFyc2VyL2NpbmlwYXJzZXIuaCB8IDI2MiArKysrKysrKysrKysrKysr KysrDQo+ICBjY2FuL2NpbmlwYXJzZXIvZGljdGlvbmFyeS5jIHwgMjY2ICsrKysrKysrKysrKysr KysrKysNCj4gIGNjYW4vY2luaXBhcnNlci9kaWN0aW9uYXJ5LmggfCAxNjYgKysrKysrKysrKysr DQo+ICA2IGZpbGVzIGNoYW5nZWQsIDExODAgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQ0K PiAgY3JlYXRlIG1vZGUgMTIwMDAwIGNjYW4vY2luaXBhcnNlci9MSUNFTlNFDQo+ICBjcmVhdGUg bW9kZSAxMDA2NDQgY2Nhbi9jaW5pcGFyc2VyL2NpbmlwYXJzZXIuYw0KPiAgY3JlYXRlIG1vZGUg MTAwNjQ0IGNjYW4vY2luaXBhcnNlci9jaW5pcGFyc2VyLmgNCj4gIGNyZWF0ZSBtb2RlIDEwMDY0 NCBjY2FuL2NpbmlwYXJzZXIvZGljdGlvbmFyeS5jDQo+ICBjcmVhdGUgbW9kZSAxMDA2NDQgY2Nh bi9jaW5pcGFyc2VyL2RpY3Rpb25hcnkuaA0KDQpIaSBRaSwNCg0KVGhhbmtzIGZvciB0aGVzZSBw YXRjaGVzLCBhbmQgYWxzbyBmb3IgcmViYXNpbmcgdG8gdGhlIGxhdGVzdCENCg0KY2luaXBhcnNl ci5jIGFkZHMgYSBuZXcgd2FybmluZyAoc2VlIGJlbG93KS4gQ291bGQgeW91IGZpeCB0aGF0IHVw IGluIGENCm5ldyBwYXRjaCBvbiB0b3Agb2YgdGhlIGluaXRpYWwgaW1wb3J0IChpLmUuIHdlIHJl dGFpbiB0aGUgYXMtaXMNCmltcG9ydCwgYW5kIG1ha2UgYSByZWNvcmQgb2Ygd2hhdCB3ZSBjaGFu Z2VkKS4NCg0KTG9va3MgbGlrZSB0aGUgLVdmb3JtYXQtdHJ1bmNhdGlvbj0gd2FybmluZ3Mgd2Vy ZSBmaXJzdCBpbnRyb2R1Y2VkIGluDQpnY2MtNy4xLCBidXQgb25seSBiZWNhbWUgcmVhbGx5IHpl YWxvdXMgYWZ0ZXIgZ2NjLTguMS4gVGhlIHJpZ2h0DQpzb2x1dGlvbiBoZXJlIG1pZ2h0IGp1c3Qg YmUgdG8gc3VwcHJlc3MgaXQgYnkgYWRkaW5nIGEgLVduby1mb3JtYXQtDQp0cnVuY2F0aW9uIHRv IENGTEFHUywgYnV0IEknbSBvcGVuIHRvIGNvbnNpZGVyaW5nIG90aGVyIGFsdGVybmF0aXZlcy4N Cg0KICAgJCBnY2MgLS12ZXJzaW9uDQogICBnY2MgKEdDQykgOC4yLjEgMjAxODExMDUgKFJlZCBI YXQgOC4yLjEtNSkNCg0KICAgY2Nhbi9jaW5pcGFyc2VyL2NpbmlwYXJzZXIuYzogSW4gZnVuY3Rp b24g4oCYY2luaXBhcnNlcl9sb2Fk4oCZOg0KICAgY2Nhbi9jaW5pcGFyc2VyL2NpbmlwYXJzZXIu Yzo0NDI6Mzk6IHdhcm5pbmc6IOKAmCVz4oCZIGRpcmVjdGl2ZSBvdXRwdXQgbWF5IGJlIHRydW5j YXRlZCB3cml0aW5nIHVwIHRvIDEwMjQgYnl0ZXMgaW50byBhIHJlZ2lvbiBvZiBzaXplIGJldHdl ZW4gMCBhbmQgMTAyNCBbLVdmb3JtYXQtdHJ1bmNhdGlvbj1dDQogICAgICAgc25wcmludGYodG1w LCBBU0NJSUxJTkVTWiArIDEsICIlczolcyIsIHNlY3Rpb24sIGtleSk7DQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBefiAgICAgICAgICAgIH5+fg0KICAgSW4gZmls ZSBpbmNsdWRlZCBmcm9tIC91c3IvaW5jbHVkZS9zdGRpby5oOjg3MywNCiAgICAgICAgICAgICAg ICAgICAgZnJvbSAuL2NjYW4vY2luaXBhcnNlci9jaW5pcGFyc2VyLmg6MzksDQogICAgICAgICAg ICAgICAgICAgIGZyb20gY2Nhbi9jaW5pcGFyc2VyL2NpbmlwYXJzZXIuYzozNjoNCiAgIC91c3Iv aW5jbHVkZS9iaXRzL3N0ZGlvMi5oOjY3OjEwOiBub3RlOiDigJhfX2J1aWx0aW5fX19zbnByaW50 Zl9jaGvigJkgb3V0cHV0IGJldHdlZW4gMiBhbmQgMjA1MCBieXRlcyBpbnRvIGEgZGVzdGluYXRp b24gb2Ygc2l6ZSAxMDI1DQogICAgICByZXR1cm4gX19idWlsdGluX19fc25wcmludGZfY2hrIChf X3MsIF9fbiwgX19VU0VfRk9SVElGWV9MRVZFTCAtIDEsDQogICAgICAgICAgICAgXn5+fn5+fn5+ fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+DQogICAg ICAgICAgIF9fYm9zIChfX3MpLCBfX2ZtdCwgX192YV9hcmdfcGFjayAoKSk7DQogICAgICAgICAg IH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4NCg0KPiANCj4gZGlmZiAtLWdp dCBhL01ha2VmaWxlLmFtIGIvTWFrZWZpbGUuYW0NCj4gaW5kZXggZTBjNDYzYS4uMmU0YjAzMyAx MDA2NDQNCj4gLS0tIGEvTWFrZWZpbGUuYW0NCj4gKysrIGIvTWFrZWZpbGUuYW0NCj4gQEAgLTU2 LDcgKzU2LDExIEBAIGxpYmNjYW5fYV9TT1VSQ0VTID0gXA0KPiAgCWNjYW4vYXJyYXlfc2l6ZS9h cnJheV9zaXplLmggXA0KPiAgCWNjYW4vbWlubWF4L21pbm1heC5oIFwNCj4gIAljY2FuL3Nob3J0 X3R5cGVzL3Nob3J0X3R5cGVzLmggXA0KPiAtCWNjYW4vZW5kaWFuL2VuZGlhbi5oDQo+ICsJY2Nh bi9lbmRpYW4vZW5kaWFuLmggXA0KPiArCWNjYW4vY2luaXBhcnNlci9jaW5pcGFyc2VyLmggXA0K PiArCWNjYW4vY2luaXBhcnNlci9jaW5pcGFyc2VyLmMgXA0KPiArCWNjYW4vY2luaXBhcnNlci9k aWN0aW9uYXJ5LmggXA0KPiArCWNjYW4vY2luaXBhcnNlci9kaWN0aW9uYXJ5LmMNCj4gIA0KPiAg bm9pbnN0X0xJQlJBUklFUyArPSBsaWJ1dGlsLmENCj4gIGxpYnV0aWxfYV9TT1VSQ0VTID0gXA0K PiBkaWZmIC0tZ2l0IGEvY2Nhbi9jaW5pcGFyc2VyL0xJQ0VOU0UgYi9jY2FuL2NpbmlwYXJzZXIv TElDRU5TRQ0KPiBuZXcgZmlsZSBtb2RlIDEyMDAwMA0KPiBpbmRleCAwMDAwMDAwLi4yMzU0ZDEy DQo+IC0tLSAvZGV2L251bGwNCj4gKysrIGIvY2Nhbi9jaW5pcGFyc2VyL0xJQ0VOU0UNCj4gQEAg LTAsMCArMSBAQA0KPiArLi4vLi4vbGljZW5zZXMvQlNELU1JVA0KPiBcIE5vIG5ld2xpbmUgYXQg ZW5kIG9mIGZpbGUNCj4gZGlmZiAtLWdpdCBhL2NjYW4vY2luaXBhcnNlci9jaW5pcGFyc2VyLmMg Yi9jY2FuL2NpbmlwYXJzZXIvY2luaXBhcnNlci5jDQo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+ IGluZGV4IDAwMDAwMDAuLjUyN2Y4MzcNCj4gLS0tIC9kZXYvbnVsbA0KPiArKysgYi9jY2FuL2Np bmlwYXJzZXIvY2luaXBhcnNlci5jDQo+IEBAIC0wLDAgKzEsNDgwIEBADQo+ICsvKiBDb3B5cmln aHQgKGMpIDIwMDAtMjAwNyBieSBOaWNvbGFzIERldmlsbGFyZC4NCj4gKyAqIENvcHlyaWdodCAo eCkgMjAwOSBieSBUaW0gUG9zdCA8dGlua2VydGltQGdtYWlsLmNvbT4NCj4gKyAqIE1JVCBMaWNl bnNlDQo+ICsgKg0KPiArICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBj aGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGENCj4gKyAqIGNvcHkgb2YgdGhpcyBzb2Z0 d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiks DQo+ICsgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNs dWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uDQo+ICsgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwg bW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwNCj4gKyAqIGFu ZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0 byB3aG9tIHRoZQ0KPiArICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0 IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCj4gKyAqDQo+ICsgKiBUaGUgYWJvdmUgY29w eXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRl ZCBpbg0KPiArICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29m dHdhcmUuDQo+ICsgKg0KPiArICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJ VEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1INCj4gKyAqIElNUExJRUQsIElO Q0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM SVRZLA0KPiArICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJ TkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFDQo+ICsgKiBBVVRIT1JTIE9SIENPUFlSSUdI VCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSDQo+ICsg KiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9U SEVSV0lTRSwgQVJJU0lORw0KPiArICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lU SCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUg0KPiArICogREVBTElOR1MgSU4gVEhF IFNPRlRXQVJFLg0KPiArICovDQo+ICsNCj4gKy8qKiBAYWRkdG9ncm91cCBjaW5pcGFyc2VyDQo+ ICsgKiBAew0KPiArICovDQo+ICsvKioNCj4gKyAqICBAZmlsZSBjaW5pcGFyc2VyLmMNCj4gKyAq ICBAYXV0aG9yIE4uIERldmlsbGFyZA0KPiArICogIEBkYXRlIFNlcCAyMDA3DQo+ICsgKiAgQHZl cnNpb24gMy4wDQo+ICsgKiAgQGJyaWVmIFBhcnNlciBmb3IgaW5pIGZpbGVzLg0KPiArICovDQo+ ICsNCj4gKyNpbmNsdWRlIDxjdHlwZS5oPg0KPiArI2luY2x1ZGUgPGNjYW4vY2luaXBhcnNlci9j aW5pcGFyc2VyLmg+DQo+ICsNCj4gKyNkZWZpbmUgQVNDSUlMSU5FU1ogICAgICAoMTAyNCkNCj4g KyNkZWZpbmUgSU5JX0lOVkFMSURfS0VZICAoKGNoYXIqKSBOVUxMKQ0KPiArDQo+ICsvKioNCj4g KyAqIFRoaXMgZW51bSBzdG9yZXMgdGhlIHN0YXR1cyBmb3IgZWFjaCBwYXJzZWQgbGluZSAoaW50 ZXJuYWwgdXNlIG9ubHkpLg0KPiArICovDQo+ICt0eXBlZGVmIGVudW0gX2xpbmVfc3RhdHVzXyB7 DQo+ICsJTElORV9VTlBST0NFU1NFRCwNCj4gKwlMSU5FX0VSUk9SLA0KPiArCUxJTkVfRU1QVFks DQo+ICsJTElORV9DT01NRU5ULA0KPiArCUxJTkVfU0VDVElPTiwNCj4gKwlMSU5FX1ZBTFVFDQo+ ICt9IGxpbmVfc3RhdHVzOw0KPiArDQo+ICsNCj4gKy8qKg0KPiArICogQGJyaWVmIENvbnZlcnQg YSBzdHJpbmcgdG8gbG93ZXJjYXNlLg0KPiArICogQHBhcmFtIHMgU3RyaW5nIHRvIGNvbnZlcnQu DQo+ICsgKiBAcmV0dXJuIHB0ciB0byBzdGF0aWNhbGx5IGFsbG9jYXRlZCBzdHJpbmcuDQo+ICsg Kg0KPiArICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0YXRpY2FsbHkg YWxsb2NhdGVkIHN0cmluZw0KPiArICogY29udGFpbmluZyBhIGxvd2VyY2FzZWQgdmVyc2lvbiBv ZiB0aGUgaW5wdXQgc3RyaW5nLiBEbyBub3QgZnJlZQ0KPiArICogb3IgbW9kaWZ5IHRoZSByZXR1 cm5lZCBzdHJpbmchIFNpbmNlIHRoZSByZXR1cm5lZCBzdHJpbmcgaXMgc3RhdGljYWxseQ0KPiAr ICogYWxsb2NhdGVkLCBpdCB3aWxsIGJlIG1vZGlmaWVkIGF0IGVhY2ggZnVuY3Rpb24gY2FsbCAo bm90IHJlLWVudHJhbnQpLg0KPiArICovDQo+ICtzdGF0aWMgY2hhciAqc3RybHdjKGNvbnN0IGNo YXIgKnMpDQo+ICt7DQo+ICsJc3RhdGljIGNoYXIgbFtBU0NJSUxJTkVTWisxXTsNCj4gKwlpbnQg aTsNCj4gKw0KPiArCWlmIChzID09IE5VTEwpDQo+ICsJCXJldHVybiBOVUxMOw0KPiArDQo+ICsJ Zm9yIChpID0gMDsgc1tpXSAmJiBpIDwgQVNDSUlMSU5FU1o7IGkrKykNCj4gKwkJbFtpXSA9IHRv bG93ZXIoc1tpXSk7DQo+ICsJbFtpXSA9ICdcMCc7DQo+ICsJcmV0dXJuIGw7DQo+ICt9DQo+ICsN Cj4gKy8qKg0KPiArICogQGJyaWVmIFJlbW92ZSBibGFua3MgYXQgdGhlIGJlZ2lubmluZyBhbmQg dGhlIGVuZCBvZiBhIHN0cmluZy4NCj4gKyAqIEBwYXJhbSBzIFN0cmluZyB0byBwYXJzZS4NCj4g KyAqIEByZXR1cm4gcHRyIHRvIHN0YXRpY2FsbHkgYWxsb2NhdGVkIHN0cmluZy4NCj4gKyAqDQo+ ICsgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIGEgc3RhdGljYWxseSBhbGxv Y2F0ZWQgc3RyaW5nLA0KPiArICogd2hpY2ggaXMgaWRlbnRpY2FsIHRvIHRoZSBpbnB1dCBzdHJp bmcsIGV4Y2VwdCB0aGF0IGFsbCBibGFuaw0KPiArICogY2hhcmFjdGVycyBhdCB0aGUgZW5kIGFu ZCB0aGUgYmVnLiBvZiB0aGUgc3RyaW5nIGhhdmUgYmVlbiByZW1vdmVkLg0KPiArICogRG8gbm90 IGZyZWUgb3IgbW9kaWZ5IHRoZSByZXR1cm5lZCBzdHJpbmchIFNpbmNlIHRoZSByZXR1cm5lZCBz dHJpbmcNCj4gKyAqIGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkLCBpdCB3aWxsIGJlIG1vZGlmaWVk IGF0IGVhY2ggZnVuY3Rpb24gY2FsbA0KPiArICogKG5vdCByZS1lbnRyYW50KS4NCj4gKyAqLw0K PiArc3RhdGljIGNoYXIgKnN0cnN0cmlwKGNvbnN0IGNoYXIgKnMpDQo+ICt7DQo+ICsJc3RhdGlj IGNoYXIgbFtBU0NJSUxJTkVTWisxXTsNCj4gKwl1bnNpZ25lZCBpbnQgaSwgbnVtc3BjOw0KPiAr DQo+ICsJaWYgKHMgPT0gTlVMTCkNCj4gKwkJcmV0dXJuIE5VTEw7DQo+ICsNCj4gKwl3aGlsZSAo aXNzcGFjZSgqcykpDQo+ICsJCXMrKzsNCj4gKw0KPiArCWZvciAoaSA9IG51bXNwYyA9IDA7IHNb aV0gJiYgaSA8IEFTQ0lJTElORVNaOyBpKyspIHsNCj4gKwkJbFtpXSA9IHNbaV07DQo+ICsJCWlm IChpc3NwYWNlKGxbaV0pKQ0KPiArCQkJbnVtc3BjKys7DQo+ICsJCWVsc2UNCj4gKwkJCW51bXNw YyA9IDA7DQo+ICsJfQ0KPiArCWxbaSAtIG51bXNwY10gPSAnXDAnOw0KPiArCXJldHVybiBsOw0K PiArfQ0KPiArDQo+ICsvKioNCj4gKyAqIEBicmllZiBMb2FkIGEgc2luZ2xlIGxpbmUgZnJvbSBh biBJTkkgZmlsZQ0KPiArICogQHBhcmFtIGlucHV0X2xpbmUgSW5wdXQgbGluZSwgbWF5IGJlIGNv bmNhdGVuYXRlZCBtdWx0aS1saW5lIGlucHV0DQo+ICsgKiBAcGFyYW0gc2VjdGlvbiBPdXRwdXQg c3BhY2UgdG8gc3RvcmUgc2VjdGlvbg0KPiArICogQHBhcmFtIGtleSBPdXRwdXQgc3BhY2UgdG8g c3RvcmUga2V5DQo+ICsgKiBAcGFyYW0gdmFsdWUgT3V0cHV0IHNwYWNlIHRvIHN0b3JlIHZhbHVl DQo+ICsgKiBAcmV0dXJuIGxpbmVfc3RhdHVzIHZhbHVlDQo+ICsgKi8NCj4gK3N0YXRpYw0KPiAr bGluZV9zdGF0dXMgY2luaXBhcnNlcl9saW5lKGNoYXIgKmlucHV0X2xpbmUsIGNoYXIgKnNlY3Rp b24sDQo+ICsJY2hhciAqa2V5LCBjaGFyICp2YWx1ZSkNCj4gK3sNCj4gKwlsaW5lX3N0YXR1cyBz dGE7DQo+ICsJY2hhciBsaW5lW0FTQ0lJTElORVNaKzFdOw0KPiArCWludAkgbGVuOw0KPiArDQo+ ICsJc3RyY3B5KGxpbmUsIHN0cnN0cmlwKGlucHV0X2xpbmUpKTsNCj4gKwlsZW4gPSAoaW50KSBz dHJsZW4obGluZSk7DQo+ICsNCj4gKwlpZiAobGVuIDwgMSkgew0KPiArCQkvKiBFbXB0eSBsaW5l ICovDQo+ICsJCXN0YSA9IExJTkVfRU1QVFk7DQo+ICsJfSBlbHNlIGlmIChsaW5lWzBdID09ICcj Jykgew0KPiArCQkvKiBDb21tZW50IGxpbmUgKi8NCj4gKwkJc3RhID0gTElORV9DT01NRU5UOw0K PiArCX0gZWxzZSBpZiAobGluZVswXSA9PSAnWycgJiYgbGluZVtsZW4tMV0gPT0gJ10nKSB7DQo+ ICsJCS8qIFNlY3Rpb24gbmFtZSAqLw0KPiArCQlzc2NhbmYobGluZSwgIlslW15dXSIsIHNlY3Rp b24pOw0KPiArCQlzdHJjcHkoc2VjdGlvbiwgc3Ryc3RyaXAoc2VjdGlvbikpOw0KPiArCQlzdHJj cHkoc2VjdGlvbiwgc3RybHdjKHNlY3Rpb24pKTsNCj4gKwkJc3RhID0gTElORV9TRUNUSU9OOw0K PiArCX0gZWxzZSBpZiAoc3NjYW5mIChsaW5lLCAiJVtePV0gPSBcIiVbXlwiXVwiIiwga2V5LCB2 YWx1ZSkgPT0gMg0KPiArCQkgICB8fCAgc3NjYW5mIChsaW5lLCAiJVtePV0gPSAnJVteXCddJyIs IGtleSwgdmFsdWUpID09IDINCj4gKwkJICAgfHwgIHNzY2FuZiAobGluZSwgIiVbXj1dID0gJVte OyNdIiwga2V5LCB2YWx1ZSkgPT0gMikgew0KPiArCQkvKiBVc3VhbCBrZXk9dmFsdWUsIHdpdGgg b3Igd2l0aG91dCBjb21tZW50cyAqLw0KPiArCQlzdHJjcHkoa2V5LCBzdHJzdHJpcChrZXkpKTsN Cj4gKwkJc3RyY3B5KGtleSwgc3RybHdjKGtleSkpOw0KPiArCQlzdHJjcHkodmFsdWUsIHN0cnN0 cmlwKHZhbHVlKSk7DQo+ICsJCS8qDQo+ICsJCSAqIHNzY2FuZiBjYW5ub3QgaGFuZGxlICcnIG9y ICIiIGFzIGVtcHR5IHZhbHVlcw0KPiArCQkgKiB0aGlzIGlzIGRvbmUgaGVyZQ0KPiArCQkgKi8N Cj4gKwkJaWYgKCFzdHJjbXAodmFsdWUsICJcIlwiIikgfHwgKCFzdHJjbXAodmFsdWUsICInJyIp KSkgew0KPiArCQkJdmFsdWVbMF0gPSAwOw0KPiArCQl9DQo+ICsJCXN0YSA9IExJTkVfVkFMVUU7 DQo+ICsJfSBlbHNlIGlmIChzc2NhbmYobGluZSwgIiVbXj1dID0gJVs7I10iLCBrZXksIHZhbHVl KSA9PSAyDQo+ICsJCXx8ICBzc2NhbmYobGluZSwgIiVbXj1dICVbPV0iLCBrZXksIHZhbHVlKSA9 PSAyKSB7DQo+ICsJCS8qDQo+ICsJCSAqIFNwZWNpYWwgY2FzZXM6DQo+ICsJCSAqIGtleT0NCj4g KwkJICoga2V5PTsNCj4gKwkJICoga2V5PSMNCj4gKwkJICovDQo+ICsJCXN0cmNweShrZXksIHN0 cnN0cmlwKGtleSkpOw0KPiArCQlzdHJjcHkoa2V5LCBzdHJsd2Moa2V5KSk7DQo+ICsJCXZhbHVl WzBdID0gMDsNCj4gKwkJc3RhID0gTElORV9WQUxVRTsNCj4gKwl9IGVsc2Ugew0KPiArCQkvKiBH ZW5lcmF0ZSBzeW50YXggZXJyb3IgKi8NCj4gKwkJc3RhID0gTElORV9FUlJPUjsNCj4gKwl9DQo+ ICsJcmV0dXJuIHN0YTsNCj4gK30NCj4gKw0KPiArLyogVGhlIHJlbWFpbmluZyBwdWJsaWMgZnVu Y3Rpb25zIGFyZSBkb2N1bWVudGVkIGluIGNpbmlwYXJzZXIuaCAqLw0KPiArDQo+ICtpbnQgY2lu aXBhcnNlcl9nZXRuc2VjKGRpY3Rpb25hcnkgKmQpDQo+ICt7DQo+ICsJaW50IGk7DQo+ICsJaW50 IG5zZWM7DQo+ICsNCj4gKwlpZiAoZCA9PSBOVUxMKQ0KPiArCQlyZXR1cm4gLTE7DQo+ICsNCj4g Kwluc2VjID0gMDsNCj4gKwlmb3IgKGkgPSAwOyBpIDwgZC0+c2l6ZTsgaSsrKSB7DQo+ICsJCWlm IChkLT5rZXlbaV0gPT0gTlVMTCkNCj4gKwkJCWNvbnRpbnVlOw0KPiArCQlpZiAoc3RyY2hyKGQt PmtleVtpXSwgJzonKSA9PSBOVUxMKSB7DQo+ICsJCQluc2VjICsrOw0KPiArCQl9DQo+ICsJfQ0K PiArDQo+ICsJcmV0dXJuIG5zZWM7DQo+ICt9DQo+ICsNCj4gK2NoYXIgKmNpbmlwYXJzZXJfZ2V0 c2VjbmFtZShkaWN0aW9uYXJ5ICpkLCBpbnQgbikNCj4gK3sNCj4gKwlpbnQgaTsNCj4gKwlpbnQg Zm91bmRzZWM7DQo+ICsNCj4gKwlpZiAoZCA9PSBOVUxMIHx8IG4gPCAwKQ0KPiArCQlyZXR1cm4g TlVMTDsNCj4gKw0KPiArCWlmIChuID09IDApDQo+ICsJCW4gKys7DQo+ICsNCj4gKwlmb3VuZHNl YyA9IDA7DQo+ICsNCj4gKwlmb3IgKGkgPSAwOyBpIDwgZC0+c2l6ZTsgaSsrKSB7DQo+ICsJCWlm IChkLT5rZXlbaV0gPT0gTlVMTCkNCj4gKwkJCWNvbnRpbnVlOw0KPiArCQlpZiAoISBzdHJjaHIo ZC0+a2V5W2ldLCAnOicpKSB7DQo+ICsJCQlmb3VuZHNlYysrOw0KPiArCQkJaWYgKGZvdW5kc2Vj ID49IG4pDQo+ICsJCQkJYnJlYWs7DQo+ICsJCX0NCj4gKwl9DQo+ICsNCj4gKwlpZiAoZm91bmRz ZWMgPT0gbikgew0KPiArCQlyZXR1cm4gZC0+a2V5W2ldOw0KPiArCX0NCj4gKw0KPiArCXJldHVy biAoY2hhciAqKSBOVUxMOw0KPiArfQ0KPiArDQo+ICt2b2lkIGNpbmlwYXJzZXJfZHVtcChkaWN0 aW9uYXJ5ICpkLCBGSUxFICpmKQ0KPiArew0KPiArCWludCBpOw0KPiArDQo+ICsJaWYgKGQgPT0g TlVMTCB8fCBmID09IE5VTEwpDQo+ICsJCXJldHVybjsNCj4gKw0KPiArCWZvciAoaSA9IDA7IGkg PCBkLT5zaXplOyBpKyspIHsNCj4gKwkJaWYgKGQtPmtleVtpXSA9PSBOVUxMKQ0KPiArCQkJY29u dGludWU7DQo+ICsJCWlmIChkLT52YWxbaV0gIT0gTlVMTCkgew0KPiArCQkJZnByaW50ZihmLCAi WyVzXT1bJXNdXG4iLCBkLT5rZXlbaV0sIGQtPnZhbFtpXSk7DQo+ICsJCX0gZWxzZSB7DQo+ICsJ CQlmcHJpbnRmKGYsICJbJXNdPVVOREVGXG4iLCBkLT5rZXlbaV0pOw0KPiArCQl9DQo+ICsJfQ0K PiArDQo+ICsJcmV0dXJuOw0KPiArfQ0KPiArDQo+ICt2b2lkIGNpbmlwYXJzZXJfZHVtcF9pbmko ZGljdGlvbmFyeSAqZCwgRklMRSAqZikNCj4gK3sNCj4gKwlpbnQgaSwgajsNCj4gKwljaGFyIGtl eW1bQVNDSUlMSU5FU1orMV07DQo+ICsJaW50IG5zZWM7DQo+ICsJY2hhciAqc2VjbmFtZTsNCj4g KwlpbnQgc2VjbGVuOw0KPiArDQo+ICsJaWYgKGQgPT0gTlVMTCB8fCBmID09IE5VTEwpDQo+ICsJ CXJldHVybjsNCj4gKw0KPiArCW1lbXNldChrZXltLCAwLCBBU0NJSUxJTkVTWiArIDEpOw0KPiAr DQo+ICsJbnNlYyA9IGNpbmlwYXJzZXJfZ2V0bnNlYyhkKTsNCj4gKwlpZiAobnNlYyA8IDEpIHsN Cj4gKwkJLyogTm8gc2VjdGlvbiBpbiBmaWxlOiBkdW1wIGFsbCBrZXlzIGFzIHRoZXkgYXJlICov DQo+ICsJCWZvciAoaSA9IDA7IGkgPCBkLT5zaXplOyBpKyspIHsNCj4gKwkJCWlmIChkLT5rZXlb aV0gPT0gTlVMTCkNCj4gKwkJCQljb250aW51ZTsNCj4gKwkJCWZwcmludGYoZiwgIiVzID0gJXNc biIsIGQtPmtleVtpXSwgZC0+dmFsW2ldKTsNCj4gKwkJfQ0KPiArCQlyZXR1cm47DQo+ICsJfQ0K PiArDQo+ICsJZm9yIChpID0gMDsgaSA8IG5zZWM7IGkrKykgew0KPiArCQlzZWNuYW1lID0gY2lu aXBhcnNlcl9nZXRzZWNuYW1lKGQsIGkpOw0KPiArCQlzZWNsZW4gID0gKGludClzdHJsZW4oc2Vj bmFtZSk7DQo+ICsJCWZwcmludGYoZiwgIlxuWyVzXVxuIiwgc2VjbmFtZSk7DQo+ICsJCXNucHJp bnRmKGtleW0sIEFTQ0lJTElORVNaICsgMSwgIiVzOiIsIHNlY25hbWUpOw0KPiArCQlmb3IgKGog PSAwOyBqIDwgZC0+c2l6ZTsgaisrKSB7DQo+ICsJCQlpZiAoZC0+a2V5W2pdID09IE5VTEwpDQo+ ICsJCQkJY29udGludWU7DQo+ICsJCQlpZiAoIXN0cm5jbXAoZC0+a2V5W2pdLCBrZXltLCBzZWNs ZW4rMSkpIHsNCj4gKwkJCQlmcHJpbnRmKGYsICIlLTMwcyA9ICVzXG4iLA0KPiArCQkJCQlkLT5r ZXlbal0rc2VjbGVuKzEsDQo+ICsJCQkJCWQtPnZhbFtqXSA/IGQtPnZhbFtqXSA6ICIiKTsNCj4g KwkJCX0NCj4gKwkJfQ0KPiArCX0NCj4gKwlmcHJpbnRmKGYsICJcbiIpOw0KPiArDQo+ICsJcmV0 dXJuOw0KPiArfQ0KPiArDQo+ICtjaGFyICpjaW5pcGFyc2VyX2dldHN0cmluZyhkaWN0aW9uYXJ5 ICpkLCBjb25zdCBjaGFyICprZXksIGNoYXIgKmRlZikNCj4gK3sNCj4gKwljaGFyICpsY19rZXk7 DQo+ICsJY2hhciAqc3ZhbDsNCj4gKw0KPiArCWlmIChkID09IE5VTEwgfHwga2V5ID09IE5VTEwp DQo+ICsJCXJldHVybiBkZWY7DQo+ICsNCj4gKwlsY19rZXkgPSBzdHJsd2Moa2V5KTsNCj4gKwlz dmFsID0gZGljdGlvbmFyeV9nZXQoZCwgbGNfa2V5LCBkZWYpOw0KPiArDQo+ICsJcmV0dXJuIHN2 YWw7DQo+ICt9DQo+ICsNCj4gK2ludCBjaW5pcGFyc2VyX2dldGludChkaWN0aW9uYXJ5ICpkLCBj b25zdCBjaGFyICprZXksIGludCBub3Rmb3VuZCkNCj4gK3sNCj4gKwljaGFyICpzdHI7DQo+ICsN Cj4gKwlzdHIgPSBjaW5pcGFyc2VyX2dldHN0cmluZyhkLCBrZXksIElOSV9JTlZBTElEX0tFWSk7 DQo+ICsNCj4gKwlpZiAoc3RyID09IElOSV9JTlZBTElEX0tFWSkNCj4gKwkJcmV0dXJuIG5vdGZv dW5kOw0KPiArDQo+ICsJcmV0dXJuIChpbnQpIHN0cnRvbChzdHIsIE5VTEwsIDEwKTsNCj4gK30N Cj4gKw0KPiArZG91YmxlIGNpbmlwYXJzZXJfZ2V0ZG91YmxlKGRpY3Rpb25hcnkgKmQsIGNvbnN0 IGNoYXIgKmtleSwgZG91YmxlIG5vdGZvdW5kKQ0KPiArew0KPiArCWNoYXIgKnN0cjsNCj4gKw0K PiArCXN0ciA9IGNpbmlwYXJzZXJfZ2V0c3RyaW5nKGQsIGtleSwgSU5JX0lOVkFMSURfS0VZKTsN Cj4gKw0KPiArCWlmIChzdHIgPT0gSU5JX0lOVkFMSURfS0VZKQ0KPiArCQlyZXR1cm4gbm90Zm91 bmQ7DQo+ICsNCj4gKwlyZXR1cm4gYXRvZihzdHIpOw0KPiArfQ0KPiArDQo+ICtpbnQgY2luaXBh cnNlcl9nZXRib29sZWFuKGRpY3Rpb25hcnkgKmQsIGNvbnN0IGNoYXIgKmtleSwgaW50IG5vdGZv dW5kKQ0KPiArew0KPiArCWNoYXIgKmM7DQo+ICsJaW50IHJldDsNCj4gKw0KPiArCWMgPSBjaW5p cGFyc2VyX2dldHN0cmluZyhkLCBrZXksIElOSV9JTlZBTElEX0tFWSk7DQo+ICsJaWYgKGMgPT0g SU5JX0lOVkFMSURfS0VZKQ0KPiArCQlyZXR1cm4gbm90Zm91bmQ7DQo+ICsNCj4gKwlzd2l0Y2go Y1swXSkgew0KPiArCWNhc2UgJ3knOiBjYXNlICdZJzogY2FzZSAnMSc6IGNhc2UgJ3QnOiBjYXNl ICdUJzoNCj4gKwkJcmV0ID0gMTsNCj4gKwkJYnJlYWs7DQo+ICsJY2FzZSAnbic6IGNhc2UgJ04n OiBjYXNlICcwJzogY2FzZSAnZic6IGNhc2UgJ0YnOg0KPiArCQlyZXQgPSAwOw0KPiArCQlicmVh azsNCj4gKwlkZWZhdWx0Og0KPiArCQlyZXQgPSBub3Rmb3VuZDsNCj4gKwkJYnJlYWs7DQo+ICsJ fQ0KPiArDQo+ICsJcmV0dXJuIHJldDsNCj4gK30NCj4gKw0KPiAraW50IGNpbmlwYXJzZXJfZmlu ZF9lbnRyeShkaWN0aW9uYXJ5ICppbmksIGNoYXIgKmVudHJ5KQ0KPiArew0KPiArCWludCBmb3Vu ZCA9IDA7DQo+ICsNCj4gKwlpZiAoY2luaXBhcnNlcl9nZXRzdHJpbmcoaW5pLCBlbnRyeSwgSU5J X0lOVkFMSURfS0VZKSAhPSBJTklfSU5WQUxJRF9LRVkpIHsNCj4gKwkJZm91bmQgPSAxOw0KPiAr CX0NCj4gKw0KPiArCXJldHVybiBmb3VuZDsNCj4gK30NCj4gKw0KPiAraW50IGNpbmlwYXJzZXJf c2V0KGRpY3Rpb25hcnkgKmQsIGNoYXIgKmVudHJ5LCBjaGFyICp2YWwpDQo+ICt7DQo+ICsJcmV0 dXJuIGRpY3Rpb25hcnlfc2V0KGQsIHN0cmx3YyhlbnRyeSksIHZhbCk7DQo+ICt9DQo+ICsNCj4g K3ZvaWQgY2luaXBhcnNlcl91bnNldChkaWN0aW9uYXJ5ICppbmksIGNoYXIgKmVudHJ5KQ0KPiAr ew0KPiArCWRpY3Rpb25hcnlfdW5zZXQoaW5pLCBzdHJsd2MoZW50cnkpKTsNCj4gK30NCj4gKw0K PiArZGljdGlvbmFyeSAqY2luaXBhcnNlcl9sb2FkKGNvbnN0IGNoYXIgKmluaW5hbWUpDQo+ICt7 DQo+ICsJRklMRSAqaW47DQo+ICsJY2hhciBsaW5lW0FTQ0lJTElORVNaKzFdOw0KPiArCWNoYXIg c2VjdGlvbltBU0NJSUxJTkVTWisxXTsNCj4gKwljaGFyIGtleVtBU0NJSUxJTkVTWisxXTsNCj4g KwljaGFyIHRtcFtBU0NJSUxJTkVTWisxXTsNCj4gKwljaGFyIHZhbFtBU0NJSUxJTkVTWisxXTsN Cj4gKwlpbnQgIGxhc3QgPSAwLCBsZW4sIGxpbmVubyA9IDAsIGVycnMgPSAwOw0KPiArCWRpY3Rp b25hcnkgKmRpY3Q7DQo+ICsNCj4gKwlpZiAoKGluID0gZm9wZW4oaW5pbmFtZSwgInIiKSkgPT0g TlVMTCkgew0KPiArCQlmcHJpbnRmKHN0ZGVyciwgImNpbmlwYXJzZXI6IGNhbm5vdCBvcGVuICVz XG4iLCBpbmluYW1lKTsNCj4gKwkJcmV0dXJuIE5VTEw7DQo+ICsJfQ0KPiArDQo+ICsJZGljdCA9 IGRpY3Rpb25hcnlfbmV3KDApOw0KPiArCWlmICghZGljdCkgew0KPiArCQlmY2xvc2UoaW4pOw0K PiArCQlyZXR1cm4gTlVMTDsNCj4gKwl9DQo+ICsNCj4gKwltZW1zZXQobGluZSwgMCwgQVNDSUlM SU5FU1ogKyAxKTsNCj4gKwltZW1zZXQoc2VjdGlvbiwgMCwgQVNDSUlMSU5FU1ogKyAxKTsNCj4g KwltZW1zZXQoa2V5LCAwLCBBU0NJSUxJTkVTWiArIDEpOw0KPiArCW1lbXNldCh2YWwsIDAsIEFT Q0lJTElORVNaICsgMSk7DQo+ICsJbGFzdCA9IDA7DQo+ICsNCj4gKwl3aGlsZSAoZmdldHMobGlu ZStsYXN0LCBBU0NJSUxJTkVTWi1sYXN0LCBpbikhPU5VTEwpIHsNCj4gKwkJbGluZW5vKys7DQo+ ICsJCWxlbiA9IChpbnQpIHN0cmxlbihsaW5lKS0xOw0KPiArCQkvKiBTYWZldHkgY2hlY2sgYWdh aW5zdCBidWZmZXIgb3ZlcmZsb3dzICovDQo+ICsJCWlmIChsaW5lW2xlbl0gIT0gJ1xuJykgew0K PiArCQkJZnByaW50ZihzdGRlcnIsDQo+ICsJCQkJCSJjaW5pcGFyc2VyOiBpbnB1dCBsaW5lIHRv byBsb25nIGluICVzICglZClcbiIsDQo+ICsJCQkJCWluaW5hbWUsDQo+ICsJCQkJCWxpbmVubyk7 DQo+ICsJCQlkaWN0aW9uYXJ5X2RlbChkaWN0KTsNCj4gKwkJCWZjbG9zZShpbik7DQo+ICsJCQly ZXR1cm4gTlVMTDsNCj4gKwkJfQ0KPiArDQo+ICsJCS8qIEdldCByaWQgb2YgXG4gYW5kIHNwYWNl cyBhdCBlbmQgb2YgbGluZSAqLw0KPiArCQl3aGlsZSAoKGxlbiA+PSAwKSAmJg0KPiArCQkJCSgo bGluZVtsZW5dID09ICdcbicpIHx8IChpc3NwYWNlKGxpbmVbbGVuXSkpKSkgew0KPiArCQkJbGlu ZVtsZW5dID0gMDsNCj4gKwkJCWxlbi0tOw0KPiArCQl9DQo+ICsNCj4gKwkJLyogRGV0ZWN0IG11 bHRpLWxpbmUgKi8NCj4gKwkJaWYgKGxlbiA+PSAwICYmIGxpbmVbbGVuXSA9PSAnXFwnKSB7DQo+ ICsJCQkvKiBNdWx0aS1saW5lIHZhbHVlICovDQo+ICsJCQlsYXN0ID0gbGVuOw0KPiArCQkJY29u dGludWU7DQo+ICsJCX0NCj4gKw0KPiArCQlzd2l0Y2ggKGNpbmlwYXJzZXJfbGluZShsaW5lLCBz ZWN0aW9uLCBrZXksIHZhbCkpIHsNCj4gKwkJY2FzZSBMSU5FX0VNUFRZOg0KPiArCQljYXNlIExJ TkVfQ09NTUVOVDoNCj4gKwkJCWJyZWFrOw0KPiArDQo+ICsJCWNhc2UgTElORV9TRUNUSU9OOg0K PiArCQkJZXJycyA9IGRpY3Rpb25hcnlfc2V0KGRpY3QsIHNlY3Rpb24sIE5VTEwpOw0KPiArCQkJ YnJlYWs7DQo+ICsNCj4gKwkJY2FzZSBMSU5FX1ZBTFVFOg0KPiArCQkJc25wcmludGYodG1wLCBB U0NJSUxJTkVTWiArIDEsICIlczolcyIsIHNlY3Rpb24sIGtleSk7DQo+ICsJCQllcnJzID0gZGlj dGlvbmFyeV9zZXQoZGljdCwgdG1wLCB2YWwpOw0KPiArCQkJYnJlYWs7DQo+ICsNCj4gKwkJY2Fz ZSBMSU5FX0VSUk9SOg0KPiArCQkJZnByaW50ZihzdGRlcnIsICJjaW5pcGFyc2VyOiBzeW50YXgg ZXJyb3IgaW4gJXMgKCVkKTpcbiIsDQo+ICsJCQkJCWluaW5hbWUsIGxpbmVubyk7DQo+ICsJCQlm cHJpbnRmKHN0ZGVyciwgIi0+ICVzXG4iLCBsaW5lKTsNCj4gKwkJCWVycnMrKzsNCj4gKwkJCWJy ZWFrOw0KPiArDQo+ICsJCWRlZmF1bHQ6DQo+ICsJCQlicmVhazsNCj4gKwkJfQ0KPiArCQltZW1z ZXQobGluZSwgMCwgQVNDSUlMSU5FU1opOw0KPiArCQlsYXN0ID0gMDsNCj4gKwkJaWYgKGVycnMg PCAwKSB7DQo+ICsJCQlmcHJpbnRmKHN0ZGVyciwgImNpbmlwYXJzZXI6IG1lbW9yeSBhbGxvY2F0 aW9uIGZhaWx1cmVcbiIpOw0KPiArCQkJYnJlYWs7DQo+ICsJCX0NCj4gKwl9DQo+ICsNCj4gKwlp ZiAoZXJycykgew0KPiArCQlkaWN0aW9uYXJ5X2RlbChkaWN0KTsNCj4gKwkJZGljdCA9IE5VTEw7 DQo+ICsJfQ0KPiArDQo+ICsJZmNsb3NlKGluKTsNCj4gKw0KPiArCXJldHVybiBkaWN0Ow0KPiAr fQ0KPiArDQo+ICt2b2lkIGNpbmlwYXJzZXJfZnJlZWRpY3QoZGljdGlvbmFyeSAqZCkNCj4gK3sN Cj4gKwlkaWN0aW9uYXJ5X2RlbChkKTsNCj4gK30NCj4gKw0KPiArLyoqIEB9DQo+ICsgKi8NCj4g ZGlmZiAtLWdpdCBhL2NjYW4vY2luaXBhcnNlci9jaW5pcGFyc2VyLmggYi9jY2FuL2NpbmlwYXJz ZXIvY2luaXBhcnNlci5oDQo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+IGluZGV4IDAwMDAwMDAu LmI2MWMxZDYNCj4gLS0tIC9kZXYvbnVsbA0KPiArKysgYi9jY2FuL2NpbmlwYXJzZXIvY2luaXBh cnNlci5oDQo+IEBAIC0wLDAgKzEsMjYyIEBADQo+ICsjaWZuZGVmIF9JTklQQVJTRVJfSF8NCj4g KyNkZWZpbmUgX0lOSVBBUlNFUl9IXw0KPiArDQo+ICsvKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAw NyBieSBOaWNvbGFzIERldmlsbGFyZC4NCj4gKyAqIENvcHlyaWdodCAoeCkgMjAwOSBieSBUaW0g UG9zdCA8dGlua2VydGltQGdtYWlsLmNvbT4NCj4gKyAqIE1JVCBMaWNlbnNlDQo+ICsgKg0KPiAr ICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBw ZXJzb24gb2J0YWluaW5nIGENCj4gKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2Np YXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksDQo+ICsgKiB0byBkZWFs IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBs aW1pdGF0aW9uDQo+ICsgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwg cHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwNCj4gKyAqIGFuZC9vciBzZWxsIGNvcGll cyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQ0KPiAr ICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dp bmcgY29uZGl0aW9uczoNCj4gKyAqDQo+ICsgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBh bmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbg0KPiArICogYWxs IGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQo+ICsgKg0K PiArICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkg T0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1INCj4gKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9U IExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLA0KPiArICogRklU TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8g RVZFTlQgU0hBTEwgVEhFDQo+ICsgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJ QUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSDQo+ICsgKiBMSUFCSUxJVFksIFdI RVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lO Rw0KPiArICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUg T1IgVEhFIFVTRSBPUiBPVEhFUg0KPiArICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLg0KPiAr ICovDQo+ICsNCj4gKy8qKiBAYWRkdG9ncm91cCBjaW5pcGFyc2VyDQo+ICsgKiBAew0KPiArICov DQo+ICsNCj4gKy8qKg0KPiArICogQGZpbGUgICAgY2luaXBhcnNlci5oDQo+ICsgKiBAYXV0aG9y ICBOLiBEZXZpbGxhcmQNCj4gKyAqIEBkYXRlICAgIFNlcCAyMDA3DQo+ICsgKiBAdmVyc2lvbiAz LjANCj4gKyAqIEBicmllZiAgIFBhcnNlciBmb3IgaW5pIGZpbGVzLg0KPiArICovDQo+ICsNCj4g KyNpbmNsdWRlIDxzdGRpby5oPg0KPiArI2luY2x1ZGUgPHN0ZGxpYi5oPg0KPiArI2luY2x1ZGUg PHN0cmluZy5oPg0KPiArI2luY2x1ZGUgPHVuaXN0ZC5oPg0KPiArDQo+ICsjaW5jbHVkZSAiZGlj dGlvbmFyeS5oIg0KPiArDQo+ICsjZGVmaW5lIGNpbmlwYXJzZXJfZ2V0c3RyKGQsIGspICBjaW5p cGFyc2VyX2dldHN0cmluZyhkLCBrLCBOVUxMKQ0KPiArI2RlZmluZSBjaW5pcGFyc2VyX3NldHN0 ciAgICAgICAgY2luaXBhcnNlcl9zZXRzdHJpbmcNCj4gKw0KPiArLyoqDQo+ICsgKiBAYnJpZWYg ICAgR2V0IG51bWJlciBvZiBzZWN0aW9ucyBpbiBhIGRpY3Rpb25hcnkNCj4gKyAqIEBwYXJhbSAg ICBkICAgRGljdGlvbmFyeSB0byBleGFtaW5lDQo+ICsgKiBAcmV0dXJuICAgaW50IE51bWJlciBv ZiBzZWN0aW9ucyBmb3VuZCBpbiBkaWN0aW9uYXJ5LCAtMSBvbiBlcnJvcg0KPiArICoNCj4gKyAq IFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIHNlY3Rpb25zIGZvdW5kIGluIGEg ZGljdGlvbmFyeS4NCj4gKyAqIFRoZSB0ZXN0IHRvIHJlY29nbml6ZSBzZWN0aW9ucyBpcyBkb25l IG9uIHRoZSBzdHJpbmcgc3RvcmVkIGluIHRoZQ0KPiArICogZGljdGlvbmFyeTogYSBzZWN0aW9u IG5hbWUgaXMgZ2l2ZW4gYXMgInNlY3Rpb24iIHdoZXJlYXMgYSBrZXkgaXMNCj4gKyAqIHN0b3Jl ZCBhcyAic2VjdGlvbjprZXkiLCB0aHVzIHRoZSB0ZXN0IGxvb2tzIGZvciBlbnRyaWVzIHRoYXQg ZG8gbm90DQo+ICsgKiBjb250YWluIGEgY29sb24uDQo+ICsgKg0KPiArICogVGhpcyBjbGVhcmx5 IGZhaWxzIGluIHRoZSBjYXNlIGEgc2VjdGlvbiBuYW1lIGNvbnRhaW5zIGEgY29sb24sIGJ1dA0K PiArICogdGhpcyBzaG91bGQgc2ltcGx5IGJlIGF2b2lkZWQuDQo+ICsgKi8NCj4gK2ludCBjaW5p cGFyc2VyX2dldG5zZWMoZGljdGlvbmFyeSAqZCk7DQo+ICsNCj4gKy8qKg0KPiArICogQGJyaWVm ICAgIEdldCBuYW1lIGZvciBzZWN0aW9uIG4gaW4gYSBkaWN0aW9uYXJ5Lg0KPiArICogQHBhcmFt ICAgIGQgICBEaWN0aW9uYXJ5IHRvIGV4YW1pbmUNCj4gKyAqIEBwYXJhbSAgICBuICAgU2VjdGlv biBudW1iZXIgKGZyb20gMCB0byBuc2VjLTEpLg0KPiArICogQHJldHVybiAgIFBvaW50ZXIgdG8g Y2hhciBzdHJpbmcsIE5VTEwgb24gZXJyb3INCj4gKyAqDQo+ICsgKiBUaGlzIGZ1bmN0aW9uIGxv Y2F0ZXMgdGhlIG4tdGggc2VjdGlvbiBpbiBhIGRpY3Rpb25hcnkgYW5kIHJldHVybnMNCj4gKyAq IGl0cyBuYW1lIGFzIGEgcG9pbnRlciB0byBhIHN0cmluZyBzdGF0aWNhbGx5IGFsbG9jYXRlZCBp bnNpZGUgdGhlDQo+ICsgKiBkaWN0aW9uYXJ5LiBEbyBub3QgZnJlZSBvciBtb2RpZnkgdGhlIHJl dHVybmVkIHN0cmluZyENCj4gKyAqLw0KPiArY2hhciAqY2luaXBhcnNlcl9nZXRzZWNuYW1lKGRp Y3Rpb25hcnkgKmQsIGludCBuKTsNCj4gKw0KPiArLyoqDQo+ICsgKiBAYnJpZWYgICAgU2F2ZSBh IGRpY3Rpb25hcnkgdG8gYSBsb2FkYWJsZSBpbmkgZmlsZQ0KPiArICogQHBhcmFtICAgIGQgICBE aWN0aW9uYXJ5IHRvIGR1bXANCj4gKyAqIEBwYXJhbSAgICBmICAgT3BlbmVkIGZpbGUgcG9pbnRl ciB0byBkdW1wIHRvDQo+ICsgKiBAcmV0dXJuICAgdm9pZA0KPiArICoNCj4gKyAqIFRoaXMgZnVu Y3Rpb24gZHVtcHMgYSBnaXZlbiBkaWN0aW9uYXJ5IGludG8gYSBsb2FkYWJsZSBpbmkgZmlsZS4N Cj4gKyAqIEl0IGlzIE9rIHRvIHNwZWNpZnkgQGMgc3RkZXJyIG9yIEBjIHN0ZG91dCBhcyBvdXRw dXQgZmlsZXMuDQo+ICsgKi8NCj4gK3ZvaWQgY2luaXBhcnNlcl9kdW1wX2luaShkaWN0aW9uYXJ5 ICpkLCBGSUxFICpmKTsNCj4gKw0KPiArLyoqDQo+ICsgKiBAYnJpZWYgICAgRHVtcCBhIGRpY3Rp b25hcnkgdG8gYW4gb3BlbmVkIGZpbGUgcG9pbnRlci4NCj4gKyAqIEBwYXJhbSAgICBkICAgRGlj dGlvbmFyeSB0byBkdW1wLg0KPiArICogQHBhcmFtICAgIGYgICBPcGVuZWQgZmlsZSBwb2ludGVy IHRvIGR1bXAgdG8uDQo+ICsgKiBAcmV0dXJuICAgdm9pZA0KPiArICoNCj4gKyAqIFRoaXMgZnVu Y3Rpb24gcHJpbnRzIG91dCB0aGUgY29udGVudHMgb2YgYSBkaWN0aW9uYXJ5LCBvbmUgZWxlbWVu dCBieQ0KPiArICogbGluZSwgb250byB0aGUgcHJvdmlkZWQgZmlsZSBwb2ludGVyLiBJdCBpcyBP SyB0byBzcGVjaWZ5IEBjIHN0ZGVycg0KPiArICogb3IgQGMgc3Rkb3V0IGFzIG91dHB1dCBmaWxl cy4gVGhpcyBmdW5jdGlvbiBpcyBtZWFudCBmb3IgZGVidWdnaW5nDQo+ICsgKiBwdXJwb3NlcyBt b3N0bHkuDQo+ICsgKi8NCj4gK3ZvaWQgY2luaXBhcnNlcl9kdW1wKGRpY3Rpb25hcnkgKmQsIEZJ TEUgKmYpOw0KPiArDQo+ICsvKioNCj4gKyAqIEBicmllZiAgICBHZXQgdGhlIHN0cmluZyBhc3Nv Y2lhdGVkIHRvIGEga2V5DQo+ICsgKiBAcGFyYW0gICAgZCAgICAgICBEaWN0aW9uYXJ5IHRvIHNl YXJjaA0KPiArICogQHBhcmFtICAgIGtleSAgICAgS2V5IHN0cmluZyB0byBsb29rIGZvcg0KPiAr ICogQHBhcmFtICAgIGRlZiAgICAgRGVmYXVsdCB2YWx1ZSB0byByZXR1cm4gaWYga2V5IG5vdCBm b3VuZC4NCj4gKyAqIEByZXR1cm4gICBwb2ludGVyIHRvIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGNo YXJhY3RlciBzdHJpbmcNCj4gKyAqDQo+ICsgKiBUaGlzIGZ1bmN0aW9uIHF1ZXJpZXMgYSBkaWN0 aW9uYXJ5IGZvciBhIGtleS4gQSBrZXkgYXMgcmVhZCBmcm9tIGFuDQo+ICsgKiBpbmkgZmlsZSBp cyBnaXZlbiBhcyAic2VjdGlvbjprZXkiLiBJZiB0aGUga2V5IGNhbm5vdCBiZSBmb3VuZCwNCj4g KyAqIHRoZSBwb2ludGVyIHBhc3NlZCBhcyAnZGVmJyBpcyByZXR1cm5lZC4NCj4gKyAqIFRoZSBy ZXR1cm5lZCBjaGFyIHBvaW50ZXIgaXMgcG9pbnRpbmcgdG8gYSBzdHJpbmcgYWxsb2NhdGVkIGlu DQo+ICsgKiB0aGUgZGljdGlvbmFyeSwgZG8gbm90IGZyZWUgb3IgbW9kaWZ5IGl0Lg0KPiArICov DQo+ICtjaGFyICpjaW5pcGFyc2VyX2dldHN0cmluZyhkaWN0aW9uYXJ5ICpkLCBjb25zdCBjaGFy ICprZXksIGNoYXIgKmRlZik7DQo+ICsNCj4gKy8qKg0KPiArICogQGJyaWVmICAgIEdldCB0aGUg c3RyaW5nIGFzc29jaWF0ZWQgdG8gYSBrZXksIGNvbnZlcnQgdG8gYW4gaW50DQo+ICsgKiBAcGFy YW0gICAgZCBEaWN0aW9uYXJ5IHRvIHNlYXJjaA0KPiArICogQHBhcmFtICAgIGtleSBLZXkgc3Ry aW5nIHRvIGxvb2sgZm9yDQo+ICsgKiBAcGFyYW0gICAgbm90Zm91bmQgVmFsdWUgdG8gcmV0dXJu IGluIGNhc2Ugb2YgZXJyb3INCj4gKyAqIEByZXR1cm4gICBpbnRlZ2VyDQo+ICsgKg0KPiArICog VGhpcyBmdW5jdGlvbiBxdWVyaWVzIGEgZGljdGlvbmFyeSBmb3IgYSBrZXkuIEEga2V5IGFzIHJl YWQgZnJvbSBhbg0KPiArICogaW5pIGZpbGUgaXMgZ2l2ZW4gYXMgInNlY3Rpb246a2V5Ii4gSWYg dGhlIGtleSBjYW5ub3QgYmUgZm91bmQsDQo+ICsgKiB0aGUgbm90Zm91bmQgdmFsdWUgaXMgcmV0 dXJuZWQuDQo+ICsgKg0KPiArICogU3VwcG9ydGVkIHZhbHVlcyBmb3IgaW50ZWdlcnMgaW5jbHVk ZSB0aGUgdXN1YWwgQyBub3RhdGlvbg0KPiArICogc28gZGVjaW1hbCwgb2N0YWwgKHN0YXJ0aW5n IHdpdGggMCkgYW5kIGhleGFkZWNpbWFsIChzdGFydGluZyB3aXRoIDB4KQ0KPiArICogYXJlIHN1 cHBvcnRlZC4gRXhhbXBsZXM6DQo+ICsgKg0KPiArICogLSAiNDIiICAgICAgLT4gIDQyDQo+ICsg KiAtICIwNDIiICAgICAtPiAgMzQgKG9jdGFsIC0+IGRlY2ltYWwpDQo+ICsgKiAtICIweDQyIiAg ICAtPiAgNjYgKGhleGEgIC0+IGRlY2ltYWwpDQo+ICsgKg0KPiArICogV2FybmluZzogdGhlIGNv bnZlcnNpb24gbWF5IG92ZXJmbG93IGluIHZhcmlvdXMgd2F5cy4gQ29udmVyc2lvbiBpcw0KPiAr ICogdG90YWxseSBvdXRzb3VyY2VkIHRvIHN0cnRvbCgpLCBzZWUgdGhlIGFzc29jaWF0ZWQgbWFu IHBhZ2UgZm9yIG92ZXJmbG93DQo+ICsgKiBoYW5kbGluZy4NCj4gKyAqDQo+ICsgKiBDcmVkaXRz OiBUaGFua3MgdG8gQS4gQmVja2VyIGZvciBzdWdnZXN0aW5nIHN0cnRvbCgpDQo+ICsgKi8NCj4g K2ludCBjaW5pcGFyc2VyX2dldGludChkaWN0aW9uYXJ5ICpkLCBjb25zdCBjaGFyICprZXksIGlu dCBub3Rmb3VuZCk7DQo+ICsNCj4gKy8qKg0KPiArICogQGJyaWVmICAgIEdldCB0aGUgc3RyaW5n IGFzc29jaWF0ZWQgdG8gYSBrZXksIGNvbnZlcnQgdG8gYSBkb3VibGUNCj4gKyAqIEBwYXJhbSAg ICBkIERpY3Rpb25hcnkgdG8gc2VhcmNoDQo+ICsgKiBAcGFyYW0gICAga2V5IEtleSBzdHJpbmcg dG8gbG9vayBmb3INCj4gKyAqIEBwYXJhbSAgICBub3Rmb3VuZCBWYWx1ZSB0byByZXR1cm4gaW4g Y2FzZSBvZiBlcnJvcg0KPiArICogQHJldHVybiAgIGRvdWJsZQ0KPiArICoNCj4gKyAqIFRoaXMg ZnVuY3Rpb24gcXVlcmllcyBhIGRpY3Rpb25hcnkgZm9yIGEga2V5LiBBIGtleSBhcyByZWFkIGZy b20gYW4NCj4gKyAqIGluaSBmaWxlIGlzIGdpdmVuIGFzICJzZWN0aW9uOmtleSIuIElmIHRoZSBr ZXkgY2Fubm90IGJlIGZvdW5kLA0KPiArICogdGhlIG5vdGZvdW5kIHZhbHVlIGlzIHJldHVybmVk Lg0KPiArICovDQo+ICtkb3VibGUgY2luaXBhcnNlcl9nZXRkb3VibGUoZGljdGlvbmFyeSAqZCwg Y29uc3QgY2hhciAqa2V5LCBkb3VibGUgbm90Zm91bmQpOw0KPiArDQo+ICsvKioNCj4gKyAqIEBi cmllZiAgICBHZXQgdGhlIHN0cmluZyBhc3NvY2lhdGVkIHRvIGEga2V5LCBjb252ZXJ0IHRvIGEg Ym9vbGVhbg0KPiArICogQHBhcmFtICAgIGQgRGljdGlvbmFyeSB0byBzZWFyY2gNCj4gKyAqIEBw YXJhbSAgICBrZXkgS2V5IHN0cmluZyB0byBsb29rIGZvcg0KPiArICogQHBhcmFtICAgIG5vdGZv dW5kIFZhbHVlIHRvIHJldHVybiBpbiBjYXNlIG9mIGVycm9yDQo+ICsgKiBAcmV0dXJuICAgaW50 ZWdlcg0KPiArICoNCj4gKyAqIFRoaXMgZnVuY3Rpb24gcXVlcmllcyBhIGRpY3Rpb25hcnkgZm9y IGEga2V5LiBBIGtleSBhcyByZWFkIGZyb20gYW4NCj4gKyAqIGluaSBmaWxlIGlzIGdpdmVuIGFz ICJzZWN0aW9uOmtleSIuIElmIHRoZSBrZXkgY2Fubm90IGJlIGZvdW5kLA0KPiArICogdGhlIG5v dGZvdW5kIHZhbHVlIGlzIHJldHVybmVkLg0KPiArICoNCj4gKyAqIEEgdHJ1ZSBib29sZWFuIGlz IGZvdW5kIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIG1hdGNoZWQ6DQo+ICsgKg0KPiArICog LSBBIHN0cmluZyBzdGFydGluZyB3aXRoICd5Jw0KPiArICogLSBBIHN0cmluZyBzdGFydGluZyB3 aXRoICdZJw0KPiArICogLSBBIHN0cmluZyBzdGFydGluZyB3aXRoICd0Jw0KPiArICogLSBBIHN0 cmluZyBzdGFydGluZyB3aXRoICdUJw0KPiArICogLSBBIHN0cmluZyBzdGFydGluZyB3aXRoICcx Jw0KPiArICoNCj4gKyAqIEEgZmFsc2UgYm9vbGVhbiBpcyBmb3VuZCBpZiBvbmUgb2YgdGhlIGZv bGxvd2luZyBpcyBtYXRjaGVkOg0KPiArICoNCj4gKyAqIC0gQSBzdHJpbmcgc3RhcnRpbmcgd2l0 aCAnbicNCj4gKyAqIC0gQSBzdHJpbmcgc3RhcnRpbmcgd2l0aCAnTicNCj4gKyAqIC0gQSBzdHJp bmcgc3RhcnRpbmcgd2l0aCAnZicNCj4gKyAqIC0gQSBzdHJpbmcgc3RhcnRpbmcgd2l0aCAnRicN Cj4gKyAqIC0gQSBzdHJpbmcgc3RhcnRpbmcgd2l0aCAnMCcNCj4gKyAqDQo+ICsgKiBUaGUgbm90 Zm91bmQgdmFsdWUgcmV0dXJuZWQgaWYgbm8gYm9vbGVhbiBpcyBpZGVudGlmaWVkLCBkb2VzIG5v dA0KPiArICogbmVjZXNzYXJpbHkgaGF2ZSB0byBiZSAwIG9yIDEuDQo+ICsgKi8NCj4gK2ludCBj aW5pcGFyc2VyX2dldGJvb2xlYW4oZGljdGlvbmFyeSAqZCwgY29uc3QgY2hhciAqa2V5LCBpbnQg bm90Zm91bmQpOw0KPiArDQo+ICsvKioNCj4gKyAqIEBicmllZiAgICBTZXQgYW4gZW50cnkgaW4g YSBkaWN0aW9uYXJ5Lg0KPiArICogQHBhcmFtICAgIGluaSAgICAgRGljdGlvbmFyeSB0byBtb2Rp ZnkuDQo+ICsgKiBAcGFyYW0gICAgZW50cnkgICBFbnRyeSB0byBtb2RpZnkgKGVudHJ5IG5hbWUp DQo+ICsgKiBAcGFyYW0gICAgdmFsICAgICBOZXcgdmFsdWUgdG8gYXNzb2NpYXRlIHRvIHRoZSBl bnRyeS4NCj4gKyAqIEByZXR1cm4gICBpbnQgMCBpZiBPaywgLTEgb3RoZXJ3aXNlLg0KPiArICoN Cj4gKyAqIElmIHRoZSBnaXZlbiBlbnRyeSBjYW4gYmUgZm91bmQgaW4gdGhlIGRpY3Rpb25hcnks IGl0IGlzIG1vZGlmaWVkIHRvDQo+ICsgKiBjb250YWluIHRoZSBwcm92aWRlZCB2YWx1ZS4gSWYg aXQgY2Fubm90IGJlIGZvdW5kLCAtMSBpcyByZXR1cm5lZC4NCj4gKyAqIEl0IGlzIE9rIHRvIHNl dCB2YWwgdG8gTlVMTC4NCj4gKyAqLw0KPiAraW50IGNpbmlwYXJzZXJfc2V0c3RyaW5nKGRpY3Rp b25hcnkgKmluaSwgY2hhciAqZW50cnksIGNoYXIgKnZhbCk7DQo+ICsNCj4gKy8qKg0KPiArICog QGJyaWVmICAgIERlbGV0ZSBhbiBlbnRyeSBpbiBhIGRpY3Rpb25hcnkNCj4gKyAqIEBwYXJhbSAg ICBpbmkgICAgIERpY3Rpb25hcnkgdG8gbW9kaWZ5DQo+ICsgKiBAcGFyYW0gICAgZW50cnkgICBF bnRyeSB0byBkZWxldGUgKGVudHJ5IG5hbWUpDQo+ICsgKiBAcmV0dXJuICAgdm9pZA0KPiArICoN Cj4gKyAqIElmIHRoZSBnaXZlbiBlbnRyeSBjYW4gYmUgZm91bmQsIGl0IGlzIGRlbGV0ZWQgZnJv bSB0aGUgZGljdGlvbmFyeS4NCj4gKyAqLw0KPiArdm9pZCBjaW5pcGFyc2VyX3Vuc2V0KGRpY3Rp b25hcnkgKmluaSwgY2hhciAqZW50cnkpOw0KPiArDQo+ICsvKioNCj4gKyAqIEBicmllZiAgICBG aW5kcyBvdXQgaWYgYSBnaXZlbiBlbnRyeSBleGlzdHMgaW4gYSBkaWN0aW9uYXJ5DQo+ICsgKiBA cGFyYW0gICAgaW5pICAgICBEaWN0aW9uYXJ5IHRvIHNlYXJjaA0KPiArICogQHBhcmFtICAgIGVu dHJ5ICAgTmFtZSBvZiB0aGUgZW50cnkgdG8gbG9vayBmb3INCj4gKyAqIEByZXR1cm4gICBpbnRl Z2VyIDEgaWYgZW50cnkgZXhpc3RzLCAwIG90aGVyd2lzZQ0KPiArICoNCj4gKyAqIEZpbmRzIG91 dCBpZiBhIGdpdmVuIGVudHJ5IGV4aXN0cyBpbiB0aGUgZGljdGlvbmFyeS4gU2luY2Ugc2VjdGlv bnMNCj4gKyAqIGFyZSBzdG9yZWQgYXMga2V5cyB3aXRoIE5VTEwgYXNzb2NpYXRlZCB2YWx1ZXMs IHRoaXMgaXMgdGhlIG9ubHkgd2F5DQo+ICsgKiBvZiBxdWVyeWluZyBmb3IgdGhlIHByZXNlbmNl IG9mIHNlY3Rpb25zIGluIGEgZGljdGlvbmFyeS4NCj4gKyAqLw0KPiAraW50IGNpbmlwYXJzZXJf ZmluZF9lbnRyeShkaWN0aW9uYXJ5ICppbmksIGNoYXIgKmVudHJ5KSA7DQo+ICsNCj4gKy8qKg0K PiArICogQGJyaWVmICAgIFBhcnNlIGFuIGluaSBmaWxlIGFuZCByZXR1cm4gYW4gYWxsb2NhdGVk IGRpY3Rpb25hcnkgb2JqZWN0DQo+ICsgKiBAcGFyYW0gICAgaW5pbmFtZSBOYW1lIG9mIHRoZSBp bmkgZmlsZSB0byByZWFkLg0KPiArICogQHJldHVybiAgIFBvaW50ZXIgdG8gbmV3bHkgYWxsb2Nh dGVkIGRpY3Rpb25hcnkNCj4gKyAqDQo+ICsgKiBUaGlzIGlzIHRoZSBwYXJzZXIgZm9yIGluaSBm aWxlcy4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIHByb3ZpZGluZw0KPiArICogdGhlIG5hbWUg b2YgdGhlIGZpbGUgdG8gYmUgcmVhZC4gSXQgcmV0dXJucyBhIGRpY3Rpb25hcnkgb2JqZWN0IHRo YXQNCj4gKyAqIHNob3VsZCBub3QgYmUgYWNjZXNzZWQgZGlyZWN0bHksIGJ1dCB0aHJvdWdoIGFj Y2Vzc29yIGZ1bmN0aW9ucw0KPiArICogaW5zdGVhZC4NCj4gKyAqDQo+ICsgKiBUaGUgcmV0dXJu ZWQgZGljdGlvbmFyeSBtdXN0IGJlIGZyZWVkIHVzaW5nIGNpbmlwYXJzZXJfZnJlZWRpY3QoKS4N Cj4gKyAqLw0KPiArZGljdGlvbmFyeSAqY2luaXBhcnNlcl9sb2FkKGNvbnN0IGNoYXIgKmluaW5h bWUpOw0KPiArDQo+ICsvKioNCj4gKyAqIEBicmllZiAgICBGcmVlIGFsbCBtZW1vcnkgYXNzb2Np YXRlZCB0byBhbiBpbmkgZGljdGlvbmFyeQ0KPiArICogQHBhcmFtICAgIGQgRGljdGlvbmFyeSB0 byBmcmVlDQo+ICsgKiBAcmV0dXJuICAgdm9pZA0KPiArICoNCj4gKyAqIEZyZWUgYWxsIG1lbW9y eSBhc3NvY2lhdGVkIHRvIGFuIGluaSBkaWN0aW9uYXJ5Lg0KPiArICogSXQgaXMgbWFuZGF0b3J5 IHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBiZWZvcmUgdGhlIGRpY3Rpb25hcnkgb2JqZWN0DQo+ICsg KiBnZXRzIG91dCBvZiB0aGUgY3VycmVudCBjb250ZXh0Lg0KPiArICovDQo+ICt2b2lkIGNpbmlw YXJzZXJfZnJlZWRpY3QoZGljdGlvbmFyeSAqZCk7DQo+ICsNCj4gKy8qKg0KPiArICogQGJyaWVm IFNldCBhbiBpdGVtIGluIHRoZSBkaWN0aW9uYXJ5DQo+ICsgKiBAcGFyYW0gZCAgICAgIERpY3Rp b25hcnkgb2JqZWN0IGNyZWF0ZWQgYnkgY2luaXBhcnNlcl9sb2FkKCkNCj4gKyAqIEBwYXJhbSBl bnRyeSAgRW50cnkgaW4gdGhlIGRpY3Rpb25hcnkgdG8gbWFuaXB1bGF0ZQ0KPiArICogQHBhcmFt IHZhbCAgICBWYWx1ZSB0byBhc3NpZ24gdG8gdGhlIGVudHJ5DQo+ICsgKiBAcmV0dXJuICAgICAg IDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3INCj4gKyAqDQo+ICsgKiBSZW1lbWJlciB0aGF0IHN0 cmluZyB2YWx1ZXMgYXJlIGNvbnZlcnRlZCBieSBjaW5pcGFyc2VyX2dldGJvb2xlYW4oKSwNCj4g KyAqIGNpbmlwYXJzZXJfZ2V0ZG91YmxlKCksIGV0Yy4gSXQgaXMgYWxzbyBPSyB0byBzZXQgYW4g ZW50cnkgdG8gTlVMTC4NCj4gKyAqLw0KPiAraW50IGNpbmlwYXJzZXJfc2V0KGRpY3Rpb25hcnkg KmQsIGNoYXIgKmVudHJ5LCBjaGFyICp2YWwpOw0KPiArDQo+ICsjZW5kaWYNCj4gKy8qKiBAfQ0K PiArICovDQo+IGRpZmYgLS1naXQgYS9jY2FuL2NpbmlwYXJzZXIvZGljdGlvbmFyeS5jIGIvY2Nh bi9jaW5pcGFyc2VyL2RpY3Rpb25hcnkuYw0KPiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPiBpbmRl eCAwMDAwMDAwLi4xOWRkNjQxDQo+IC0tLSAvZGV2L251bGwNCj4gKysrIGIvY2Nhbi9jaW5pcGFy c2VyL2RpY3Rpb25hcnkuYw0KPiBAQCAtMCwwICsxLDI2NiBAQA0KPiArLyogQ29weXJpZ2h0IChj KSAyMDAwLTIwMDcgYnkgTmljb2xhcyBEZXZpbGxhcmQuDQo+ICsgKiBDb3B5cmlnaHQgKHgpIDIw MDkgYnkgVGltIFBvc3QgPHRpbmtlcnRpbUBnbWFpbC5jb20+DQo+ICsgKiBNSVQgTGljZW5zZQ0K PiArICoNCj4gKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdl LCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhDQo+ICsgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUg YW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLA0KPiAr ICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5n IHdpdGhvdXQgbGltaXRhdGlvbg0KPiArICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlm eSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsDQo+ICsgKiBhbmQvb3Ig c2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hv bSB0aGUNCj4gKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0 aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQo+ICsgKg0KPiArICogVGhlIGFib3ZlIGNvcHlyaWdo dCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4N Cj4gKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJl Lg0KPiArICoNCj4gKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VU IFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SDQo+ICsgKiBJTVBMSUVELCBJTkNMVURJ TkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwN Cj4gKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1F TlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQ0KPiArICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9M REVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUg0KPiArICogTElB QklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJ U0UsIEFSSVNJTkcNCj4gKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhF IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVINCj4gKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZU V0FSRS4NCj4gKyAqLw0KPiArDQo+ICsvKiogQGFkZHRvZ3JvdXAgY2luaXBhcnNlcg0KPiArICog QHsNCj4gKyAqLw0KPiArLyoqDQo+ICsgKiBAZmlsZSBkaWN0aW9uYXJ5LmMNCj4gKyAqIEBhdXRo b3IgTi4gRGV2aWxsYXJkDQo+ICsgKiBAZGF0ZSBTZXAgMjAwNw0KPiArICogQHZlcnNpb24gJFJl dmlzaW9uOiAxLjI3ICQNCj4gKyAqIEBicmllZiBJbXBsZW1lbnRzIGEgZGljdGlvbmFyeSBmb3Ig c3RyaW5nIHZhcmlhYmxlcy4NCj4gKyAqDQo+ICsgKiBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIGEg c2ltcGxlIGRpY3Rpb25hcnkgb2JqZWN0LCBpLmUuIGEgbGlzdA0KPiArICogb2Ygc3RyaW5nL3N0 cmluZyBhc3NvY2lhdGlvbnMuIFRoaXMgb2JqZWN0IGlzIHVzZWZ1bCB0byBzdG9yZSBlLmcuDQo+ ICsgKiBpbmZvcm1hdGlvbiByZXRyaWV2ZWQgZnJvbSBhIGNvbmZpZ3VyYXRpb24gZmlsZSAoaW5p IGZpbGVzKS4NCj4gKyAqLw0KPiArDQo+ICsjaW5jbHVkZSAiZGljdGlvbmFyeS5oIg0KPiArDQo+ ICsjaW5jbHVkZSA8c3RkaW8uaD4NCj4gKyNpbmNsdWRlIDxzdGRsaWIuaD4NCj4gKyNpbmNsdWRl IDxzdHJpbmcuaD4NCj4gKyNpbmNsdWRlIDx1bmlzdGQuaD4NCj4gKw0KPiArLyoqIE1heGltdW0g dmFsdWUgc2l6ZSBmb3IgaW50ZWdlcnMgYW5kIGRvdWJsZXMuICovDQo+ICsjZGVmaW5lIE1BWFZB TFNaCTEwMjQNCj4gKw0KPiArLyoqIE1pbmltYWwgYWxsb2NhdGVkIG51bWJlciBvZiBlbnRyaWVz IGluIGEgZGljdGlvbmFyeSAqLw0KPiArI2RlZmluZSBESUNUTUlOU1oJMTI4DQo+ICsNCj4gKy8q KiBJbnZhbGlkIGtleSB0b2tlbiAqLw0KPiArI2RlZmluZSBESUNUX0lOVkFMSURfS0VZCSgoY2hh ciopLTEpDQo+ICsNCj4gKy8qKg0KPiArICogQGJyaWVmIERvdWJsZSB0aGUgYWxsb2NhdGVkIHNp emUgYXNzb2NpYXRlZCB0byBhIHBvaW50ZXINCj4gKyAqIEBwYXJhbSBzaXplIHRoZSBjdXJyZW50 IGFsbG9jYXRlZCBzaXplDQo+ICsgKiBAcmV0dXJuIHJlLWFsbG9jYXRlZCBwb2ludGVyIG9uIHN1 Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZQ0KPiArICovDQo+ICtzdGF0aWMgdm9pZCAqbWVtX2RvdWJs ZSh2b2lkICpwdHIsIGludCBzaXplKQ0KPiArew0KPiArCXZvaWQgKm5ld3B0cjsNCj4gKw0KPiAr CW5ld3B0ciA9IGNhbGxvYygyICogc2l6ZSwgMSk7DQo+ICsJaWYgKG5ld3B0ciA9PSBOVUxMKSB7 DQo+ICsJCXJldHVybiBOVUxMOw0KPiArCX0NCj4gKwltZW1jcHkobmV3cHRyLCBwdHIsIHNpemUp Ow0KPiArCWZyZWUocHRyKTsNCj4gKwlyZXR1cm4gbmV3cHRyOw0KPiArfQ0KPiArDQo+ICsvKiBU aGUgcmVtYWluaW5nIGV4cG9zZWQgZnVuY3Rpb25zIGFyZSBkb2N1bWVudGVkIGluIGRpY3Rpb25h cnkuaCAqLw0KPiArDQo+ICt1bnNpZ25lZCBkaWN0aW9uYXJ5X2hhc2goY29uc3QgY2hhciAqa2V5 KQ0KPiArew0KPiArCWludCBsZW47DQo+ICsJdW5zaWduZWQgaGFzaDsNCj4gKwlpbnQgaTsNCj4g Kw0KPiArCWxlbiA9IHN0cmxlbihrZXkpOw0KPiArCWZvciAoaGFzaCA9IDAsIGkgPSAwOyBpIDwg bGVuOyBpKyspIHsNCj4gKwkJaGFzaCArPSAodW5zaWduZWQpIGtleVtpXTsNCj4gKwkJaGFzaCAr PSAoaGFzaCA8PCAxMCk7DQo+ICsJCWhhc2ggXj0gKGhhc2ggPj4gNik7DQo+ICsJfQ0KPiArCWhh c2ggKz0gKGhhc2ggPDwgMyk7DQo+ICsJaGFzaCBePSAoaGFzaCA+PiAxMSk7DQo+ICsJaGFzaCAr PSAoaGFzaCA8PCAxNSk7DQo+ICsJcmV0dXJuIGhhc2g7DQo+ICt9DQo+ICsNCj4gK2RpY3Rpb25h cnkgKmRpY3Rpb25hcnlfbmV3KGludCBzaXplKQ0KPiArew0KPiArCWRpY3Rpb25hcnkgKmQ7DQo+ ICsNCj4gKwkvKiBJZiBubyBzaXplIHdhcyBzcGVjaWZpZWQsIGFsbG9jYXRlIHNwYWNlIGZvciBE SUNUTUlOU1ogKi8NCj4gKwlpZiAoc2l6ZTxESUNUTUlOU1opIHNpemU9RElDVE1JTlNaOw0KPiAr DQo+ICsJaWYgKCEoZCA9IChkaWN0aW9uYXJ5ICopIGNhbGxvYygxLCBzaXplb2YoZGljdGlvbmFy eSkpKSkgew0KPiArCQlyZXR1cm4gTlVMTDsNCj4gKwl9DQo+ICsJZC0+c2l6ZSA9IHNpemU7DQo+ ICsJZC0+dmFsICA9IChjaGFyICoqKSBjYWxsb2Moc2l6ZSwgc2l6ZW9mKGNoYXIgKikpOw0KPiAr CWQtPmtleSAgPSAoY2hhciAqKikgY2FsbG9jKHNpemUsIHNpemVvZihjaGFyICopKTsNCj4gKwlk LT5oYXNoID0gKHVuc2lnbmVkIGludCAqKSBjYWxsb2Moc2l6ZSwgc2l6ZW9mKHVuc2lnbmVkKSk7 DQo+ICsJcmV0dXJuIGQ7DQo+ICt9DQo+ICsNCj4gK3ZvaWQgZGljdGlvbmFyeV9kZWwoZGljdGlv bmFyeSAqZCkNCj4gK3sNCj4gKwlpbnQgaTsNCj4gKw0KPiArCWlmIChkID09IE5VTEwpDQo+ICsJ CXJldHVybjsNCj4gKwlmb3IgKGkgPSAwOyBpIDwgZC0+c2l6ZTsgaSsrKSB7DQo+ICsJCWlmIChk LT5rZXlbaV0gIT0gTlVMTCkNCj4gKwkJCWZyZWUoZC0+a2V5W2ldKTsNCj4gKwkJaWYgKGQtPnZh bFtpXSAhPSBOVUxMKQ0KPiArCQkJZnJlZShkLT52YWxbaV0pOw0KPiArCX0NCj4gKwlmcmVlKGQt PnZhbCk7DQo+ICsJZnJlZShkLT5rZXkpOw0KPiArCWZyZWUoZC0+aGFzaCk7DQo+ICsJZnJlZShk KTsNCj4gKwlyZXR1cm47DQo+ICt9DQo+ICsNCj4gK2NoYXIgKmRpY3Rpb25hcnlfZ2V0KGRpY3Rp b25hcnkgKmQsIGNvbnN0IGNoYXIgKmtleSwgY2hhciAqZGVmKQ0KPiArew0KPiArCXVuc2lnbmVk IGhhc2g7DQo+ICsJaW50IGk7DQo+ICsNCj4gKwloYXNoID0gZGljdGlvbmFyeV9oYXNoKGtleSk7 DQo+ICsJZm9yIChpPTA7IGkgPCBkLT5zaXplOyBpKyspIHsNCj4gKwkJaWYgKGQtPmtleVtpXSA9 PSBOVUxMKQ0KPiArCQkJY29udGludWU7DQo+ICsJCS8qIENvbXBhcmUgaGFzaCAqLw0KPiArCQlp ZiAoaGFzaCA9PSBkLT5oYXNoW2ldKSB7DQo+ICsJCQkvKiBDb21wYXJlIHN0cmluZywgdG8gYXZv aWQgaGFzaCBjb2xsaXNpb25zICovDQo+ICsJCQlpZiAoIXN0cmNtcChrZXksIGQtPmtleVtpXSkp IHsNCj4gKwkJCQlyZXR1cm4gZC0+dmFsW2ldOw0KPiArCQkJfQ0KPiArCQl9DQo+ICsJfQ0KPiAr CXJldHVybiBkZWY7DQo+ICt9DQo+ICsNCj4gK2ludCBkaWN0aW9uYXJ5X3NldChkaWN0aW9uYXJ5 ICpkLCBjb25zdCBjaGFyICprZXksIGNoYXIgKnZhbCkNCj4gK3sNCj4gKwlpbnQgaTsNCj4gKwl1 bnNpZ25lZCBoYXNoOw0KPiArDQo+ICsJaWYgKGQ9PU5VTEwgfHwga2V5PT1OVUxMKQ0KPiArCQly ZXR1cm4gLTE7DQo+ICsNCj4gKwkvKiBDb21wdXRlIGhhc2ggZm9yIHRoaXMga2V5ICovDQo+ICsJ aGFzaCA9IGRpY3Rpb25hcnlfaGFzaChrZXkpOw0KPiArCS8qIEZpbmQgaWYgdmFsdWUgaXMgYWxy ZWFkeSBpbiBkaWN0aW9uYXJ5ICovDQo+ICsJaWYgKGQtPm4gPiAwKSB7DQo+ICsJCWZvciAoaSA9 IDA7IGkgPCBkLT5zaXplOyBpKyspIHsNCj4gKwkJCWlmIChkLT5rZXlbaV0gPT0gTlVMTCkNCj4g KwkJCQljb250aW51ZTsNCj4gKwkJCS8qIFNhbWUgaGFzaCB2YWx1ZSAqLw0KPiArCQkJaWYgKGhh c2ggPT0gZC0+aGFzaFtpXSkgew0KPiArCQkJCS8qIFNhbWUga2V5ICovDQo+ICsJCQkJaWYgKCFz dHJjbXAoa2V5LCBkLT5rZXlbaV0pKSB7DQo+ICsJCQkJCS8qIEZvdW5kIGEgdmFsdWU6IG1vZGlm eSBhbmQgcmV0dXJuICovDQo+ICsJCQkJCWlmIChkLT52YWxbaV0gIT0gTlVMTCkNCj4gKwkJCQkJ CWZyZWUoZC0+dmFsW2ldKTsNCj4gKwkJCQkJZC0+dmFsW2ldID0gdmFsID8gc3RyZHVwKHZhbCkg OiBOVUxMOw0KPiArCQkJCQkvKiBWYWx1ZSBoYXMgYmVlbiBtb2RpZmllZDogcmV0dXJuICovDQo+ ICsJCQkJCXJldHVybiAwOw0KPiArCQkJCX0NCj4gKwkJCX0NCj4gKwkJfQ0KPiArCX0NCj4gKw0K PiArCS8qIEFkZCBhIG5ldyB2YWx1ZQ0KPiArCSAqIFNlZSBpZiBkaWN0aW9uYXJ5IG5lZWRzIHRv IGdyb3cgKi8NCj4gKwlpZiAoZC0+biA9PSBkLT5zaXplKSB7DQo+ICsJCS8qIFJlYWNoZWQgbWF4 aW11bSBzaXplOiByZWFsbG9jYXRlIGRpY3Rpb25hcnkgKi8NCj4gKwkJZC0+dmFsICA9IChjaGFy ICoqKSBtZW1fZG91YmxlKGQtPnZhbCwgZC0+c2l6ZSAqIHNpemVvZihjaGFyICopKTsNCj4gKwkJ ZC0+a2V5ICA9IChjaGFyICoqKSBtZW1fZG91YmxlKGQtPmtleSwgZC0+c2l6ZSAqIHNpemVvZihj aGFyICopKTsNCj4gKwkJZC0+aGFzaCA9ICh1bnNpZ25lZCBpbnQgKikNCj4gKwkJCW1lbV9kb3Vi bGUoZC0+aGFzaCwgZC0+c2l6ZSAqIHNpemVvZih1bnNpZ25lZCkpOw0KPiArCQlpZiAoKGQtPnZh bCA9PSBOVUxMKSB8fCAoZC0+a2V5ID09IE5VTEwpIHx8IChkLT5oYXNoID09IE5VTEwpKQ0KPiAr CQkJLyogQ2Fubm90IGdyb3cgZGljdGlvbmFyeSAqLw0KPiArCQkJcmV0dXJuIC0xOw0KPiArCQkv KiBEb3VibGUgc2l6ZSAqLw0KPiArCQlkLT5zaXplICo9IDI7DQo+ICsJfQ0KPiArDQo+ICsJLyog SW5zZXJ0IGtleSBpbiB0aGUgZmlyc3QgZW1wdHkgc2xvdCAqLw0KPiArCWZvciAoaSA9IDA7IGkg PCBkLT5zaXplOyBpKyspIHsNCj4gKwkJaWYgKGQtPmtleVtpXSA9PSBOVUxMKSB7DQo+ICsJCQkv KiBBZGQga2V5IGhlcmUgKi8NCj4gKwkJCWJyZWFrOw0KPiArCQl9DQo+ICsJfQ0KPiArCS8qIENv cHkga2V5ICovDQo+ICsJZC0+a2V5W2ldID0gc3RyZHVwKGtleSk7DQo+ICsJZC0+dmFsW2ldID0g dmFsID8gc3RyZHVwKHZhbCkgOiBOVUxMOw0KPiArCWQtPmhhc2hbaV0gPSBoYXNoOw0KPiArCWQt Pm4gKys7DQo+ICsJcmV0dXJuIDA7DQo+ICt9DQo+ICsNCj4gK3ZvaWQgZGljdGlvbmFyeV91bnNl dChkaWN0aW9uYXJ5ICpkLCBjb25zdCBjaGFyICprZXkpDQo+ICt7DQo+ICsJdW5zaWduZWQgaGFz aDsNCj4gKwlpbnQgaTsNCj4gKw0KPiArCWlmIChrZXkgPT0gTlVMTCkNCj4gKwkJcmV0dXJuOw0K PiArDQo+ICsJaGFzaCA9IGRpY3Rpb25hcnlfaGFzaChrZXkpOw0KPiArCWZvciAoaSA9IDA7IGkg PCBkLT5zaXplOyBpKyspIHsNCj4gKwkJaWYgKGQtPmtleVtpXSA9PSBOVUxMKQ0KPiArCQkJY29u dGludWU7DQo+ICsJCS8qIENvbXBhcmUgaGFzaCAqLw0KPiArCQlpZiAoaGFzaCA9PSBkLT5oYXNo W2ldKSB7DQo+ICsJCQkvKiBDb21wYXJlIHN0cmluZywgdG8gYXZvaWQgaGFzaCBjb2xsaXNpb25z ICovDQo+ICsJCQlpZiAoIXN0cmNtcChrZXksIGQtPmtleVtpXSkpIHsNCj4gKwkJCQkvKiBGb3Vu ZCBrZXkgKi8NCj4gKwkJCQlicmVhazsNCj4gKwkJCX0NCj4gKwkJfQ0KPiArCX0NCj4gKwlpZiAo aSA+PSBkLT5zaXplKQ0KPiArCQkvKiBLZXkgbm90IGZvdW5kICovDQo+ICsJCXJldHVybjsNCj4g Kw0KPiArCWZyZWUoZC0+a2V5W2ldKTsNCj4gKwlkLT5rZXlbaV0gPSBOVUxMOw0KPiArCWlmIChk LT52YWxbaV0hPU5VTEwpIHsNCj4gKwkJZnJlZShkLT52YWxbaV0pOw0KPiArCQlkLT52YWxbaV0g PSBOVUxMOw0KPiArCX0NCj4gKwlkLT5oYXNoW2ldID0gMDsNCj4gKwlkLT5uIC0tOw0KPiArCXJl dHVybjsNCj4gK30NCj4gKw0KPiArdm9pZCBkaWN0aW9uYXJ5X2R1bXAoZGljdGlvbmFyeSAqZCwg RklMRSAqb3V0KQ0KPiArew0KPiArCWludCBpOw0KPiArDQo+ICsJaWYgKGQgPT0gTlVMTCB8fCBv dXQgPT0gTlVMTCkNCj4gKwkJcmV0dXJuOw0KPiArCWlmIChkLT5uIDwgMSkgew0KPiArCQlmcHJp bnRmKG91dCwgImVtcHR5IGRpY3Rpb25hcnlcbiIpOw0KPiArCQlyZXR1cm47DQo+ICsJfQ0KPiAr CWZvciAoaSA9IDA7IGkgPCBkLT5zaXplOyBpKyspIHsNCj4gKwkJaWYgKGQtPmtleVtpXSkgew0K PiArCQkJZnByaW50ZihvdXQsICIlMjBzXHRbJXNdXG4iLA0KPiArCQkJCWQtPmtleVtpXSwNCj4g KwkJCQlkLT52YWxbaV0gPyBkLT52YWxbaV0gOiAiVU5ERUYiKTsNCj4gKwkJfQ0KPiArCX0NCj4g KwlyZXR1cm47DQo+ICt9DQo+ICsNCj4gKy8qKiBAfQ0KPiArICovDQo+IGRpZmYgLS1naXQgYS9j Y2FuL2NpbmlwYXJzZXIvZGljdGlvbmFyeS5oIGIvY2Nhbi9jaW5pcGFyc2VyL2RpY3Rpb25hcnku aA0KPiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPiBpbmRleCAwMDAwMDAwLi5hOTRlYTFhDQo+IC0t LSAvZGV2L251bGwNCj4gKysrIGIvY2Nhbi9jaW5pcGFyc2VyL2RpY3Rpb25hcnkuaA0KPiBAQCAt MCwwICsxLDE2NiBAQA0KPiArI2lmbmRlZiBfRElDVElPTkFSWV9IXw0KPiArI2RlZmluZSBfRElD VElPTkFSWV9IXw0KPiArDQo+ICsvKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNyBieSBOaWNvbGFz IERldmlsbGFyZC4NCj4gKyAqIENvcHlyaWdodCAoeCkgMjAwOSBieSBUaW0gUG9zdCA8dGlua2Vy dGltQGdtYWlsLmNvbT4NCj4gKyAqIE1JVCBMaWNlbnNlDQo+ICsgKg0KPiArICogUGVybWlzc2lv biBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWlu aW5nIGENCj4gKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVu dGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksDQo+ICsgKiB0byBkZWFsIGluIHRoZSBTb2Z0 d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uDQo+ ICsgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlz dHJpYnV0ZSwgc3VibGljZW5zZSwNCj4gKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29m dHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQ0KPiArICogU29mdHdhcmUg aXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u czoNCj4gKyAqDQo+ICsgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJt aXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbg0KPiArICogYWxsIGNvcGllcyBvciBz dWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQo+ICsgKg0KPiArICogVEhFIFNP RlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQs IEVYUFJFU1MgT1INCj4gKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8g VEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLA0KPiArICogRklUTkVTUyBGT1IgQSBQ QVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwg VEhFDQo+ICsgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5Z IENMQUlNLCBEQU1BR0VTIE9SIE9USEVSDQo+ICsgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4g QUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORw0KPiArICogRlJP TSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBP UiBPVEhFUg0KPiArICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLg0KPiArICovDQo+ICsNCj4g KyNpbmNsdWRlIDxzdGRpby5oPg0KPiArI2luY2x1ZGUgPHN0ZGxpYi5oPg0KPiArI2luY2x1ZGUg PHN0cmluZy5oPg0KPiArI2luY2x1ZGUgPHVuaXN0ZC5oPg0KPiArDQo+ICsvKiogQGFkZHRvZ3Jv dXAgY2luaXBhcnNlcg0KPiArICogQHsNCj4gKyAqLw0KPiArLyoqDQo+ICsgKiBAZmlsZSAgICBk aWN0aW9uYXJ5LmgNCj4gKyAqIEBhdXRob3IgIE4uIERldmlsbGFyZA0KPiArICogQGRhdGUgICAg U2VwIDIwMDcNCj4gKyAqIEB2ZXJzaW9uICRSZXZpc2lvbjogMS4xMiAkDQo+ICsgKiBAYnJpZWYg ICBJbXBsZW1lbnRzIGEgZGljdGlvbmFyeSBmb3Igc3RyaW5nIHZhcmlhYmxlcy4NCj4gKyAqDQo+ ICsgKiBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIGEgc2ltcGxlIGRpY3Rpb25hcnkgb2JqZWN0LCBp LmUuIGEgbGlzdA0KPiArICogb2Ygc3RyaW5nL3N0cmluZyBhc3NvY2lhdGlvbnMuIFRoaXMgb2Jq ZWN0IGlzIHVzZWZ1bCB0byBzdG9yZSBlLmcuDQo+ICsgKiBpbmZvcm1hdGlvbiByZXRyaWV2ZWQg ZnJvbSBhIGNvbmZpZ3VyYXRpb24gZmlsZSAoaW5pIGZpbGVzKS4NCj4gKyAqLw0KPiArDQo+ICsN Cj4gKy8qKg0KPiArICogQGJyaWVmIERpY3Rpb25hcnkgb2JqZWN0DQo+ICsgKiBAcGFyYW0gbiBO dW1iZXIgb2YgZW50cmllcyBpbiB0aGUgZGljdGlvbmFyeQ0KPiArICogQHBhcmFtIHNpemUgU3Rv cmFnZSBzaXplDQo+ICsgKiBAcGFyYW0gdmFsIExpc3Qgb2Ygc3RyaW5nIHZhbHVlcw0KPiArICog QHBhcmFtIGtleSBMaXN0IG9mIHN0cmluZyBrZXlzDQo+ICsgKiBAcGFyYW0gaGFzaCBMaXN0IG9m IGhhc2ggdmFsdWVzIGZvciBrZXlzDQo+ICsgKg0KPiArICogVGhpcyBvYmplY3QgY29udGFpbnMg YSBsaXN0IG9mIHN0cmluZy9zdHJpbmcgYXNzb2NpYXRpb25zLiBFYWNoDQo+ICsgKiBhc3NvY2lh dGlvbiBpcyBpZGVudGlmaWVkIGJ5IGEgdW5pcXVlIHN0cmluZyBrZXkuIExvb2tpbmcgdXAgdmFs dWVzDQo+ICsgKiBpbiB0aGUgZGljdGlvbmFyeSBpcyBzcGVlZGVkIHVwIGJ5IHRoZSB1c2Ugb2Yg YSAoaG9wZWZ1bGx5IGNvbGxpc2lvbi1mcmVlKQ0KPiArICogaGFzaCBmdW5jdGlvbi4NCj4gKyAq Lw0KPiArdHlwZWRlZiBzdHJ1Y3QgX2RpY3Rpb25hcnlfIHsNCj4gKwlpbnQgbjsNCj4gKwlpbnQg c2l6ZTsNCj4gKwljaGFyICoqdmFsOw0KPiArCWNoYXIgKiprZXk7DQo+ICsJdW5zaWduZWQgKmhh c2g7DQo+ICt9IGRpY3Rpb25hcnk7DQo+ICsNCj4gKy8qKg0KPiArICogQGJyaWVmIENvbXB1dGUg dGhlIGhhc2gga2V5IGZvciBhIHN0cmluZy4NCj4gKyAqIEBwYXJhbSBrZXkgQ2hhcmFjdGVyIHN0 cmluZyB0byB1c2UgZm9yIGtleS4NCj4gKyAqIEByZXR1cm4gMSB1bnNpZ25lZCBpbnQgb24gYXQg bGVhc3QgMzIgYml0cy4NCj4gKyAqDQo+ICsgKiBUaGlzIGhhc2ggZnVuY3Rpb24gaGFzIGJlZW4g dGFrZW4gZnJvbSBhbiBBcnRpY2xlIGluIERyIERvYmJzIEpvdXJuYWwuDQo+ICsgKiBUaGlzIGlz IG5vcm1hbGx5IGEgY29sbGlzaW9uLWZyZWUgZnVuY3Rpb24sIGRpc3RyaWJ1dGluZyBrZXlzIGV2 ZW5seS4NCj4gKyAqIFRoZSBrZXkgaXMgc3RvcmVkIGFueXdheSBpbiB0aGUgc3RydWN0IHNvIHRo YXQgY29sbGlzaW9uIGNhbiBiZSBhdm9pZGVkDQo+ICsgKiBieSBjb21wYXJpbmcgdGhlIGtleSBp dHNlbGYgaW4gbGFzdCByZXNvcnQuDQo+ICsgKi8NCj4gK3Vuc2lnbmVkIGRpY3Rpb25hcnlfaGFz aChjb25zdCBjaGFyICprZXkpOw0KPiArDQo+ICsvKioNCj4gKyAqIEBicmllZiBDcmVhdGUgYSBu ZXcgZGljdGlvbmFyeSBvYmplY3QuDQo+ICsgKiBAcGFyYW0gc2l6ZSBPcHRpb25hbCBpbml0aWFs IHNpemUgb2YgdGhlIGRpY3Rpb25hcnkuDQo+ICsgKiBAcmV0dXJuIGFsbG9jYXRlZCBkaWN0aW9u YXJ5IG9iamVjdCBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUNCj4gKyAqDQo+ICsgKiBUaGlz IGZ1bmN0aW9uIGFsbG9jYXRlcyBhIG5ldyBkaWN0aW9uYXJ5IG9iamVjdCBvZiBnaXZlbiBzaXpl IGFuZCByZXR1cm5zDQo+ICsgKiBpdC4gSWYgeW91IGRvIG5vdCBrbm93IGluIGFkdmFuY2UgKHJv dWdobHkpIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUNCj4gKyAqIGRpY3Rpb25hcnksIGdp dmUgc2l6ZT0wLg0KPiArICovDQo+ICtkaWN0aW9uYXJ5ICpkaWN0aW9uYXJ5X25ldyhpbnQgc2l6 ZSk7DQo+ICsNCj4gKy8qKg0KPiArICogQGJyaWVmIERlbGV0ZSBhIGRpY3Rpb25hcnkgb2JqZWN0 DQo+ICsgKiBAcGFyYW0gZCBkaWN0aW9uYXJ5IG9iamVjdCB0byBkZWFsbG9jYXRlLg0KPiArICog QHJldHVybiB2b2lkDQo+ICsgKg0KPiArICogRGVhbGxvY2F0ZSBhIGRpY3Rpb25hcnkgb2JqZWN0 IGFuZCBhbGwgbWVtb3J5IGFzc29jaWF0ZWQgdG8gaXQuDQo+ICsgKi8NCj4gK3ZvaWQgZGljdGlv bmFyeV9kZWwoZGljdGlvbmFyeSAqdmQpOw0KPiArDQo+ICsvKioNCj4gKyAqIEBicmllZiBHZXQg YSB2YWx1ZSBmcm9tIGEgZGljdGlvbmFyeS4NCj4gKyAqIEBwYXJhbSBkIGRpY3Rpb25hcnkgb2Jq ZWN0IHRvIHNlYXJjaC4NCj4gKyAqIEBwYXJhbSBrZXkgS2V5IHRvIGxvb2sgZm9yIGluIHRoZSBk aWN0aW9uYXJ5Lg0KPiArICogQHBhcmFtIGRlZiBEZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpZiBr ZXkgbm90IGZvdW5kLg0KPiArICogQHJldHVybiAxIHBvaW50ZXIgdG8gaW50ZXJuYWxseSBhbGxv Y2F0ZWQgY2hhcmFjdGVyIHN0cmluZy4NCj4gKyAqDQo+ICsgKiBUaGlzIGZ1bmN0aW9uIGxvY2F0 ZXMgYSBrZXkgaW4gYSBkaWN0aW9uYXJ5IGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byBpdHMNCj4g KyAqIHZhbHVlLCBvciB0aGUgcGFzc2VkICdkZWYnIHBvaW50ZXIgaWYgbm8gc3VjaCBrZXkgY2Fu IGJlIGZvdW5kIGluDQo+ICsgKiBkaWN0aW9uYXJ5LiBUaGUgcmV0dXJuZWQgY2hhcmFjdGVyIHBv aW50ZXIgcG9pbnRzIHRvIGRhdGEgaW50ZXJuYWwgdG8gdGhlDQo+ICsgKiBkaWN0aW9uYXJ5IG9i amVjdCwgeW91IHNob3VsZCBub3QgdHJ5IHRvIGZyZWUgaXQgb3IgbW9kaWZ5IGl0Lg0KPiArICov DQo+ICtjaGFyICpkaWN0aW9uYXJ5X2dldChkaWN0aW9uYXJ5ICpkLCBjb25zdCBjaGFyICprZXks IGNoYXIgKmRlZik7DQo+ICsNCj4gKy8qKg0KPiArICogQGJyaWVmIFNldCBhIHZhbHVlIGluIGEg ZGljdGlvbmFyeS4NCj4gKyAqIEBwYXJhbSBkIGRpY3Rpb25hcnkgb2JqZWN0IHRvIG1vZGlmeS4N Cj4gKyAqIEBwYXJhbSBrZXkgS2V5IHRvIG1vZGlmeSBvciBhZGQuDQo+ICsgKiBAcGFyYW0gdmFs IFZhbHVlIHRvIGFkZC4NCj4gKyAqIEByZXR1cm4gaW50IDAgaWYgT2ssIGFueXRoaW5nIGVsc2Ug b3RoZXJ3aXNlDQo+ICsgKg0KPiArICogSWYgdGhlIGdpdmVuIGtleSBpcyBmb3VuZCBpbiB0aGUg ZGljdGlvbmFyeSwgdGhlIGFzc29jaWF0ZWQgdmFsdWUgaXMNCj4gKyAqIHJlcGxhY2VkIGJ5IHRo ZSBwcm92aWRlZCBvbmUuIElmIHRoZSBrZXkgY2Fubm90IGJlIGZvdW5kIGluIHRoZQ0KPiArICog ZGljdGlvbmFyeSwgaXQgaXMgYWRkZWQgdG8gaXQuDQo+ICsgKg0KPiArICogSXQgaXMgT2sgdG8g cHJvdmlkZSBhIE5VTEwgdmFsdWUgZm9yIHZhbCwgYnV0IE5VTEwgdmFsdWVzIGZvciB0aGUgZGlj dGlvbmFyeQ0KPiArICogb3IgdGhlIGtleSBhcmUgY29uc2lkZXJlZCBhcyBlcnJvcnM6IHRoZSBm dW5jdGlvbiB3aWxsIHJldHVybiBpbW1lZGlhdGVseQ0KPiArICogaW4gc3VjaCBhIGNhc2UuDQo+ ICsgKg0KPiArICogTm90aWNlIHRoYXQgaWYgeW91IGRpY3Rpb25hcnlfc2V0IGEgdmFyaWFibGUg dG8gTlVMTCwgYSBjYWxsIHRvDQo+ICsgKiBkaWN0aW9uYXJ5X2dldCB3aWxsIHJldHVybiBhIE5V TEwgdmFsdWU6IHRoZSB2YXJpYWJsZSB3aWxsIGJlIGZvdW5kLCBhbmQNCj4gKyAqIGl0cyB2YWx1 ZSAoTlVMTCkgaXMgcmV0dXJuZWQuIEluIG90aGVyIHdvcmRzLCBzZXR0aW5nIHRoZSB2YXJpYWJs ZQ0KPiArICogY29udGVudCB0byBOVUxMIGlzIGVxdWl2YWxlbnQgdG8gZGVsZXRpbmcgdGhlIHZh cmlhYmxlIGZyb20gdGhlDQo+ICsgKiBkaWN0aW9uYXJ5LiBJdCBpcyBub3QgcG9zc2libGUgKGlu IHRoaXMgaW1wbGVtZW50YXRpb24pIHRvIGhhdmUgYSBrZXkgaW4NCj4gKyAqIHRoZSBkaWN0aW9u YXJ5IHdpdGhvdXQgdmFsdWUuDQo+ICsgKg0KPiArICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIG5v bi16ZXJvIGluIGNhc2Ugb2YgZmFpbHVyZS4NCj4gKyAqLw0KPiAraW50IGRpY3Rpb25hcnlfc2V0 KGRpY3Rpb25hcnkgKnZkLCBjb25zdCBjaGFyICprZXksIGNoYXIgKnZhbCk7DQo+ICsNCj4gKy8q Kg0KPiArICogQGJyaWVmIERlbGV0ZSBhIGtleSBpbiBhIGRpY3Rpb25hcnkNCj4gKyAqIEBwYXJh bSBkIGRpY3Rpb25hcnkgb2JqZWN0IHRvIG1vZGlmeS4NCj4gKyAqIEBwYXJhbSBrZXkgS2V5IHRv IHJlbW92ZS4NCj4gKyAqIEByZXR1cm4gdm9pZA0KPiArICoNCj4gKyAqIFRoaXMgZnVuY3Rpb24g ZGVsZXRlcyBhIGtleSBpbiBhIGRpY3Rpb25hcnkuIE5vdGhpbmcgaXMgZG9uZSBpZiB0aGUNCj4g KyAqIGtleSBjYW5ub3QgYmUgZm91bmQuDQo+ICsgKi8NCj4gK3ZvaWQgZGljdGlvbmFyeV91bnNl dChkaWN0aW9uYXJ5ICpkLCBjb25zdCBjaGFyICprZXkpOw0KPiArDQo+ICsvKioNCj4gKyAqIEBi cmllZiBEdW1wIGEgZGljdGlvbmFyeSB0byBhbiBvcGVuZWQgZmlsZSBwb2ludGVyLg0KPiArICog QHBhcmFtIGQgRGljdGlvbmFyeSB0byBkdW1wDQo+ICsgKiBAcGFyYW0gb3V0IE9wZW5lZCBmaWxl IHBvaW50ZXINCj4gKyAqIEByZXR1cm4gdm9pZA0KPiArICoNCj4gKyAqIER1bXBzIGEgZGljdGlv bmFyeSBvbnRvIGFuIG9wZW5lZCBmaWxlIHBvaW50ZXIuIEtleSBwYWlycyBhcmUgcHJpbnRlZCBv dXQNCj4gKyAqIGFzIEBjIFtLZXldPVtWYWx1ZV0sIG9uZSBwZXIgbGluZS4gSXQgaXMgT2sgdG8g cHJvdmlkZSBzdGRvdXQgb3Igc3RkZXJyIGFzDQo+ICsgKiBvdXRwdXQgZmlsZSBwb2ludGVycy4N Cj4gKyAqLw0KPiArdm9pZCBkaWN0aW9uYXJ5X2R1bXAoZGljdGlvbmFyeSAqZCwgRklMRSAqb3V0 KTsNCj4gKw0KPiArI2VuZGlmDQo+ICsvKiogQH0NCj4gKyAqLw0KDQpfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpMaW51eC1udmRpbW0gbWFpbGluZyBsaXN0 CkxpbnV4LW52ZGltbUBsaXN0cy4wMS5vcmcKaHR0cHM6Ly9saXN0cy4wMS5vcmcvbWFpbG1hbi9s aXN0aW5mby9saW51eC1udmRpbW0K