From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <pve-devel-bounces@lists.proxmox.com> Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 6F50A1FF164 for <inbox@lore.proxmox.com>; Fri, 11 Apr 2025 13:05:05 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 09E92F7C0; Fri, 11 Apr 2025 13:04:59 +0200 (CEST) Message-ID: <123e823b-c283-4090-9bf0-9bce777eb670@proxmox.com> Date: Fri, 11 Apr 2025 13:04:50 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird From: Daniel Kral <d.kral@proxmox.com> To: Proxmox VE development discussion <pve-devel@lists.proxmox.com>, =?UTF-8?Q?Fabian_Gr=C3=BCnbichler?= <f.gruenbichler@proxmox.com> References: <20250325151254.193177-1-d.kral@proxmox.com> <20250325151254.193177-7-d.kral@proxmox.com> <1743672047.yfgqapvf7h.astroid@yuna.none> Content-Language: en-US In-Reply-To: <1743672047.yfgqapvf7h.astroid@yuna.none> X-SPAM-LEVEL: Spam detection results: 0 AWL -0.389 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_ASCII_DIVIDERS 0.8 Email that uses ascii formatting dividers and possible spam tricks KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: Re: [pve-devel] [PATCH ha-manager 05/15] rules: add colocation rule plugin X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion <pve-devel.lists.proxmox.com> List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/pve-devel>, <mailto:pve-devel-request@lists.proxmox.com?subject=unsubscribe> List-Archive: <http://lists.proxmox.com/pipermail/pve-devel/> List-Post: <mailto:pve-devel@lists.proxmox.com> List-Help: <mailto:pve-devel-request@lists.proxmox.com?subject=help> List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel>, <mailto:pve-devel-request@lists.proxmox.com?subject=subscribe> Reply-To: Proxmox VE development discussion <pve-devel@lists.proxmox.com> Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" <pve-devel-bounces@lists.proxmox.com> VGhhbmtzIGZvciB0aGUgcmV2aWV3LCBGYWJpYW4hCgpTb3JyeSBmb3IgdGhlIHdhaXQsIEkgd2Fz IG1vcmUgZm9jdXNlZCBvbiB0ZXN0aW5nIG90aGVyIHBhdGNoIHNlcmllcyAKd2hpY2ggd2VyZSBh bHJlYWR5IHJlYWR5IHRvIG1lcmdlIGZvciBQVkUgOC40IDspLiBCdXQgSSdtIGdvaW5nIHRvIGJl IAp3b3JraW5nIG9uIHRoaXMgYWdhaW4gbm93LCBzbyB0aGF0IGl0IHdpbGwgYmUgcmVhZHkgZm9y IHRoZSBuZXh0IHJlbGVhc2UgCm9yIGV2ZW4gYmVmb3JlIHRoYXQgOikKClRoYW5rcyBmb3IgdGhl IHN1Z2dlc3Rpb25zLCBJJ2xsIGltcGxlbWVudCB0aGVtIHNob3J0bHkuIEkgc3RpbGwgaGF2ZSBh IApmZXcgcXVlc3Rpb25zL2Rpc2N1c3Npb24gcG9pbnRzIGJlbG93LgoKT24gNC8zLzI1IDE0OjE2 LCBGYWJpYW4gR3LDvG5iaWNobGVyIHdyb3RlOgo+IE9uIE1hcmNoIDI1LCAyMDI1IDQ6MTIgcG0s IERhbmllbCBLcmFsIHdyb3RlOgo+PiBBZGQgdGhlIGNvbG9jYXRpb24gcnVsZSBwbHVnaW4gdG8g YWxsb3cgdXNlcnMgdG8gc3BlY2lmeSBpbnRlci1zZXJ2aWNlCj4+IGFmZmluaXR5IGNvbnN0cmFp bnRzLgo+Pgo+PiBUaGVzZSBjb2xvY2F0aW9uIHJ1bGVzIGNhbiBlaXRoZXIgYmUgcG9zaXRpdmUg KGtlZXBpbmcgc2VydmljZXMKPj4gdG9nZXRoZXIpIG9yIG5lZ2F0aXZlIChrZWVwaW5nIHNlcnZp Y2Ugc2VwYXJhdGUpLiBUaGVpciBzdHJpY3RuZXNzIGNhbgo+PiBhbHNvIGJlIHNwZWNpZmllZCBh cyBlaXRoZXIgYSBNVVNUIG9yIGEgU0hPVUxELCB3aGVyZSB0aGUgZmlyc3QKPj4gc3BlY2lmaWVz IHRoYXQgYW55IHNlcnZpY2UgdGhlIGNvbnN0cmFpbnQgY2Fubm90IGJlIGFwcGxpZWQgZm9yIHN0 YXlzIGluCj4+IHJlY292ZXJ5LCB3aGlsZSB0aGUgbGF0dGVyIHNwZWNpZmllcyB0aGF0IHRoYXQg YW55IHNlcnZpY2UgdGhlCj4+IGNvbnN0cmFpbnQgY2Fubm90IGJlIGFwcGxpZWQgZm9yIGlzIGxp ZnRlZCBmcm9tIHRoZSBjb25zdHJhaW50Lgo+Pgo+PiBUaGUgaW5pdGlhbCBpbXBsZW1lbnRhdGlv biBhbHNvIGltcGxlbWVudHMgZm91ciBiYXNpYyB0cmFuc2Zvcm1hdGlvbnMsCj4+IHdoZXJlIGNv bG9jYXRpb24gcnVsZXMgd2l0aCBub3QgZW5vdWdoIHNlcnZpY2VzIGFyZSBkcm9wcGVkLCB0cmFu c2l0aXZlCj4+IHBvc2l0aXZlIGNvbG9jYXRpb24gcnVsZXMgYXJlIG1lcmdlZCwgYW5kIGludGVy LWNvbG9jYXRpb24gcnVsZQo+PiBpbmNvbnNpc3RlbmNpZXMgYXMgd2VsbCBhcyBjb2xvY2F0aW9u IHJ1bGUgaW5jb25zaXN0ZW5jaWVzIHdpdGggcmVzcGVjdAo+PiB0byB0aGUgbG9jYXRpb24gY29u c3RyYWludHMgc3BlY2lmaWVkIGluIEhBIGdyb3VwcyBhcmUgZHJvcHBlZC4KPiAKPiBhIGhpZ2gg bGV2ZWwgcXVlc3Rpb246IHRoZXJlcyBhIGxvdCBvZiBsb29wcyBhbmQgc29ydHMgb3ZlciBydWxl cywKPiBzZXJ2aWNlcywgZ3JvdXBzIGhlcmUgLSBncmFudGVkIHRoYXQgaXMgYWxsIGluIG1lbW9y eSwgc28gc2hvdWxkIGJlCj4gcmVhc29uYWJseSBmYXN0LCBkbyB3ZSBoYXZlIGNvbmNlcm5zIGhl cmUvc2hvdWxkIHdlIGxvb2sgZm9yIGZ1cnRoZXIKPiBvcHRpbWl6YXRpb24gcG90ZW50aWFsPwo+ IAo+IGUuZy4gcmlnaHQgbm93IEkgY291bnQgKGNvbWluZyBpbiB2aWEgY2Fub25pY2FsaXplKToK PiAKPiAtIGNoZWNrX3NlcnZpY2VzX2NvdW50Cj4gLS0gc29ydCBvZiBydWxlaWRzIChmb3JlYWNo X2NvbG9jYXRpb25fcnVsZSkKPiAtLSBsb29wIG92ZXIgcnVsZXMgKGZvcmVhY2hfY29sb2NhdGlv bl9ydWxlKQo+IC0tLSBrZXlzIG9uIHNlcnZpY2VzIG9mIGVhY2ggcnVsZQo+IC0gbG9vcCBvdmVy IHRoZSByZXN1bHRzIChzaG91bGQgYmUgZW1wdHkpCj4gLSBjaGVja19wb3NpdGl2ZV9pbnRyYW5z aXRpdml0eQo+IC0tIHNvcnQgb2YgcnVsZWlkcywgMXggbG9vcCBvdmVyIHJ1bGVzIChmb3JlYWNo X2NvbG9jYXRpb25fcnVsZSB2aWEgc3BsaXRfY29sb2NhdGlvbl9ydWxlcykKPiAtLSBsb29wIG92 ZXIgZWFjaCB1bmlxdWUgcGFpciBvZiBydWxlaWRzCj4gLS0tIGlzX2Rpc2pvaW50IG9uIHNlcnZp Y2VzIG9mIGVhY2ggcGFpciAobG9vcCBvdmVyIHNlcnZpY2Uga2V5cykKPiAtIGxvb3Agb3ZlciBy ZXN1bHRpbmcgcnVsZWlkcyAobWlnaHQgYmUgbWFueSEpCj4gLS0gbG9vcCBvdmVyIG1lcmdlYWJs ZSBydWxlcyBmb3IgZWFjaCBtZXJnZSB0YXJnZXQKPiAtLS0gbG9vcCBvdmVyIHNlcnZpY2VzIG9m IGVhY2ggbWVyZ2VhYmxlIHJ1bGUKPiAtIGNoZWNrX2lubmVyX2NvbnNpc3RlbmN5Cj4gLS0gc29y dCBvZiBydWxlaWRzLCAxeCBsb29wIG92ZXIgcnVsZXMgKGZvcmVhY2hfY29sb2NhdGlvbl9ydWxl IHZpYSBzcGxpdF9jb2xvY2F0aW9uX3J1bGVzKQo+IC0tIGxvb3Agb3ZlciBwb3NpdGl2ZSBydWxl cwo+IC0tLSBmb3IgZXZlcnkgcG9zaXRpdmUgcnVsZSwgbG9vcCBvdmVyIG5lZ2F0aXZlIHJ1bGVz Cj4gLS0tLSBmb3IgZWFjaCBwYWlyIG9mIHBvc2l0aXZlK25lZ2F0aXZlIHJ1bGUsIGNoZWNrIHNl cnZpY2UKPiBpbnRlcnNlY3Rpb25zCj4gLSBsb29wIG92ZXIgcmVzdWx0aW5nIGNvbmZsaWN0cyAo c2hvdWxkIGJlIGVtcHR5KQo+IC0gY2hlY2tfY29uc2lzdGVuY3lfd2l0aF9ncm91cHMKPiAtLSBz b3J0IG9mIHJ1bGVpZHMsIDF4IGxvb3Agb3ZlciBydWxlcyAoZm9yZWFjaF9jb2xvY2F0aW9uX3J1 bGUgdmlhIHNwbGl0X2NvbG9jYXRpb25fcnVsZXMpCj4gLS0gbG9vcCBvdmVyIHBvc2l0aXZlIHJ1 bGVzCj4gLS0tIGxvb3Agb3ZlciBzZXJ2aWNlcwo+IC0tLS0gbG9vcCBvdmVyIG5vZGVzIG9mIHNl cnZpY2UncyBncm91cAo+IC0tIGxvb3Agb3ZlciBuZWdhdGl2ZSBydWxlcwo+IC0tLSBsb29wIG92 ZXIgc2VydmljZXMKPiAtLS0tIGxvb3Agb3ZlciBub2RlcyBvZiBzZXJ2aWNlJ3MgZ3JvdXAKPiAt IGxvb3Agb3ZlciByZXN1bHRpbmcgY29uZmxpY3RzIChzaG91bGQgYmUgZW1wdHkpCj4gCj4gcG9z c2libHkgc3BsaXR0aW5nIHRoZSBydWxlcyAoaW5zdGVhZCBvZiBqdXN0IHRoZSBJRHMpIG9uY2Ug YW5kIGtlZXBpbmcKPiBhIGxpc3Qgb2Ygc29ydGVkIHJ1bGUgSURzIHdlIGNvdWxkIHNhdmUgc29t ZSBvdmVyaGVhZD8KPiAKPiBtaWdodCBub3QgYmUgd29ydGggaXQgKHlldCkgdGhvdWdoLCBidXQg c29tZXRoaW5nIHRvIGtlZXAgaW4gbWluZCBpZiB0aGUKPiBydWxlcyBhcmUgZ2V0dGluZyBtb3Jl IGNvbXBsaWNhdGVkIG92ZXIgdGltZS4uCgpUaGFua3MgZm9yIHRoZSBuaWNlIGNhbGwgZ3JhcGgh CgpJIHRoaW5rIGl0IHdvdWxkIGJlIHJlYXNvbmFibGUgdG8gZG8gdGhpcyBhbHJlYWR5LCBlc3Bl Y2lhbGx5IHRvIHJlZHVjZSAKdGhlIGNvZGUgZHVwbGljYXRpb24gYmV0d2VlbiBjYW5vbmljYWxp emUoKSBhbmQgYXJlX3NhdGlzZmlhYmxlKCkgeW91IAphbHJlYWR5IG1lbnRpb25lZCBiZWxvdy4K Ckkgd2FzIHRoaW5raW5nIGFib3V0IHNvbWV0aGluZyBsaWtlICRjbWRkZWYgb3IgYW5vdGhlciBy ZWdpc3RyeS10eXBlIApzdHJ1Y3R1cmUsIHdoaWNoIGhhcyBhbiBlbnRyeSBmb3IgZWFjaCBjaGVj a2luZyBzdWJyb3V0aW5lIGFuZCBhbHNvIGEgCmhhbmRsZXIgZm9yIHdoYXQgdG8gcHJpbnQvZG8g Zm9yIGJvdGggY2Fub25pY2FsaXplKCkgYXMgd2VsbCBhcyAKYXJlX3NhdGlzZmlhYmxlKCkuIFRo ZW4gdGhvc2Ugd291bGQgaGF2ZSB0byBvbmx5IGl0ZXJhdGUgb3ZlciB0aGUgbGlzdCAKYW5kIGNh bGwgdGhlIHN1YnJvdXRpbmVzLgoKRm9yIGV2ZXJ5IGNoZWNraW5nIHN1YnJvdXRpbmUsIHdlIGNv dWxkIHBhc3MgdGhlIHdob2xlIG9mICRydWxlcywgYW5kIGEgCnJ1bGUgdHlwZS1zcGVjaWZpYyB2 YXJpYWJsZSwgZS5nLiBbJHBvc2l0aXZlX2lkcywgJG5lZ2F0aXZlX2lkc10gaGVyZSwgCm9yIGFz IHlvdSBhbHJlYWR5IHN1Z2dlc3RlZCBiZWxvdyBbJHBvc2l0aXZlX3J1bGVzLCAkbmVnYXRpdmVf cnVsZXNdLgoKT25lIHNtYWxsIHRoaW5nIEkgaGF2ZW4ndCBleHBsaWNpdGx5IG1lbnRpb25lZCBo ZXJlIGJlZm9yZSBpcyB0aGF0IGF0IApsZWFzdCB0aGUgY2hlY2sgZm9yIG1lcmdlYWJsZSBwb3Np dGl2ZSBjb2xvY2F0aW9uIHJ1bGVzIAooYGNoZWNrX3Bvc2l0aXZlX2ludHJhbnNpdGl2aXR5YCkg YW5kIHRoZSBjaGVjayBmb3IgaW5jb25zaXN0ZW5jeSAKYmV0d2VlbiBwb3NpdGl2ZSBhbmQgbmVn YXRpdmUgY29sb2NhdGlvbiBydWxlcyAKKGBjaGVja19pbm5lcl9jb25zaXN0ZW5jeWApIGRvIGRl cGVuZCBvbiBlYWNoIG90aGVyIHNvbWV3aGF0LCBzbyBvcmRlciAKZm9yIHRoZXNlIHJ1bGVzIHN0 YXlzIGltcG9ydGFudCBoZXJlIGFzIHdlbGwgYXMgdGhhdCBtb2RpZmljYXRpb25zIHRvIAokcnVs ZXMgYXJlIHdyaXR0ZW4gY29ycmVjdGx5IGJlZm9yZSB0aGUgbmV4dCBjaGVjayBoYW5kbGVyIGlz IGNhbGxlZC4KCkkndmUgd3JpdHRlbiBhYm91dCBhbiBleGFtcGxlIHdoeSB0aGlzIGlzIG5lY2Vz c2FyeSBpbiBhIGNvbW1lbnQgYmVsb3cgCmBjaGVja19wb3NpdGl2ZV9pbnRyYW5zaXRpdml0eWAg YW5kIHdpbGwgZG9jdW1lbnQgdGhpcyBtb3JlIGNsZWFybHkgaW4gCnRoZSB2MS4KClRoZSBvbmx5 IHNlbWktYmxvY2tlciBoZXJlIGlzIHRoYXQgY2hlY2tfY29uc2lzdGVuY3lfd2l0aF9ncm91cHMo Li4uKSAKYWxzbyBuZWVkcyBhY2Nlc3MgdG8gJGdyb3VwcyBhbmQgJHNlcnZpY2VzLCBidXQgZm9y IHRoZSB0aW1lIGJlaW5nIHdlIApjb3VsZCBqdXN0IHBhc3MgdGhvc2UgdHdvIHRvIGV2ZXJ5IHN1 YnJvdXRpbmUgYW5kIGlnbm9yZSBpdCwgd2hlcmUgaXQgCmlzbid0IG5lZWRlZC4KCkFub3RoZXIg YXBwcm9hY2ggY291bGQgYmUgdG8gd3JpdGUgYW55IHNlcnZpY2UgZ3JvdXAgbWVtYmVyc2hpcCBp bnRvIAokcnVsZXMgaW50ZXJuYWxseSBhbHJlYWR5IGFuZCBqdXN0IHdvcmsgd2l0aCB0aGUgZGF0 YSBmcm9tIHRoZXJlLCBzbyAKdGhhdCB0cmFuc2l0aW9uaW5nIHRvIHJlcGxhY2luZyAiSEEgR3Jv dXBzIiB3aXRoICJIQSBMb2NhdGlvbiBSdWxlcyIgCmNvdWxkIGdvIG1vcmUgc21vb3RobHkgaW4g YSBmdXR1cmUgbWFqb3IgdmVyc2lvbiwgaWYgd2Ugd2FudCB0byBkbyB0aGlzIAppbiB0aGUgZW5k LiBPciB3ZSdsbCBhbHJlYWR5IGFsbG93IGNyZWF0aW5nIGxvY2F0aW9uIHJ1bGVzIGV4cGxpY2l0 bHksIAp3aGljaCBhcmUgc3luY2hyb25pemVkIHdpdGggSEEgZ3JvdXBzLgoKPiAKPj4KPj4gU2ln bmVkLW9mZi1ieTogRGFuaWVsIEtyYWwgPGQua3JhbEBwcm94bW94LmNvbT4KPj4gLS0tCj4+ICAg ZGViaWFuL3B2ZS1oYS1tYW5hZ2VyLmluc3RhbGwgIHwgICAxICsKPj4gICBzcmMvUFZFL0hBL01h a2VmaWxlICAgICAgICAgICAgfCAgIDEgKwo+PiAgIHNyYy9QVkUvSEEvUnVsZXMvQ29sb2NhdGlv bi5wbSB8IDM5MSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKPj4gICBzcmMvUFZF L0hBL1J1bGVzL01ha2VmaWxlICAgICAgfCAgIDYgKwo+PiAgIHNyYy9QVkUvSEEvVG9vbHMucG0g ICAgICAgICAgICB8ICAgNiArCj4+ICAgNSBmaWxlcyBjaGFuZ2VkLCA0MDUgaW5zZXJ0aW9ucygr KQo+PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvUFZFL0hBL1J1bGVzL0NvbG9jYXRpb24ucG0K Pj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL1BWRS9IQS9SdWxlcy9NYWtlZmlsZQo+Pgo+PiBk aWZmIC0tZ2l0IGEvZGViaWFuL3B2ZS1oYS1tYW5hZ2VyLmluc3RhbGwgYi9kZWJpYW4vcHZlLWhh LW1hbmFnZXIuaW5zdGFsbAo+PiBpbmRleCA5YmJkMzc1Li44OWY5MTQ0IDEwMDY0NAo+PiAtLS0g YS9kZWJpYW4vcHZlLWhhLW1hbmFnZXIuaW5zdGFsbAo+PiArKysgYi9kZWJpYW4vcHZlLWhhLW1h bmFnZXIuaW5zdGFsbAo+PiBAQCAtMzMsNiArMzMsNyBAQAo+PiAgIC91c3Ivc2hhcmUvcGVybDUv UFZFL0hBL1Jlc291cmNlcy9QVkVDVC5wbQo+PiAgIC91c3Ivc2hhcmUvcGVybDUvUFZFL0hBL1Jl c291cmNlcy9QVkVWTS5wbQo+PiAgIC91c3Ivc2hhcmUvcGVybDUvUFZFL0hBL1J1bGVzLnBtCj4+ ICsvdXNyL3NoYXJlL3Blcmw1L1BWRS9IQS9SdWxlcy9Db2xvY2F0aW9uLnBtCj4+ICAgL3Vzci9z aGFyZS9wZXJsNS9QVkUvSEEvVG9vbHMucG0KPj4gICAvdXNyL3NoYXJlL3Blcmw1L1BWRS9IQS9V c2FnZS5wbQo+PiAgIC91c3Ivc2hhcmUvcGVybDUvUFZFL0hBL1VzYWdlL0Jhc2ljLnBtCj4+IGRp ZmYgLS1naXQgYS9zcmMvUFZFL0hBL01ha2VmaWxlIGIvc3JjL1BWRS9IQS9NYWtlZmlsZQo+PiBp bmRleCA0ODljYmMwLi5lMzg2Y2JmIDEwMDY0NAo+PiAtLS0gYS9zcmMvUFZFL0hBL01ha2VmaWxl Cj4+ICsrKyBiL3NyYy9QVkUvSEEvTWFrZWZpbGUKPj4gQEAgLTgsNiArOCw3IEBAIGluc3RhbGw6 Cj4+ICAgCWluc3RhbGwgLWQgLW0gMDc1NSAke0RFU1RESVJ9JHtQRVJMRElSfS9QVkUvSEEKPj4g ICAJZm9yIGkgaW4gJHtTT1VSQ0VTfTsgZG8gaW5zdGFsbCAtRCAtbSAwNjQ0ICQkaSAke0RFU1RE SVJ9JHtQRVJMRElSfS9QVkUvSEEvJCRpOyBkb25lCj4+ICAgCW1ha2UgLUMgUmVzb3VyY2VzIGlu c3RhbGwKPj4gKwltYWtlIC1DIFJ1bGVzIGluc3RhbGwKPj4gICAJbWFrZSAtQyBVc2FnZSBpbnN0 YWxsCj4+ICAgCW1ha2UgLUMgRW52IGluc3RhbGwKPj4gICAKPj4gZGlmZiAtLWdpdCBhL3NyYy9Q VkUvSEEvUnVsZXMvQ29sb2NhdGlvbi5wbSBiL3NyYy9QVkUvSEEvUnVsZXMvQ29sb2NhdGlvbi5w bQo+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+PiBpbmRleCAwMDAwMDAwLi44MDhkNDhlCj4+IC0t LSAvZGV2L251bGwKPj4gKysrIGIvc3JjL1BWRS9IQS9SdWxlcy9Db2xvY2F0aW9uLnBtCj4+IEBA IC0wLDAgKzEsMzkxIEBACj4+ICtwYWNrYWdlIFBWRTo6SEE6OlJ1bGVzOjpDb2xvY2F0aW9uOwo+ PiArCj4+ICt1c2Ugc3RyaWN0Owo+PiArdXNlIHdhcm5pbmdzOwo+PiArCj4+ICt1c2UgRGF0YTo6 RHVtcGVyOwo+IAo+IGxlZnRvdmVyIGR1bXBlciA7KQo+IAo+PiArCj4+ICt1c2UgUFZFOjpKU09O U2NoZW1hIHF3KGdldF9zdGFuZGFyZF9vcHRpb24pOwo+PiArdXNlIFBWRTo6SEE6OlRvb2xzOwo+ PiArCj4+ICt1c2UgYmFzZSBxdyhQVkU6OkhBOjpSdWxlcyk7Cj4+ICsKPj4gK3N1YiB0eXBlIHsK Pj4gKyAgICByZXR1cm4gJ2NvbG9jYXRpb24nOwo+PiArfQo+PiArCj4+ICtzdWIgcHJvcGVydGll cyB7Cj4+ICsgICAgcmV0dXJuIHsKPj4gKwlzZXJ2aWNlcyA9PiBnZXRfc3RhbmRhcmRfb3B0aW9u KCdwdmUtaGEtcmVzb3VyY2UtaWQtbGlzdCcpLAo+PiArCWFmZmluaXR5ID0+IHsKPj4gKwkgICAg ZGVzY3JpcHRpb24gPT4gIkRlc2NyaWJlcyB3aGV0aGVyIHRoZSBzZXJ2aWNlcyBhcmUgc3VwcG9z ZWQgdG8gYmUga2VwdCBvbiBzZXBhcmF0ZSIKPj4gKwkJLiAiIG5vZGVzLCBvciBhcmUgc3VwcG9z ZWQgdG8gYmUga2VwdCB0b2dldGhlciBvbiB0aGUgc2FtZSBub2RlLiIsCj4+ICsJICAgIHR5cGUg PT4gJ3N0cmluZycsCj4+ICsJICAgIGVudW0gPT4gWydzZXBhcmF0ZScsICd0b2dldGhlciddLAo+ PiArCSAgICBvcHRpb25hbCA9PiAwLAo+PiArCX0sCj4+ICsJc3RyaWN0ID0+IHsKPj4gKwkgICAg ZGVzY3JpcHRpb24gPT4gIkRlc2NyaWJlcyB3aGV0aGVyIHRoZSBjb2xvY2F0aW9uIHJ1bGUgaXMg bWFuZGF0b3J5IG9yIG9wdGlvbmFsLiIsCj4+ICsJICAgIHR5cGUgPT4gJ2Jvb2xlYW4nLAo+PiAr CSAgICBvcHRpb25hbCA9PiAwLAo+PiArCX0sCj4+ICsgICAgfQo+PiArfQo+PiArCj4+ICtzdWIg b3B0aW9ucyB7Cj4+ICsgICAgcmV0dXJuIHsKPj4gKwlzZXJ2aWNlcyA9PiB7IG9wdGlvbmFsID0+ IDAgfSwKPj4gKwlzdHJpY3QgPT4geyBvcHRpb25hbCA9PiAwIH0sCj4+ICsJYWZmaW5pdHkgPT4g eyBvcHRpb25hbCA9PiAwIH0sCj4+ICsJY29tbWVudCA9PiB7IG9wdGlvbmFsID0+IDEgfSwKPj4g KyAgICB9Owo+PiArfTsKPj4gKwo+PiArc3ViIGRlY29kZV92YWx1ZSB7Cj4+ICsgICAgbXkgKCRj bGFzcywgJHR5cGUsICRrZXksICR2YWx1ZSkgPSBAXzsKPj4gKwo+PiArICAgIGlmICgka2V5IGVx ICdzZXJ2aWNlcycpIHsKPj4gKwlteSAkcmVzID0ge307Cj4+ICsKPj4gKwlmb3IgbXkgJHNlcnZp Y2UgKFBWRTo6VG9vbHM6OnNwbGl0X2xpc3QoJHZhbHVlKSkgewo+PiArCSAgICBpZiAoUFZFOjpI QTo6VG9vbHM6OnB2ZV92ZXJpZnlfaGFfcmVzb3VyY2VfaWQoJHNlcnZpY2UpKSB7Cj4+ICsJCSRy ZXMtPnskc2VydmljZX0gPSAxOwo+PiArCSAgICB9Cj4+ICsJfQo+PiArCj4+ICsJcmV0dXJuICRy ZXM7Cj4+ICsgICAgfQo+PiArCj4+ICsgICAgcmV0dXJuICR2YWx1ZTsKPj4gK30KPj4gKwo+PiAr c3ViIGVuY29kZV92YWx1ZSB7Cj4+ICsgICAgbXkgKCRjbGFzcywgJHR5cGUsICRrZXksICR2YWx1 ZSkgPSBAXzsKPj4gKwo+PiArICAgIGlmICgka2V5IGVxICdzZXJ2aWNlcycpIHsKPj4gKwlQVkU6 OkhBOjpUb29sczo6cHZlX3ZlcmlmeV9oYV9yZXNvdXJjZV9pZCgkXykgZm9yIChrZXlzICUkdmFs dWUpOwo+PiArCj4+ICsJcmV0dXJuIGpvaW4oJywnLCBrZXlzICUkdmFsdWUpOwo+PiArICAgIH0K Pj4gKwo+PiArICAgIHJldHVybiAkdmFsdWU7Cj4+ICt9Cj4+ICsKPj4gK3N1YiBmb3JlYWNoX2Nv bG9jYXRpb25fcnVsZSB7Cj4+ICsgICAgbXkgKCRydWxlcywgJGZ1bmMsICRvcHRzKSA9IEBfOwo+ PiArCj4+ICsgICAgbXkgJG15X29wdHMgPSB7IG1hcCB7ICRfID0+ICRvcHRzLT57JF99IH0ga2V5 cyAlJG9wdHMgfTsKPiAKPiB3aHk/IGlmIHRoZSBjYWxsZXIgZG9lc24ndCB3YW50ICRvcHRzIHRv IGJlIG1vZGlmaWVkLCB0aGV5IGNvdWxkIGp1c3QKPiBwYXNzIGluIGEgY29weSAob3IgeW91IGNv dWxkIHJlcXVpcmUgaXQgdG8gYmUgcGFzc2VkIGJ5IHZhbHVlIGluc3RlYWQgb2YKPiBieSByZWZl cmVuY2U/KS4KPiAKPiB0aGVyZSdzIG9ubHkgYSBzaW5nbGUgY2FsbGVyIHRoYXQgZG9lcyAoaW50 cm9kdWNlZCBieSBhIGxhdGVyIHBhdGNoKSBhbmQKPiB0aGF0IG9uZSBjb25zdHJ1Y3RzIHRoZSBo YXNoIHJlZmVyZW5jZSByaWdodCBhdCB0aGUgY2FsbCBzaXRlLCBzbyB1bmxlc3MKPiBJIGFtIG1p c3Npbmcgc29tZXRoaW5nIHRoaXMgc2VlbXMgYSBiaXQgb3ZlcmtpbGwuLgoKUmlnaHQsIEkgZGlk bid0IHRoaW5rIGFib3V0IHRoaXMgY2xlYXJseSBlbm91Z2ggYW5kIHRoaXMgY291bGQgdmVyeSB3 ZWxsIApiZSBqdXN0IGEgZGlyZWN0IHdyaXRlIHRvIHRoZSBwYXNzZWQgaGFzaCBoZXJlLgoKV2ls bCBjaGFuZ2UgdGhhdCBpbiB0aGUgdjEhCgo+IAo+PiArICAgICRteV9vcHRzLT57dHlwZX0gPSAn Y29sb2NhdGlvbic7Cj4+ICsKPj4gKyAgICBQVkU6OkhBOjpSdWxlczo6Zm9yZWFjaF9zZXJ2aWNl X3J1bGUoJHJ1bGVzLCAkZnVuYywgJG15X29wdHMpOwo+PiArfQo+PiArCj4+ICtzdWIgc3BsaXRf Y29sb2NhdGlvbl9ydWxlcyB7Cj4+ICsgICAgbXkgKCRydWxlcykgPSBAXzsKPj4gKwo+PiArICAg IG15ICRwb3NpdGl2ZV9ydWxlaWRzID0gW107Cj4+ICsgICAgbXkgJG5lZ2F0aXZlX3J1bGVpZHMg PSBbXTsKPj4gKwo+PiArICAgIGZvcmVhY2hfY29sb2NhdGlvbl9ydWxlKCRydWxlcywgc3ViIHsK Pj4gKwlteSAoJHJ1bGUsICRydWxlaWQpID0gQF87Cj4+ICsKPj4gKwlteSAkcnVsZWlkX3NldCA9 ICRydWxlLT57YWZmaW5pdHl9IGVxICd0b2dldGhlcicgPyAkcG9zaXRpdmVfcnVsZWlkcyA6ICRu ZWdhdGl2ZV9ydWxlaWRzOwo+PiArCXB1c2ggQCRydWxlaWRfc2V0LCAkcnVsZWlkOwo+PiArICAg IH0pOwo+PiArCj4+ICsgICAgcmV0dXJuICgkcG9zaXRpdmVfcnVsZWlkcywgJG5lZ2F0aXZlX3J1 bGVpZHMpOwo+PiArfQo+PiArCj4+ICs9aGVhZDMgY2hlY2tfc2VydmljZV9jb3VudCgkcnVsZXMp Cj4+ICsKPj4gK1JldHVybnMgYSBsaXN0IG9mIGNvbmZsaWN0cyBjYXVzZWQgYnkgY29sb2NhdGlv biBydWxlcywgd2hpY2ggZG8gbm90IGhhdmUKPj4gK2Vub3VnaCBzZXJ2aWNlcyBpbiB0aGVtLCBk ZWZpbmVkIGluIEM8JHJ1bGVzPi4KPj4gKwo+PiArSWYgdGhlcmUgYXJlIG5vIGNvbmZsaWN0cywg dGhlIHJldHVybmVkIGxpc3QgaXMgZW1wdHkuCj4+ICsKPj4gKz1jdXQKPj4gKwo+PiArc3ViIGNo ZWNrX3NlcnZpY2VzX2NvdW50IHsKPj4gKyAgICBteSAoJHJ1bGVzKSA9IEBfOwo+PiArCj4+ICsg ICAgbXkgJGNvbmZsaWN0cyA9IFtdOwo+PiArCj4+ICsgICAgZm9yZWFjaF9jb2xvY2F0aW9uX3J1 bGUoJHJ1bGVzLCBzdWIgewo+PiArCW15ICgkcnVsZSwgJHJ1bGVpZCkgPSBAXzsKPj4gKwo+PiAr CXB1c2ggQCRjb25mbGljdHMsICRydWxlaWQgaWYgKHNjYWxhcihrZXlzICV7JHJ1bGUtPntzZXJ2 aWNlc319KSA8IDIpOwo+PiArICAgIH0pOwo+PiArCj4+ICsgICAgcmV0dXJuICRjb25mbGljdHM7 Cj4+ICt9Cj4gCj4gaXMgdGhpcyByZWFsbHkgYW4gaXNzdWU/IGEgY29sb2NhdGlvbiBydWxlIHdp dGggYSBzaW5nbGUgc2VydmljZSBpcyBqdXN0Cj4gYSBub3A/IHRoZXJlJ3MgY3VycmVudGx5IG5v IGNsZWFudXAgQUZBSUNUIGlmIGEgcmVzb3VyY2UgaXMgcmVtb3ZlZCwgYnV0CgpZb3UncmUgcmln aHQsIEFGQUlDUyB0aG9zZSBhcmUgYSBub29wIHdoZW4gc2VsZWN0aW5nIHRoZSBzZXJ2aWNlIG5v ZGUuIEkgCmd1ZXNzIEkgd2FzIGEgbGl0dGxlIHBlZGFudGljIC8gb3ZlcnByb3RlY3RpdmUgaGVy ZSBhYm91dCB3aGljaCBydWxlcyAKbWFrZSBzZW5zZSBpbiBnZW5lcmFsIGluc3RlYWQgb2Ygd2hh dCB0aGUgYWxnb3JpdGhtIGRvZXMgaW4gdGhlIGVuZC4KCkFuZCBnb29kIHBvaW50IGFib3V0IGhh bmRsaW5nIHdoZW4gcmVzb3VyY2VzIGFyZSByZW1vdmVkLCBhZGRpbmcgdGhhdCB0byAKZGVsZXRl X3NlcnZpY2VfZnJvbV9jb25maWcgY29tZXMgcmlnaHQgb24gbXkgVE9ETyBsaXN0IGZvciB0aGUg djEhCgo+IGlmIHdlIGFkZCB0aGF0IHBhcnQgKHdlIG1heWJlIHNob3VsZD8pIHRoZW4gb25lIGNh biBlYXNpbHkgZW5kIHVwIGluIGEKPiBzaXR1YXRpb24gd2hlcmUgYSBydWxlIHRlbXBvcmFyaWx5 IGNvbnRhaW5zIGEgc2luZ2xlIG9yIG5vIHNlcnZpY2U/CgpIbSwgeWVzLCBlc3BlY2lhbGx5IGlm IHdlIGFkZCBwb29scy90YWdzIGF0IGEgbGF0ZXIgcG9pbnQgdG8gc2VsZWN0IApzZXJ2aWNlcyBm b3IgdGhlIHJ1bGUsIHRoZW4gdGhpcyBjb3VsZCBoYXBwZW4gdmVyeSBlYXNpbHkuIEJ1dCBhcyB5 b3UgCmFscmVhZHkgbWVudGlvbmVkLCB0aG9zZSB0d28gY2FzZXMgd291bGQgYmUgbm9vcHMgdG9v LgoKTmV2ZXJ0aGVsZXNzLCBzaG91bGQgd2UgZHJvcCB0aGlzPyBJIHRoaW5rIGl0IGNvdWxkIGJl bmVmaXQgdXNlcnMgaW4gCmlkZW50aWZ5aW5nIHRoYXQgc29tZSBydWxlcyBtaWdodCBub3QgZG8g c29tZXRoaW5nIHRoZXkgd2FudGVkIGFuZCBnaXZlIAp0aGVtIGEgcmVhc29uIHdoeSwgaS5lLiB0 aGVyZSdzIG9ubHkgb25lIHNlcnZpY2UgaW4gdGhlcmUsIGJ1dCBhdCB0aGUgCnNhbWUgdGltZSBp dCBjb3VsZCBiZSBhIGxpdHRsZSBub2lzeSBpZiB0aGVyZSBhcmUgYSBsb3Qgb2YgYWZmZWN0ZWQg cnVsZXMuCgo+IAo+PiArCj4+ICs9aGVhZDMgY2hlY2tfcG9zaXRpdmVfaW50cmFuc2l0aXZpdHko JHJ1bGVzKQo+PiArCj4+ICtSZXR1cm5zIGEgbGlzdCBvZiBjb25mbGljdHMgY2F1c2VkIGJ5IHRy YW5zaXRpdmUgcG9zaXRpdmUgY29sb2NhdGlvbiBydWxlcwo+PiArZGVmaW5lZCBpbiBDPCRydWxl cz4uCj4+ICsKPj4gK1RyYW5zaXRpdmUgcG9zaXRpdmUgY29sb2NhdGlvbiBydWxlcyBleGlzdCwg aWYgdGhlcmUgYXJlIGF0IGxlYXN0IHR3byBwb3NpdGl2ZQo+PiArY29sb2NhdGlvbiBydWxlcyB3 aXRoIHRoZSBzYW1lIHN0cmljdG5lc3MsIHdoaWNoIHB1dCBhdCBsZWFzdCB0aGUgc2FtZSB0d28K Pj4gK3NlcnZpY2VzIGluIHJlbGF0aW9uLiBUaGlzIG1lYW5zLCB0aGF0IHRoZXNlIHJ1bGVzIGNh biBiZSBtZXJnZWQgdG9nZXRoZXIuCj4+ICsKPj4gK0lmIHRoZXJlIGFyZSBubyBjb25mbGljdHMs IHRoZSByZXR1cm5lZCBsaXN0IGlzIGVtcHR5Lgo+IAo+IFRoZSB0ZXJtaW5vbG9neSBoZXJlIGlz IHF1aXQgY29uZnVzaW5nIC0gY29uZmxpY3QgbWVhbmluZyB0aGF0IHR3byBydWxlcwo+IGFyZSAi dHJhbnNpdGl2ZSIgYW5kIHRodXMgbWVyZ2VhYmxlICh3aGljaCBpcyBnb29kLCBjYXVzZSBpdCBt YWtlcwo+IHRoaW5ncyBlYXNpZXIgdG8gaGFuZGxlPykgaXMgcXVpdGUgd2VpcmQsIGFzICJjb25m bGljdCIgaXMgYSByYXRoZXIKPiBuZWdhdGl2ZSB0ZXJtLi4KPiAKPiB0aGVyZSdzIG9ubHkgYSBz aW5nbGUgY2FsbCBzaXRlIGluIHRoZSBzYW1lIG1vZHVsZSwgbWF5YmUgd2UgY291bGQganVzdAo+ IHJlbmFtZSB0aGlzIGludG8gImZpbmRfbWVyZ2VhYmxlX3Bvc2l0aXZlX3J1bGVpZHMiLCBzaW1p bGFyIHRvIHRoZQo+IHZhcmlhYmxlIHdoZXJlIHRoZSByZXN1bHQgaXMgc3RvcmVkPwoKWWVhaCwg SSB3YXMgcHJvYmFibHkgdG8ga2VlbiBvbiB0aGUgYCRjb25mbGljdCA9IGNoZWNrX3NvbWV0aGlu ZyguLi4pYCAKcGF0dGVybiBoZXJlLCBidXQgaXQgd291bGQgYmUgbXVjaCBtb3JlIHJlYWRhYmxl IHdpdGggYSBzaW1wbGVyIG5hbWUsIApJJ2xsIGNoYW5nZSB0aGF0IGZvciB0aGUgdjEhCgotLS0t LQoKQWQgd2h5OiBJJ2xsIGFsc28gYWRkIHNvbWUgZG9jdW1lbnRhdGlvbiBhYm91dCB0aGUgcmF0 aW9uYWxlIHdoeSB0aGlzIGlzIApuZWVkZWQgaW4gdGhlIGZpcnN0IHBsYWNlLgoKVGhlIG1haW4g cmVhc29uIHdhcyBiZWNhdXNlIHRoZSBsYXR0ZXIgcnVsZSBjaGVjayAKJ2NoZWNrX2lubmVyX2Nv bnNpc3RlbmN5JyBkZXBlbmRzIG9uIHRoZSBmYWN0IHRoYXQgdGhlIHBvc2l0aXZlIApjb2xvY2F0 aW9uIHJ1bGVzIGhhdmUgYmVlbiBtZXJnZWQgYWxyZWFkeSwgYXMgaXQgYXNzdW1lcyB0aGF0IGVh Y2ggCnBvc2l0aXZlIGNvbG9jYXRpb24gcnVsZSBoYXMgYWxsIG9mIHRoZSBzZXJ2aWNlcyBpbiB0 aGVyZSwgd2hpY2ggYXJlIApwb3NpdGl2ZWx5IGNvbG9jYXRlZC4gSWYgaXQgd2VyZW4ndCBzbywg aXQgd291bGRuJ3QgZGV0ZWN0IHRoYXQgdGhlIApmb2xsb3dpbmcgdGhyZWUgcnVsZXMgYXJlIGlu Y29uc2lzdGVudCB3aXRoIGVhY2ggb3RoZXI6Cgpjb2xvY2F0aW9uOiBzdGljay10b2dldGhlcjEK ICAgICBzZXJ2aWNlcyB2bToxMDEsdm06MTA0CiAgICAgYWZmaW5pdHkgdG9nZXRoZXIKICAgICBz dHJpY3QgMQoKY29sb2NhdGlvbjogc3RpY2stdG9nZXRoZXIyCiAgICAgc2VydmljZXMgdm06MTA0 LHZtOjEwMgogICAgIGFmZmluaXR5IHRvZ2V0aGVyCiAgICAgc3RyaWN0IDEKCmNvbG9jYXRpb246 IGtlZXAtYXBhcnQKICAgICBzZXJ2aWNlcyB2bToxMDEsdm06MTAyLHZtOjEwMwogICAgIGFmZmlu aXR5IHNlcGFyYXRlCiAgICAgc3RyaWN0IDEKClRoaXMgcmVkdWNlcyB0aGUgY29tcGxleGl0eSBv ZiB0aGUgbG9naWMgYSBsaXR0bGUgaW4gCidjaGVja19pbm5lcl9jb25zaXN0ZW5jeScgYXMgdGhl cmUgaXQgZG9lc24ndCBoYXZlIHRvIGhhbmRsZSB0aGlzIApzcGVjaWFsIGNhc2UgYXMgJ3N0aWNr LXRvZ2V0aGVyMScgYW5kICdzdGljay10b2dldGhlcjInIGFyZSBhbHJlYWR5IAptZXJnZWQgaW4g dG8gb25lIGFuZCBpdCBpcyBlYXNpbHkgYXBwYXJlbnQgdGhhdCB2bSAxMDEgYW5kIHZtIDEwMiBj YW5ub3QgCmJlIGNvbG9jYXRlZCBhbmQgbm9uLWNvbG9jYXRlZCBhdCB0aGUgc2FtZSB0aW1lLgoK LS0tLS0KCkFsc28sIEkgd2FzIGN1cmlvdXMgYWJvdXQgaG93IHRoYXQgd291bGQgd29yayBvdXQg Zm9yIHRoZSBjYXNlIHdoZXJlIGEgCm5lZ2F0aXZlIGNvbG9jYXRpb24gcnVsZSB3YXMgZGVmaW5l ZCBmb3IgdGhyZWUgbm9kZXMgd2l0aCB0aG9zZSBydWxlcyAKc3BsaXQgaW50byB0aHJlZSBydWxl cyAoZXNzZW50aWFsbHkgYSBjeWNsZSBkZXBlbmRlbmNlKS4gVGhpcyBzaG91bGQgaW4gCnRoZW9y eSBoYXZlIHRoZSBzYW1lIHNlbWFudGljcyBhcyB0aGUgYWJvdmUgcnVsZSBzZXQ6Cgpjb2xvY2F0 aW9uOiBzdGljay10b2dldGhlcjEKICAgICBzZXJ2aWNlcyB2bToxMDEsdm06MTA0CiAgICAgYWZm aW5pdHkgdG9nZXRoZXIKICAgICBzdHJpY3QgMQoKY29sb2NhdGlvbjogc3RpY2stdG9nZXRoZXIy CiAgICAgc2VydmljZXMgdm06MTA0LHZtOjEwMgogICAgIGFmZmluaXR5IHRvZ2V0aGVyCiAgICAg c3RyaWN0IDEKCmNvbG9jYXRpb246IHZlcnktbG9uZWx5LXNlcnZpY2VzMQogICAgIHNlcnZpY2Vz IHZtOjEwMSx2bToxMDIKICAgICBhZmZpbml0eSBzZXBhcmF0ZQogICAgIHN0cmljdCAxCgpjb2xv Y2F0aW9uOiB2ZXJ5LWxvbmVseS1zZXJ2aWNlczIKICAgICBzZXJ2aWNlcyB2bToxMDIsdm06MTAz CiAgICAgYWZmaW5pdHkgc2VwYXJhdGUKICAgICBzdHJpY3QgMQoKY29sb2NhdGlvbjogdmVyeS1s b25lbHktc2VydmljZXMzCiAgICAgc2VydmljZXMgdm06MTAxLHZtOjEwMwogICAgIGFmZmluaXR5 IHNlcGFyYXRlCiAgICAgc3RyaWN0IDEKCldpdGhvdXQgdGhlIG1lcmdlIG9mIHBvc2l0aXZlIHJ1 bGVzLCAnY2hlY2tfaW5uZXJfY29uc2lzdGVuY3knIHdvdWxkIAphZ2FpbiBub3QgZGV0ZWN0IHRo ZSBpbmNvbnNpc3RlbmN5IGhlcmUuIEJ1dCB3aXRoIHRoZSBtZXJnZSBjb3JyZWN0bHkgCmFwcGxp ZWQgYmVmb3JlIGNoZWNraW5nIHRoZSBjb25zaXN0ZW5jeSwgdGhpcyB3b3VsZCBiZSByZXNvbHZl ZCBhbmQgdGhlIAplZmZlY3RpdmUgcnVsZSBzZXQgd291bGQgYmU6Cgpjb2xvY2F0aW9uOiB2ZXJ5 LWxvbmVseS1zZXJ2aWNlczIKICAgICBzZXJ2aWNlcyB2bToxMDIsdm06MTAzCiAgICAgYWZmaW5p dHkgc2VwYXJhdGUKICAgICBzdHJpY3QgMQoKY29sb2NhdGlvbjogdmVyeS1sb25lbHktc2Vydmlj ZXMzCiAgICAgc2VydmljZXMgdm06MTAxLHZtOjEwMwogICAgIGFmZmluaXR5IHNlcGFyYXRlCiAg ICAgc3RyaWN0IDEKCkl0IGNvdWxkIGJlIGFyZ3VlZCwgdGhhdCB0aGUgbmVnYXRpdmUgY29sb2Nh dGlvbiBydWxlcyBzaG91bGQgYmUgbWVyZ2VkIAppbiBhIHNpbWlsYXIgbWFubmVyIGhlcmUsIGFz IHRoZXJlJ3Mgbm93IGEgImVmZmVjdGl2ZSIgZGlmZmVyZW5jZSBpbiB0aGUgCnNlbWFudGljcyBv ZiB0aGUgYWJvdmUgcnVsZSBzZXRzLCBhcyB0aGUgbmVnYXRpdmUgY29sb2NhdGlvbiBydWxlIApi ZXR3ZWVuIHZtIDEwMSBhbmQgdm0gMTAzIGFuZCB2bSAxMDIgYW5kIHZtIDEwMyByZW1haW5zLgoK V2hhdCBkbyB5b3UgdGhpbms/Cgo+IAo+PiArCj4+ICs9Y3V0Cj4+ICsKPj4gK3N1YiBjaGVja19w b3NpdGl2ZV9pbnRyYW5zaXRpdml0eSB7Cj4+ICsgICAgbXkgKCRydWxlcykgPSBAXzsKPj4gKwo+ PiArICAgIG15ICRjb25mbGljdHMgPSB7fTsKPj4gKyAgICBteSAoJHBvc2l0aXZlX3J1bGVpZHMp ID0gc3BsaXRfY29sb2NhdGlvbl9ydWxlcygkcnVsZXMpOwo+PiArCj4+ICsgICAgd2hpbGUgKG15 ICRvdXRlcmlkID0gc2hpZnQoQCRwb3NpdGl2ZV9ydWxlaWRzKSkgewo+PiArCW15ICRvdXRlciA9 ICRydWxlcy0+e2lkc30tPnskb3V0ZXJpZH07Cj4+ICsKPj4gKwlmb3IgbXkgJGlubmVyaWQgKEAk cG9zaXRpdmVfcnVsZWlkcykgewo+IAo+IHNvIHRoaXMgaXMgaW4gcHJhY3RpY2UgYSBzb3J0IG9m ICJvcHRpbWl6ZWQiIGxvb3Agb3ZlciBhbGwgcGFpcnMgb2YKPiBydWxlcyAtIGl0ZXJhdGluZyBv dmVyIHRoZSBwb3NpdGl2ZSBydWxlcyB0d2ljZSwgYnV0IHNraXBwaW5nIHBhaXJzIHRoYXQKPiB3 ZXJlIGFscmVhZHkgdmlzaXRlZCBieSB2aXJ0dWUgb2YgdGhlIHNoaWZ0IG9uIHRoZSBvdXRlciBs b29wLi4KPiAKPiBtaWdodCBiZSB3b3J0aCBhIHNob3J0IG5vdGUsIHRvZ2V0aGVyIHdpdGggdGhl ICRpbm5lciBhbmQgJG91dGVyCj4gdGVybWlub2xvZ3kgSSB3YXMgYSBiaXQgY29uZnVzZWQgYXQg Zmlyc3QuLgoKU29ycnksIEknbGwgbWFrZSB0aGF0IGNsZWFyZXIgaW4gYSBjb21tZW50IGFib3Zl IG9yIHdpdGggYmV0dGVyIG5hbWluZyAKb2YgdGhlIHZhcmlhYmxlcyEKClRoZSBgd2hpbGUoc2hp ZnQgLi4uKWAgd2FzIG1vdGl2YXRlZCBieSBub3QgaGF2aW5nIHRvIHBydW5lIGR1cGxpY2F0ZXMg CmFmdGVyd2FyZHMgYW5kIG9mIGNvdXJzZSBub3QgaGF2aW5nIHRvIGNoZWNrIHRoZSBzYW1lIHJ1 bGVzIGFnYWluLCBidXQgCmxhY2tzIGEgbGl0dGxlIGluIHJlYWRhYmlsaXR5IGhlcmUuCgo+IAo+ PiArCSAgICBteSAkaW5uZXIgPSAkcnVsZXMtPntpZHN9LT57JGlubmVyaWR9Owo+PiArCj4+ICsJ ICAgIG5leHQgaWYgJG91dGVyaWQgZXEgJGlubmVyaWQ7Cj4+ICsJICAgIG5leHQgaWYgJG91dGVy LT57c3RyaWN0fSAhPSAkaW5uZXItPntzdHJpY3R9Owo+PiArCSAgICBuZXh0IGlmIFBWRTo6SEE6 OlRvb2xzOjppc19kaXNqb2ludCgkb3V0ZXItPntzZXJ2aWNlc30sICRpbm5lci0+e3NlcnZpY2Vz fSk7Cj4+ICsKPj4gKwkgICAgcHVzaCBAeyRjb25mbGljdHMtPnskb3V0ZXJpZH19LCAkaW5uZXJp ZDsKPj4gKwl9Cj4+ICsgICAgfQo+PiArCj4+ICsgICAgcmV0dXJuICRjb25mbGljdHM7Cj4+ICt9 Cj4+ICsKPj4gKz1oZWFkMyBjaGVja19pbm5lcl9jb25zaXN0ZW5jeSgkcnVsZXMpCj4+ICsKPj4g K1JldHVybnMgYSBsaXN0IG9mIGNvbmZsaWN0cyBjYXVzZWQgYnkgaW5jb25zaXN0ZW5jaWVzIGJl dHdlZW4gcG9zaXRpdmUgYW5kCj4+ICtuZWdhdGl2ZSBjb2xvY2F0aW9uIHJ1bGVzIGRlZmluZWQg aW4gQzwkcnVsZXM+Lgo+PiArCj4+ICtJbm5lciBpbmNvbnNpc3RlbnQgY29sb2NhdGlvbiBydWxl cyBleGlzdCwgaWYgdGhlcmUgYXJlIGF0IGxlYXN0IHRoZSBzYW1lIHR3bwo+PiArc2VydmljZXMg aW4gYSBwb3NpdGl2ZSBhbmQgYSBuZWdhdGl2ZSBjb2xvY2F0aW9uIHJlbGF0aW9uLCB3aGljaCBp cyBhbgo+PiAraW1wb3NzaWJsZSBjb25zdHJhaW50IGFzIHRoZXkgYXJlIG9wcG9zaXRlcyBvZiBl YWNoIG90aGVyLgo+PiArCj4+ICtJZiB0aGVyZSBhcmUgbm8gY29uZmxpY3RzLCB0aGUgcmV0dXJu ZWQgbGlzdCBpcyBlbXB0eS4KPiAKPiBoZXJlIHRoZSBjb25mbGljdHMgYW5kIGNoZWNrIHRlcm1p bm9sb2d5IG1ha2VzIHNlbnNlIC0gd2UgYXJlIGNoZWNraW5nCj4gYW4gaW52YXJpYW50IHRoYXQg bXVzdCBiZSBzYXRpc2ZpZWQgYWZ0ZXIgYWxsIDopCj4gCj4+ICsKPj4gKz1jdXQKPj4gKwo+PiAr c3ViIGNoZWNrX2lubmVyX2NvbnNpc3RlbmN5IHsKPiAKPiBidXQgJ2lubmVyJyBpcyBhIHdlaXJk IHRlcm0gc2luY2UgdGhpcyBpcyBjb25zaXN0ZW5jeSBiZXR3ZWVuIHJ1bGVzPwo+IAo+IGl0IGJh c2ljYWxseSBjaGVja3MgdGhhdCBubyBwYWlyIG9mIHNlcnZpY2VzIHNob3VsZCBib3RoIGJlIGNv bG9jYXRlZAo+IGFuZCBub3QgYmUgY29sb2NhdGVkIGF0IHRoZSBzYW1lIHRpbWUsIGJ1dCBub3Qg c3VyZSBob3cgdG8gZW5jb2RlIHRoYXQKPiBjb25jaXNlbHkuLgoKSG0gcmlnaHQsICdpbnRyYScg d291bGRuJ3QgbWFrZSB0aGlzIGFueSBzaW1wbGVyLiBJJ2xsIGNvbWUgdXAgd2l0aCBhIApiZXR0 ZXIgbmFtZSBmb3IgdGhlIG5leHQgcmV2aXNpb24hCgo+IAo+PiArICAgIG15ICgkcnVsZXMpID0g QF87Cj4+ICsKPj4gKyAgICBteSAkY29uZmxpY3RzID0gW107Cj4+ICsgICAgbXkgKCRwb3NpdGl2 ZV9ydWxlaWRzLCAkbmVnYXRpdmVfcnVsZWlkcykgPSBzcGxpdF9jb2xvY2F0aW9uX3J1bGVzKCRy dWxlcyk7Cj4+ICsKPj4gKyAgICBmb3IgbXkgJG91dGVyaWQgKEAkcG9zaXRpdmVfcnVsZWlkcykg ewo+PiArCW15ICRvdXRlciA9ICRydWxlcy0+e2lkc30tPnskb3V0ZXJpZH0tPntzZXJ2aWNlc307 Cj4gCj4gcy9vdXRlci9wb3NpdGl2ZSA/CgpBQ0sgZm9yIHRoaXMgYW5kIGFsbCB0aGUgZm9sbG93 aW5nIGluc3RhbmNlcyA7KQoKPiAKPj4gKwo+PiArCWZvciBteSAkaW5uZXJpZCAoQCRuZWdhdGl2 ZV9ydWxlaWRzKSB7Cj4+ICsJICAgIG15ICRpbm5lciA9ICRydWxlcy0+e2lkc30tPnskaW5uZXJp ZH0tPntzZXJ2aWNlc307Cj4gCj4gcy9pbm5lci9uZWdhdGl2ZSA/Cj4gCj4+ICsKPj4gKwkgICAg bXkgJGludGVyc2VjdGlvbiA9IFBWRTo6SEE6OlRvb2xzOjppbnRlcnNlY3QoJG91dGVyLCAkaW5u ZXIpOwo+PiArCSAgICBuZXh0IGlmIHNjYWxhcihrZXlzICUkaW50ZXJzZWN0aW9uIDwgMik7Cj4g Cj4gdGhlIGtleXMgdGhlcmUgaXMgbm90IG5lZWRlZCwgYnV0IHRoZSBwYXJlbnRoZXNlcyBhcmUg aW4gdGhlIHdyb25nIHBsYWNlCj4gaW5zdGVhZCA7KSBpdCBkb2VzIHdvcmsgYnkgYWNjaWRlbnQg dGhvdWdoLCBiZWNhdXNlIHRoZSByZXN1bHQgb2Yga2V5cwo+IHdpbGwgYmUgY29lcmNlZCB0byBh IHNjYWxhciBhbnl3YXksIHNvIHlvdSBnZXQgdGhlIHJlc3VsdCBvZiB5b3VyCj4gY29tcGFyaXNv biB3cmFwcGVkIGJ5IGFub3RoZXIgY2FsbCB0byBzY2FsYXIsIHNvIHlvdSBlbmQgdXAgd2l0aCBl aXRoZXIKPiAxIG9yICcnIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBjaGVjayB3YXMgdHJ1ZSBv ciBmYWxzZS4uCgpPaCwgd2hhdCBhIGx1Y2sgY29pbmNpZGVuY2UgOykhIFRoYW5rcyBmb3IgY2F0 Y2hpbmcgdGhhdCwgSSdsbCBmaXggdGhhdCEKCj4gCj4+ICsKPj4gKwkgICAgcHVzaCBAJGNvbmZs aWN0cywgWyRvdXRlcmlkLCAkaW5uZXJpZF07Cj4+ICsJfQo+PiArICAgIH0KPj4gKwo+PiArICAg IHJldHVybiAkY29uZmxpY3RzOwo+PiArfQo+PiArCj4+ICs9aGVhZDMgY2hlY2tfcG9zaXRpdmVf Z3JvdXBfY29uc2lzdGVuY3koLi4uKQo+PiArCj4+ICtSZXR1cm5zIGEgbGlzdCBvZiBjb25mbGlj dHMgY2F1c2VkIGJ5IGluY29uc2lzdGVuY2llcyBiZXR3ZWVuIHBvc2l0aXZlCj4+ICtjb2xvY2F0 aW9uIHJ1bGVzIGRlZmluZWQgaW4gQzwkcnVsZXM+IGFuZCBub2RlIHJlc3RyaWN0aW9ucyBkZWZp bmVkIGluCj4+ICtDPCRncm91cHM+IGFuZCBDPCRzZXJ2aWNlPi4KPiAKPiBzZXJ2aWNlcz8KCkFD Sy4KCj4gCj4+ICsKPj4gK0EgcG9zaXRpdmUgY29sb2NhdGlvbiBydWxlIGluY29uc2lzdGVuY3kg d2l0aCBncm91cHMgZXhpc3RzLCBpZiBhdCBsZWFzdCB0d28KPj4gK3NlcnZpY2VzIGluIGEgcG9z aXRpdmUgY29sb2NhdGlvbiBydWxlIGFyZSByZXN0cmljdGVkIHRvIGRpc2pvaW50IHNldHMgb2YK Pj4gK25vZGVzLCBpLmUuIHRoZXkgYXJlIGluIHJlc3RyaWN0ZWQgSEEgZ3JvdXBzLCB3aGljaCBo YXZlIGEgZGlzam9pbnQgc2V0IG9mCj4+ICtub2Rlcy4KPj4gKwo+PiArSWYgdGhlcmUgYXJlIG5v IGNvbmZsaWN0cywgdGhlIHJldHVybmVkIGxpc3QgaXMgZW1wdHkuCj4+ICsKPj4gKz1jdXQKPj4g Kwo+PiArc3ViIGNoZWNrX3Bvc2l0aXZlX2dyb3VwX2NvbnNpc3RlbmN5IHsKPj4gKyAgICBteSAo JHJ1bGVzLCAkZ3JvdXBzLCAkc2VydmljZXMsICRwb3NpdGl2ZV9ydWxlaWRzLCAkY29uZmxpY3Rz KSA9IEBfOwo+IAo+IHRoaXMgY291bGQganVzdCBnZXQgJHBvc2l0aXZlX3J1bGVzIChmaWx0ZXJl ZCB2aWEgZ3JlcCkgaW5zdGVhZD8KPiAKPj4gKwo+PiArICAgIGZvciBteSAkcnVsZWlkIChAJHBv c2l0aXZlX3J1bGVpZHMpIHsKPj4gKwlteSAkcnVsZV9zZXJ2aWNlcyA9ICRydWxlcy0+e2lkc30t PnskcnVsZWlkfS0+e3NlcnZpY2VzfTsKPiAKPiBhbmQgdGhpcyBjb3VsZCBiZQo+IAo+IHdoaWxl IChteSAoJHJ1bGVpZCwgJHJ1bGUpID0gZWFjaCAlJHBvc2l0aXZlX3J1bGVzKSB7Cj4gICAgbXkg JG5vZGVzOwo+ICAgIC4uCj4gfQoKVGhhbmtzIGZvciB0aGUgc3VnZ2VzdGlvbiBoZXJlIGFuZCBh Ym92ZSwgd2lsbCB1c2UgdGhhdCBmb3IgdGhlIHYxIQoKPiAKPj4gKwlteSAkbm9kZXM7Cj4+ICsK Pj4gKwlmb3IgbXkgJHNpZCAoa2V5cyAlJHJ1bGVfc2VydmljZXMpIHsKPj4gKwkgICAgbXkgJGdy b3VwaWQgPSAkc2VydmljZXMtPnskc2lkfS0+e2dyb3VwfTsKPj4gKwkgICAgcmV0dXJuIGlmICEk Z3JvdXBpZDsKPiAKPiBzaG91bGQgdGhpcyByZWFsbHkgYmUgYSByZXR1cm4/CgpPb3BzLCBubyB0 aGF0IHNob3VsZG4ndCBiZSBhIHJldHVybiwgYnV0IGEgbmV4dCBvYnZpb3VzbHkuIEZvcmdvdCB0 byAKY2hhbmdlIHRoZW0gYmFjayBhZnRlciBJIG1vdmVkIHRoZW0gYmFjayBmcm9tIGEgaGFuZGxl ciAoc2luY2UgdGhlcmUncyAKbWluaW1hbCBkdXBsaWNhdGVkIGNvZGUgd2l0aCB0aGUgbmV4dCBz dWJyb3V0aW5lKS4gSSdsbCBjaGFuZ2UgdGhpcyBhbmQgCmFsbCB0aGUgb3RoZXIgaW5zdGFuY2Vz IGZvciB0aGUgdjEuCgo+IAo+PiArCj4+ICsJICAgIG15ICRncm91cCA9ICRncm91cHMtPntpZHN9 LT57JGdyb3VwaWR9Owo+PiArCSAgICByZXR1cm4gaWYgISRncm91cDsKPj4gKwkgICAgcmV0dXJu IGlmICEkZ3JvdXAtPntyZXN0cmljdGVkfTsKPiAKPiBzYW1lIGhlcmU/Cj4gCj4+ICsKPj4gKwkg ICAgJG5vZGVzID0geyBtYXAgeyAkXyA9PiAxIH0ga2V5cyAleyRncm91cC0+e25vZGVzfX0gfSBp ZiAhZGVmaW5lZCgkbm9kZXMpOwo+IAo+IGlzbid0ICRncm91cC0+e25vZGVzfSBhbHJlYWR5IGEg aGFzaCBzZXQgb2YgdGhlIGRlc2lyZWQgZm9ybWF0PyBzbyB0aGlzIGNvdWxkIGJlCj4gCj4gJG5v ZGVzID0geyAkZ3JvdXAtPntub2Rlc30tPiUqIH07Cj4gCj4gPwoKUmlnaHQsIHllcyBpdCBpcyEK Ckkgd2FzIHN0aWxsIHNvbWV3aGF0IGNvbmZ1c2VkIGFib3V0IHdoYXQgdGhlIC0+JSogb3BlcmF0 aW9uIGV4YWN0bHkgZGlkIApvciBkaWQgbm90IHJlYWxseSBrbm93IHRoYXQgaXQgZXhpc3RlZCBi ZWZvcmUsIGJ1dCBJIG5vdyBJIGZpbmFsbHkgCmxvb2tlZCB1cCBhYm91dCBwb3N0Zml4IGRlcmVm ZXJlbmNpbmcgOykuCgo+IAo+PiArCSAgICAkbm9kZXMgPSBQVkU6OkhBOjpUb29sczo6aW50ZXJz ZWN0KCRub2RlcywgJGdyb3VwLT57bm9kZXN9KTsKPiAKPiBjb3VsZCBhZGQgYSBicmVhayBoZXJl IHdpdGggdGhlIHNhbWUgY29uZGl0aW9uIGFzIGJlbG93PwoKUmlnaHQgZm9yIHRoaXMgYW5kIHRo ZSBzYW1lIGNvbW1lbnQgZm9yIApgY2hlY2tfbmVnYXRpdmVfZ3JvdXBfY29uc2lzdGVuY3lgLCBJ J2xsIGRlZmluaXRlbHkgYWxzbyBhZGQgYSBjb21tZW50IAphYm92ZSB0aGF0IHRvIG1ha2UgaXQg Y2xlYXIgd2h5LiBUaGFua3MgZm9yIHRoZSBzdWdnZXN0aW9uIQoKPiAKPj4gKwl9Cj4+ICsKPj4g KwlpZiAoZGVmaW5lZCgkbm9kZXMpICYmIHNjYWxhciBrZXlzICUkbm9kZXMgPCAxKSB7Cj4+ICsJ ICAgIHB1c2ggQCRjb25mbGljdHMsIFsncG9zaXRpdmUnLCAkcnVsZWlkXTsKPj4gKwl9Cj4+ICsg ICAgfQo+PiArfQo+PiArCj4+ICs9aGVhZDMgY2hlY2tfbmVnYXRpdmVfZ3JvdXBfY29uc2lzdGVu Y3koLi4uKQo+PiArCj4+ICtSZXR1cm5zIGEgbGlzdCBvZiBjb25mbGljdHMgY2F1c2VkIGJ5IGlu Y29uc2lzdGVuY2llcyBiZXR3ZWVuIG5lZ2F0aXZlCj4+ICtjb2xvY2F0aW9uIHJ1bGVzIGRlZmlu ZWQgaW4gQzwkcnVsZXM+IGFuZCBub2RlIHJlc3RyaWN0aW9ucyBkZWZpbmVkIGluCj4+ICtDPCRn cm91cHM+IGFuZCBDPCRzZXJ2aWNlPi4KPj4gKwo+PiArQSBuZWdhdGl2ZSBjb2xvY2F0aW9uIHJ1 bGUgaW5jb25zaXN0ZW5jeSB3aXRoIGdyb3VwcyBleGlzdHMsIGlmIGF0IGxlYXN0IHR3bwo+PiAr c2VydmljZXMgaW4gYSBuZWdhdGl2ZSBjb2xvY2F0aW9uIHJ1bGUgYXJlIHJlc3RyaWN0ZWQgdG8g bGVzcyBub2RlcyBpbiB0b3RhbAo+PiArdGhhbiBzZXJ2aWNlcyBpbiB0aGUgcnVsZSwgaS5lLiB0 aGV5IGFyZSBpbiByZXN0cmljdGVkIEhBIGdyb3Vwcywgd2hlcmUgdGhlCj4+ICt1bmlvbiBvZiBh bGwgcmVzdHJpY3RlZCBub2RlIHNldHMgaGF2ZSBsZXNzIGVsZW1lbnRzIHRoYW4gcmVzdHJpY3Rl ZCBzZXJ2aWNlcy4KPj4gKwo+PiArSWYgdGhlcmUgYXJlIG5vIGNvbmZsaWN0cywgdGhlIHJldHVy bmVkIGxpc3QgaXMgZW1wdHkuCj4+ICsKPj4gKz1jdXQKPj4gKwo+PiArc3ViIGNoZWNrX25lZ2F0 aXZlX2dyb3VwX2NvbnNpc3RlbmN5IHsKPj4gKyAgICBteSAoJHJ1bGVzLCAkZ3JvdXBzLCAkc2Vy dmljZXMsICRuZWdhdGl2ZV9ydWxlaWRzLCAkY29uZmxpY3RzKSA9IEBfOwo+IAo+IHNhbWUgcXVl c3Rpb24gaGVyZQo+IAo+PiArCj4+ICsgICAgZm9yIG15ICRydWxlaWQgKEAkbmVnYXRpdmVfcnVs ZWlkcykgewo+PiArCW15ICRydWxlX3NlcnZpY2VzID0gJHJ1bGVzLT57aWRzfS0+eyRydWxlaWR9 LT57c2VydmljZXN9Owo+PiArCW15ICRyZXN0cmljdGVkX3NlcnZpY2VzID0gMDsKPj4gKwlteSAk cmVzdHJpY3RlZF9ub2RlczsKPj4gKwo+PiArCWZvciBteSAkc2lkIChrZXlzICUkcnVsZV9zZXJ2 aWNlcykgewo+PiArCSAgICBteSAkZ3JvdXBpZCA9ICRzZXJ2aWNlcy0+eyRzaWR9LT57Z3JvdXB9 Owo+PiArCSAgICByZXR1cm4gaWYgISRncm91cGlkOwo+IAo+IHNhbWUgcXVlc3Rpb24gYXMgYWJv dmUgOykKPiAKPj4gKwo+PiArCSAgICBteSAkZ3JvdXAgPSAkZ3JvdXBzLT57aWRzfS0+eyRncm91 cGlkfTsKPj4gKwkgICAgcmV0dXJuIGlmICEkZ3JvdXA7Cj4+ICsJICAgIHJldHVybiBpZiAhJGdy b3VwLT57cmVzdHJpY3RlZH07Cj4gCj4gc2FtZSBoZXJlCj4gCj4+ICsKPj4gKwkgICAgJHJlc3Ry aWN0ZWRfc2VydmljZXMrKzsKPj4gKwo+PiArCSAgICAkcmVzdHJpY3RlZF9ub2RlcyA9IHt9IGlm ICFkZWZpbmVkKCRyZXN0cmljdGVkX25vZGVzKTsKPj4gKwkgICAgJHJlc3RyaWN0ZWRfbm9kZXMg PSBQVkU6OkhBOjpUb29sczo6dW5pb24oJHJlc3RyaWN0ZWRfbm9kZXMsICRncm91cC0+e25vZGVz fSk7Cj4gCj4gaGVyZSBhcyB3ZWxsIC0gaWYgcmVzdHJpY3RlZF9zZXJ2aWNlcyA+IHJlc3RyaWN0 ZWRfbm9kZXMsIGhhdmVuJ3Qgd2UKPiBhbHJlYWR5IGZvdW5kIGEgdmlvbGF0aW9uIG9mIHRoZSBp bnZhcmlhbnQgYW5kIHNob3VsZCBicmVhayBldmVuIGlmCj4gYW5vdGhlciBzZXJ2aWNlIHdvdWxk IHRoZW4gYmUgYWRkZWQgaW4gdGhlIG5leHQgaXRlcmF0aW9uIHRoYXQgY2FuIHJ1bgo+IG9uIDUg bW92ZSBuZXcgbm9kZXMuLgoKVGhhbmtzIGZvciBjYXRjaGluZyB0aGlzLCB3aWxsIGRvIHRoYXQg YXMgYWxyZWFkeSBzYWlkIGluIHRoZSBhYm92ZSBjb21tZW50IQoKPiAKPj4gKwl9Cj4+ICsKPj4g KwlpZiAoZGVmaW5lZCgkcmVzdHJpY3RlZF9ub2RlcykKPj4gKwkgICAgJiYgc2NhbGFyIGtleXMg JSRyZXN0cmljdGVkX25vZGVzIDwgJHJlc3RyaWN0ZWRfc2VydmljZXMpIHsKPj4gKwkgICAgcHVz aCBAJGNvbmZsaWN0cywgWyduZWdhdGl2ZScsICRydWxlaWRdOwo+PiArCX0KPj4gKyAgICB9Cj4+ ICt9Cj4+ICsKPj4gK3N1YiBjaGVja19jb25zaXN0ZW5jeV93aXRoX2dyb3VwcyB7Cj4+ICsgICAg bXkgKCRydWxlcywgJGdyb3VwcywgJHNlcnZpY2VzKSA9IEBfOwo+PiArCj4+ICsgICAgbXkgJGNv bmZsaWN0cyA9IFtdOwo+PiArICAgIG15ICgkcG9zaXRpdmVfcnVsZWlkcywgJG5lZ2F0aXZlX3J1 bGVpZHMpID0gc3BsaXRfY29sb2NhdGlvbl9ydWxlcygkcnVsZXMpOwo+PiArCj4+ICsgICAgY2hl Y2tfcG9zaXRpdmVfZ3JvdXBfY29uc2lzdGVuY3koJHJ1bGVzLCAkZ3JvdXBzLCAkc2VydmljZXMs ICRwb3NpdGl2ZV9ydWxlaWRzLCAkY29uZmxpY3RzKTsKPj4gKyAgICBjaGVja19uZWdhdGl2ZV9n cm91cF9jb25zaXN0ZW5jeSgkcnVsZXMsICRncm91cHMsICRzZXJ2aWNlcywgJG5lZ2F0aXZlX3J1 bGVpZHMsICRjb25mbGljdHMpOwo+PiArCj4+ICsgICAgcmV0dXJuICRjb25mbGljdHM7Cj4+ICt9 Cj4+ICsKPj4gK3N1YiBjYW5vbmljYWxpemUgewo+PiArICAgIG15ICgkY2xhc3MsICRydWxlcywg JGdyb3VwcywgJHNlcnZpY2VzKSA9IEBfOwo+IAo+IHNob3VsZCB0aGlzIG5vdGUgdGhhdCBpdCB3 aWxsIG1vZGlmeSAkcnVsZXMgaW4tcGxhY2U/IHRoaXMgaXMgb25seQo+IGNhbGxlZCBieSBQVkU6 OkhBOjpSdWxlczo6Y2hlY2tlZF9jb25maWcgd2hpY2ggYWxzbyBkb2VzIG5vdCBub3RlIHRoYXQK PiBhbmQgY291bGQgYmUgaW50ZXJwcmV0ZWQgYXMgImNvbmZpZyBpcyBjaGVja2VkIG5vdyIgOykK ClllcywgaXQgc2hvdWxkIHJlYWxseSBiZSBwb2ludGVkIG91dCBieSBjaGVja2VkX2NvbmZpZywg YnV0IGl0IGRvZXNuJ3QgCmh1cnQgYXQgYWxsIHRvIGRvY3VtZW50IGl0IGZvciBib3RoLiBjaGVj a2VkX2NvbmZpZyBjb3VsZCBhbHNvIGhhdmUgYSAKYmV0dGVyIG5hbWUuCgo+IAo+PiArCj4+ICsg ICAgbXkgJGlsbGRlZmluZWRfcnVsZWlkcyA9IGNoZWNrX3NlcnZpY2VzX2NvdW50KCRydWxlcyk7 Cj4+ICsKPj4gKyAgICBmb3IgbXkgJHJ1bGVpZCAoQCRpbGxkZWZpbmVkX3J1bGVpZHMpIHsKPj4g KwlwcmludCAiRHJvcCBjb2xvY2F0aW9uIHJ1bGUgJyRydWxlaWQnLCBiZWNhdXNlIGl0IGRvZXMg bm90IGhhdmUgZW5vdWdoIHNlcnZpY2VzIGRlZmluZWQuXG4iOwo+PiArCj4+ICsJZGVsZXRlICRy dWxlcy0+e2lkc30tPnskcnVsZWlkfTsKPj4gKyAgICB9Cj4+ICsKPj4gKyAgICBteSAkbWVyZ2Vh YmxlX3Bvc2l0aXZlX3J1bGVpZHMgPSBjaGVja19wb3NpdGl2ZV9pbnRyYW5zaXRpdml0eSgkcnVs ZXMpOwo+PiArCj4+ICsgICAgZm9yIG15ICRvdXRlcmlkIChzb3J0IGtleXMgJSRtZXJnZWFibGVf cG9zaXRpdmVfcnVsZWlkcykgewo+PiArCW15ICRvdXRlciA9ICRydWxlcy0+e2lkc30tPnskb3V0 ZXJpZH07Cj4+ICsJbXkgJGlubmVyaWRzID0gJG1lcmdlYWJsZV9wb3NpdGl2ZV9ydWxlaWRzLT57 JG91dGVyaWR9Owo+PiArCj4+ICsJZm9yIG15ICRpbm5lcmlkIChAJGlubmVyaWRzKSB7Cj4+ICsJ ICAgIG15ICRpbm5lciA9ICRydWxlcy0+e2lkc30tPnskaW5uZXJpZH07Cj4+ICsKPj4gKwkgICAg JG91dGVyLT57c2VydmljZXN9LT57JF99ID0gMSBmb3IgKGtleXMgJXskaW5uZXItPntzZXJ2aWNl c319KTsKPj4gKwo+PiArCSAgICBwcmludCAiTWVyZ2Ugc2VydmljZXMgb2YgcG9zaXRpdmUgY29s b2NhdGlvbiBydWxlICckaW5uZXJpZCcgaW50byBwb3NpdGl2ZSBjb2xvY2F0aW9uIgo+PiArCQku ICIgcnVsZSAnJG91dGVyaWQnLCBiZWNhdXNlIHRoZXkgc2hhcmUgYXQgbGVhc3Qgb25lIHNlcnZp Y2UuXG4iOwo+IAo+IHRoaXMgaXMgYSBiaXQgY29uZnVzaW5nIGJlY2F1c2UgaXQgbW9kaWZpZXMg dGhlIHJ1bGUgd2hpbGUgY29udGludWluZyB0bwo+IHJlZmVyIHRvIGl0IHVzaW5nIHRoZSBvbGQg bmFtZSBhZnRlcndhcmRzLi4gc2hvdWxkIHdlIG1lcmdlIHRoZW0gYW5kCj4gZ2l2ZSB0aGVtIGEg bmV3IG5hbWU/CgpHb29kIGNhbGwsIEkgd291bGQgZ28gZm9yIGp1c3QgYXBwZW5kaW5nIHRoZSBu YW1lLCBidXQgZGVwZW5kaW5nIG9uIGhvdyAKbWFueSBydWxlcyB0aGF0IGFyZSBhZmZlY3RlZCB0 aGlzIGNvdWxkIGdldCByYXRoZXIgbG9uZy4uLiBXZSBjb3VsZCBhbHNvIApqdXN0IGRvIHNvbWUg dGVtcG9yYXJ5IG5hbWUgYXQgZWFjaCBuZXcgbWVyZ2UsIGJ1dCB0aGlzIGNvdWxkIGhhcmRlciB0 byAKZm9sbG93IGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gdHdvIG1lcmdlIGFjdGlvbnMuCgpJIHRo aW5rIEknbGwgcHJlZmVyIGp1c3QgYXBwZW5kaW5nIGl0IHNpbmNlIGl0IHNlZW1zIHRoYXQgUGVy bCBjYW4gCmhhbmRsZSBoYXNoIGtleXMgb2YgMioqMzEgImZpbmUiIGFueXdheSA6UCBhbmQgaG9w ZSBmb3IgdGhlIGJldHRlciB0aGF0IAp0aGVyZSB3b24ndCBiZSB0b28gbWFueSBhZmZlY3RlZCBy dWxlcyBmb3IgdXNlcnMgc28gdGhhdCB0aGUga2V5IGRvZXNuJ3QgCmdyb3cgdGhhdCBsb25nLiBP ciB3aGF0IGRvIHlvdSB0aGluaz8KCj4gCj4+ICsKPj4gKwkgICAgZGVsZXRlICRydWxlcy0+e2lk c30tPnskaW5uZXJpZH07Cj4+ICsJfQo+PiArICAgIH0KPj4gKwo+PiArICAgIG15ICRpbm5lcl9j b25mbGljdHMgPSBjaGVja19pbm5lcl9jb25zaXN0ZW5jeSgkcnVsZXMpOwo+PiArCj4+ICsgICAg Zm9yIG15ICRjb25mbGljdCAoQCRpbm5lcl9jb25mbGljdHMpIHsKPj4gKwlteSAoJHBvc2l0aXZl aWQsICRuZWdhdGl2ZWlkKSA9IEAkY29uZmxpY3Q7Cj4+ICsKPj4gKwlwcmludCAiRHJvcCBwb3Np dGl2ZSBjb2xvY2F0aW9uIHJ1bGUgJyRwb3NpdGl2ZWlkJyBhbmQgbmVnYXRpdmUgY29sb2NhdGlv biBydWxlIgo+PiArCSAgICAuICIgJyRuZWdhdGl2ZWlkJywgYmVjYXVzZSB0aGV5IHNoYXJlIHR3 byBvciBtb3JlIHNlcnZpY2VzLlxuIjsKPj4gKwo+PiArCWRlbGV0ZSAkcnVsZXMtPntpZHN9LT57 JHBvc2l0aXZlaWR9Owo+PiArCWRlbGV0ZSAkcnVsZXMtPntpZHN9LT57JG5lZ2F0aXZlaWR9Owo+ PiArICAgIH0KPj4gKwo+PiArICAgIG15ICRncm91cF9jb25mbGljdHMgPSBjaGVja19jb25zaXN0 ZW5jeV93aXRoX2dyb3VwcygkcnVsZXMsICRncm91cHMsICRzZXJ2aWNlcyk7Cj4+ICsKPj4gKyAg ICBmb3IgbXkgJGNvbmZsaWN0IChAJGdyb3VwX2NvbmZsaWN0cykgewo+PiArCW15ICgkdHlwZSwg JHJ1bGVpZCkgPSBAJGNvbmZsaWN0Owo+PiArCj4+ICsJaWYgKCR0eXBlIGVxICdwb3NpdGl2ZScp IHsKPj4gKwkgICAgcHJpbnQgIkRyb3AgcG9zaXRpdmUgY29sb2NhdGlvbiBydWxlICckcnVsZWlk JywgYmVjYXVzZSB0d28gb3IgbW9yZSBzZXJ2aWNlcyBhcmUiCj4+ICsJCS4gIiByZXN0cmljdGVk IHRvIGRpZmZlcmVudCBub2Rlcy5cbiI7Cj4+ICsJfSBlbHNpZiAoJHR5cGUgZXEgJ25lZ2F0aXZl Jykgewo+PiArCSAgICBwcmludCAiRHJvcCBuZWdhdGl2ZSBjb2xvY2F0aW9uIHJ1bGUgJyRydWxl aWQnLCBiZWNhdXNlIHR3byBvciBtb3JlIHNlcnZpY2VzIGFyZSIKPj4gKwkJLiAiIHJlc3RyaWN0 ZWQgdG8gbGVzcyBub2RlcyB0aGFuIHNlcnZpY2VzLlxuIjsKPj4gKwl9IGVsc2Ugewo+PiArCSAg ICBkaWUgIkludmFsaWQgZ3JvdXAgY29uZmxpY3QgdHlwZSAkdHlwZVxuIjsKPj4gKwl9Cj4+ICsK Pj4gKwlkZWxldGUgJHJ1bGVzLT57aWRzfS0+eyRydWxlaWR9Owo+PiArICAgIH0KPj4gK30KPj4g Kwo+PiArIyBUT0RPIFRoaXMgd2lsbCBiZSB1c2VkIHRvIHZlcmlmeSBtb2RpZmljYXRpb25zIHRv IHRoZSBydWxlcyBjb25maWcgb3ZlciB0aGUgQVBJCj4+ICtzdWIgYXJlX3NhdGlzZmlhYmxlIHsK PiAKPiB0aGlzIGlzIGJhc2ljYWxseSBjYW5vbmljYWxpemUsIGJ1dAo+IC0gd2l0aG91dCBkZWxl dGluZyBydWxlcwo+IC0gd2l0aG91dCB0aGUgdHJhbnNpdGl2aXR5IGNoZWNrCj4gLSB3aXRoIHNs aWdodGx5IGFkYXB0ZWQgbWVzc2FnZXMKPiAKPiBzaG91bGQgdGhleSBiZSBjb21iaW5lZCBzbyB0 aGF0IHdlIGhhdmUgcm91Z2hseSB0aGUgc2FtZSBsb2dpYyB3aGVuCj4gZG9pbmcgY2hhbmdlcyB2 aWEgdGhlIEFQSSBhbmQgd2hlbiBsb2FkaW5nIHRoZSBydWxlcyBmb3Igb3BlcmF0aW9ucz8KClRo YXQgd291bGQgYmUgbXVjaCBiZXR0ZXIsIHllcywgYXMgaXQncyBlYXN5IHRvIG1pc3MgYWRkaW5n IGl0IHRvIGJvdGggCmFuZCBjb3VsZCBiZWNvbWUgY3VtYmVyc29tZSBpZiB0aGVyZSBhcmUgbW9y ZSBjaGVja3MgbmVlZGVkIGluIHRoZSBmdXR1cmUuCgpJZiB0aGVyZSdzIG5vdGhpbmcgc3BlYWtp bmcgYWdhaW5zdCB0aGF0LCBJIHdvdWxkIGdvIGZvciB0aGUgc3RydWN0dXJlIEkgCmhhdmUgbWVu dGlvbmVkIGluIHRoZSBmaXJzdCBpbmxpbmUgY29tbWVudCB0byBpbXByb3ZlIHRoaXMsIHNvIHRo YXQgdGhlIApjaGVjayByb3V0aW5lIGFuZCBoYW5kbGVycyBmb3IgY2Fub25pY2FsaXplKCkgYW5k IGFyZV9zYXRpc2ZpYWJsZSgpIGFyZSAKY2xvc2VyIHRvZ2V0aGVyLgoKPiAKPj4gKyAgICBteSAo JGNsYXNzLCAkcnVsZXMsICRncm91cHMsICRzZXJ2aWNlcykgPSBAXzsKPj4gKwo+PiArICAgIG15 ICRpbGxkZWZpbmVkX3J1bGVpZHMgPSBjaGVja19zZXJ2aWNlc19jb3VudCgkcnVsZXMpOwo+PiAr Cj4+ICsgICAgZm9yIG15ICRydWxlaWQgKEAkaWxsZGVmaW5lZF9ydWxlaWRzKSB7Cj4+ICsJcHJp bnQgIkNvbG9jYXRpb24gcnVsZSAnJHJ1bGVpZCcgZG9lcyBub3QgaGF2ZSBlbm91Z2ggc2Vydmlj ZXMgZGVmaW5lZC5cbiI7Cj4+ICsgICAgfQo+PiArCj4+ICsgICAgbXkgJGlubmVyX2NvbmZsaWN0 cyA9IGNoZWNrX2lubmVyX2NvbnNpc3RlbmN5KCRydWxlcyk7Cj4+ICsKPj4gKyAgICBmb3IgbXkg JGNvbmZsaWN0IChAJGlubmVyX2NvbmZsaWN0cykgewo+PiArCW15ICgkcG9zaXRpdmVpZCwgJG5l Z2F0aXZlaWQpID0gQCRjb25mbGljdDsKPj4gKwo+PiArCXByaW50ICJQb3NpdGl2ZSBjb2xvY2F0 aW9uIHJ1bGUgJyRwb3NpdGl2ZWlkJyBpcyBpbmNvbnNpc3RlbnQgd2l0aCBuZWdhdGl2ZSBjb2xv Y2F0aW9uIHJ1bGUiCj4+ICsJICAgIC4gIiAnJG5lZ2F0aXZlaWQnLCBiZWNhdXNlIHRoZXkgc2hh cmUgdHdvIG9yIG1vcmUgc2VydmljZXMgYmV0d2VlbiB0aGVtLlxuIjsKPj4gKyAgICB9Cj4+ICsK Pj4gKyAgICBteSAkZ3JvdXBfY29uZmxpY3RzID0gY2hlY2tfY29uc2lzdGVuY3lfd2l0aF9ncm91 cHMoJHJ1bGVzLCAkZ3JvdXBzLCAkc2VydmljZXMpOwo+PiArCj4+ICsgICAgZm9yIG15ICRjb25m bGljdCAoQCRncm91cF9jb25mbGljdHMpIHsKPj4gKwlteSAoJHR5cGUsICRydWxlaWQpID0gQCRj b25mbGljdDsKPj4gKwo+PiArCWlmICgkdHlwZSBlcSAncG9zaXRpdmUnKSB7Cj4+ICsJICAgIHBy aW50ICJQb3NpdGl2ZSBjb2xvY2F0aW9uIHJ1bGUgJyRydWxlaWQnIGlzIHVuYXBwbGljYWJsZSwg YmVjYXVzZSB0d28gb3IgbW9yZSBzZXJ2aWNlcyIKPj4gKwkJLiAiIGFyZSByZXN0cmljdGVkIHRv IGRpZmZlcmVudCBub2Rlcy5cbiI7Cj4+ICsJfSBlbHNpZiAoJHR5cGUgZXEgJ25lZ2F0aXZlJykg ewo+PiArCSAgICBwcmludCAiTmVnYXRpdmUgY29sb2NhdGlvbiBydWxlICckcnVsZWlkJyBpcyB1 bmFwcGxpY2FibGUsIGJlY2F1c2UgdHdvIG9yIG1vcmUgc2VydmljZXMiCj4+ICsJCS4gIiBhcmUg cmVzdHJpY3RlZCB0byBsZXNzIG5vZGVzIHRoYW4gc2VydmljZXMuXG4iOwo+PiArCX0gZWxzZSB7 Cj4+ICsJICAgIGRpZSAiSW52YWxpZCBncm91cCBjb25mbGljdCB0eXBlICR0eXBlXG4iOwo+PiAr CX0KPj4gKyAgICB9Cj4+ICsKPj4gKyAgICBpZiAoc2NhbGFyKEAkaW5uZXJfY29uZmxpY3RzKSB8 fCBzY2FsYXIoQCRncm91cF9jb25mbGljdHMpKSB7Cj4+ICsJcmV0dXJuIDA7Cj4+ICsgICAgfQo+ PiArCj4+ICsgICAgcmV0dXJuIDE7Cj4+ICt9Cj4+ICsKPj4gKzE7Cj4+IGRpZmYgLS1naXQgYS9z cmMvUFZFL0hBL1J1bGVzL01ha2VmaWxlIGIvc3JjL1BWRS9IQS9SdWxlcy9NYWtlZmlsZQo+PiBu ZXcgZmlsZSBtb2RlIDEwMDY0NAo+PiBpbmRleCAwMDAwMDAwLi44Y2I5MWFjCj4+IC0tLSAvZGV2 L251bGwKPj4gKysrIGIvc3JjL1BWRS9IQS9SdWxlcy9NYWtlZmlsZQo+PiBAQCAtMCwwICsxLDYg QEAKPj4gK1NPVVJDRVM9Q29sb2NhdGlvbi5wbQo+PiArCj4+ICsuUEhPTlk6IGluc3RhbGwKPj4g K2luc3RhbGw6Cj4+ICsJaW5zdGFsbCAtZCAtbSAwNzU1ICR7REVTVERJUn0ke1BFUkxESVJ9L1BW RS9IQS9SdWxlcwo+PiArCWZvciBpIGluICR7U09VUkNFU307IGRvIGluc3RhbGwgLUQgLW0gMDY0 NCAkJGkgJHtERVNURElSfSR7UEVSTERJUn0vUFZFL0hBL1J1bGVzLyQkaTsgZG9uZQo+PiBkaWZm IC0tZ2l0IGEvc3JjL1BWRS9IQS9Ub29scy5wbSBiL3NyYy9QVkUvSEEvVG9vbHMucG0KPj4gaW5k ZXggMzUxMDdjOS4uNTIyNTFkNyAxMDA2NDQKPj4gLS0tIGEvc3JjL1BWRS9IQS9Ub29scy5wbQo+ PiArKysgYi9zcmMvUFZFL0hBL1Rvb2xzLnBtCj4+IEBAIC00Niw2ICs0NiwxMiBAQCBQVkU6OkpT T05TY2hlbWE6OnJlZ2lzdGVyX3N0YW5kYXJkX29wdGlvbigncHZlLWhhLXJlc291cmNlLWlkJywg ewo+PiAgICAgICB0eXBlID0+ICdzdHJpbmcnLCBmb3JtYXQgPT4gJ3B2ZS1oYS1yZXNvdXJjZS1p ZCcsCj4+ICAgfSk7Cj4+ICAgCj4+ICtQVkU6OkpTT05TY2hlbWE6OnJlZ2lzdGVyX3N0YW5kYXJk X29wdGlvbigncHZlLWhhLXJlc291cmNlLWlkLWxpc3QnLCB7Cj4+ICsgICAgZGVzY3JpcHRpb24g PT4gIkxpc3Qgb2YgSEEgcmVzb3VyY2UgSURzLiIsCj4+ICsgICAgdHlwZXRleHQgPT4gIjx0eXBl Pjo8bmFtZT57LDx0eXBlPjo8bmFtZT59KiIsCj4+ICsgICAgdHlwZSA9PiAnc3RyaW5nJywgZm9y bWF0ID0+ICdwdmUtaGEtcmVzb3VyY2UtaWQtbGlzdCcsCj4+ICt9KTsKPj4gKwo+PiAgIFBWRTo6 SlNPTlNjaGVtYTo6cmVnaXN0ZXJfZm9ybWF0KCdwdmUtaGEtcmVzb3VyY2Utb3Itdm0taWQnLCBc JnB2ZV92ZXJpZnlfaGFfcmVzb3VyY2Vfb3Jfdm1faWQpOwo+PiAgIHN1YiBwdmVfdmVyaWZ5X2hh X3Jlc291cmNlX29yX3ZtX2lkIHsKPj4gICAgICAgbXkgKCRzaWQsICRub2VycikgPSBAXzsKPj4g LS0gCj4+IDIuMzkuNQo+Pgo+Pgo+Pgo+PiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwo+PiBwdmUtZGV2ZWwgbWFpbGluZyBsaXN0Cj4+IHB2ZS1kZXZlbEBs aXN0cy5wcm94bW94LmNvbQo+PiBodHRwczovL2xpc3RzLnByb3htb3guY29tL2NnaS1iaW4vbWFp bG1hbi9saXN0aW5mby9wdmUtZGV2ZWwKPj4KPj4KPj4KPiAKPiAKPiBfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwo+IHB2ZS1kZXZlbCBtYWlsaW5nIGxpc3QK PiBwdmUtZGV2ZWxAbGlzdHMucHJveG1veC5jb20KPiBodHRwczovL2xpc3RzLnByb3htb3guY29t L2NnaS1iaW4vbWFpbG1hbi9saXN0aW5mby9wdmUtZGV2ZWwKPiAKPiAKCgoKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KcHZlLWRldmVsIG1haWxpbmcgbGlz dApwdmUtZGV2ZWxAbGlzdHMucHJveG1veC5jb20KaHR0cHM6Ly9saXN0cy5wcm94bW94LmNvbS9j Z2ktYmluL21haWxtYW4vbGlzdGluZm8vcHZlLWRldmVsCg==